aboutsummaryrefslogtreecommitdiff
path: root/gas
diff options
context:
space:
mode:
authorRichard Sandiford <rdsandiford@googlemail.com>2006-04-05 12:41:59 +0000
committerRichard Sandiford <rdsandiford@googlemail.com>2006-04-05 12:41:59 +0000
commit910600e9c7e78f59a8e89638016b70837a1ea622 (patch)
tree840539dc31ba9060f47dbfe8d9cc523a607e84b2 /gas
parent3b6fe0ccfde65852e8aedad01c1aa6953de9ca13 (diff)
downloadgdb-910600e9c7e78f59a8e89638016b70837a1ea622.zip
gdb-910600e9c7e78f59a8e89638016b70837a1ea622.tar.gz
gdb-910600e9c7e78f59a8e89638016b70837a1ea622.tar.bz2
bfd/
* config.bfd (sparc-*-vxworks*): New stanza. * configure.in (bfd_elf32_sparc_vxworks_vec): New stanza. (bfd_elf32_sparc_vec, bfd_elf64_sparc_vec): Add elf-vxworks.lo. * configure: Regenerate. * elf32-sparc.c: Include elf-vxworks.h. (elf32_sparc_vxworks_link_hash_table_create: New. (elf32_sparc_vxworks_final_write_processing): New. (TARGET_BIG_SYM): Override for VxWorks. (TARGET_BIG_NAME, ELF_MINPAGESIZE): Likewise. (bfd_elf32_bfd_link_hash_table_create): Likewise. (elf_backend_want_got_plt, elf_backend_plt_readonly): Likewise. (elf_backend_got_header_size, elf_backend_add_symbol_hook): Likewise. (elf_backend_link_output_symbol_hook): Likewise. (elf_backend_emit_relocs): Likewise. (elf_backend_final_write_processing, elf32_bed): Likewise. * elfxx-sparc.c: Include libiberty.h and elf-vxworks.h. (sparc_vxworks_exec_plt0_entry, sparc_vxworks_exec_plt_entry): New. (sparc_vxworks_shared_plt0_entry, sparc_vxworks_shared_plt_entry): New. (_bfd_sparc_elf_link_hash_table_create): Don't initialize build_plt_entry here. (create_got_section): Initialize sgotplt for VxWorks. (_bfd_sparc_elf_create_dynamic_sections): Initialize build_plt_entry, plt_header_size and plt_entry_size, with new VxWorks-specific settings. Call elf_vxworks_create_dynamic_sections for VxWorks. (allocate_dynrelocs): Use plt_header_size and plt_entry_size. Allocate room for .got.plt and .rela.plt.unloaded entries on VxWorks. (_bfd_sparc_elf_size_dynamic_sections): Don't allocate a nop in .plt for VxWorks. Check for the .got.plt section. (sparc_vxworks_build_plt_entry): New function. (_bfd_sparc_elf_finish_dynamic_symbol): Add handling of VxWorks PLTs. Don't make _GLOBAL_OFFSET_TABLE_ and _PROCEDURE_LINKAGE_TABLE_ absolute on VxWorks. (sparc32_finish_dyn): Add special handling for DT_RELASZ and DT_PLTGOT on VxWorks. (sparc_vxworks_finish_exec_plt): New. (sparc_vxworks_finish_shared_plt): New. (_bfd_sparc_elf_finish_dynamic_sections): Call them. Use plt_header_size and plt_entry_size. * elfxx-sparc.h (_bfd_sparc_elf_link_hash_table): Add is_vxworks, srelplt2, sgotplt, plt_header_size and plt_entry_size fields. * Makefile.am (elfxx-sparc.lo): Depend on elf-vxworks.h. (elf32-sparc.lo): Likewise. * Makefile.in: Regenerate. * targets.c (bfd_elf32_sparc_vxworks_vec): Declare. (_bfd_target_vector): Add a pointer to it. gas/ * config/tc-sparc.c (sparc_target_format): Handle TE_VXWORKS. (GOTT_BASE, GOTT_INDEX): New. (tc_gen_reloc): Don't alter relocations against GOTT_BASE and GOTT_INDEX when generating VxWorks PIC. * configure.tgt (sparc*-*-vxworks*): Remove this special case; use the generic *-*-vxworks* stanza instead. gas/testsuite/ * gas/sparc/vxworks-pic.s, gas/sparc/vxworks-pic.d: New test. * gas/sparc/sparc.exp: Run it. Remove sparc*-*-vxworks* XFAILs. ld/ * configure.tgt (sparc*-*-vxworks*): New stanza. * emulparams/elf32_sparc_vxworks.sh: New file. * Makefile.am (ALL_EMULATIONS): Add eelf32_sparc_vxworks.o. (eelf32_sparc_vxworks.c): New rule. * Makefile.in: Regenerate. ld/testsuite/ * ld-sparc/vxworks1.dd, ld-sparc/vxworks1.ld, ld-sparc/vxworks1-lib.dd, * ld-sparc/vxworks1-lib.nd, ld-sparc/vxworks1-lib.rd, * ld-sparc/vxworks1-lib.s, ld-sparc/vxworks1.rd, ld-sparc/vxworks1.s, * ld-sparc/vxworks1-static.d, ld-sparc/vxworks2.s, * ld-sparc/vxworks2.sd, ld-sparc/vxworks2-static.sd: New tests. * ld-sparc/sparc.exp: Run them.
Diffstat (limited to 'gas')
-rw-r--r--gas/ChangeLog10
-rw-r--r--gas/config/tc-sparc.c40
-rw-r--r--gas/configure.tgt2
-rw-r--r--gas/testsuite/ChangeLog5
-rw-r--r--gas/testsuite/gas/sparc/sparc.exp6
-rw-r--r--gas/testsuite/gas/sparc/vxworks-pic.d27
-rw-r--r--gas/testsuite/gas/sparc/vxworks-pic.s11
7 files changed, 89 insertions, 12 deletions
diff --git a/gas/ChangeLog b/gas/ChangeLog
index fadd3e0..3f759e0 100644
--- a/gas/ChangeLog
+++ b/gas/ChangeLog
@@ -1,3 +1,13 @@
+2006-04-05 Richard Sandiford <richard@codesourcery.com>
+ Daniel Jacobowitz <dan@codesourcery.com>
+
+ * config/tc-sparc.c (sparc_target_format): Handle TE_VXWORKS.
+ (GOTT_BASE, GOTT_INDEX): New.
+ (tc_gen_reloc): Don't alter relocations against GOTT_BASE and
+ GOTT_INDEX when generating VxWorks PIC.
+ * configure.tgt (sparc*-*-vxworks*): Remove this special case;
+ use the generic *-*-vxworks* stanza instead.
+
2006-04-04 Alan Modra <amodra@bigpond.net.au>
PR 997
diff --git a/gas/config/tc-sparc.c b/gas/config/tc-sparc.c
index 04bfb53..10a1411 100644
--- a/gas/config/tc-sparc.c
+++ b/gas/config/tc-sparc.c
@@ -334,6 +334,10 @@ sparc_target_format ()
#endif
#endif
+#ifdef TE_VXWORKS
+ return "elf32-sparc-vxworks";
+#endif
+
#ifdef OBJ_ELF
return sparc_arch_size == 64 ? "elf64-sparc" : "elf32-sparc";
#endif
@@ -3528,6 +3532,10 @@ tc_gen_reloc (section, fixp)
#else
#define GOT_NAME "__GLOBAL_OFFSET_TABLE_"
#endif
+#ifdef TE_VXWORKS
+#define GOTT_BASE "__GOTT_BASE__"
+#define GOTT_INDEX "__GOTT_INDEX__"
+#endif
/* This code must be parallel to the OBJ_ELF tc_fix_adjustable. */
@@ -3540,18 +3548,30 @@ tc_gen_reloc (section, fixp)
code = BFD_RELOC_SPARC_WPLT30;
break;
case BFD_RELOC_HI22:
- if (fixp->fx_addsy != NULL
- && strcmp (S_GET_NAME (fixp->fx_addsy), GOT_NAME) == 0)
- code = BFD_RELOC_SPARC_PC22;
- else
- code = BFD_RELOC_SPARC_GOT22;
+ code = BFD_RELOC_SPARC_GOT22;
+ if (fixp->fx_addsy != NULL)
+ {
+ if (strcmp (S_GET_NAME (fixp->fx_addsy), GOT_NAME) == 0)
+ code = BFD_RELOC_SPARC_PC22;
+#ifdef TE_VXWORKS
+ if (strcmp (S_GET_NAME (fixp->fx_addsy), GOTT_BASE) == 0
+ || strcmp (S_GET_NAME (fixp->fx_addsy), GOTT_INDEX) == 0)
+ code = BFD_RELOC_HI22; /* Unchanged. */
+#endif
+ }
break;
case BFD_RELOC_LO10:
- if (fixp->fx_addsy != NULL
- && strcmp (S_GET_NAME (fixp->fx_addsy), GOT_NAME) == 0)
- code = BFD_RELOC_SPARC_PC10;
- else
- code = BFD_RELOC_SPARC_GOT10;
+ code = BFD_RELOC_SPARC_GOT10;
+ if (fixp->fx_addsy != NULL)
+ {
+ if (strcmp (S_GET_NAME (fixp->fx_addsy), GOT_NAME) == 0)
+ code = BFD_RELOC_SPARC_PC10;
+#ifdef TE_VXWORKS
+ if (strcmp (S_GET_NAME (fixp->fx_addsy), GOTT_BASE) == 0
+ || strcmp (S_GET_NAME (fixp->fx_addsy), GOTT_INDEX) == 0)
+ code = BFD_RELOC_LO10; /* Unchanged. */
+#endif
+ }
break;
case BFD_RELOC_SPARC13:
code = BFD_RELOC_SPARC_GOT13;
diff --git a/gas/configure.tgt b/gas/configure.tgt
index 6463631..696daaa 100644
--- a/gas/configure.tgt
+++ b/gas/configure.tgt
@@ -335,7 +335,7 @@ case ${generic_target} in
sparc-*-rtems*) fmt=elf ;;
sparc-*-sunos4*) fmt=aout em=sun3 ;;
- sparc-*-aout | sparc*-*-vxworks*) fmt=aout em=sparcaout ;;
+ sparc-*-aout) fmt=aout em=sparcaout ;;
sparc-*-coff) fmt=coff ;;
sparc-*-linux*aout*) fmt=aout em=linux ;;
sparc-*-linux-*) fmt=elf em=linux ;;
diff --git a/gas/testsuite/ChangeLog b/gas/testsuite/ChangeLog
index c4b0217..28bbea8 100644
--- a/gas/testsuite/ChangeLog
+++ b/gas/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2006-04-05 Richard Sandiford <richard@codesourcery.com>
+
+ * gas/sparc/vxworks-pic.s, gas/sparc/vxworks-pic.d: New test.
+ * gas/sparc/sparc.exp: Run it. Remove sparc*-*-vxworks* XFAILs.
+
2006-03-23 H.J. Lu <hongjiu.lu@intel.com>
* gas/i386/rep.s: Pad with .p2align.
diff --git a/gas/testsuite/gas/sparc/sparc.exp b/gas/testsuite/gas/sparc/sparc.exp
index 4189ddb..a2e362d 100644
--- a/gas/testsuite/gas/sparc/sparc.exp
+++ b/gas/testsuite/gas/sparc/sparc.exp
@@ -17,7 +17,7 @@ proc gas_64_check { } {
}
proc sparc_elf_setup { } {
- setup_xfail "sparc*-*-*aout*" "sparc*-*-sunos4*" "sparc*-*-vxworks*"
+ setup_xfail "sparc*-*-*aout*" "sparc*-*-sunos4*"
setup_xfail "sparc*-fujitsu-none" "sparc*-*-*n*bsd*"
setup_xfail "sparc*-*-coff" "sparc*-*-lynxos*"
clear_xfail "sparc64*-*-*n*bsd*"
@@ -50,6 +50,10 @@ if [istarget sparc*-*-*] {
}
}
+if [istarget sparc-*-vxworks*] {
+ run_dump_test "vxworks-pic"
+}
+
if [istarget sparclet*-*-*] {
run_dump_test "splet"
run_dump_test "splet-2"
diff --git a/gas/testsuite/gas/sparc/vxworks-pic.d b/gas/testsuite/gas/sparc/vxworks-pic.d
new file mode 100644
index 0000000..7e238fb
--- /dev/null
+++ b/gas/testsuite/gas/sparc/vxworks-pic.d
@@ -0,0 +1,27 @@
+#as: -KPIC
+#objdump: -dr
+#name: VxWorks PIC
+
+.*: file format .*
+
+Disassembly of section \.text:
+
+00000000 <\.text>:
+ 0: 2f 00 00 00 sethi %hi\(0\), %l7
+ 0: R_SPARC_HI22 __GOTT_BASE__
+ 4: ee 05 e0 00 ld \[ %l7 \], %l7
+ 4: R_SPARC_LO10 __GOTT_BASE__
+ 8: ee 05 e0 00 ld \[ %l7 \], %l7
+ 8: R_SPARC_LO10 __GOTT_INDEX__
+ c: 03 00 00 00 sethi %hi\(0\), %g1
+ c: R_SPARC_HI22 __GOTT_BASE__
+ 10: 82 10 60 00 mov %g1, %g1 ! 0x0
+ 10: R_SPARC_LO10 __GOTT_BASE__
+ 14: 03 00 00 00 sethi %hi\(0\), %g1
+ 14: R_SPARC_HI22 __GOTT_INDEX__
+ 18: 82 10 60 00 mov %g1, %g1 ! 0x0
+ 18: R_SPARC_LO10 __GOTT_INDEX__
+ 1c: 03 00 00 00 sethi %hi\(0\), %g1
+ 1c: R_SPARC_GOT22 __GOT_BASE__
+ 20: 82 10 60 00 mov %g1, %g1 ! 0x0
+ 20: R_SPARC_GOT10 __GOT_BASE__
diff --git a/gas/testsuite/gas/sparc/vxworks-pic.s b/gas/testsuite/gas/sparc/vxworks-pic.s
new file mode 100644
index 0000000..9d49e00
--- /dev/null
+++ b/gas/testsuite/gas/sparc/vxworks-pic.s
@@ -0,0 +1,11 @@
+ sethi %hi(__GOTT_BASE__), %l7
+ ld [%l7+%lo(__GOTT_BASE__)],%l7
+ ld [%l7+%lo(__GOTT_INDEX__)],%l7
+
+ sethi %hi(__GOTT_BASE__), %g1
+ or %g1, %lo(__GOTT_BASE__), %g1
+ sethi %hi(__GOTT_INDEX__), %g1
+ or %g1, %lo(__GOTT_INDEX__), %g1
+
+ sethi %hi(__GOT_BASE__), %g1
+ or %g1, %lo(__GOT_BASE__), %g1