From ade614d5076838bda772ad9cf35a332298a8aedf Mon Sep 17 00:00:00 2001 From: Ken Raeburn Date: Wed, 7 Sep 1994 23:58:32 +0000 Subject: [PATCH] (tc_gen_reloc): Use bfd_get_reloc_code_name in error message. --- gas/config/tc-alpha.c | 9 ++++----- gas/config/tc-i386.c | 41 +++++++++++++++++++++++++++++++++++------ gas/config/tc-sparc.c | 17 +++++++++++++++-- 3 files changed, 54 insertions(+), 13 deletions(-) diff --git a/gas/config/tc-alpha.c b/gas/config/tc-alpha.c index c2ff1c3c699..2b82dd7e3d1 100644 --- a/gas/config/tc-alpha.c +++ b/gas/config/tc-alpha.c @@ -130,6 +130,7 @@ static void emit_ldah_num PARAMS ((int, bfd_vma, int)); static void emit_addq_r PARAMS ((int, int, int)); static void emit_lda_n PARAMS ((int, bfd_vma, int)); static void emit_add64 PARAMS ((int, int, bfd_vma)); +static int in_range PARAMS ((bfd_vma, int, int)); const pseudo_typeS md_pseudo_table[] = { @@ -383,8 +384,8 @@ tc_gen_reloc (sec, fixp) assert (reloc->howto != 0); if (!fixp->fx_pcrel != !reloc->howto->pc_relative) { - as_fatal ("bug in handling type-%d relocs", fixp->fx_r_type); - abort (); + as_fatal ("internal error? cannot generate `%s' relocation", + bfd_get_reloc_code_name (fixp->fx_r_type)); } assert (!fixp->fx_pcrel == !reloc->howto->pc_relative); @@ -1074,7 +1075,6 @@ build_mem (opc, ra, rb, disp) int opc, ra, rb; bfd_signed_vma disp; { - fprintf (stderr, "build_mem: disp=%lx\n", disp); if ((disp >> 15) != 0 && (disp >> 15) + 1 != 0) abort (); @@ -1148,7 +1148,7 @@ emit_add64 (in, out, num) emit_ldah_num (out, snum >> 16, in); return; } - /* I'm not sure this one is getting invoked when it could. + /* I'm not sure this one is getting invoked when it could. */ if ((num & 1) == 0 && in == ZERO) { if (in_range (snum >> 1, 16, 0)) @@ -1195,7 +1195,6 @@ emit_add64 (in, out, num) if (lo & 0x80000000) lo -= ((bfd_vma)0x10000000 << 4); snum -= lo; - printf ("splitting load of 0x%lx: 0x%lx 0x%lx\n", num, snum, lo); emit_add64 (ZERO, out, snum >> 32); emit_sll_n (out, 32, out); if (lo != 0) diff --git a/gas/config/tc-i386.c b/gas/config/tc-i386.c index ef179c11df9..e3caab803d3 100644 --- a/gas/config/tc-i386.c +++ b/gas/config/tc-i386.c @@ -161,6 +161,8 @@ static reg_entry *ebp, *esp; static int this_operand; /* current operand we are working on */ +static int flag_do_long_jump; /* FIXME what does this do? */ + /* Interface to relax_segment. There are 2 relax states for 386 jump insns: one for conditional & one for unconditional jumps. This is because the these two types @@ -1649,7 +1651,7 @@ md_assemble (line) } #ifdef DEBUG386 - if (flagseen['D']) + if (flag_debug) { pi (line, &i); } @@ -2242,7 +2244,7 @@ md_create_long_jump (ptr, from_addr, to_addr, frag, to_symbol) { long offset; - if (flagseen['m']) + if (flag_do_long_jump) { offset = to_addr - S_GET_VALUE (to_symbol); md_number_to_chars (ptr, (valueT) 0xe9, 1);/* opcode for long jmp */ @@ -2427,7 +2429,11 @@ parse_register (reg_string) return (reg_entry *) hash_find (reg_hash, reg_name_given); } -CONST char *md_shortopts = ""; +#ifdef OBJ_ELF +CONST char *md_shortopts = "mVQ:"; +#else +CONST char *md_shortopts = "m"; +#endif struct option md_longopts[] = { {NULL, no_argument, NULL, 0} }; @@ -2438,13 +2444,36 @@ md_parse_option (c, arg) int c; char *arg; { - return 0; + switch (c) + { + case 'm': + flag_do_long_jump = 1; + break; + +#ifdef OBJ_ELF + /* -V: SVR4 argument to print version ID. */ + case 'V': + print_version_id (); + break; + + /* -Qy, -Qn: SVR4 arguments controlling whether a .comment section + should be emitted or not. FIXME: Not implemented. */ + case 'Q': + break; +#endif + + default: + return 0; + } + return 1; } void md_show_usage (stream) FILE *stream; { + fprintf (stream, "\ +-m do long jump\n"); } /* We have no need to default values of symbols. */ @@ -2551,8 +2580,8 @@ tc_gen_reloc (section, fixp) name = S_GET_NAME (fixp->fx_addsy); if (name == NULL) name = ""; - as_fatal ("Cannot find relocation type for symbol %s, code %d", - name, (int) code); + as_fatal ("Cannot generate relocation type for symbol %s, code %s", + name, bfd_get_reloc_code_name (code)); } return rel; diff --git a/gas/config/tc-sparc.c b/gas/config/tc-sparc.c index 2219814366f..5fa7d9dae60 100644 --- a/gas/config/tc-sparc.c +++ b/gas/config/tc-sparc.c @@ -1906,6 +1906,19 @@ md_apply_fix (fixP, value) if (fixP->fx_r_type == BFD_RELOC_32_PCREL_S2 && fixP->fx_addsy) val += fixP->fx_where + fixP->fx_frag->fr_address; +#ifdef OBJ_AOUT + /* FIXME: More ridiculous gas reloc hacking. If we are going to + generate a reloc, then we just want to let the reloc addend set + the value. We do not want to also stuff the addend into the + object file. Including the addend in the object file works when + doing a static link, because the linker will ignore the object + file contents. However, the dynamic linker does not ignore the + object file contents. */ + if (fixP->fx_addsy != NULL + && fixP->fx_r_type != BFD_RELOC_32_PCREL_S2) + val = 0; +#endif + switch (fixP->fx_r_type) { case BFD_RELOC_16: @@ -2113,8 +2126,8 @@ tc_gen_reloc (section, fixp) if (reloc->howto == 0) { as_bad_where (fixp->fx_file, fixp->fx_line, - "internal error: can't export reloc type %d", - fixp->fx_r_type); + "internal error: can't export reloc type %d (`%s')", + fixp->fx_r_type, bfd_get_reloc_code_name (code)); return 0; } assert (!fixp->fx_pcrel == !reloc->howto->pc_relative); -- 2.30.2