From d182319b0955ee234d2c9c1e1a68c38344238274 Mon Sep 17 00:00:00 2001 From: Jan Beulich Date: Wed, 28 Sep 2005 14:44:25 +0000 Subject: [PATCH] gas/ 2005-09-28 Jan Beulich * config/tc-i386.h (x86_cons_fix_new): Declare unconditionally. (TC_CONS_FIX_NEW): Define unconditionally. (x86_pe_cons_fix_new): Remove. * config/tc-i386.c (signed_cons): New. (md_pseudo_table): Add slong. (x86_cons_fix_new): Declare unconditionally. (x86_pe_cons_fix_new): Merge into x86_cons_fix_new. (tc_gen_reloc): Also consider BFD_RELOC_X86_64_32S for gotpc conversion. gas/testsuite/ 2005-09-28 Jan Beulich * gas/i386/reloc64.s: Also test .slong. * gas/i386/reloc64.l: Adjust. * gas/i386/reloc64.d: Adjust. --- gas/ChangeLog | 12 ++++++ gas/config/tc-i386.c | 72 ++++++++++++++++---------------- gas/config/tc-i386.h | 8 +--- gas/testsuite/ChangeLog | 6 +++ gas/testsuite/gas/i386/reloc64.d | 12 ++++++ gas/testsuite/gas/i386/reloc64.l | 17 ++++---- gas/testsuite/gas/i386/reloc64.s | 14 +++++++ 7 files changed, 91 insertions(+), 50 deletions(-) diff --git a/gas/ChangeLog b/gas/ChangeLog index de17088f7d..b513b57892 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,15 @@ +2005-09-28 Jan Beulich + + * config/tc-i386.h (x86_cons_fix_new): Declare unconditionally. + (TC_CONS_FIX_NEW): Define unconditionally. + (x86_pe_cons_fix_new): Remove. + * config/tc-i386.c (signed_cons): New. + (md_pseudo_table): Add slong. + (x86_cons_fix_new): Declare unconditionally. + (x86_pe_cons_fix_new): Merge into x86_cons_fix_new. + (tc_gen_reloc): Also consider BFD_RELOC_X86_64_32S for gotpc + conversion. + 2005-09-28 Arnold Metselaar * app.c (do_scrub_chars ): Check for full diff --git a/gas/config/tc-i386.c b/gas/config/tc-i386.c index 3820b19abe..8f229cfb35 100644 --- a/gas/config/tc-i386.c +++ b/gas/config/tc-i386.c @@ -80,6 +80,7 @@ static void set_cpu_arch PARAMS ((int)); #ifdef TE_PE static void pe_directive_secrel PARAMS ((int)); #endif +static void signed_cons PARAMS ((int)); static char *output_invalid PARAMS ((int c)); static int i386_operand PARAMS ((char *operand_string)); static int i386_intel_operand PARAMS ((char *operand_string, int got_a_float)); @@ -461,6 +462,7 @@ const pseudo_typeS md_pseudo_table[] = {"dfloat", float_cons, 'd'}, {"tfloat", float_cons, 'x'}, {"value", cons, 2}, + {"slong", signed_cons, 4}, {"noopt", s_ignore, 0}, {"optim", s_ignore, 0}, {"code16gcc", set_16bit_gcc_code_flag, CODE_16BIT}, @@ -3764,6 +3766,32 @@ output_imm (insn_start_frag, insn_start_off) } } +/* x86_cons_fix_new is called via the expression parsing code when a + reloc is needed. We use this hook to get the correct .got reloc. */ +static enum bfd_reloc_code_real got_reloc = NO_RELOC; +static int cons_sign = -1; + +void +x86_cons_fix_new (fragS *frag, + unsigned int off, + unsigned int len, + expressionS *exp) +{ + enum bfd_reloc_code_real r = reloc (len, 0, cons_sign, got_reloc); + + got_reloc = NO_RELOC; + +#ifdef TE_PE + if (exp->X_op == O_secrel) + { + exp->X_op = O_symbol; + r = BFD_RELOC_32_SECREL; + } +#endif + + fix_new_exp (frag, off, len, exp, 0, r); +} + #if (!defined (OBJ_ELF) && !defined (OBJ_MAYBE_ELF)) || defined (LEX_AT) # define lex_got(reloc, adjust, types) NULL #else @@ -3871,22 +3899,6 @@ lex_got (enum bfd_reloc_code_real *reloc, return NULL; } -/* x86_cons_fix_new is called via the expression parsing code when a - reloc is needed. We use this hook to get the correct .got reloc. */ -static enum bfd_reloc_code_real got_reloc = NO_RELOC; - -void -x86_cons_fix_new (frag, off, len, exp) - fragS *frag; - unsigned int off; - unsigned int len; - expressionS *exp; -{ - enum bfd_reloc_code_real r = reloc (len, 0, -1, got_reloc); - got_reloc = NO_RELOC; - fix_new_exp (frag, off, len, exp, 0, r); -} - void x86_cons (exp, size) expressionS *exp; @@ -3922,26 +3934,15 @@ x86_cons (exp, size) } #endif -#ifdef TE_PE - -void -x86_pe_cons_fix_new (frag, off, len, exp) - fragS *frag; - unsigned int off; - unsigned int len; - expressionS *exp; +static void signed_cons (int size) { - enum bfd_reloc_code_real r = reloc (len, 0, -1, NO_RELOC); - - if (exp->X_op == O_secrel) - { - exp->X_op = O_symbol; - r = BFD_RELOC_32_SECREL; - } - - fix_new_exp (frag, off, len, exp, 0, r); + if (flag_code == CODE_64BIT) + cons_sign = 1; + cons (size); + cons_sign = -1; } +#ifdef TE_PE static void pe_directive_secrel (dummy) int dummy ATTRIBUTE_UNUSED; @@ -3961,7 +3962,6 @@ pe_directive_secrel (dummy) input_line_pointer--; demand_empty_rest_of_line (); } - #endif static int i386_immediate PARAMS ((char *)); @@ -5565,7 +5565,9 @@ tc_gen_reloc (section, fixp) break; } - if ((code == BFD_RELOC_32 || code == BFD_RELOC_32_PCREL) + if ((code == BFD_RELOC_32 + || code == BFD_RELOC_32_PCREL + || code == BFD_RELOC_X86_64_32S) && GOT_symbol && fixp->fx_addsy == GOT_symbol) { diff --git a/gas/config/tc-i386.h b/gas/config/tc-i386.h index ddfe297854..bf537e06cf 100644 --- a/gas/config/tc-i386.h +++ b/gas/config/tc-i386.h @@ -390,17 +390,11 @@ arch_entry; #if (defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)) && !defined (LEX_AT) #define TC_PARSE_CONS_EXPRESSION(EXP, NBYTES) x86_cons (EXP, NBYTES) extern void x86_cons PARAMS ((expressionS *, int)); +#endif #define TC_CONS_FIX_NEW(FRAG,OFF,LEN,EXP) x86_cons_fix_new(FRAG, OFF, LEN, EXP) extern void x86_cons_fix_new PARAMS ((fragS *, unsigned int, unsigned int, expressionS *)); -#endif - -#ifdef TE_PE -#define TC_CONS_FIX_NEW(FRAG,OFF,LEN,EXP) x86_pe_cons_fix_new(FRAG, OFF, LEN, EXP) -extern void x86_pe_cons_fix_new - PARAMS ((fragS *, unsigned int, unsigned int, expressionS *)); -#endif #define DIFF_EXPR_OK /* foo-. gets turned into PC relative relocs */ diff --git a/gas/testsuite/ChangeLog b/gas/testsuite/ChangeLog index 6e82c828d6..dc7927a4c8 100644 --- a/gas/testsuite/ChangeLog +++ b/gas/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2005-09-28 Jan Beulich + + * gas/i386/reloc64.s: Also test .slong. + * gas/i386/reloc64.l: Adjust. + * gas/i386/reloc64.d: Adjust. + 2005-09-21 Alan Modra * gas/lns/lns.exp (lns-common-1): Don't run on targets without diff --git a/gas/testsuite/gas/i386/reloc64.d b/gas/testsuite/gas/i386/reloc64.d index ae0879660a..8503d23eea 100644 --- a/gas/testsuite/gas/i386/reloc64.d +++ b/gas/testsuite/gas/i386/reloc64.d @@ -65,6 +65,18 @@ Disassembly of section \.data: .*[ ]+R_X86_64_TLSLD[ ]+xtrn .*[ ]+R_X86_64_DTPOFF32[ ]+xtrn .*[ ]+R_X86_64_TPOFF32[ ]+xtrn +.*[ ]+R_X86_64_32S[ ]+xtrn +.*[ ]+R_X86_64_PC32[ ]+xtrn +.*[ ]+R_X86_64_GOT32[ ]+xtrn +.*[ ]+R_X86_64_GOTPCREL[ ]+xtrn +.*[ ]+R_X86_64_GOTPC32[ ]+_GLOBAL_OFFSET_TABLE_ +.*[ ]+R_X86_64_GOTPC32[ ]+_GLOBAL_OFFSET_TABLE_ +.*[ ]+R_X86_64_PLT32[ ]+xtrn +.*[ ]+R_X86_64_TLSGD[ ]+xtrn +.*[ ]+R_X86_64_GOTTPOFF[ ]+xtrn +.*[ ]+R_X86_64_TLSLD[ ]+xtrn +.*[ ]+R_X86_64_DTPOFF32[ ]+xtrn +.*[ ]+R_X86_64_TPOFF32[ ]+xtrn .*[ ]+R_X86_64_16[ ]+xtrn .*[ ]+R_X86_64_PC16[ ]+xtrn .*[ ]+R_X86_64_8[ ]+xtrn diff --git a/gas/testsuite/gas/i386/reloc64.l b/gas/testsuite/gas/i386/reloc64.l index a72a452331..62a762bc7e 100644 --- a/gas/testsuite/gas/i386/reloc64.l +++ b/gas/testsuite/gas/i386/reloc64.l @@ -57,15 +57,7 @@ .*:138: Error: .* .*:139: Error: .* .*:146: Error: .* -.*:159: Error: .* .*:160: Error: .* -.*:161: Error: .* -.*:164: Error: .* -.*:165: Error: .* -.*:166: Error: .* -.*:167: Error: .* -.*:168: Error: .* -.*:169: Error: .* .*:173: Error: .* .*:174: Error: .* .*:175: Error: .* @@ -75,3 +67,12 @@ .*:181: Error: .* .*:182: Error: .* .*:183: Error: .* +.*:187: Error: .* +.*:188: Error: .* +.*:189: Error: .* +.*:192: Error: .* +.*:193: Error: .* +.*:194: Error: .* +.*:195: Error: .* +.*:196: Error: .* +.*:197: Error: .* diff --git a/gas/testsuite/gas/i386/reloc64.s b/gas/testsuite/gas/i386/reloc64.s index 9b93eb2807..1ae14ddcbe 100644 --- a/gas/testsuite/gas/i386/reloc64.s +++ b/gas/testsuite/gas/i386/reloc64.s @@ -154,6 +154,20 @@ bad .long xtrn@gotoff .long xtrn@dtpoff .long xtrn@tpoff + .slong xtrn + .slong xtrn - . + .slong xtrn@got +bad .slong xtrn@gotoff + .slong xtrn@gotpcrel + .slong _GLOBAL_OFFSET_TABLE_ + .slong _GLOBAL_OFFSET_TABLE_ - . + .slong xtrn@plt + .slong xtrn@tlsgd + .slong xtrn@gottpoff + .slong xtrn@tlsld + .slong xtrn@dtpoff + .slong xtrn@tpoff + .word xtrn .word xtrn - . bad .word xtrn@got -- 2.34.1