aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJan Beulich <jbeulich@novell.com>2005-09-28 14:44:25 +0000
committerJan Beulich <jbeulich@novell.com>2005-09-28 14:44:25 +0000
commitd182319b0955ee234d2c9c1e1a68c38344238274 (patch)
tree48de22d3a1915ae87305ff3cd7aced0823225a43
parent37b75c0cc089664dafeed5720c2cfe11183089df (diff)
downloadgdb-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.
-rw-r--r--gas/ChangeLog12
-rw-r--r--gas/config/tc-i386.c72
-rw-r--r--gas/config/tc-i386.h8
-rw-r--r--gas/testsuite/ChangeLog6
-rw-r--r--gas/testsuite/gas/i386/reloc64.d12
-rw-r--r--gas/testsuite/gas/i386/reloc64.l17
-rw-r--r--gas/testsuite/gas/i386/reloc64.s14
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