mirror of
https://github.com/darlinghq/darling-gdb.git
synced 2025-01-18 23:13:46 +00:00
(add_to_literal_pool): Take symbol and addend as arguments, instead of
expression, for now. Fix calculation of offset to return.
This commit is contained in:
parent
939b21d207
commit
acf6404e0b
78
gas/literal.c
Normal file
78
gas/literal.c
Normal file
@ -0,0 +1,78 @@
|
||||
/* as.c - GAS literal pool management.
|
||||
Copyright (C) 1994 Free Software Foundation, Inc.
|
||||
|
||||
This file is part of GAS, the GNU Assembler.
|
||||
|
||||
GAS is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2, or (at your option)
|
||||
any later version.
|
||||
|
||||
GAS is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with GAS; see the file COPYING. If not, write to
|
||||
the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
|
||||
|
||||
/* This isn't quite a "constant" pool. Some of the values may get
|
||||
adjusted at run time, e.g., for symbolic relocations when shared
|
||||
libraries are in use. It's more of a "literal" pool.
|
||||
|
||||
On the Alpha, this should be used for .lita and .lit8. (Is there
|
||||
ever a .lit4?) On the MIPS, it could be used for .lit4 as well.
|
||||
|
||||
The expressions passed here should contain either constants or symbols,
|
||||
*not* a combination of both. Typically, the constant pool is accessed
|
||||
with some sort of GP register, so the size of the pool must be kept down
|
||||
if possible. The exception is section offsets -- if you're storing a
|
||||
pointer to the start of .data, for example, and your machine provides
|
||||
for 16-bit signed addends, you might want to store .data+32K, so that
|
||||
you can access all of the first 64K of .data with the one pointer... */
|
||||
|
||||
#include "as.h"
|
||||
#include "subsegs.h"
|
||||
|
||||
#if defined (BFD_ASSEMBLER) && defined (NEED_LITERAL_POOL)
|
||||
|
||||
valueT
|
||||
add_to_literal_pool (sym, addend, sec, size)
|
||||
symbolS *sym;
|
||||
valueT addend;
|
||||
segT sec;
|
||||
int size;
|
||||
{
|
||||
segT current_section = now_seg;
|
||||
int current_subsec = now_subseg;
|
||||
valueT offset;
|
||||
bfd_reloc_code_real_type reloc_type;
|
||||
char *p;
|
||||
|
||||
subseg_set (sec, 0);
|
||||
p = frag_more (size);
|
||||
memset (p, 0, size);
|
||||
|
||||
switch (size)
|
||||
{
|
||||
case 4:
|
||||
reloc_type = BFD_RELOC_32;
|
||||
break;
|
||||
case 8:
|
||||
reloc_type = BFD_RELOC_64;
|
||||
break;
|
||||
default:
|
||||
abort ();
|
||||
}
|
||||
fix_new (frag_now, p - frag_now->fr_literal, size, sym, addend, 0,
|
||||
reloc_type);
|
||||
|
||||
subseg_set (current_section, current_subsec);
|
||||
|
||||
offset = seg_info (sec)->literal_pool_size;
|
||||
seg_info (sec)->literal_pool_size += size;
|
||||
|
||||
return offset;
|
||||
}
|
||||
#endif /* BFD_ASSEMBLER */
|
Loading…
x
Reference in New Issue
Block a user