Kazu Hirata's formatting fixes.

This commit is contained in:
Alan Modra
2000-07-27 04:05:05 +00:00
parent 6166d547d8
commit e0c6ed95b5
4 changed files with 907 additions and 892 deletions

View File

@ -1,3 +1,13 @@
2000-07-27 Alan Modra <alan@linuxcare.com.au>
* config/tc-d10v.c (find_opcode): Remove extraneous `='.
2000-07-27 Kazu Hirata <kazu@hxi.com>
* config/tc-d10v.c: Fix formatting.
* config/tc-z8k.c: Likewise.
* config/tc-sparc.c: Likewise.
2000-07-26 Dave Brolley <brolley@redhat.com> 2000-07-26 Dave Brolley <brolley@redhat.com>
* cgen.c (queue_fixup): Declare opinfo. * cgen.c (queue_fixup): Declare opinfo.

File diff suppressed because it is too large Load Diff

View File

@ -1,5 +1,6 @@
/* tc-sparc.c -- Assemble for the SPARC /* tc-sparc.c -- Assemble for the SPARC
Copyright (C) 1989, 90-96, 97, 98, 99, 2000 Free Software Foundation, Inc. Copyright (C) 1989, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 2000
Free Software Foundation, Inc.
This file is part of GAS, the GNU Assembler. This file is part of GAS, the GNU Assembler.
GAS is free software; you can redistribute it and/or modify GAS is free software; you can redistribute it and/or modify
@ -117,7 +118,7 @@ static symbolS *globals[8];
|| SPARC_OPCODE_ARCH_V9_P (max_architecture)) || SPARC_OPCODE_ARCH_V9_P (max_architecture))
#endif #endif
/* handle of the OPCODE hash table */ /* Handle of the OPCODE hash table. */
static struct hash_control *op_hash; static struct hash_control *op_hash;
static int log2 PARAMS ((int)); static int log2 PARAMS ((int));
@ -133,7 +134,7 @@ static void s_register PARAMS ((int));
const pseudo_typeS md_pseudo_table[] = const pseudo_typeS md_pseudo_table[] =
{ {
{"align", s_align_bytes, 0}, /* Defaulting is invalid (0) */ {"align", s_align_bytes, 0}, /* Defaulting is invalid (0). */
{"common", s_common, 0}, {"common", s_common, 0},
{"empty", s_empty, 0}, {"empty", s_empty, 0},
{"global", s_globl, 0}, {"global", s_globl, 0},
@ -150,7 +151,7 @@ const pseudo_typeS md_pseudo_table[] =
{"uaword", s_uacons, 4}, {"uaword", s_uacons, 4},
{"uaxword", s_uacons, 8}, {"uaxword", s_uacons, 8},
#ifdef OBJ_ELF #ifdef OBJ_ELF
/* these are specific to sparc/svr4 */ /* These are specific to sparc/svr4. */
{"2byte", s_uacons, 2}, {"2byte", s_uacons, 2},
{"4byte", s_uacons, 4}, {"4byte", s_uacons, 4},
{"8byte", s_uacons, 8}, {"8byte", s_uacons, 8},
@ -159,15 +160,17 @@ const pseudo_typeS md_pseudo_table[] =
{NULL, 0, 0}, {NULL, 0, 0},
}; };
const int md_reloc_size = 12; /* Size of relocation record */ /* Size of relocation record. */
const int md_reloc_size = 12;
/* This array holds the chars that always start a comment. If the /* This array holds the chars that always start a comment. If the
pre-processor is disabled, these aren't very useful */ pre-processor is disabled, these aren't very useful. */
const char comment_chars[] = "!"; /* JF removed '|' from comment_chars */ const char comment_chars[] = "!"; /* JF removed '|' from
comment_chars. */
/* This array holds the chars that only start a comment at the beginning of /* This array holds the chars that only start a comment at the beginning of
a line. If the line seems to have the form '# 123 filename' a line. If the line seems to have the form '# 123 filename'
.line and .file directives will appear in the pre-processed output */ .line and .file directives will appear in the pre-processed output. */
/* Note that input_file.c hand checks for '#' at the beginning of the /* Note that input_file.c hand checks for '#' at the beginning of the
first line of the input file. This is because the compiler outputs first line of the input file. This is because the compiler outputs
#NO_APP at the beginning of its output. */ #NO_APP at the beginning of its output. */
@ -177,12 +180,13 @@ const char line_comment_chars[] = "#";
const char line_separator_chars[] = ";"; const char line_separator_chars[] = ";";
/* Chars that can be used to separate mant from exp in floating point nums */ /* Chars that can be used to separate mant from exp in floating point
nums. */
const char EXP_CHARS[] = "eE"; const char EXP_CHARS[] = "eE";
/* Chars that mean this number is a floating point constant */ /* Chars that mean this number is a floating point constant.
/* As in 0f12.456 */ As in 0f12.456
/* or 0d1.2345e12 */ or 0d1.2345e12 */
const char FLT_CHARS[] = "rRsSfFdDxXpP"; const char FLT_CHARS[] = "rRsSfFdDxXpP";
/* Also be aware that MAXIMUM_NUMBER_OF_CHARS_FOR_FLOAT may have to be /* Also be aware that MAXIMUM_NUMBER_OF_CHARS_FOR_FLOAT may have to be
@ -323,8 +327,7 @@ sparc_target_format ()
abort (); abort ();
} }
/* /* md_parse_option
* md_parse_option
* Invocation line includes a switch not recognized by the base assembler. * Invocation line includes a switch not recognized by the base assembler.
* See if it's a processor-specific option. These are: * See if it's a processor-specific option. These are:
* *
@ -424,7 +427,8 @@ struct option md_longopts[] = {
{"no-relax", no_argument, NULL, OPTION_NO_RELAX}, {"no-relax", no_argument, NULL, OPTION_NO_RELAX},
{NULL, no_argument, NULL, 0} {NULL, no_argument, NULL, 0}
}; };
size_t md_longopts_size = sizeof(md_longopts);
size_t md_longopts_size = sizeof (md_longopts);
int int
md_parse_option (c, arg) md_parse_option (c, arg)
@ -451,8 +455,7 @@ md_parse_option (c, arg)
as_bad (_("invalid architecture -xarch=%s"), arg); as_bad (_("invalid architecture -xarch=%s"), arg);
return 0; return 0;
} }
/* Fall through. */
/* fall through */
case 'A': case 'A':
{ {
@ -554,15 +557,15 @@ md_parse_option (c, arg)
case 'Q': case 'Q':
/* Qy - do emit .comment /* Qy - do emit .comment
Qn - do not emit .comment */ Qn - do not emit .comment. */
break; break;
case 's': case 's':
/* use .stab instead of .stab.excl */ /* Use .stab instead of .stab.excl. */
break; break;
case 'q': case 'q':
/* quick -- native assembler does fewer checks */ /* quick -- Native assembler does fewer checks. */
break; break;
case 'K': case 'K':
@ -607,7 +610,7 @@ md_show_usage (stream)
if (! default_init_p) if (! default_init_p)
init_default_arch (); init_default_arch ();
fprintf(stream, _("SPARC options:\n")); fprintf (stream, _("SPARC options:\n"));
for (arch = &sparc_arch_table[0]; arch->name; arch++) for (arch = &sparc_arch_table[0]; arch->name; arch++)
{ {
if (arch != &sparc_arch_table[0]) if (arch != &sparc_arch_table[0])
@ -659,7 +662,7 @@ md_show_usage (stream)
#endif #endif
} }
/* native operand size opcode translation */ /* Native operand size opcode translation. */
struct struct
{ {
char *name; char *name;
@ -680,7 +683,7 @@ struct
{NULL, NULL, NULL}, {NULL, NULL, NULL},
}; };
/* sparc64 priviledged registers */ /* sparc64 priviledged registers. */
struct priv_reg_entry struct priv_reg_entry
{ {
@ -707,10 +710,10 @@ struct priv_reg_entry priv_reg_table[] =
{"wstate", 14}, {"wstate", 14},
{"fq", 15}, {"fq", 15},
{"ver", 31}, {"ver", 31},
{"", -1}, /* end marker */ {"", -1}, /* End marker. */
}; };
/* v9a specific asrs */ /* v9a specific asrs. */
struct priv_reg_entry v9a_asr_table[] = struct priv_reg_entry v9a_asr_table[] =
{ {
@ -722,7 +725,7 @@ struct priv_reg_entry v9a_asr_table[] =
{"gsr", 19}, {"gsr", 19},
{"dcr", 18}, {"dcr", 18},
{"clear_softint", 21}, {"clear_softint", 21},
{"", -1}, /* end marker */ {"", -1}, /* End marker. */
}; };
static int static int
@ -737,7 +740,8 @@ cmp_reg_entry (parg, qarg)
} }
/* This function is called once, at assembler startup time. It should /* This function is called once, at assembler startup time. It should
set up all the tables, etc. that the MD part of the assembler will need. */ set up all the tables, etc. that the MD part of the assembler will
need. */
void void
md_begin () md_begin ()
@ -783,7 +787,7 @@ md_begin ()
const struct sparc_opcode *insn; const struct sparc_opcode *insn;
char *name = sparc_arch_size == 32 ? native_op_table[i].name32 : char *name = sparc_arch_size == 32 ? native_op_table[i].name32 :
native_op_table[i].name64; native_op_table[i].name64;
insn = (struct sparc_opcode *)hash_find (op_hash, name); insn = (struct sparc_opcode *) hash_find (op_hash, name);
if (insn == NULL) if (insn == NULL)
{ {
as_bad (_("Internal error: can't find opcode `%s' for `%s'\n"), as_bad (_("Internal error: can't find opcode `%s' for `%s'\n"),
@ -857,9 +861,9 @@ sparc_md_end ()
bfd_set_arch_mach (stdoutput, bfd_arch_sparc, bfd_mach_sparc_sparclite_le); bfd_set_arch_mach (stdoutput, bfd_arch_sparc, bfd_mach_sparc_sparclite_le);
else else
{ {
/* The sparclite is treated like a normal sparc. Perhaps it shouldn't /* The sparclite is treated like a normal sparc. Perhaps it
be but for now it is (since that's the way it's always been shouldn't be but for now it is (since that's the way it's
treated). */ always been treated). */
bfd_set_arch_mach (stdoutput, bfd_arch_sparc, bfd_mach_sparc); bfd_set_arch_mach (stdoutput, bfd_arch_sparc, bfd_mach_sparc);
} }
} }
@ -877,7 +881,7 @@ in_signed_range (val, max)
0xffffffff is always considered -1 on sparc32. */ 0xffffffff is always considered -1 on sparc32. */
if (sparc_arch_size == 32) if (sparc_arch_size == 32)
{ {
bfd_signed_vma sign = (bfd_signed_vma)1 << 31; bfd_signed_vma sign = (bfd_signed_vma) 1 << 31;
val = ((val & 0xffffffff) ^ sign) - sign; val = ((val & 0xffffffff) ^ sign) - sign;
} }
if (val > max) if (val > max)
@ -967,6 +971,7 @@ static const struct sparc_opcode *last_insn;
static unsigned long last_opcode; static unsigned long last_opcode;
/* Handle the set and setuw synthetic instructions. */ /* Handle the set and setuw synthetic instructions. */
static void static void
synthetize_setuw (insn) synthetize_setuw (insn)
const struct sparc_opcode *insn; const struct sparc_opcode *insn;
@ -978,18 +983,18 @@ synthetize_setuw (insn)
{ {
if (SPARC_OPCODE_ARCH_V9_P (max_architecture)) if (SPARC_OPCODE_ARCH_V9_P (max_architecture))
{ {
if (sizeof(offsetT) > 4 if (sizeof (offsetT) > 4
&& (the_insn.exp.X_add_number < 0 && (the_insn.exp.X_add_number < 0
|| the_insn.exp.X_add_number > (offsetT) 0xffffffff)) || the_insn.exp.X_add_number > (offsetT) 0xffffffff))
as_warn (_("set: number not in 0..4294967295 range")); as_warn (_("set: number not in 0..4294967295 range"));
} }
else else
{ {
if (sizeof(offsetT) > 4 if (sizeof (offsetT) > 4
&& (the_insn.exp.X_add_number < -(offsetT) 0x80000000 && (the_insn.exp.X_add_number < -(offsetT) 0x80000000
|| the_insn.exp.X_add_number > (offsetT) 0xffffffff)) || the_insn.exp.X_add_number > (offsetT) 0xffffffff))
as_warn (_("set: number not in -2147483648..4294967295 range")); as_warn (_("set: number not in -2147483648..4294967295 range"));
the_insn.exp.X_add_number = (int)the_insn.exp.X_add_number; the_insn.exp.X_add_number = (int) the_insn.exp.X_add_number;
} }
} }
@ -1026,6 +1031,7 @@ synthetize_setuw (insn)
} }
/* Handle the setsw synthetic instruction. */ /* Handle the setsw synthetic instruction. */
static void static void
synthetize_setsw (insn) synthetize_setsw (insn)
const struct sparc_opcode *insn; const struct sparc_opcode *insn;
@ -1045,7 +1051,7 @@ synthetize_setsw (insn)
return; return;
} }
if (sizeof(offsetT) > 4 if (sizeof (offsetT) > 4
&& (the_insn.exp.X_add_number < -(offsetT) 0x80000000 && (the_insn.exp.X_add_number < -(offsetT) 0x80000000
|| the_insn.exp.X_add_number > (offsetT) 0xffffffff)) || the_insn.exp.X_add_number > (offsetT) 0xffffffff))
as_warn (_("setsw: number not in -2147483648..4294967295 range")); as_warn (_("setsw: number not in -2147483648..4294967295 range"));
@ -1077,6 +1083,7 @@ synthetize_setsw (insn)
} }
/* Handle the setsw synthetic instruction. */ /* Handle the setsw synthetic instruction. */
static void static void
synthetize_setx (insn) synthetize_setx (insn)
const struct sparc_opcode *insn; const struct sparc_opcode *insn;
@ -1285,7 +1292,7 @@ md_assemble (str)
switch (special_case) switch (special_case)
{ {
case SPECIAL_CASE_NONE: case SPECIAL_CASE_NONE:
/* normal insn */ /* Normal insn. */
output_insn (insn, &the_insn); output_insn (insn, &the_insn);
break; break;
@ -1358,8 +1365,7 @@ sparc_ip (str, pinsn)
case ',': case ',':
comma = 1; comma = 1;
/* Fall through. */
/*FALLTHROUGH */
case ' ': case ' ':
*s++ = '\0'; *s++ = '\0';
@ -1388,10 +1394,8 @@ sparc_ip (str, pinsn)
the_insn.reloc = BFD_RELOC_NONE; the_insn.reloc = BFD_RELOC_NONE;
v9_arg_p = 0; v9_arg_p = 0;
/* /* Build the opcode, checking as we go to make sure that the
* Build the opcode, checking as we go to make operands match. */
* sure that the operands match
*/
for (args = insn->args;; ++args) for (args = insn->args;; ++args)
{ {
switch (*args) switch (*args)
@ -1474,7 +1478,7 @@ sparc_ip (str, pinsn)
if (*s == '%') if (*s == '%')
{ {
struct priv_reg_entry *p = priv_reg_table; struct priv_reg_entry *p = priv_reg_table;
unsigned int len = 9999999; /* init to make gcc happy */ unsigned int len = 9999999; /* Init to make gcc happy. */
s += 1; s += 1;
while (p->name[0] > s[0]) while (p->name[0] > s[0])
@ -1510,7 +1514,7 @@ sparc_ip (str, pinsn)
if (*s == '%') if (*s == '%')
{ {
struct priv_reg_entry *p = v9a_asr_table; struct priv_reg_entry *p = v9a_asr_table;
unsigned int len = 9999999; /* init to make gcc happy */ unsigned int len = 9999999; /* Init to make gcc happy. */
s += 1; s += 1;
while (p->name[0] > s[0]) while (p->name[0] > s[0])
@ -1731,7 +1735,7 @@ sparc_ip (str, pinsn)
} }
break; break;
case '\0': /* end of args */ case '\0': /* End of args. */
if (*s == '\0') if (*s == '\0')
{ {
match = 1; match = 1;
@ -1750,7 +1754,7 @@ sparc_ip (str, pinsn)
} }
break; break;
case '[': /* these must match exactly */ case '[': /* These must match exactly. */
case ']': case ']':
case ',': case ',':
case ' ': case ' ':
@ -1758,7 +1762,7 @@ sparc_ip (str, pinsn)
continue; continue;
break; break;
case '#': /* must be at least one digit */ case '#': /* Must be at least one digit. */
if (isdigit ((unsigned char) *s++)) if (isdigit ((unsigned char) *s++))
{ {
while (isdigit ((unsigned char) *s)) while (isdigit ((unsigned char) *s))
@ -1769,7 +1773,7 @@ sparc_ip (str, pinsn)
} }
break; break;
case 'C': /* coprocessor state register */ case 'C': /* Coprocessor state register. */
if (strncmp (s, "%csr", 4) == 0) if (strncmp (s, "%csr", 4) == 0)
{ {
s += 4; s += 4;
@ -1777,7 +1781,7 @@ sparc_ip (str, pinsn)
} }
break; break;
case 'b': /* next operand is a coprocessor register */ case 'b': /* Next operand is a coprocessor register. */
case 'c': case 'c':
case 'D': case 'D':
if (*s++ == '%' && *s++ == 'c' && isdigit ((unsigned char) *s)) if (*s++ == '%' && *s++ == 'c' && isdigit ((unsigned char) *s))
@ -1910,7 +1914,7 @@ sparc_ip (str, pinsn)
} }
if ((mask & ~1) == 2 && sparc_arch_size == 64 if ((mask & ~1) == 2 && sparc_arch_size == 64
&& no_undeclared_regs && ! globals [mask]) && no_undeclared_regs && ! globals[mask])
as_bad (_("detected global register use not covered by .register pseudo-op")); as_bad (_("detected global register use not covered by .register pseudo-op"));
/* Got the register, now figure out where /* Got the register, now figure out where
@ -2014,7 +2018,6 @@ sparc_ip (str, pinsn)
opcode |= RS1 (mask); opcode |= RS1 (mask);
continue; continue;
case 'f': case 'f':
case 'B': case 'B':
case 'R': case 'R':
@ -2169,10 +2172,11 @@ sparc_ip (str, pinsn)
*s1 = '0'; *s1 = '0';
s = s1; s = s1;
op_exp = the_insn.exp; op_exp = the_insn.exp;
memset (&the_insn.exp, 0, sizeof(the_insn.exp)); memset (&the_insn.exp, 0, sizeof (the_insn.exp));
} }
for (s1 = s; *s1 && *s1 != ',' && *s1 != ']'; s1++) ; for (s1 = s; *s1 && *s1 != ',' && *s1 != ']'; s1++)
;
if (s1 != s && isdigit ((unsigned char) s1[-1])) if (s1 != s && isdigit ((unsigned char) s1[-1]))
{ {
@ -2227,7 +2231,7 @@ sparc_ip (str, pinsn)
case BFD_RELOC_SPARC_HH22: case BFD_RELOC_SPARC_HH22:
val = BSR (val, 32); val = BSR (val, 32);
/* intentional fallthrough */ /* Fall through. */
case BFD_RELOC_SPARC_LM22: case BFD_RELOC_SPARC_LM22:
case BFD_RELOC_HI22: case BFD_RELOC_HI22:
@ -2236,7 +2240,7 @@ sparc_ip (str, pinsn)
case BFD_RELOC_SPARC_HM10: case BFD_RELOC_SPARC_HM10:
val = BSR (val, 32); val = BSR (val, 32);
/* intentional fallthrough */ /* Fall through. */
case BFD_RELOC_LO10: case BFD_RELOC_LO10:
val &= 0x3ff; val &= 0x3ff;
@ -2352,7 +2356,7 @@ sparc_ip (str, pinsn)
} }
opcode |= ASI (asi); opcode |= ASI (asi);
continue; continue;
} /* alternate space */ } /* Alternate space. */
case 'p': case 'p':
if (strncmp (s, "%psr", 4) == 0) if (strncmp (s, "%psr", 4) == 0)
@ -2362,7 +2366,7 @@ sparc_ip (str, pinsn)
} }
break; break;
case 'q': /* floating point queue */ case 'q': /* Floating point queue. */
if (strncmp (s, "%fq", 3) == 0) if (strncmp (s, "%fq", 3) == 0)
{ {
s += 3; s += 3;
@ -2370,7 +2374,7 @@ sparc_ip (str, pinsn)
} }
break; break;
case 'Q': /* coprocessor queue */ case 'Q': /* Coprocessor queue. */
if (strncmp (s, "%cq", 3) == 0) if (strncmp (s, "%cq", 3) == 0)
{ {
s += 3; s += 3;
@ -2476,11 +2480,11 @@ sparc_ip (str, pinsn)
default: default:
as_fatal (_("failed sanity check.")); as_fatal (_("failed sanity check."));
} /* switch on arg code */ } /* switch on arg code. */
/* Break out of for() loop. */ /* Break out of for() loop. */
break; break;
} /* for each arg that we expect */ } /* For each arg that we expect. */
error: error:
if (match == 0) if (match == 0)
@ -2502,7 +2506,7 @@ sparc_ip (str, pinsn)
} }
else else
{ {
/* We have a match. Now see if the architecture is ok. */ /* We have a match. Now see if the architecture is OK. */
int needed_arch_mask = insn->architecture; int needed_arch_mask = insn->architecture;
if (v9_arg_p) if (v9_arg_p)
@ -2512,10 +2516,13 @@ sparc_ip (str, pinsn)
needed_arch_mask |= (1 << SPARC_OPCODE_ARCH_V9); needed_arch_mask |= (1 << SPARC_OPCODE_ARCH_V9);
} }
if (needed_arch_mask & SPARC_OPCODE_SUPPORTED (current_architecture)) if (needed_arch_mask
; /* ok */ & SPARC_OPCODE_SUPPORTED (current_architecture))
/* OK. */
;
/* Can we bump up the architecture? */ /* Can we bump up the architecture? */
else if (needed_arch_mask & SPARC_OPCODE_SUPPORTED (max_architecture)) else if (needed_arch_mask
& SPARC_OPCODE_SUPPORTED (max_architecture))
{ {
enum sparc_opcode_arch_val needed_architecture = enum sparc_opcode_arch_val needed_architecture =
sparc_ffs (SPARC_OPCODE_SUPPORTED (max_architecture) sparc_ffs (SPARC_OPCODE_SUPPORTED (max_architecture)
@ -2540,12 +2547,12 @@ sparc_ip (str, pinsn)
happen but what about tomorrow? */ happen but what about tomorrow? */
else else
{ {
int arch,printed_one_p = 0; int arch, printed_one_p = 0;
char *p; char *p;
char required_archs[SPARC_OPCODE_ARCH_MAX * 16]; char required_archs[SPARC_OPCODE_ARCH_MAX * 16];
/* Create a list of the architectures that support the insn. */ /* Create a list of the architectures that support the insn. */
needed_arch_mask &= ~ SPARC_OPCODE_SUPPORTED (max_architecture); needed_arch_mask &= ~SPARC_OPCODE_SUPPORTED (max_architecture);
p = required_archs; p = required_archs;
arch = sparc_ffs (needed_arch_mask); arch = sparc_ffs (needed_arch_mask);
while ((1 << arch) <= needed_arch_mask) while ((1 << arch) <= needed_arch_mask)
@ -2567,10 +2574,10 @@ sparc_ip (str, pinsn)
sparc_opcode_archs[max_architecture].name); sparc_opcode_archs[max_architecture].name);
return special_case; return special_case;
} }
} /* if no match */ } /* If no match. */
break; break;
} /* forever looking for a match */ } /* Forever looking for a match. */
the_insn.opcode = opcode; the_insn.opcode = opcode;
return special_case; return special_case;
@ -2676,18 +2683,18 @@ output_insn (insn, the_insn)
{ {
char *toP = frag_more (4); char *toP = frag_more (4);
/* put out the opcode */ /* Put out the opcode. */
if (INSN_BIG_ENDIAN) if (INSN_BIG_ENDIAN)
number_to_chars_bigendian (toP, (valueT) the_insn->opcode, 4); number_to_chars_bigendian (toP, (valueT) the_insn->opcode, 4);
else else
number_to_chars_littleendian (toP, (valueT) the_insn->opcode, 4); number_to_chars_littleendian (toP, (valueT) the_insn->opcode, 4);
/* put out the symbol-dependent stuff */ /* Put out the symbol-dependent stuff. */
if (the_insn->reloc != BFD_RELOC_NONE) if (the_insn->reloc != BFD_RELOC_NONE)
{ {
fixS *fixP = fix_new_exp (frag_now, /* which frag */ fixS *fixP = fix_new_exp (frag_now, /* Which frag. */
(toP - frag_now->fr_literal), /* where */ (toP - frag_now->fr_literal), /* Where. */
4, /* size */ 4, /* Size. */
&the_insn->exp, &the_insn->exp,
the_insn->pcrel, the_insn->pcrel,
the_insn->reloc); the_insn->reloc);
@ -2704,16 +2711,15 @@ output_insn (insn, the_insn)
last_opcode = the_insn->opcode; last_opcode = the_insn->opcode;
} }
/* /* This is identical to the md_atof in m68k.c. I think this is right,
This is identical to the md_atof in m68k.c. I think this is right,
but I'm not sure. but I'm not sure.
Turn a string in input_line_pointer into a floating point constant of type Turn a string in input_line_pointer into a floating point constant
type, and store the appropriate bytes in *litP. The number of LITTLENUMS of type TYPE, and store the appropriate bytes in *LITP. The number
emitted is stored in *sizeP . An error message is returned, or NULL on OK. of LITTLENUMS emitted is stored in *SIZEP. An error message is
*/ returned, or NULL on OK. */
/* Equal to MAX_PRECISION in atof-ieee.c */ /* Equal to MAX_PRECISION in atof-ieee.c. */
#define MAX_LITTLENUMS 6 #define MAX_LITTLENUMS 6
char * char *
@ -2722,7 +2728,7 @@ md_atof (type, litP, sizeP)
char *litP; char *litP;
int *sizeP; int *sizeP;
{ {
int i,prec; int i, prec;
LITTLENUM_TYPE words[MAX_LITTLENUMS]; LITTLENUM_TYPE words[MAX_LITTLENUMS];
char *t; char *t;
@ -2795,7 +2801,8 @@ md_number_to_chars (buf, val, n)
number_to_chars_bigendian (buf, val, n); number_to_chars_bigendian (buf, val, n);
else if (target_little_endian_data else if (target_little_endian_data
&& ((n == 4 || n == 2) && ~now_seg->flags & SEC_ALLOC)) && ((n == 4 || n == 2) && ~now_seg->flags & SEC_ALLOC))
/* Output debug words, which are not in allocated sections, as big endian */ /* Output debug words, which are not in allocated sections, as big
endian. */
number_to_chars_bigendian (buf, val, n); number_to_chars_bigendian (buf, val, n);
else if (target_little_endian_data || ! target_big_endian) else if (target_little_endian_data || ! target_big_endian)
number_to_chars_littleendian (buf, val, n); number_to_chars_littleendian (buf, val, n);
@ -2818,7 +2825,7 @@ md_apply_fix3 (fixP, value, segment)
assert (fixP->fx_r_type < BFD_RELOC_UNUSED); assert (fixP->fx_r_type < BFD_RELOC_UNUSED);
fixP->fx_addnumber = val; /* Remember value for emit_reloc */ fixP->fx_addnumber = val; /* Remember value for emit_reloc. */
#ifdef OBJ_ELF #ifdef OBJ_ELF
/* FIXME: SPARC ELF relocations don't use an addend in the data /* FIXME: SPARC ELF relocations don't use an addend in the data
@ -2935,7 +2942,7 @@ md_apply_fix3 (fixP, value, segment)
insn |= val & 0x3fffffff; insn |= val & 0x3fffffff;
/* See if we have a delay slot */ /* See if we have a delay slot. */
if (sparc_relax && fixP->fx_where + 8 <= fixP->fx_frag->fr_fix) if (sparc_relax && fixP->fx_where + 8 <= fixP->fx_frag->fr_fix)
{ {
#define G0 0 #define G0 0
@ -2960,15 +2967,15 @@ md_apply_fix3 (fixP, value, segment)
delay = bfd_getb32 ((unsigned char *) buf + 4); delay = bfd_getb32 ((unsigned char *) buf + 4);
else else
delay = bfd_getl32 ((unsigned char *) buf + 4); delay = bfd_getl32 ((unsigned char *) buf + 4);
if ((insn & OP(~0)) != OP(1) || (delay & OP(~0)) != OP(2)) if ((insn & OP (~0)) != OP (1) || (delay & OP (~0)) != OP (2))
break; break;
if ((delay & OP3(~0)) != OP3(0x3d) /* restore */ if ((delay & OP3 (~0)) != OP3 (0x3d) /* Restore. */
&& ((delay & OP3(0x28)) != 0 /* arithmetic */ && ((delay & OP3 (0x28)) != 0 /* Arithmetic. */
|| ((delay & RD(~0)) != RD(O7)))) || ((delay & RD (~0)) != RD (O7))))
break; break;
if ((delay & RS1(~0)) == RS1(O7) if ((delay & RS1 (~0)) == RS1 (O7)
|| ((delay & F3I(~0)) == 0 || ((delay & F3I (~0)) == 0
&& (delay & RS2(~0)) == RS2(O7))) && (delay & RS2 (~0)) == RS2 (O7)))
break; break;
/* Ensure the branch will fit into simm22. */ /* Ensure the branch will fit into simm22. */
if ((val & 0x3fe00000) if ((val & 0x3fe00000)
@ -2986,8 +2993,8 @@ md_apply_fix3 (fixP, value, segment)
/* ba */ /* ba */
insn = INSN_BA | (val & 0x3fffff); insn = INSN_BA | (val & 0x3fffff);
if (fixP->fx_where >= 4 if (fixP->fx_where >= 4
&& ((delay & (0xffffffff ^ RS1(~0))) && ((delay & (0xffffffff ^ RS1 (~0)))
== (INSN_OR | RD(O7) | RS2(G0)))) == (INSN_OR | RD (O7) | RS2 (G0))))
{ {
long setter; long setter;
int reg; int reg;
@ -2996,8 +3003,8 @@ md_apply_fix3 (fixP, value, segment)
setter = bfd_getb32 ((unsigned char *) buf - 4); setter = bfd_getb32 ((unsigned char *) buf - 4);
else else
setter = bfd_getl32 ((unsigned char *) buf - 4); setter = bfd_getl32 ((unsigned char *) buf - 4);
if ((setter & (0xffffffff ^ RD(~0))) if ((setter & (0xffffffff ^ RD (~0)))
!= (INSN_OR | RS1(O7) | RS2(G0))) != (INSN_OR | RS1 (O7) | RS2 (G0)))
break; break;
/* The sequence was /* The sequence was
or %o7, %g0, %rN or %o7, %g0, %rN
@ -3006,8 +3013,8 @@ md_apply_fix3 (fixP, value, segment)
If call foo was replaced with ba, replace If call foo was replaced with ba, replace
or %rN, %g0, %o7 with nop. */ or %rN, %g0, %o7 with nop. */
reg = (delay & RS1(~0)) >> 14; reg = (delay & RS1 (~0)) >> 14;
if (reg != ((setter & RD(~0)) >> 25) if (reg != ((setter & RD (~0)) >> 25)
|| reg == G0 || reg == O7) || reg == G0 || reg == O7)
break; break;
@ -3055,7 +3062,7 @@ md_apply_fix3 (fixP, value, segment)
break; break;
case BFD_RELOC_SPARC_WDISP16: case BFD_RELOC_SPARC_WDISP16:
/* FIXME: simplify */ /* FIXME: simplify. */
if (((val > 0) && (val & ~0x3fffc)) if (((val > 0) && (val & ~0x3fffc))
|| ((val < 0) && (~(val - 1) & ~0x3fffc))) || ((val < 0) && (~(val - 1) & ~0x3fffc)))
as_bad_where (fixP->fx_file, fixP->fx_line, as_bad_where (fixP->fx_file, fixP->fx_line,
@ -3066,7 +3073,7 @@ md_apply_fix3 (fixP, value, segment)
break; break;
case BFD_RELOC_SPARC_WDISP19: case BFD_RELOC_SPARC_WDISP19:
/* FIXME: simplify */ /* FIXME: simplify. */
if (((val > 0) && (val & ~0x1ffffc)) if (((val > 0) && (val & ~0x1ffffc))
|| ((val < 0) && (~(val - 1) & ~0x1ffffc))) || ((val < 0) && (~(val - 1) & ~0x1ffffc)))
as_bad_where (fixP->fx_file, fixP->fx_line, as_bad_where (fixP->fx_file, fixP->fx_line,
@ -3078,7 +3085,7 @@ md_apply_fix3 (fixP, value, segment)
case BFD_RELOC_SPARC_HH22: case BFD_RELOC_SPARC_HH22:
val = BSR (val, 32); val = BSR (val, 32);
/* intentional fallthrough */ /* Fall through. */
case BFD_RELOC_SPARC_LM22: case BFD_RELOC_SPARC_LM22:
case BFD_RELOC_HI22: case BFD_RELOC_HI22:
@ -3102,7 +3109,7 @@ md_apply_fix3 (fixP, value, segment)
case BFD_RELOC_SPARC_HM10: case BFD_RELOC_SPARC_HM10:
val = BSR (val, 32); val = BSR (val, 32);
/* intentional fallthrough */ /* Fall through. */
case BFD_RELOC_LO10: case BFD_RELOC_LO10:
if (!fixP->fx_addsy) if (!fixP->fx_addsy)
@ -3119,7 +3126,7 @@ md_apply_fix3 (fixP, value, segment)
case BFD_RELOC_SPARC_OLO10: case BFD_RELOC_SPARC_OLO10:
val &= 0x3ff; val &= 0x3ff;
val += fixP->tc_fix_data; val += fixP->tc_fix_data;
/* intentional fallthrough */ /* Fall through. */
case BFD_RELOC_SPARC13: case BFD_RELOC_SPARC13:
if (! in_signed_range (val, 0x1fff)) if (! in_signed_range (val, 0x1fff))
@ -3130,7 +3137,7 @@ md_apply_fix3 (fixP, value, segment)
case BFD_RELOC_SPARC_WDISP22: case BFD_RELOC_SPARC_WDISP22:
val = (val >> 2) + 1; val = (val >> 2) + 1;
/* FALLTHROUGH */ /* Fall through. */
case BFD_RELOC_SPARC_BASE22: case BFD_RELOC_SPARC_BASE22:
insn |= val & 0x3fffff; insn |= val & 0x3fffff;
break; break;
@ -3190,6 +3197,7 @@ md_apply_fix3 (fixP, value, segment)
/* Translate internal representation of relocation info to BFD target /* Translate internal representation of relocation info to BFD target
format. */ format. */
arelent ** arelent **
tc_gen_reloc (section, fixp) tc_gen_reloc (section, fixp)
asection *section; asection *section;
@ -3358,15 +3366,15 @@ tc_gen_reloc (section, fixp)
/* We have no need to default values of symbols. */ /* We have no need to default values of symbols. */
/* ARGSUSED */
symbolS * symbolS *
md_undefined_symbol (name) md_undefined_symbol (name)
char *name; char *name;
{ {
return 0; return 0;
} /* md_undefined_symbol() */ }
/* Round up a section size to the appropriate boundary. */ /* Round up a section size to the appropriate boundary. */
valueT valueT
md_section_align (segment, size) md_section_align (segment, size)
segT segment; segT segment;
@ -3378,7 +3386,8 @@ md_section_align (segment, size)
valueT align = ((valueT) 1 valueT align = ((valueT) 1
<< (valueT) bfd_get_section_alignment (stdoutput, segment)); << (valueT) bfd_get_section_alignment (stdoutput, segment));
valueT newsize; valueT newsize;
/* turn alignment value into a mask */
/* Turn alignment value into a mask. */
align--; align--;
newsize = (size + align) & ~align; newsize = (size + align) & ~align;
return newsize; return newsize;
@ -3423,9 +3432,7 @@ log2 (value)
return (value == 1) ? shift : -1; return (value == 1) ? shift : -1;
} }
/* /* Sort of like s_lcomm. */
* sort of like s_lcomm
*/
#ifndef OBJ_ELF #ifndef OBJ_ELF
static int max_alignment = 15; static int max_alignment = 15;
@ -3463,7 +3470,7 @@ s_reserve (ignore)
as_bad (_("BSS length (%d.) <0! Ignored."), size); as_bad (_("BSS length (%d.) <0! Ignored."), size);
ignore_rest_of_line (); ignore_rest_of_line ();
return; return;
} /* bad length */ } /* Bad length. */
*p = 0; *p = 0;
symbolP = symbol_find_or_make (name); symbolP = symbol_find_or_make (name);
@ -3542,18 +3549,20 @@ s_reserve (ignore)
segT current_seg = now_seg; segT current_seg = now_seg;
subsegT current_subseg = now_subseg; subsegT current_subseg = now_subseg;
subseg_set (bss_section, 1); /* switch to bss */ /* Switch to bss. */
subseg_set (bss_section, 1);
if (align) if (align)
frag_align (align, 0, 0); /* do alignment */ /* Do alignment. */
frag_align (align, 0, 0);
/* detach from old frag */ /* Detach from old frag. */
if (S_GET_SEGMENT(symbolP) == bss_section) if (S_GET_SEGMENT(symbolP) == bss_section)
symbol_get_frag (symbolP)->fr_symbol = NULL; symbol_get_frag (symbolP)->fr_symbol = NULL;
symbol_set_frag (symbolP, frag_now); symbol_set_frag (symbolP, frag_now);
pfrag = frag_var (rs_org, 1, 1, (relax_substateT)0, symbolP, pfrag = frag_var (rs_org, 1, 1, (relax_substateT) 0, symbolP,
(offsetT) size, (char *)0); (offsetT) size, (char *) 0);
*pfrag = 0; *pfrag = 0;
S_SET_SEGMENT (symbolP, bss_section); S_SET_SEGMENT (symbolP, bss_section);
@ -3569,7 +3578,7 @@ s_reserve (ignore)
{ {
as_warn("Ignoring attempt to re-define symbol %s", as_warn("Ignoring attempt to re-define symbol %s",
S_GET_NAME (symbolP)); S_GET_NAME (symbolP));
} /* if not redefining */ } /* if not redefining. */
demand_empty_rest_of_line (); demand_empty_rest_of_line ();
} }
@ -3586,7 +3595,7 @@ s_common (ignore)
name = input_line_pointer; name = input_line_pointer;
c = get_symbol_end (); c = get_symbol_end ();
/* just after name is now '\0' */ /* Just after name is now '\0'. */
p = input_line_pointer; p = input_line_pointer;
*p = c; *p = c;
SKIP_WHITESPACE (); SKIP_WHITESPACE ();
@ -3596,7 +3605,10 @@ s_common (ignore)
ignore_rest_of_line (); ignore_rest_of_line ();
return; return;
} }
input_line_pointer++; /* skip ',' */
/* Skip ','. */
input_line_pointer++;
if ((temp = get_absolute_expression ()) < 0) if ((temp = get_absolute_expression ()) < 0)
{ {
as_bad (_(".COMMon length (%d.) <0! Ignored."), temp); as_bad (_(".COMMon length (%d.) <0! Ignored."), temp);
@ -3790,7 +3802,7 @@ s_seg (ignore)
/* We only support 2 segments -- text and data -- for now, so /* We only support 2 segments -- text and data -- for now, so
things in the "bss segment" will have to go into data for now. things in the "bss segment" will have to go into data for now.
You can still allocate SEG_BSS stuff with .lcomm or .reserve. */ You can still allocate SEG_BSS stuff with .lcomm or .reserve. */
subseg_set (data_section, 255); /* FIXME-SOMEDAY */ subseg_set (data_section, 255); /* FIXME-SOMEDAY. */
return; return;
} }
as_bad (_("Unknown segment type")); as_bad (_("Unknown segment type"));
@ -3850,7 +3862,7 @@ s_ncons (bytes)
The syntax is: The syntax is:
.register %g[2367],{#scratch|symbolname|#ignore} .register %g[2367],{#scratch|symbolname|#ignore}
*/ */
static void static void
s_register (ignore) s_register (ignore)
@ -3889,17 +3901,17 @@ s_register (ignore)
} }
if (sparc_arch_size == 64) if (sparc_arch_size == 64)
{ {
if (globals [reg]) if (globals[reg])
{ {
if ((regname && globals [reg] != (symbolS *)1 if ((regname && globals[reg] != (symbolS *) 1
&& strcmp (S_GET_NAME (globals [reg]), regname)) && strcmp (S_GET_NAME (globals[reg]), regname))
|| ((regname != NULL) ^ (globals [reg] != (symbolS *)1))) || ((regname != NULL) ^ (globals[reg] != (symbolS *) 1)))
as_bad (_("redefinition of global register")); as_bad (_("redefinition of global register"));
} }
else else
{ {
if (regname == NULL) if (regname == NULL)
globals [reg] = (symbolS *)1; globals[reg] = (symbolS *) 1;
else else
{ {
if (*regname) if (*regname)
@ -3908,26 +3920,26 @@ s_register (ignore)
as_bad (_("Register symbol %s already defined."), as_bad (_("Register symbol %s already defined."),
regname); regname);
} }
globals [reg] = symbol_make (regname); globals[reg] = symbol_make (regname);
flags = symbol_get_bfdsym (globals [reg])->flags; flags = symbol_get_bfdsym (globals[reg])->flags;
if (! *regname) if (! *regname)
flags = flags & ~(BSF_GLOBAL|BSF_LOCAL|BSF_WEAK); flags = flags & ~(BSF_GLOBAL|BSF_LOCAL|BSF_WEAK);
if (! (flags & (BSF_GLOBAL|BSF_LOCAL|BSF_WEAK))) if (! (flags & (BSF_GLOBAL|BSF_LOCAL|BSF_WEAK)))
flags |= BSF_GLOBAL; flags |= BSF_GLOBAL;
symbol_get_bfdsym (globals [reg])->flags = flags; symbol_get_bfdsym (globals[reg])->flags = flags;
S_SET_VALUE (globals [reg], (valueT)reg); S_SET_VALUE (globals[reg], (valueT) reg);
S_SET_ALIGN (globals [reg], reg); S_SET_ALIGN (globals[reg], reg);
S_SET_SIZE (globals [reg], 0); S_SET_SIZE (globals[reg], 0);
/* Although we actually want undefined_section here, /* Although we actually want undefined_section here,
we have to use absolute_section, because otherwise we have to use absolute_section, because otherwise
generic as code will make it a COM section. generic as code will make it a COM section.
We fix this up in sparc_adjust_symtab. */ We fix this up in sparc_adjust_symtab. */
S_SET_SEGMENT (globals [reg], absolute_section); S_SET_SEGMENT (globals[reg], absolute_section);
S_SET_OTHER (globals [reg], 0); S_SET_OTHER (globals[reg], 0);
elf_symbol (symbol_get_bfdsym (globals [reg])) elf_symbol (symbol_get_bfdsym (globals[reg]))
->internal_elf_sym.st_info = ->internal_elf_sym.st_info =
ELF_ST_INFO(STB_GLOBAL, STT_REGISTER); ELF_ST_INFO(STB_GLOBAL, STT_REGISTER);
elf_symbol (symbol_get_bfdsym (globals [reg])) elf_symbol (symbol_get_bfdsym (globals[reg]))
->internal_elf_sym.st_shndx = SHN_UNDEF; ->internal_elf_sym.st_shndx = SHN_UNDEF;
} }
} }
@ -4026,16 +4038,17 @@ sparc_handle_align (fragp)
if (count >= 4 if (count >= 4
&& !(count & 3) && !(count & 3)
&& count <= 1024 && count <= 1024
&& !((long)(fragp->fr_literal + fragp->fr_fix) & 3)) && !((long) (fragp->fr_literal + fragp->fr_fix) & 3))
{ {
unsigned *p = (unsigned *)(fragp->fr_literal + fragp->fr_fix); unsigned *p = (unsigned *) (fragp->fr_literal + fragp->fr_fix);
int i; int i;
for (i = 0; i < count; i += 4, p++) for (i = 0; i < count; i += 4, p++)
if (INSN_BIG_ENDIAN) if (INSN_BIG_ENDIAN)
number_to_chars_bigendian ((char *)p, 0x01000000, 4); /* emit nops */ /* Emit nops. */
number_to_chars_bigendian ((char *) p, 0x01000000, 4);
else else
number_to_chars_littleendian ((char *)p, 0x10000000, 4); number_to_chars_littleendian ((char *) p, 0x10000000, 4);
if (SPARC_OPCODE_ARCH_V9_P (max_architecture) && count > 8) if (SPARC_OPCODE_ARCH_V9_P (max_architecture) && count > 8)
{ {
@ -4115,4 +4128,3 @@ elf32_sparc_force_relocation (fixp)
return 0; return 0;
} }
#endif #endif

View File

@ -19,10 +19,8 @@
Software Foundation, 59 Temple Place - Suite 330, Boston, MA Software Foundation, 59 Temple Place - Suite 330, Boston, MA
02111-1307, USA. */ 02111-1307, USA. */
/* /* Written By Steve Chamberlain <sac@cygnus.com>. */
Written By Steve Chamberlain
sac@cygnus.com
*/
#define DEFINE_TABLE #define DEFINE_TABLE
#include <stdio.h> #include <stdio.h>
@ -41,13 +39,6 @@ extern int coff_flags;
int segmented_mode; int segmented_mode;
const int md_reloc_size; const int md_reloc_size;
/* This table describes all the machine specific pseudo-ops the assembler
has to support. The fields are:
pseudo-op name without dot
function to call to execute this pseudo-op
Integer arg to pass to the function
*/
void cons (); void cons ();
void void
@ -66,8 +57,7 @@ s_unseg ()
coff_flags = F_Z8002; coff_flags = F_Z8002;
} }
static static void
void
even () even ()
{ {
frag_align (1, 0, 0); frag_align (1, 0, 0);
@ -90,7 +80,6 @@ tohex (c)
void void
sval () sval ()
{ {
SKIP_WHITESPACE (); SKIP_WHITESPACE ();
if (*input_line_pointer == '\'') if (*input_line_pointer == '\'')
{ {
@ -110,47 +99,53 @@ sval ()
} }
demand_empty_rest_of_line (); demand_empty_rest_of_line ();
} }
} }
const pseudo_typeS md_pseudo_table[] =
{
{"int", cons, 2},
{"data.b", cons, 1},
{"data.w", cons, 2},
{"data.l", cons, 4},
{"form", listing_psize, 0},
{"heading", listing_title, 0},
{"import", s_ignore, 0},
{"page", listing_eject, 0},
{"program", s_ignore, 0},
{"z8001", s_segm, 0},
{"z8002", s_unseg, 0},
/* This table describes all the machine specific pseudo-ops the assembler
has to support. The fields are:
pseudo-op name without dot
function to call to execute this pseudo-op
Integer arg to pass to the function
*/
{"segm", s_segm, 0}, const pseudo_typeS md_pseudo_table[] = {
{"unsegm", s_unseg, 0}, {"int" , cons , 2},
{"unseg", s_unseg, 0}, {"data.b" , cons , 1},
{"name", s_app_file, 0}, {"data.w" , cons , 2},
{"global", s_globl, 0}, {"data.l" , cons , 4},
{"wval", cons, 2}, {"form" , listing_psize , 0},
{"lval", cons, 4}, {"heading", listing_title , 0},
{"bval", cons, 1}, {"import" , s_ignore , 0},
{"sval", sval, 0}, {"page" , listing_eject , 0},
{"rsect", obj_coff_section, 0}, {"program", s_ignore , 0},
{"sect", obj_coff_section, 0}, {"z8001" , s_segm , 0},
{"block", s_space, 0}, {"z8002" , s_unseg , 0},
{"even", even, 0},
{0, 0, 0} {"segm" , s_segm , 0},
{"unsegm" , s_unseg , 0},
{"unseg" , s_unseg , 0},
{"name" , s_app_file , 0},
{"global" , s_globl , 0},
{"wval" , cons , 2},
{"lval" , cons , 4},
{"bval" , cons , 1},
{"sval" , sval , 0},
{"rsect" , obj_coff_section, 0},
{"sect" , obj_coff_section, 0},
{"block" , s_space , 0},
{"even" , even , 0},
{0 , 0 , 0}
}; };
const char EXP_CHARS[] = "eE"; const char EXP_CHARS[] = "eE";
/* Chars that mean this number is a floating point constant */ /* Chars that mean this number is a floating point constant.
/* As in 0f12.456 */ As in 0f12.456
/* or 0d1.2345e12 */ or 0d1.2345e12 */
const char FLT_CHARS[] = "rRsSfFdDxXpP"; const char FLT_CHARS[] = "rRsSfFdDxXpP";
static struct hash_control *opcode_hash_control; /* Opcode mnemonics */ /* Opcode mnemonics. */
static struct hash_control *opcode_hash_control;
void void
md_begin () md_begin ()
@ -163,7 +158,7 @@ md_begin ()
for (opcode = z8k_table; opcode->name; opcode++) for (opcode = z8k_table; opcode->name; opcode++)
{ {
/* Only enter unique codes into the table */ /* Only enter unique codes into the table. */
char *src = opcode->name; char *src = opcode->name;
if (strcmp (opcode->name, prev_name)) if (strcmp (opcode->name, prev_name))
@ -175,10 +170,10 @@ md_begin ()
prev_name = opcode->name; prev_name = opcode->name;
} }
/* default to z8002 */ /* Default to z8002. */
s_unseg (); s_unseg ();
/* insert the pseudo ops too */ /* Insert the pseudo ops, too. */
for (idx = 0; md_pseudo_table[idx].poc_name; idx++) for (idx = 0; md_pseudo_table[idx].poc_name; idx++)
{ {
opcode_entry_type *fake_opcode; opcode_entry_type *fake_opcode;
@ -198,15 +193,22 @@ struct z8k_exp
char *e_end; char *e_end;
expressionS e_exp; expressionS e_exp;
}; };
typedef struct z8k_op typedef struct z8k_op
{ {
char regsize; /* 'b','w','r','q' */ /* 'b','w','r','q'. */
unsigned int reg; /* 0..15 */ char regsize;
/* 0 .. 15. */
unsigned int reg;
int mode; int mode;
unsigned int x_reg; /* any other register associated with the mode */ /* Any other register associated with the mode. */
expressionS exp; /* any expression */ unsigned int x_reg;
/* Any expression. */
expressionS exp;
} }
op_type; op_type;
@ -237,8 +239,7 @@ whatreg (reg, src)
} }
} }
/* /* Parse operands
parse operands
rh0-rh7, rl0-rl7 rh0-rh7, rl0-rl7
r0-r15 r0-r15
@ -250,8 +251,7 @@ whatreg (reg, src)
@WREG+ @WREG+
@-WREG @-WREG
#const #const
*/
*/
/* Try to parse a reg name. Return a pointer to the first character /* Try to parse a reg name. Return a pointer to the first character
in SRC after the reg name. */ in SRC after the reg name. */
@ -287,7 +287,7 @@ parse_reg (src, mode, reg)
res = whatreg (reg, src + 2); res = whatreg (reg, src + 2);
regno = *reg; regno = *reg;
if (regno > 14) if (regno > 14)
as_warn (_("register rr%d, out of range."),regno); as_warn (_("register rr%d, out of range."), regno);
} }
else if (src[1] == 'h') else if (src[1] == 'h')
{ {
@ -295,7 +295,7 @@ parse_reg (src, mode, reg)
res = whatreg (reg, src + 2); res = whatreg (reg, src + 2);
regno = *reg; regno = *reg;
if (regno > 7) if (regno > 7)
as_warn (_("register rh%d, out of range."),regno); as_warn (_("register rh%d, out of range."), regno);
} }
else if (src[1] == 'l') else if (src[1] == 'l')
{ {
@ -303,7 +303,7 @@ parse_reg (src, mode, reg)
res = whatreg (reg, src + 2); res = whatreg (reg, src + 2);
regno = *reg; regno = *reg;
if (regno > 7) if (regno > 7)
as_warn (_("register rl%d, out of range."),regno); as_warn (_("register rl%d, out of range."), regno);
*reg += 8; *reg += 8;
} }
else if (src[1] == 'q') else if (src[1] == 'q')
@ -312,7 +312,7 @@ parse_reg (src, mode, reg)
res = whatreg (reg, src + 2); res = whatreg (reg, src + 2);
regno = *reg; regno = *reg;
if (regno > 12) if (regno > 12)
as_warn (_("register rq%d, out of range."),regno); as_warn (_("register rq%d, out of range."), regno);
} }
else else
{ {
@ -320,11 +320,10 @@ parse_reg (src, mode, reg)
res = whatreg (reg, src + 1); res = whatreg (reg, src + 1);
regno = *reg; regno = *reg;
if (regno > 15) if (regno > 15)
as_warn (_("register r%d, out of range."),regno); as_warn (_("register r%d, out of range."), regno);
} }
} }
return res; return res;
} }
char * char *
@ -356,13 +355,9 @@ parse_exp (s, op)
exp(r) exp(r)
r(#exp) r(#exp)
r(r) r(r)
*/ */
static static char *
char *
checkfor (ptr, what) checkfor (ptr, what)
char *ptr; char *ptr;
char what; char what;
@ -370,13 +365,13 @@ checkfor (ptr, what)
if (*ptr == what) if (*ptr == what)
ptr++; ptr++;
else else
{
as_bad (_("expected %c"), what); as_bad (_("expected %c"), what);
}
return ptr; return ptr;
} }
/* Make sure the mode supplied is the size of a word */ /* Make sure the mode supplied is the size of a word. */
static void static void
regword (mode, string) regword (mode, string)
int mode; int mode;
@ -391,7 +386,8 @@ regword (mode, string)
} }
} }
/* Make sure the mode supplied is the size of an address */ /* Make sure the mode supplied is the size of an address. */
static void static void
regaddr (mode, string) regaddr (mode, string)
int mode; int mode;
@ -412,8 +408,7 @@ struct ctrl_names
char *name; char *name;
}; };
struct ctrl_names ctrl_table[] = struct ctrl_names ctrl_table[] = {
{
0x2, "fcw", 0x2, "fcw",
0X3, "refresh", 0X3, "refresh",
0x4, "psapseg", 0x4, "psapseg",
@ -422,7 +417,7 @@ struct ctrl_names ctrl_table[] =
0x6, "nspseg", 0x6, "nspseg",
0x7, "nspoff", 0x7, "nspoff",
0x7, "nsp", 0x7, "nsp",
0, 0 0 , 0
}; };
static void static void
@ -451,7 +446,8 @@ get_ctrl_operand (ptr, mode, dst)
the_ctrl = ctrl_table[i].value; the_ctrl = ctrl_table[i].value;
*ptr = src + j; *ptr = src + j;
return; return;
fail:; fail:
;
} }
the_ctrl = 0; the_ctrl = 0;
return; return;
@ -464,8 +460,7 @@ struct flag_names
}; };
struct flag_names flag_table[] = struct flag_names flag_table[] = {
{
0x1, "p", 0x1, "p",
0x1, "v", 0x1, "v",
0x2, "s", 0x2, "s",
@ -512,7 +507,6 @@ get_flags_operand (ptr, mode, dst)
return; return;
} }
struct interrupt_names struct interrupt_names
{ {
int value; int value;
@ -555,7 +549,8 @@ get_interrupt_operand (ptr, mode, dst)
the_interrupt = intr_table[i].value; the_interrupt = intr_table[i].value;
*ptr = src + j; *ptr = src + j;
return; return;
fail:; fail:
;
} }
the_interrupt = 0x0; the_interrupt = 0x0;
return; return;
@ -568,8 +563,7 @@ struct cc_names
}; };
struct cc_names table[] = struct cc_names table[] = {
{
0x0, "f", 0x0, "f",
0x1, "lt", 0x1, "lt",
0x2, "le", 0x2, "le",
@ -592,7 +586,7 @@ struct cc_names table[] =
0xe, "nz", 0xe, "nz",
0xf, "nc", 0xf, "nc",
0xf, "uge", 0xf, "uge",
0, 0 0 , 0
}; };
static void static void
@ -621,7 +615,8 @@ get_cc_operand (ptr, mode, dst)
the_cc = table[i].value; the_cc = table[i].value;
*ptr = src + j; *ptr = src + j;
return; return;
fail:; fail:
;
} }
the_cc = 0x8; the_cc = 0x8;
} }
@ -672,20 +667,18 @@ get_operand (ptr, mode, dst)
end = parse_reg (src, &nw, &nr); end = parse_reg (src, &nw, &nr);
if (end) if (end)
{ {
/* Got Ra(Rb) */ /* Got Ra(Rb). */
src = end; src = end;
if (*src != ')') if (*src != ')')
{
as_bad (_("Missing ) in ra(rb)")); as_bad (_("Missing ) in ra(rb)"));
}
else else
{
src++; src++;
}
regaddr (mode->mode, "ra(rb) ra"); regaddr (mode->mode, "ra(rb) ra");
/* regword (mode->mode, "ra(rb) rb");*/ #if 0
regword (mode->mode, "ra(rb) rb");
#endif
mode->mode = CLASS_BX; mode->mode = CLASS_BX;
mode->reg = regn; mode->reg = regn;
mode->x_reg = nr; mode->x_reg = nr;
@ -693,7 +686,7 @@ get_operand (ptr, mode, dst)
} }
else else
{ {
/* Got Ra(disp) */ /* Got Ra(disp). */
if (*src == '#') if (*src == '#')
src++; src++;
src = parse_exp (src, &(mode->exp)); src = parse_exp (src, &(mode->exp));
@ -712,7 +705,7 @@ get_operand (ptr, mode, dst)
} }
else else
{ {
/* No initial reg */ /* No initial reg. */
src = parse_exp (src, &(mode->exp)); src = parse_exp (src, &(mode->exp));
if (*src == '(') if (*src == '(')
{ {
@ -727,7 +720,7 @@ get_operand (ptr, mode, dst)
} }
else else
{ {
/* Just an address */ /* Just an address. */
mode->mode = CLASS_DA; mode->mode = CLASS_DA;
mode->reg = 0; mode->reg = 0;
mode->x_reg = 0; mode->x_reg = 0;
@ -738,15 +731,15 @@ get_operand (ptr, mode, dst)
*ptr = src; *ptr = src;
} }
static static char *
char *
get_operands (opcode, op_end, operand) get_operands (opcode, op_end, operand)
opcode_entry_type *opcode; opcode_entry_type *opcode;
char *op_end; char *op_end;
op_type *operand; op_type *operand;
{ {
char *ptr = op_end; char *ptr = op_end;
char *savptr; char *savptr;
switch (opcode->noperands) switch (opcode->noperands)
{ {
case 0: case 0:
@ -764,7 +757,7 @@ char *savptr;
{ {
get_flags_operand (&ptr, operand + 0, 0); get_flags_operand (&ptr, operand + 0, 0);
} }
else if (opcode->arg_info[0] == (CLASS_IMM +(ARG_IMM2))) else if (opcode->arg_info[0] == (CLASS_IMM + (ARG_IMM2)))
{ {
get_interrupt_operand (&ptr, operand + 0, 0); get_interrupt_operand (&ptr, operand + 0, 0);
} }
@ -832,6 +825,7 @@ char *savptr;
ptr++; ptr++;
get_cc_operand (&ptr, operand + 3, 3); get_cc_operand (&ptr, operand + 3, 3);
break; break;
default: default:
abort (); abort ();
} }
@ -840,12 +834,10 @@ char *savptr;
} }
/* Passed a pointer to a list of opcodes which use different /* Passed a pointer to a list of opcodes which use different
addressing modes, return the opcode which matches the opcodes addressing modes. Return the opcode which matches the opcodes
provided provided. */
*/
static static opcode_entry_type *
opcode_entry_type *
get_specific (opcode, operands) get_specific (opcode, operands)
opcode_entry_type *opcode; opcode_entry_type *opcode;
op_type *operands; op_type *operands;
@ -869,29 +861,29 @@ get_specific (opcode, operands)
if ((mode & CLASS_MASK) != (this_try->arg_info[i] & CLASS_MASK)) if ((mode & CLASS_MASK) != (this_try->arg_info[i] & CLASS_MASK))
{ {
/* it could be an pc rel operand, if this is a da mode and /* It could be an pc rel operand, if this is a da mode
we like disps, then insert it */ and we like disps, then insert it. */
if (mode == CLASS_DA && this_try->arg_info[i] == CLASS_DISP) if (mode == CLASS_DA && this_try->arg_info[i] == CLASS_DISP)
{ {
/* This is the case */ /* This is the case. */
operands[i].mode = CLASS_DISP; operands[i].mode = CLASS_DISP;
} }
else if (mode == CLASS_BA && this_try->arg_info[i]) else if (mode == CLASS_BA && this_try->arg_info[i])
{ {
/* Can't think of a way to turn what we've been given into /* Can't think of a way to turn what we've been
something that's ok */ given into something that's OK. */
goto fail; goto fail;
} }
else if (this_try->arg_info[i] & CLASS_PR) else if (this_try->arg_info[i] & CLASS_PR)
{ {
if (mode == CLASS_REG_LONG && segmented_mode) if (mode == CLASS_REG_LONG && segmented_mode)
{ {
/* ok */ /* OK. */
} }
else if (mode == CLASS_REG_WORD && !segmented_mode) else if (mode == CLASS_REG_WORD && !segmented_mode)
{ {
/* ok */ /* OK. */
} }
else else
goto fail; goto fail;
@ -920,7 +912,8 @@ get_specific (opcode, operands)
} }
found = 1; found = 1;
fail:; fail:
;
} }
if (found) if (found)
return this_try; return this_try;
@ -938,13 +931,15 @@ check_operand (operand, width, string)
&& operand->exp.X_op_symbol == 0) && operand->exp.X_op_symbol == 0)
{ {
/* No symbol involved, let's look at offset, it's dangerous if any of /* No symbol involved, let's look at offset, it's dangerous if
the high bits are not 0 or ff's, find out by oring or anding with any of the high bits are not 0 or ff's, find out by oring or
the width and seeing if the answer is 0 or all fs*/ anding with the width and seeing if the answer is 0 or all
fs. */
if ((operand->exp.X_add_number & ~width) != 0 && if ((operand->exp.X_add_number & ~width) != 0 &&
(operand->exp.X_add_number | width) != (~0)) (operand->exp.X_add_number | width) != (~0))
{ {
as_warn (_("operand %s0x%x out of range."), string, operand->exp.X_add_number); as_warn (_("operand %s0x%x out of range."),
string, operand->exp.X_add_number);
} }
} }
@ -1004,12 +999,12 @@ apply_fix (ptr, type, operand, size)
} }
/* Now we know what sort of opcodes it is, lets build the bytes - /* Now we know what sort of opcodes it is. Let's build the bytes. */
*/
#define INSERT(x,y) *x++ = y>>24; *x++ = y>> 16; *x++=y>>8; *x++ =y; #define INSERT(x,y) *x++ = y>>24; *x++ = y>> 16; *x++=y>>8; *x++ =y;
static void static void
build_bytes (this_try, operand) build_bytes (this_try, operand)
opcode_entry_type * this_try; opcode_entry_type *this_try;
struct z8k_op *operand; struct z8k_op *operand;
{ {
unsigned int i; unsigned int i;
@ -1029,18 +1024,18 @@ build_bytes (this_try, operand)
memset (buffer, 20, 0); memset (buffer, 20, 0);
class_ptr = this_try->byte_info; class_ptr = this_try->byte_info;
top:;
top:
for (nibble = 0; c = *class_ptr++; nibble++) for (nibble = 0; c = *class_ptr++; nibble++)
{ {
switch (c & CLASS_MASK) switch (c & CLASS_MASK)
{ {
default: default:
abort (); abort ();
case CLASS_ADDRESS: case CLASS_ADDRESS:
/* Direct address, we don't cope with the SS mode right now */ /* Direct address, we don't cope with the SS mode right now. */
if (segmented_mode) if (segmented_mode)
{ {
da_operand->X_add_number |= 0x80000000; da_operand->X_add_number |= 0x80000000;
@ -1078,18 +1073,12 @@ top:;
if (imm_operand) if (imm_operand)
{ {
if (imm_operand->X_add_number == 2) if (imm_operand->X_add_number == 2)
{
*output_ptr |= 2; *output_ptr |= 2;
}
else if (imm_operand->X_add_number != 1) else if (imm_operand->X_add_number != 1)
{
as_bad (_("immediate must be 1 or 2")); as_bad (_("immediate must be 1 or 2"));
} }
}
else else
{
as_bad (_("immediate 1 or 2 expected")); as_bad (_("immediate 1 or 2 expected"));
}
output_ptr++; output_ptr++;
break; break;
case CLASS_CC: case CLASS_CC:
@ -1115,16 +1104,14 @@ top:;
break; break;
case CLASS_REGN0: case CLASS_REGN0:
if (reg[c & 0xf] == 0) if (reg[c & 0xf] == 0)
{
as_bad (_("can't use R0 here")); as_bad (_("can't use R0 here"));
} /* Fall through. */
case CLASS_REG: case CLASS_REG:
case CLASS_REG_BYTE: case CLASS_REG_BYTE:
case CLASS_REG_WORD: case CLASS_REG_WORD:
case CLASS_REG_LONG: case CLASS_REG_LONG:
case CLASS_REG_QUAD: case CLASS_REG_QUAD:
/* Insert bit mattern of /* Insert bit mattern of right reg. */
right reg */
*output_ptr++ = reg[c & 0xf]; *output_ptr++ = reg[c & 0xf];
break; break;
case CLASS_DISP: case CLASS_DISP:
@ -1168,8 +1155,7 @@ top:;
} }
} }
/* Copy from the nibble buffer into the frag */ /* Copy from the nibble buffer into the frag. */
{ {
int length = (output_ptr - buffer) / 2; int length = (output_ptr - buffer) / 2;
char *src = buffer; char *src = buffer;
@ -1181,9 +1167,7 @@ top:;
src += 2; src += 2;
fragp++; fragp++;
} }
} }
} }
/* This is the guts of the machine-dependent assembler. STR points to a /* This is the guts of the machine-dependent assembler. STR points to a
@ -1204,17 +1188,14 @@ md_assemble (str)
char *dot = 0; char *dot = 0;
char c; char c;
/* Drop leading whitespace */ /* Drop leading whitespace. */
while (*str == ' ') while (*str == ' ')
str++; str++;
/* find the op code end */ /* Find the op code end. */
for (op_start = op_end = str; for (op_start = op_end = str;
*op_end != 0 && *op_end != ' '; *op_end != 0 && *op_end != ' ';
op_end++) op_end++)
{
}
; ;
if (op_end == op_start) if (op_end == op_start)
@ -1225,9 +1206,7 @@ md_assemble (str)
*op_end = 0; *op_end = 0;
opcode = (opcode_entry_type *) hash_find (opcode_hash_control, opcode = (opcode_entry_type *) hash_find (opcode_hash_control, op_start);
op_start);
if (opcode == NULL) if (opcode == NULL)
{ {
@ -1237,7 +1216,7 @@ md_assemble (str)
if (opcode->opcode == 250) if (opcode->opcode == 250)
{ {
/* was really a pseudo op */ /* Was really a pseudo op. */
pseudo_typeS *p; pseudo_typeS *p;
char oc; char oc;
@ -1245,7 +1224,6 @@ md_assemble (str)
char *old = input_line_pointer; char *old = input_line_pointer;
*op_end = c; *op_end = c;
input_line_pointer = op_end; input_line_pointer = op_end;
oc = *old; oc = *old;
@ -1260,15 +1238,14 @@ md_assemble (str)
} }
else else
{ {
input_line_pointer = get_operands (opcode, op_end, input_line_pointer = get_operands (opcode, op_end, operand);
operand);
prev_opcode = opcode; prev_opcode = opcode;
opcode = get_specific (opcode, operand); opcode = get_specific (opcode, operand);
if (opcode == 0) if (opcode == 0)
{ {
/* Couldn't find an opcode which matched the operands */ /* Couldn't find an opcode which matched the operands. */
char *where = frag_more (2); char *where = frag_more (2);
where[0] = 0x0; where[0] = 0x0;
@ -1303,14 +1280,15 @@ tc_headers_hook (headers)
printf (_("call to tc_headers_hook \n")); printf (_("call to tc_headers_hook \n"));
} }
/* Various routines to kill one day */ /* Various routines to kill one day. */
/* Equal to MAX_PRECISION in atof-ieee.c */ /* Equal to MAX_PRECISION in atof-ieee.c. */
#define MAX_LITTLENUMS 6 #define MAX_LITTLENUMS 6
/* Turn a string in input_line_pointer into a floating point constant of type /* Turn a string in input_line_pointer into a floating point constant
type, and store the appropriate bytes in *litP. The number of LITTLENUMS of type TYPE, and store the appropriate bytes in *LITP. The number
emitted is stored in *sizeP . An error message is returned, or NULL on OK. of LITTLENUMS emitted is stored in *SIZEP. An error message is
*/ returned, or NULL on OK. */
char * char *
md_atof (type, litP, sizeP) md_atof (type, litP, sizeP)
char type; char type;
@ -1367,10 +1345,12 @@ md_atof (type, litP, sizeP)
} }
CONST char *md_shortopts = "z:"; CONST char *md_shortopts = "z:";
struct option md_longopts[] = { struct option md_longopts[] = {
{NULL, no_argument, NULL, 0} {NULL, no_argument, NULL, 0}
}; };
size_t md_longopts_size = sizeof(md_longopts);
size_t md_longopts_size = sizeof (md_longopts);
int int
md_parse_option (c, arg) md_parse_option (c, arg)
@ -1402,7 +1382,7 @@ void
md_show_usage (stream) md_show_usage (stream)
FILE *stream; FILE *stream;
{ {
fprintf(stream, _("\ fprintf (stream, _("\
Z8K options:\n\ Z8K options:\n\
-z8001 generate segmented code\n\ -z8001 generate segmented code\n\
-z8002 generate unsegmented code\n")); -z8002 generate unsegmented code\n"));
@ -1430,7 +1410,8 @@ md_section_align (seg, size)
segT seg; segT seg;
valueT size; valueT size;
{ {
return ((size + (1 << section_alignment[(int) seg]) - 1) & (-1 << section_alignment[(int) seg])); return ((size + (1 << section_alignment[(int) seg]) - 1)
& (-1 << section_alignment[(int) seg]));
} }
@ -1450,13 +1431,19 @@ md_apply_fix (fixP, val)
case R_JR: case R_JR:
*buf++ = val; *buf++ = val;
/* if (val != 0) abort();*/ #if 0
if (val != 0)
abort ();
#endif
break; break;
case R_DISP7: case R_DISP7:
*buf++ += val; *buf++ += val;
/* if (val != 0) abort();*/ #if 0
if (val != 0)
abort ();
#endif
break; break;
case R_IMM8: case R_IMM8:
@ -1487,7 +1474,6 @@ md_apply_fix (fixP, val)
default: default:
abort (); abort ();
} }
} }
@ -1500,7 +1486,7 @@ md_estimate_size_before_relax (fragP, segment_type)
abort (); abort ();
} }
/* Put number into target byte order */ /* Put number into target byte order. */
void void
md_number_to_chars (ptr, use, nbytes) md_number_to_chars (ptr, use, nbytes)
@ -1510,6 +1496,7 @@ md_number_to_chars (ptr, use, nbytes)
{ {
number_to_chars_bigendian (ptr, use, nbytes); number_to_chars_bigendian (ptr, use, nbytes);
} }
long long
md_pcrel_from (fixP) md_pcrel_from (fixP)
fixS *fixP; fixS *fixP;
@ -1532,18 +1519,19 @@ tc_reloc_mangle (fix_ptr, intr, base)
{ {
symbolS *symbol_ptr; symbolS *symbol_ptr;
if (fix_ptr->fx_addsy && if (fix_ptr->fx_addsy
fix_ptr->fx_subsy) && fix_ptr->fx_subsy)
{ {
symbolS *add = fix_ptr->fx_addsy; symbolS *add = fix_ptr->fx_addsy;
symbolS *sub = fix_ptr->fx_subsy; symbolS *sub = fix_ptr->fx_subsy;
if (S_GET_SEGMENT(add) != S_GET_SEGMENT(sub))
if (S_GET_SEGMENT (add) != S_GET_SEGMENT (sub))
as_bad (_("Can't subtract symbols in different sections %s %s"),
S_GET_NAME (add), S_GET_NAME (sub));
else
{ {
as_bad(_("Can't subtract symbols in different sections %s %s"), int diff = S_GET_VALUE (add) - S_GET_VALUE (sub);
S_GET_NAME(add), S_GET_NAME(sub));
}
else {
int diff = S_GET_VALUE(add) - S_GET_VALUE(sub);
fix_ptr->fx_addsy = 0; fix_ptr->fx_addsy = 0;
fix_ptr->fx_subsy = 0; fix_ptr->fx_subsy = 0;
fix_ptr->fx_offset += diff; fix_ptr->fx_offset += diff;
@ -1552,10 +1540,10 @@ tc_reloc_mangle (fix_ptr, intr, base)
symbol_ptr = fix_ptr->fx_addsy; symbol_ptr = fix_ptr->fx_addsy;
/* If this relocation is attached to a symbol then it's ok /* If this relocation is attached to a symbol then it's ok
to output it */ to output it. */
if (fix_ptr->fx_r_type == 0) if (fix_ptr->fx_r_type == 0)
{ {
/* cons likes to create reloc32's whatever the size of the reloc.. */ /* cons likes to create reloc32's whatever the size of the reloc. */
switch (fix_ptr->fx_size) switch (fix_ptr->fx_size)
{ {
case 2: case 2:
@ -1570,12 +1558,9 @@ tc_reloc_mangle (fix_ptr, intr, base)
default: default:
abort (); abort ();
} }
} }
else else
{
intr->r_type = fix_ptr->fx_r_type; intr->r_type = fix_ptr->fx_r_type;
}
intr->r_vaddr = fix_ptr->fx_frag->fr_address + fix_ptr->fx_where + base; intr->r_vaddr = fix_ptr->fx_frag->fr_address + fix_ptr->fx_where + base;
intr->r_offset = fix_ptr->fx_offset; intr->r_offset = fix_ptr->fx_offset;
@ -1585,4 +1570,3 @@ tc_reloc_mangle (fix_ptr, intr, base)
else else
intr->r_symndx = -1; intr->r_symndx = -1;
} }