diff options
author | Jan Beulich <jbeulich@novell.com> | 2005-09-28 14:44:25 +0000 |
---|---|---|
committer | Jan Beulich <jbeulich@novell.com> | 2005-09-28 14:44:25 +0000 |
commit | d182319b0955ee234d2c9c1e1a68c38344238274 (patch) | |
tree | 48de22d3a1915ae87305ff3cd7aced0823225a43 /gas | |
parent | 37b75c0cc089664dafeed5720c2cfe11183089df (diff) | |
download | gdb-d182319b0955ee234d2c9c1e1a68c38344238274.zip gdb-d182319b0955ee234d2c9c1e1a68c38344238274.tar.gz gdb-d182319b0955ee234d2c9c1e1a68c38344238274.tar.bz2 |
gas/
2005-09-28 Jan Beulich <jbeulich@novell.com>
* 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 <jbeulich@novell.com>
* gas/i386/reloc64.s: Also test .slong.
* gas/i386/reloc64.l: Adjust.
* gas/i386/reloc64.d: Adjust.
Diffstat (limited to 'gas')
-rw-r--r-- | gas/ChangeLog | 12 | ||||
-rw-r--r-- | gas/config/tc-i386.c | 72 | ||||
-rw-r--r-- | gas/config/tc-i386.h | 8 | ||||
-rw-r--r-- | gas/testsuite/ChangeLog | 6 | ||||
-rw-r--r-- | gas/testsuite/gas/i386/reloc64.d | 12 | ||||
-rw-r--r-- | gas/testsuite/gas/i386/reloc64.l | 17 | ||||
-rw-r--r-- | gas/testsuite/gas/i386/reloc64.s | 14 |
7 files changed, 91 insertions, 50 deletions
diff --git a/gas/ChangeLog b/gas/ChangeLog index de17088..b513b57 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,15 @@ +2005-09-28 Jan Beulich <jbeulich@novell.com> + + * 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 <arnold.metselaar@planet.nl> * app.c (do_scrub_chars <LEX_IS_SYMBOL_COMPONENT>): Check for full diff --git a/gas/config/tc-i386.c b/gas/config/tc-i386.c index 3820b19..8f229cf 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 ddfe297..bf537e0 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 6e82c82..dc7927a 100644 --- a/gas/testsuite/ChangeLog +++ b/gas/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2005-09-28 Jan Beulich <jbeulich@novell.com> + + * gas/i386/reloc64.s: Also test .slong. + * gas/i386/reloc64.l: Adjust. + * gas/i386/reloc64.d: Adjust. + 2005-09-21 Alan Modra <amodra@bigpond.net.au> * 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 ae08796..8503d23 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 a72a452..62a762b 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 9b93eb2..1ae14dd 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 |