mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-06-20 01:50:24 +08:00
* config/tc-ppc.c: Formatting fixes.
This commit is contained in:
@ -1,3 +1,7 @@
|
||||
2001-07-02 Alan Modra <amodra@bigpond.net.au>
|
||||
|
||||
* config/tc-ppc.c: Formatting fixes.
|
||||
|
||||
2001-07-01 Ben Elliston <bje@redhat.com>
|
||||
|
||||
* config/tc-m88k.c: Back out warning fixes from 2001-06-24, as
|
||||
|
@ -203,7 +203,7 @@ const pseudo_typeS md_pseudo_table[] =
|
||||
#endif
|
||||
|
||||
#ifdef TE_PE
|
||||
/* Pseudo-ops specific to the Windows NT PowerPC PE (coff) format */
|
||||
/* Pseudo-ops specific to the Windows NT PowerPC PE (coff) format. */
|
||||
{ "previous", ppc_previous, 0 },
|
||||
{ "pdata", ppc_pdata, 0 },
|
||||
{ "ydata", ppc_ydata, 0 },
|
||||
@ -225,9 +225,9 @@ const pseudo_typeS md_pseudo_table[] =
|
||||
};
|
||||
|
||||
|
||||
/* Predefined register names if -mregnames (or default for Windows NT). */
|
||||
/* In general, there are lots of them, in an attempt to be compatible */
|
||||
/* with a number of other Windows NT assemblers. */
|
||||
/* Predefined register names if -mregnames (or default for Windows NT).
|
||||
In general, there are lots of them, in an attempt to be compatible
|
||||
with a number of other Windows NT assemblers. */
|
||||
|
||||
/* Structure to hold information about predefined registers. */
|
||||
struct pd_reg
|
||||
@ -555,7 +555,7 @@ reg_name_search (regs, regcount, name)
|
||||
}
|
||||
|
||||
/*
|
||||
* Summary of register_name().
|
||||
* Summary of register_name.
|
||||
*
|
||||
* in: Input_line_pointer points to 1st char of operand.
|
||||
*
|
||||
@ -575,7 +575,7 @@ register_name (expressionP)
|
||||
char *start;
|
||||
char c;
|
||||
|
||||
/* Find the spelling of the operand */
|
||||
/* Find the spelling of the operand. */
|
||||
start = name = input_line_pointer;
|
||||
if (name[0] == '%' && isalpha (name[1]))
|
||||
name = ++input_line_pointer;
|
||||
@ -586,23 +586,24 @@ register_name (expressionP)
|
||||
c = get_symbol_end ();
|
||||
reg_number = reg_name_search (pre_defined_registers, REG_NAME_CNT, name);
|
||||
|
||||
/* look to see if it's in the register table */
|
||||
/* Look to see if it's in the register table. */
|
||||
if (reg_number >= 0)
|
||||
{
|
||||
expressionP->X_op = O_register;
|
||||
expressionP->X_add_number = reg_number;
|
||||
|
||||
/* make the rest nice */
|
||||
/* Make the rest nice. */
|
||||
expressionP->X_add_symbol = NULL;
|
||||
expressionP->X_op_symbol = NULL;
|
||||
*input_line_pointer = c; /* put back the delimiting char */
|
||||
/* Put back the delimiting char. */
|
||||
*input_line_pointer = c;
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* reset the line as if we had not done anything */
|
||||
*input_line_pointer = c; /* put back the delimiting char */
|
||||
input_line_pointer = start; /* reset input_line pointer */
|
||||
/* Reset the line as if we had not done anything. */
|
||||
*input_line_pointer = c;
|
||||
input_line_pointer = start;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@ -666,7 +667,7 @@ static int ppc_cpu = 0;
|
||||
PPC_OPCODE_32 or PPC_OPCODE_64. */
|
||||
static unsigned long ppc_size = PPC_OPCODE_32;
|
||||
|
||||
/* Whether to target xcoff64 */
|
||||
/* Whether to target xcoff64. */
|
||||
static int ppc_xcoff64 = 0;
|
||||
|
||||
/* Opcode hash table. */
|
||||
@ -676,10 +677,10 @@ static struct hash_control *ppc_hash;
|
||||
static struct hash_control *ppc_macro_hash;
|
||||
|
||||
#ifdef OBJ_ELF
|
||||
/* What type of shared library support to use */
|
||||
/* What type of shared library support to use. */
|
||||
static enum { SHLIB_NONE, SHLIB_PIC, SHLIB_MRELOCATABLE } shlib = SHLIB_NONE;
|
||||
|
||||
/* Flags to set in the elf header */
|
||||
/* Flags to set in the elf header. */
|
||||
static flagword ppc_flags = 0;
|
||||
|
||||
/* Whether this is Solaris or not. */
|
||||
@ -806,7 +807,7 @@ md_parse_option (c, arg)
|
||||
break;
|
||||
|
||||
case 'K':
|
||||
/* Recognize -K PIC */
|
||||
/* Recognize -K PIC. */
|
||||
if (strcmp (arg, "PIC") == 0 || strcmp (arg, "pic") == 0)
|
||||
{
|
||||
shlib = SHLIB_PIC;
|
||||
@ -879,7 +880,8 @@ md_parse_option (c, arg)
|
||||
reg_names_p = false;
|
||||
|
||||
#ifdef OBJ_ELF
|
||||
/* -mrelocatable/-mrelocatable-lib -- warn about initializations that require relocation */
|
||||
/* -mrelocatable/-mrelocatable-lib -- warn about initializations
|
||||
that require relocation. */
|
||||
else if (strcmp (arg, "relocatable") == 0)
|
||||
{
|
||||
shlib = SHLIB_MRELOCATABLE;
|
||||
@ -892,12 +894,13 @@ md_parse_option (c, arg)
|
||||
ppc_flags |= EF_PPC_RELOCATABLE_LIB;
|
||||
}
|
||||
|
||||
/* -memb, set embedded bit */
|
||||
/* -memb, set embedded bit. */
|
||||
else if (strcmp (arg, "emb") == 0)
|
||||
ppc_flags |= EF_PPC_EMB;
|
||||
|
||||
/* -mlittle/-mbig set the endianess */
|
||||
else if (strcmp (arg, "little") == 0 || strcmp (arg, "little-endian") == 0)
|
||||
/* -mlittle/-mbig set the endianess. */
|
||||
else if (strcmp (arg, "little") == 0
|
||||
|| strcmp (arg, "little-endian") == 0)
|
||||
{
|
||||
target_big_endian = 0;
|
||||
set_target_endian = 1;
|
||||
@ -1010,7 +1013,8 @@ ppc_set_cpu ()
|
||||
|| strcmp (default_cpu, "powerpcle") == 0)
|
||||
ppc_cpu = PPC_OPCODE_PPC;
|
||||
else
|
||||
as_fatal (_("Unknown default cpu = %s, os = %s"), default_cpu, default_os);
|
||||
as_fatal (_("Unknown default cpu = %s, os = %s"),
|
||||
default_cpu, default_os);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1042,31 +1046,31 @@ ppc_arch ()
|
||||
unsigned long
|
||||
ppc_mach ()
|
||||
{
|
||||
return (ppc_size == PPC_OPCODE_64) ? 620 : 0;
|
||||
return ppc_size == PPC_OPCODE_64 ? 620 : 0;
|
||||
}
|
||||
|
||||
int
|
||||
ppc_subseg_align()
|
||||
ppc_subseg_align ()
|
||||
{
|
||||
return (ppc_xcoff64) ? 3 : 2;
|
||||
return ppc_xcoff64 ? 3 : 2;
|
||||
}
|
||||
|
||||
extern char*
|
||||
ppc_target_format()
|
||||
ppc_target_format ()
|
||||
{
|
||||
#ifdef OBJ_COFF
|
||||
#ifdef TE_PE
|
||||
return (target_big_endian ? "pe-powerpc" : "pe-powerpcle");
|
||||
return target_big_endian ? "pe-powerpc" : "pe-powerpcle";
|
||||
#elif TE_POWERMAC
|
||||
#else
|
||||
return (ppc_xcoff64 ? "aixcoff64-rs6000" : "aixcoff-rs6000");
|
||||
return ppc_xcoff64 ? "aixcoff64-rs6000" : "aixcoff-rs6000";
|
||||
#endif
|
||||
#ifdef TE_POWERMAC
|
||||
return "xcoff-powermac";
|
||||
#endif
|
||||
#endif
|
||||
#ifdef OBJ_ELF
|
||||
return (target_big_endian ? "elf32-powerpc" : "elf32-powerpcle");
|
||||
return target_big_endian ? "elf32-powerpc" : "elf32-powerpcle";
|
||||
#endif
|
||||
}
|
||||
|
||||
@ -1109,12 +1113,13 @@ md_begin ()
|
||||
retval = hash_insert (ppc_hash, op->name, (PTR) op);
|
||||
if (retval != (const char *) NULL)
|
||||
{
|
||||
/* Ignore Power duplicates for -m601 */
|
||||
/* Ignore Power duplicates for -m601. */
|
||||
if ((ppc_cpu & PPC_OPCODE_601) != 0
|
||||
&& (op->flags & PPC_OPCODE_POWER) != 0)
|
||||
continue;
|
||||
|
||||
as_bad (_("Internal assembler error for instruction %s"), op->name);
|
||||
as_bad (_("Internal assembler error for instruction %s"),
|
||||
op->name);
|
||||
dup_insn = true;
|
||||
}
|
||||
}
|
||||
@ -1142,7 +1147,8 @@ md_begin ()
|
||||
if (dup_insn)
|
||||
abort ();
|
||||
|
||||
/* Tell the main code what the endianness is if it is not overidden by the user. */
|
||||
/* Tell the main code what the endianness is if it is not overidden
|
||||
by the user. */
|
||||
if (!set_target_endian)
|
||||
{
|
||||
set_target_endian = 1;
|
||||
@ -1315,7 +1321,7 @@ ppc_elf_suffix (str_p, exp_p)
|
||||
MAP ("relsda", BFD_RELOC_PPC_EMB_RELSDA),
|
||||
MAP ("xgot", BFD_RELOC_PPC_TOC16),
|
||||
|
||||
{ (char *)0, 0, BFD_RELOC_UNUSED }
|
||||
{ (char *) 0, 0, BFD_RELOC_UNUSED }
|
||||
};
|
||||
|
||||
if (*str++ != '@')
|
||||
@ -1345,7 +1351,7 @@ ppc_elf_suffix (str_p, exp_p)
|
||||
|| ptr->reloc == BFD_RELOC_HI16_S_GOTOFF))
|
||||
as_warn (_("identifier+constant@got means identifier@got+constant"));
|
||||
|
||||
/* Now check for identifier@suffix+constant */
|
||||
/* Now check for identifier@suffix+constant. */
|
||||
if (*str == '-' || *str == '+')
|
||||
{
|
||||
char *orig_line = input_line_pointer;
|
||||
@ -1370,9 +1376,8 @@ ppc_elf_suffix (str_p, exp_p)
|
||||
return BFD_RELOC_UNUSED;
|
||||
}
|
||||
|
||||
/* Like normal .long/.short/.word, except support @got, etc. */
|
||||
/* clobbers input_line_pointer, checks */
|
||||
/* end-of-line. */
|
||||
/* Like normal .long/.short/.word, except support @got, etc.
|
||||
Clobbers input_line_pointer, checks end-of-line. */
|
||||
static void
|
||||
ppc_elf_cons (nbytes)
|
||||
register int nbytes; /* 1=.byte, 2=.word, 4=.long */
|
||||
@ -1391,20 +1396,26 @@ ppc_elf_cons (nbytes)
|
||||
expression (&exp);
|
||||
if (exp.X_op == O_symbol
|
||||
&& *input_line_pointer == '@'
|
||||
&& (reloc = ppc_elf_suffix (&input_line_pointer, &exp)) != BFD_RELOC_UNUSED)
|
||||
&& (reloc = ppc_elf_suffix (&input_line_pointer,
|
||||
&exp)) != BFD_RELOC_UNUSED)
|
||||
{
|
||||
reloc_howto_type *reloc_howto = bfd_reloc_type_lookup (stdoutput, reloc);
|
||||
int size = bfd_get_reloc_size (reloc_howto);
|
||||
reloc_howto_type *reloc_howto;
|
||||
int size;
|
||||
|
||||
reloc_howto = bfd_reloc_type_lookup (stdoutput, reloc);
|
||||
size = bfd_get_reloc_size (reloc_howto);
|
||||
|
||||
if (size > nbytes)
|
||||
as_bad (_("%s relocations do not fit in %d bytes\n"), reloc_howto->name, nbytes);
|
||||
as_bad (_("%s relocations do not fit in %d bytes\n"),
|
||||
reloc_howto->name, nbytes);
|
||||
|
||||
else
|
||||
{
|
||||
register char *p = frag_more ((int) nbytes);
|
||||
int offset = nbytes - size;
|
||||
|
||||
fix_new_exp (frag_now, p - frag_now->fr_literal + offset, size, &exp, 0, reloc);
|
||||
fix_new_exp (frag_now, p - frag_now->fr_literal + offset, size,
|
||||
&exp, 0, reloc);
|
||||
}
|
||||
}
|
||||
else
|
||||
@ -1412,7 +1423,8 @@ ppc_elf_cons (nbytes)
|
||||
}
|
||||
while (*input_line_pointer++ == ',');
|
||||
|
||||
input_line_pointer--; /* Put terminator back into stream. */
|
||||
/* Put terminator back into stream. */
|
||||
input_line_pointer--;
|
||||
demand_empty_rest_of_line ();
|
||||
}
|
||||
|
||||
@ -1431,9 +1443,9 @@ ppc_elf_rdata (xxx)
|
||||
input_line_pointer = save_line;
|
||||
}
|
||||
|
||||
/* Pseudo op to make file scope bss items */
|
||||
/* Pseudo op to make file scope bss items. */
|
||||
static void
|
||||
ppc_elf_lcomm(xxx)
|
||||
ppc_elf_lcomm (xxx)
|
||||
int xxx ATTRIBUTE_UNUSED;
|
||||
{
|
||||
register char *name;
|
||||
@ -1450,7 +1462,7 @@ ppc_elf_lcomm(xxx)
|
||||
name = input_line_pointer;
|
||||
c = get_symbol_end ();
|
||||
|
||||
/* just after name is now '\0' */
|
||||
/* just after name is now '\0'. */
|
||||
p = input_line_pointer;
|
||||
*p = c;
|
||||
SKIP_WHITESPACE ();
|
||||
@ -1506,12 +1518,12 @@ ppc_elf_lcomm(xxx)
|
||||
return;
|
||||
}
|
||||
|
||||
/* allocate_bss: */
|
||||
/* Allocate_bss. */
|
||||
old_sec = now_seg;
|
||||
old_subsec = now_subseg;
|
||||
if (align)
|
||||
{
|
||||
/* convert to a power of 2 alignment */
|
||||
/* Convert to a power of 2 alignment. */
|
||||
for (align2 = 0; (align & 1) == 0; align >>= 1, ++align2);
|
||||
if (align != 1)
|
||||
{
|
||||
@ -1590,7 +1602,7 @@ ppc_elf_validate_fix (fixp, seg)
|
||||
#ifdef TE_PE
|
||||
|
||||
/*
|
||||
* Summary of parse_toc_entry().
|
||||
* Summary of parse_toc_entry.
|
||||
*
|
||||
* in: Input_line_pointer points to the '[' in one of:
|
||||
*
|
||||
@ -1623,7 +1635,7 @@ enum toc_size_qualifier
|
||||
};
|
||||
|
||||
static int
|
||||
parse_toc_entry(toc_kind)
|
||||
parse_toc_entry (toc_kind)
|
||||
enum toc_size_qualifier *toc_kind;
|
||||
{
|
||||
char *start;
|
||||
@ -1631,43 +1643,43 @@ parse_toc_entry(toc_kind)
|
||||
char c;
|
||||
enum toc_size_qualifier t;
|
||||
|
||||
/* save the input_line_pointer */
|
||||
/* Save the input_line_pointer. */
|
||||
start = input_line_pointer;
|
||||
|
||||
/* skip over the '[' , and whitespace */
|
||||
/* Skip over the '[' , and whitespace. */
|
||||
++input_line_pointer;
|
||||
SKIP_WHITESPACE ();
|
||||
|
||||
/* find the spelling of the operand */
|
||||
/* Find the spelling of the operand. */
|
||||
toc_spec = input_line_pointer;
|
||||
c = get_symbol_end ();
|
||||
|
||||
if (strcmp(toc_spec, "toc") == 0)
|
||||
if (strcmp (toc_spec, "toc") == 0)
|
||||
{
|
||||
t = default_toc;
|
||||
}
|
||||
else if (strcmp(toc_spec, "tocv") == 0)
|
||||
else if (strcmp (toc_spec, "tocv") == 0)
|
||||
{
|
||||
t = data_in_toc;
|
||||
}
|
||||
else if (strcmp(toc_spec, "toc32") == 0)
|
||||
else if (strcmp (toc_spec, "toc32") == 0)
|
||||
{
|
||||
t = must_be_32;
|
||||
}
|
||||
else if (strcmp(toc_spec, "toc64") == 0)
|
||||
else if (strcmp (toc_spec, "toc64") == 0)
|
||||
{
|
||||
t = must_be_64;
|
||||
}
|
||||
else
|
||||
{
|
||||
as_bad (_("syntax error: invalid toc specifier `%s'"), toc_spec);
|
||||
*input_line_pointer = c; /* put back the delimiting char */
|
||||
input_line_pointer = start; /* reset input_line pointer */
|
||||
*input_line_pointer = c;
|
||||
input_line_pointer = start;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* now find the ']' */
|
||||
*input_line_pointer = c; /* put back the delimiting char */
|
||||
/* Now find the ']'. */
|
||||
*input_line_pointer = c;
|
||||
|
||||
SKIP_WHITESPACE (); /* leading whitespace could be there. */
|
||||
c = *input_line_pointer++; /* input_line_pointer->past char in c. */
|
||||
@ -1675,11 +1687,11 @@ parse_toc_entry(toc_kind)
|
||||
if (c != ']')
|
||||
{
|
||||
as_bad (_("syntax error: expected `]', found `%c'"), c);
|
||||
input_line_pointer = start; /* reset input_line pointer */
|
||||
input_line_pointer = start;
|
||||
return 0;
|
||||
}
|
||||
|
||||
*toc_kind = t; /* set return value */
|
||||
*toc_kind = t;
|
||||
return 1;
|
||||
}
|
||||
#endif
|
||||
@ -1846,84 +1858,85 @@ md_assemble (str)
|
||||
if (*input_line_pointer == '[')
|
||||
{
|
||||
/* We are expecting something like the second argument here:
|
||||
|
||||
lwz r4,[toc].GS.0.static_int(rtoc)
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
The argument following the `]' must be a symbol name, and the
|
||||
register must be the toc register: 'rtoc' or '2'
|
||||
|
||||
The effect is to 0 as the displacement field
|
||||
in the instruction, and issue an IMAGE_REL_PPC_TOCREL16 (or
|
||||
the appropriate variation) reloc against it based on the symbol.
|
||||
The linker will build the toc, and insert the resolved toc offset.
|
||||
|
||||
Note:
|
||||
o The size of the toc entry is currently assumed to be
|
||||
32 bits. This should not be assumed to be a hard coded
|
||||
number.
|
||||
o In an effort to cope with a change from 32 to 64 bits,
|
||||
there are also toc entries that are specified to be
|
||||
either 32 or 64 bits:
|
||||
lwz r4,[toc32].GS.0.static_int(rtoc)
|
||||
lwz r4,[toc64].GS.0.static_int(rtoc)
|
||||
These demand toc entries of the specified size, and the
|
||||
instruction probably requires it.
|
||||
*
|
||||
* lwz r4,[toc].GS.0.static_int(rtoc)
|
||||
* ^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
* The argument following the `]' must be a symbol name, and the
|
||||
* register must be the toc register: 'rtoc' or '2'
|
||||
*
|
||||
* The effect is to 0 as the displacement field
|
||||
* in the instruction, and issue an IMAGE_REL_PPC_TOCREL16 (or
|
||||
* the appropriate variation) reloc against it based on the symbol.
|
||||
* The linker will build the toc, and insert the resolved toc offset.
|
||||
*
|
||||
* Note:
|
||||
* o The size of the toc entry is currently assumed to be
|
||||
* 32 bits. This should not be assumed to be a hard coded
|
||||
* number.
|
||||
* o In an effort to cope with a change from 32 to 64 bits,
|
||||
* there are also toc entries that are specified to be
|
||||
* either 32 or 64 bits:
|
||||
* lwz r4,[toc32].GS.0.static_int(rtoc)
|
||||
* lwz r4,[toc64].GS.0.static_int(rtoc)
|
||||
* These demand toc entries of the specified size, and the
|
||||
* instruction probably requires it.
|
||||
*/
|
||||
|
||||
int valid_toc;
|
||||
enum toc_size_qualifier toc_kind;
|
||||
bfd_reloc_code_real_type toc_reloc;
|
||||
|
||||
/* go parse off the [tocXX] part */
|
||||
valid_toc = parse_toc_entry(&toc_kind);
|
||||
/* Go parse off the [tocXX] part. */
|
||||
valid_toc = parse_toc_entry (&toc_kind);
|
||||
|
||||
if (!valid_toc)
|
||||
{
|
||||
/* Note: message has already been issued. */
|
||||
/* FIXME: what sort of recovery should we do? */
|
||||
/* demand_rest_of_line(); return; ? */
|
||||
/* Note: message has already been issued.
|
||||
FIXME: what sort of recovery should we do?
|
||||
demand_rest_of_line (); return; ? */
|
||||
}
|
||||
|
||||
/* Now get the symbol following the ']' */
|
||||
expression(&ex);
|
||||
/* Now get the symbol following the ']'. */
|
||||
expression (&ex);
|
||||
|
||||
switch (toc_kind)
|
||||
{
|
||||
case default_toc:
|
||||
/* In this case, we may not have seen the symbol yet, since */
|
||||
/* it is allowed to appear on a .extern or .globl or just be */
|
||||
/* a label in the .data section. */
|
||||
/* In this case, we may not have seen the symbol yet,
|
||||
since it is allowed to appear on a .extern or .globl
|
||||
or just be a label in the .data section. */
|
||||
toc_reloc = BFD_RELOC_PPC_TOC16;
|
||||
break;
|
||||
case data_in_toc:
|
||||
/* 1. The symbol must be defined and either in the toc */
|
||||
/* section, or a global. */
|
||||
/* 2. The reloc generated must have the TOCDEFN flag set in */
|
||||
/* upper bit mess of the reloc type. */
|
||||
/* FIXME: It's a little confusing what the tocv qualifier can */
|
||||
/* be used for. At the very least, I've seen three */
|
||||
/* uses, only one of which I'm sure I can explain. */
|
||||
/* 1. The symbol must be defined and either in the toc
|
||||
section, or a global.
|
||||
2. The reloc generated must have the TOCDEFN flag set
|
||||
in upper bit mess of the reloc type.
|
||||
FIXME: It's a little confusing what the tocv
|
||||
qualifier can be used for. At the very least, I've
|
||||
seen three uses, only one of which I'm sure I can
|
||||
explain. */
|
||||
if (ex.X_op == O_symbol)
|
||||
{
|
||||
assert (ex.X_add_symbol != NULL);
|
||||
if (symbol_get_bfdsym (ex.X_add_symbol)->section
|
||||
!= tocdata_section)
|
||||
{
|
||||
as_bad(_("[tocv] symbol is not a toc symbol"));
|
||||
as_bad (_("[tocv] symbol is not a toc symbol"));
|
||||
}
|
||||
}
|
||||
|
||||
toc_reloc = BFD_RELOC_PPC_TOC16;
|
||||
break;
|
||||
case must_be_32:
|
||||
/* FIXME: these next two specifically specify 32/64 bit toc */
|
||||
/* entries. We don't support them today. Is this the */
|
||||
/* right way to say that? */
|
||||
/* FIXME: these next two specifically specify 32/64 bit
|
||||
toc entries. We don't support them today. Is this
|
||||
the right way to say that? */
|
||||
toc_reloc = BFD_RELOC_UNUSED;
|
||||
as_bad (_("Unimplemented toc32 expression modifier"));
|
||||
break;
|
||||
case must_be_64:
|
||||
/* FIXME: see above */
|
||||
/* FIXME: see above. */
|
||||
toc_reloc = BFD_RELOC_UNUSED;
|
||||
as_bad (_("Unimplemented toc64 expression modifier"));
|
||||
break;
|
||||
@ -1945,7 +1958,7 @@ md_assemble (str)
|
||||
++fc;
|
||||
|
||||
/* Ok. We've set up the fixup for the instruction. Now make it
|
||||
look like the constant 0 was found here */
|
||||
look like the constant 0 was found here. */
|
||||
ex.X_unsigned = 1;
|
||||
ex.X_op = O_constant;
|
||||
ex.X_add_number = 0;
|
||||
@ -2020,8 +2033,8 @@ md_assemble (str)
|
||||
#ifdef OBJ_ELF
|
||||
else if ((reloc = ppc_elf_suffix (&str, &ex)) != BFD_RELOC_UNUSED)
|
||||
{
|
||||
/* For the absoulte forms of branchs, convert the PC relative form back into
|
||||
the absolute. */
|
||||
/* For the absolute forms of branches, convert the PC
|
||||
relative form back into the absolute. */
|
||||
if ((operand->flags & PPC_OPERAND_ABSOLUTE) != 0)
|
||||
{
|
||||
switch (reloc)
|
||||
@ -2117,11 +2130,12 @@ md_assemble (str)
|
||||
operand = &powerpc_operands[fixups[i].opindex];
|
||||
if (fixups[i].reloc != BFD_RELOC_UNUSED)
|
||||
{
|
||||
reloc_howto_type *reloc_howto = bfd_reloc_type_lookup (stdoutput, fixups[i].reloc);
|
||||
reloc_howto_type *reloc_howto;
|
||||
int size;
|
||||
int offset;
|
||||
fixS *fixP;
|
||||
|
||||
reloc_howto = bfd_reloc_type_lookup (stdoutput, fixups[i].reloc);
|
||||
if (!reloc_howto)
|
||||
abort ();
|
||||
|
||||
@ -2131,8 +2145,11 @@ md_assemble (str)
|
||||
if (size < 1 || size > 4)
|
||||
abort ();
|
||||
|
||||
fixP = fix_new_exp (frag_now, f - frag_now->fr_literal + offset, size,
|
||||
&fixups[i].exp, reloc_howto->pc_relative,
|
||||
fixP = fix_new_exp (frag_now,
|
||||
f - frag_now->fr_literal + offset,
|
||||
size,
|
||||
&fixups[i].exp,
|
||||
reloc_howto->pc_relative,
|
||||
fixups[i].reloc);
|
||||
|
||||
/* Turn off complaints that the addend is too large for things like
|
||||
@ -2151,7 +2168,9 @@ md_assemble (str)
|
||||
}
|
||||
}
|
||||
else
|
||||
fix_new_exp (frag_now, f - frag_now->fr_literal, 4,
|
||||
fix_new_exp (frag_now,
|
||||
f - frag_now->fr_literal,
|
||||
4,
|
||||
&fixups[i].exp,
|
||||
(operand->flags & PPC_OPERAND_RELATIVE) != 0,
|
||||
((bfd_reloc_code_real_type)
|
||||
@ -2240,7 +2259,7 @@ ppc_macro (str, macro)
|
||||
}
|
||||
|
||||
#ifdef OBJ_ELF
|
||||
/* For ELF, add support for SHF_EXCLUDE and SHT_ORDERED */
|
||||
/* For ELF, add support for SHF_EXCLUDE and SHT_ORDERED. */
|
||||
|
||||
int
|
||||
ppc_section_letter (letter, ptr_msg)
|
||||
@ -3426,7 +3445,7 @@ ppc_tc (ignore)
|
||||
|
||||
#ifdef TE_PE
|
||||
|
||||
/* Pseudo-ops specific to the Windows NT PowerPC PE (coff) format */
|
||||
/* Pseudo-ops specific to the Windows NT PowerPC PE (coff) format. */
|
||||
|
||||
/* Set the current section. */
|
||||
static void
|
||||
@ -3440,23 +3459,23 @@ ppc_set_current_section (new)
|
||||
/* pseudo-op: .previous
|
||||
behaviour: toggles the current section with the previous section.
|
||||
errors: None
|
||||
warnings: "No previous section"
|
||||
*/
|
||||
warnings: "No previous section" */
|
||||
|
||||
static void
|
||||
ppc_previous(ignore)
|
||||
ppc_previous (ignore)
|
||||
int ignore ATTRIBUTE_UNUSED;
|
||||
{
|
||||
symbolS *tmp;
|
||||
|
||||
if (ppc_previous_section == NULL)
|
||||
{
|
||||
as_warn(_("No previous section to return to. Directive ignored."));
|
||||
as_warn (_("No previous section to return to. Directive ignored."));
|
||||
return;
|
||||
}
|
||||
|
||||
subseg_set(ppc_previous_section, 0);
|
||||
subseg_set (ppc_previous_section, 0);
|
||||
|
||||
ppc_set_current_section(ppc_previous_section);
|
||||
ppc_set_current_section (ppc_previous_section);
|
||||
}
|
||||
|
||||
/* pseudo-op: .pdata
|
||||
@ -3472,11 +3491,10 @@ ppc_previous(ignore)
|
||||
|
||||
commentary:
|
||||
Tag index tables (also known as the function table) for exception
|
||||
handling, debugging, etc.
|
||||
handling, debugging, etc. */
|
||||
|
||||
*/
|
||||
static void
|
||||
ppc_pdata(ignore)
|
||||
ppc_pdata (ignore)
|
||||
int ignore ATTRIBUTE_UNUSED;
|
||||
{
|
||||
if (pdata_section == 0)
|
||||
@ -3491,9 +3509,9 @@ ppc_pdata(ignore)
|
||||
}
|
||||
else
|
||||
{
|
||||
pdata_section = subseg_new(".pdata", 0);
|
||||
pdata_section = subseg_new (".pdata", 0);
|
||||
}
|
||||
ppc_set_current_section(pdata_section);
|
||||
ppc_set_current_section (pdata_section);
|
||||
}
|
||||
|
||||
/* pseudo-op: .ydata
|
||||
@ -3508,10 +3526,10 @@ ppc_pdata(ignore)
|
||||
3 - double word aligned (that would be 4 byte boundary)
|
||||
commentary:
|
||||
Tag tables (also known as the scope table) for exception handling,
|
||||
debugging, etc.
|
||||
*/
|
||||
debugging, etc. */
|
||||
|
||||
static void
|
||||
ppc_ydata(ignore)
|
||||
ppc_ydata (ignore)
|
||||
int ignore ATTRIBUTE_UNUSED;
|
||||
{
|
||||
if (ydata_section == 0)
|
||||
@ -3527,7 +3545,7 @@ ppc_ydata(ignore)
|
||||
{
|
||||
ydata_section = subseg_new (".ydata", 0);
|
||||
}
|
||||
ppc_set_current_section(ydata_section);
|
||||
ppc_set_current_section (ydata_section);
|
||||
}
|
||||
|
||||
/* pseudo-op: .reldata
|
||||
@ -3545,10 +3563,10 @@ ppc_ydata(ignore)
|
||||
|
||||
commentary:
|
||||
Like .data, but intended to hold data subject to relocation, such as
|
||||
function descriptors, etc.
|
||||
*/
|
||||
function descriptors, etc. */
|
||||
|
||||
static void
|
||||
ppc_reldata(ignore)
|
||||
ppc_reldata (ignore)
|
||||
int ignore ATTRIBUTE_UNUSED;
|
||||
{
|
||||
if (reldata_section == 0)
|
||||
@ -3556,8 +3574,8 @@ ppc_reldata(ignore)
|
||||
reldata_section = subseg_new (".reldata", 0);
|
||||
|
||||
bfd_set_section_flags (stdoutput, reldata_section,
|
||||
( SEC_ALLOC | SEC_LOAD | SEC_RELOC
|
||||
| SEC_DATA ));
|
||||
(SEC_ALLOC | SEC_LOAD | SEC_RELOC
|
||||
| SEC_DATA));
|
||||
|
||||
bfd_set_section_alignment (stdoutput, reldata_section, 2);
|
||||
}
|
||||
@ -3565,7 +3583,7 @@ ppc_reldata(ignore)
|
||||
{
|
||||
reldata_section = subseg_new (".reldata", 0);
|
||||
}
|
||||
ppc_set_current_section(reldata_section);
|
||||
ppc_set_current_section (reldata_section);
|
||||
}
|
||||
|
||||
/* pseudo-op: .rdata
|
||||
@ -3576,10 +3594,10 @@ ppc_reldata(ignore)
|
||||
initial: .section .rdata "dr3"
|
||||
d - initialized data
|
||||
r - readable
|
||||
3 - double word aligned (that would be 4 byte boundary)
|
||||
*/
|
||||
3 - double word aligned (that would be 4 byte boundary) */
|
||||
|
||||
static void
|
||||
ppc_rdata(ignore)
|
||||
ppc_rdata (ignore)
|
||||
int ignore ATTRIBUTE_UNUSED;
|
||||
{
|
||||
if (rdata_section == 0)
|
||||
@ -3595,7 +3613,7 @@ ppc_rdata(ignore)
|
||||
{
|
||||
rdata_section = subseg_new (".rdata", 0);
|
||||
}
|
||||
ppc_set_current_section(rdata_section);
|
||||
ppc_set_current_section (rdata_section);
|
||||
}
|
||||
|
||||
/* pseudo-op: .ualong
|
||||
@ -3603,14 +3621,14 @@ ppc_rdata(ignore)
|
||||
performed.
|
||||
FIXME: test the alignment statement
|
||||
errors: None
|
||||
warnings: None
|
||||
*/
|
||||
warnings: None */
|
||||
|
||||
static void
|
||||
ppc_ualong(ignore)
|
||||
ppc_ualong (ignore)
|
||||
int ignore ATTRIBUTE_UNUSED;
|
||||
{
|
||||
/* try for long */
|
||||
cons ( 4 );
|
||||
/* Try for long. */
|
||||
cons (4);
|
||||
}
|
||||
|
||||
/* pseudo-op: .znop <symbol name>
|
||||
@ -3618,20 +3636,17 @@ ppc_ualong(ignore)
|
||||
Issue a IMAGE_REL_PPC_IFGLUE relocation against it, using
|
||||
the supplied symbol name.
|
||||
errors: None
|
||||
warnings: Missing symbol name
|
||||
*/
|
||||
warnings: Missing symbol name */
|
||||
|
||||
static void
|
||||
ppc_znop(ignore)
|
||||
ppc_znop (ignore)
|
||||
int ignore ATTRIBUTE_UNUSED;
|
||||
{
|
||||
unsigned long insn;
|
||||
const struct powerpc_opcode *opcode;
|
||||
expressionS ex;
|
||||
char *f;
|
||||
|
||||
symbolS *sym;
|
||||
|
||||
/* Strip out the symbol name */
|
||||
char *symbol_name;
|
||||
char c;
|
||||
char *name;
|
||||
@ -3639,6 +3654,7 @@ ppc_znop(ignore)
|
||||
flagword flags;
|
||||
asection *sec;
|
||||
|
||||
/* Strip out the symbol name. */
|
||||
symbol_name = input_line_pointer;
|
||||
c = get_symbol_end ();
|
||||
|
||||
@ -3654,7 +3670,7 @@ ppc_znop(ignore)
|
||||
/* Look up the opcode in the hash table. */
|
||||
opcode = (const struct powerpc_opcode *) hash_find (ppc_hash, "nop");
|
||||
|
||||
/* stick in the nop */
|
||||
/* Stick in the nop. */
|
||||
insn = opcode->opcode;
|
||||
|
||||
/* Write out the instruction. */
|
||||
@ -3673,10 +3689,10 @@ ppc_znop(ignore)
|
||||
/* pseudo-op:
|
||||
behaviour:
|
||||
errors:
|
||||
warnings:
|
||||
*/
|
||||
warnings: */
|
||||
|
||||
static void
|
||||
ppc_pe_comm(lcomm)
|
||||
ppc_pe_comm (lcomm)
|
||||
int lcomm;
|
||||
{
|
||||
register char *name;
|
||||
@ -3689,7 +3705,7 @@ ppc_pe_comm(lcomm)
|
||||
name = input_line_pointer;
|
||||
c = get_symbol_end ();
|
||||
|
||||
/* just after name is now '\0' */
|
||||
/* just after name is now '\0'. */
|
||||
p = input_line_pointer;
|
||||
*p = c;
|
||||
SKIP_WHITESPACE ();
|
||||
@ -3808,7 +3824,7 @@ void
|
||||
ppc_pe_section (ignore)
|
||||
int ignore ATTRIBUTE_UNUSED;
|
||||
{
|
||||
/* Strip out the section name */
|
||||
/* Strip out the section name. */
|
||||
char *section_name;
|
||||
char c;
|
||||
char *name;
|
||||
@ -3851,7 +3867,8 @@ ppc_pe_section (ignore)
|
||||
align = 1;
|
||||
}
|
||||
else
|
||||
align = 4; /* default alignment to 16 byte boundary */
|
||||
/* Default alignment to 16 byte boundary. */
|
||||
align = 4;
|
||||
|
||||
if (*input_line_pointer == ',')
|
||||
{
|
||||
@ -3939,7 +3956,7 @@ ppc_pe_section (ignore)
|
||||
break;
|
||||
|
||||
default:
|
||||
as_bad(_("unknown section attribute '%c'"),
|
||||
as_bad (_("unknown section attribute '%c'"),
|
||||
*input_line_pointer);
|
||||
break;
|
||||
}
|
||||
@ -3952,7 +3969,7 @@ ppc_pe_section (ignore)
|
||||
|
||||
sec = subseg_new (name, (subsegT) exp);
|
||||
|
||||
ppc_set_current_section(sec);
|
||||
ppc_set_current_section (sec);
|
||||
|
||||
if (flags != SEC_NO_FLAGS)
|
||||
{
|
||||
@ -3962,7 +3979,7 @@ ppc_pe_section (ignore)
|
||||
bfd_errmsg (bfd_get_error ()));
|
||||
}
|
||||
|
||||
bfd_set_section_alignment(stdoutput, sec, align);
|
||||
bfd_set_section_alignment (stdoutput, sec, align);
|
||||
|
||||
}
|
||||
|
||||
@ -3996,10 +4013,10 @@ ppc_pe_tocd (ignore)
|
||||
if (tocdata_section == 0)
|
||||
{
|
||||
tocdata_section = subseg_new (".tocd", 0);
|
||||
/* FIXME: section flags won't work */
|
||||
/* FIXME: section flags won't work. */
|
||||
bfd_set_section_flags (stdoutput, tocdata_section,
|
||||
(SEC_ALLOC | SEC_LOAD | SEC_RELOC
|
||||
| SEC_READONLY | SEC_DATA ));
|
||||
| SEC_READONLY | SEC_DATA));
|
||||
|
||||
bfd_set_section_alignment (stdoutput, tocdata_section, 2);
|
||||
}
|
||||
@ -4008,7 +4025,7 @@ ppc_pe_tocd (ignore)
|
||||
rdata_section = subseg_new (".tocd", 0);
|
||||
}
|
||||
|
||||
ppc_set_current_section(tocdata_section);
|
||||
ppc_set_current_section (tocdata_section);
|
||||
|
||||
demand_empty_rest_of_line ();
|
||||
}
|
||||
@ -5064,7 +5081,7 @@ md_apply_fix3 (fixp, valuep, seg)
|
||||
break;
|
||||
|
||||
/* Because SDA21 modifies the register field, the size is set to 4
|
||||
bytes, rather than 2, so offset it here appropriately */
|
||||
bytes, rather than 2, so offset it here appropriately. */
|
||||
case BFD_RELOC_PPC_EMB_SDA21:
|
||||
if (fixp->fx_pcrel)
|
||||
abort ();
|
||||
@ -5106,7 +5123,7 @@ md_apply_fix3 (fixp, valuep, seg)
|
||||
|| (offsetT) value >= 0x40000000)
|
||||
as_bad_where (fixp->fx_file, fixp->fx_line,
|
||||
_("@local or @plt branch destination is too far away, %ld bytes"),
|
||||
value);
|
||||
(long) value);
|
||||
insn = insn | (value & 0x03fffffc);
|
||||
if (target_big_endian)
|
||||
bfd_putb32 ((bfd_vma) insn, (unsigned char *) where);
|
||||
@ -5130,7 +5147,7 @@ md_apply_fix3 (fixp, valuep, seg)
|
||||
default:
|
||||
fprintf (stderr,
|
||||
_("Gas failure, reloc value %d\n"), fixp->fx_r_type);
|
||||
fflush(stderr);
|
||||
fflush (stderr);
|
||||
abort ();
|
||||
}
|
||||
}
|
||||
@ -5174,7 +5191,8 @@ tc_gen_reloc (seg, fixp)
|
||||
if (reloc->howto == (reloc_howto_type *) NULL)
|
||||
{
|
||||
as_bad_where (fixp->fx_file, fixp->fx_line,
|
||||
_("reloc %d not supported by object file format"), (int)fixp->fx_r_type);
|
||||
_("reloc %d not supported by object file format"),
|
||||
(int) fixp->fx_r_type);
|
||||
return NULL;
|
||||
}
|
||||
reloc->addend = fixp->fx_addnumber;
|
||||
|
Reference in New Issue
Block a user