diff options
author | Nick Clifton <nickc@redhat.com> | 2010-05-25 14:12:43 +0000 |
---|---|---|
committer | Nick Clifton <nickc@redhat.com> | 2010-05-25 14:12:43 +0000 |
commit | 8e45593ff36c03d6f39e28a0a7947ce3d282794d (patch) | |
tree | 5778225fd7142beeca4f0f499269befd551cd78d /gas | |
parent | 52a6ecd218c2ac5b1dac09f2f002eedbd11c8ee3 (diff) | |
download | gdb-8e45593ff36c03d6f39e28a0a7947ce3d282794d.zip gdb-8e45593ff36c03d6f39e28a0a7947ce3d282794d.tar.gz gdb-8e45593ff36c03d6f39e28a0a7947ce3d282794d.tar.bz2 |
2010-05-21 Daniel Jacobowitz <dan@codesourcery.com>
Joseph Myers <joseph@codesourcery.com>
Andrew Stubbs <ams@codesourcery.com>
bfd/
* config.bfd (sh-*-uclinux* | sh[12]-*-uclinux*): Add
bfd_elf32_shl_vec, and FDPIC vectors to targ_selvecs.
* configure.in: Handle FDPIC vectors.
* elf32-sh-relocs.h: Add FDPIC and movi20 relocations.
* elf32-sh.c (DEFAULT_STACK_SIZE): Define.
(SYMBOL_FUNCDESC_LOCAL): Define. Use it instead of
SYMBOL_REFERENCES_LOCAL for function descriptors.
(fdpic_object_p): New.
(sh_reloc_map): Add FDPIC and movi20 relocations.
(sh_elf_info_to_howto, sh_elf_relocate_section): Handle new invalid
range.
(struct elf_sh_plt_info): Add got20 and short_plt. Update all
definitions.
(FDPIC_PLT_ENTRY_SIZE, FDPIC_PLT_LAZY_OFFSET): Define.
(fdpic_sh_plt_entry_be, fdpic_sh_plt_entry_le, fdpic_sh_plts): New.
(FDPIC_SH2A_PLT_ENTRY_SIZE, FDPIC_SH2A_PLT_LAZY_OFFSET): Define.
(fdpic_sh2a_plt_entry_be, fdpic_sh2a_plt_entry_le)
(fdpic_sh2a_short_plt_be, fdpic_sh2a_short_plt_le, fdpic_sh2a_plts):
New.
(get_plt_info): Handle FDPIC.
(MAX_SHORT_PLT): Define.
(get_plt_index, get_plt_offset): Handle short_plt.
(union gotref): New.
(struct elf_sh_link_hash_entry): Add funcdesc, rename tls_type to
got_type and adjust all uses. Add GOT_FUNCDESC.
(struct sh_elf_obj_tdata): Add local_funcdesc. Rename
local_got_tls_type to local_got_type.
(sh_elf_local_got_type): Renamed from sh_elf_local_got_tls_type. All
users changed.
(sh_elf_local_funcdesc): Define.
(struct elf_sh_link_hash_table): Add sfuncdesc, srelfuncdesc, fdpic_p,
and srofixup.
(sh_elf_link_hash_newfunc): Initialize new fields.
(sh_elf_link_hash_table_create): Set fdpic_p.
(sh_elf_omit_section_dynsym): New.
(create_got_section): Create .got.funcdesc, .rela.got.funcdesc
and .rofixup.
(allocate_dynrelocs): Allocate local function descriptors and space
for R_SH_FUNCDESC-related relocations, and for rofixups.
Handle GOT_FUNCDESC. Create fixups. Handle GOT entries which
require function descriptors.
(sh_elf_always_size_sections): Handle PT_GNU_STACK and __stacksize.
(sh_elf_modify_program_headers): New.
(sh_elf_size_dynamic_sections): Allocate function descriptors for
local symbols. Allocate .got.funcdesc contents. Allocate rofixups.
Handle local GOT entries of type GOT_FUNCDESC. Create fixups for
local GOT entries. Ensure that FDPIC libraries always have a PLTGOT
entry in the .dynamic section.
(sh_elf_add_dyn_reloc, sh_elf_got_offset, sh_elf_initialize_funcdesc)
(sh_elf_add_rofixup, sh_elf_osec_to_segment)
(sh_elf_osec_readonly_p, install_movi20_field): New functions.
(sh_elf_relocate_section): Handle new relocations, R_SH_FUNCDESC,
R_SH_GOTFUNCDESC and R_SH_GOTOFFFUNCDESC. Use sh_elf_got_offset
and .got.plt throughout to find _GLOBAL_OFFSET_TABLE_. Add rofixup
read-only section warnings. Handle undefined weak symbols. Generate
fixups for R_SH_DIR32 and GOT entries. Check for cross-segment
relocations and clear EF_SH_PIC. Handle 20-bit relocations.
Always generate R_SH_DIR32 for FDPIC instead of R_SH_RELATIVE.
(sh_elf_gc_sweep_hook): Handle R_SH_FUNCDESC, R_SH_GOTOFF20,
R_SH_GOTFUNCDESC, R_SH_GOTFUNCDESC20, and R_SH_GOTOFFFUNCDESC.
Handle 20-bit relocations.
(sh_elf_copy_indirect_symbol): Copy function descriptor reference
counts.
(sh_elf_check_relocs): Handle new relocations. Make symbols
dynamic for FDPIC relocs. Account for rofixups. Error for FDPIC
symbol mismatches. Allocate a GOT for R_SH_DIR32. Allocate fixups
for R_SH_DIR32.
(sh_elf_copy_private_data): Copy PT_GNU_STACK size.
(sh_elf_merge_private_data): Copy initial flags. Do not clobber
non-mach flags. Set EF_SH_PIC for FDPIC. Reject FDPIC mismatches.
(sh_elf_finish_dynamic_symbol): Do not handle got_funcdesc entries
here. Rename sgot to sgotplt and srel to srelplt. Handle short_plt,
FDPIC descriptors, and got20. Create R_SH_FUNCDESC_VALUE for FDPIC.
Use install_movi20_field. Rename srel to srelgot. Always generate
R_SH_DIR32 for FDPIC instead of R_SH_RELATIVE.
(sh_elf_finish_dynamic_sections): Fill in the GOT pointer in rofixup.
Do not fill in reserved GOT entries for FDPIC. Correct DT_PLTGOT.
Rename sgot to sgotplt. Assert that the right number of rofixups
and dynamic relocations were allocated.
(sh_elf_use_relative_eh_frame, sh_elf_encode_eh_address): New.
(elf_backend_omit_section_dynsym): Use sh_elf_omit_section_dynsym.
(elf_backend_can_make_relative_eh_frame)
(elf_backend_can_make_lsda_relative_eh_frame)
(elf_backend_encode_eh_address): Define.
(TARGET_BIG_SYM, TARGET_BIG_NAME, TARGET_LITTLE_SYM)
(TARGET_LITTLE_NAME, elf_backend_modify_program_headers, elf32_bed):
Redefine for FDPIC vector.
* reloc.c: Add SH FDPIC and movi20 relocations.
* targets.c (_bfd_target_vector): Add FDPIC vectors.
* configure, bfd-in2.h, libbfd.h: Regenerated.
binutils/
* readelf.c (get_machine_flags): Handle EF_SH_PIC and EF_SH_FDPIC.
gas/
* config/tc-sh.c (sh_fdpic): New.
(sh_check_fixup): Handle relocations on movi20.
(parse_exp): Do not reject PIC operators here.
(build_Mytes): Check for unhandled PIC operators here. Use
sh_check_fixup for movi20.
(enum options): Add OPTION_FDPIC.
(md_longopts, md_parse_option, md_show_usage): Add --fdpic.
(sh_fix_adjustable, md_apply_fix): Handle FDPIC and movi20 relocations.
(sh_elf_final_processing): Handle --fdpic.
(sh_uclinux_target_format): New.
(sh_parse_name): Handle FDPIC relocation operators.
* config/tc-sh.h (TARGET_FORMAT): Define specially for TE_UCLINUX.
(sh_uclinux_target_format): Declare for TE_UCLINUX.
* configure.tgt (sh-*-uclinux* | sh[12]-*-uclinux*): Set
em=uclinux.
* doc/c-sh.texi (SH Options): Document --fdpic.
gas/testsuite/
* gas/sh/basic.exp: Run new tests. Handle uClinux like Linux.
* gas/sh/fdpic.d: New file.
* gas/sh/fdpic.s: New file.
* gas/sh/reg-prefix.d: Force big-endian.
* gas/sh/sh2a-pic.d: New file.
* gas/sh/sh2a-pic.s: New file.
* lib/gas-defs.exp (is_elf_format): Include sh*-*-uclinux*.
include/elf/
* sh.h (EF_SH_PIC, EF_SH_FDPIC): Define.
(R_SH_FIRST_INVALID_RELOC_6, R_SH_LAST_INVALID_RELOC_6): New. Adjust
other invalid ranges.
(R_SH_GOT20, R_SH_GOTOFF20, R_SH_GOTFUNCDESC, R_SH_GOTFUNCDESC20)
(R_SH_GOTOFFFUNCDESC, R_SH_GOTOFFFUNCDESC20, R_SH_FUNCDESC)
(R_SH_FUNCDESC_VALUE): New.
ld/
* Makefile.am (ALL_EMULATIONS): Add eshelf_fd.o and eshlelf_fd.o.
(eshelf_fd.c, eshlelf_fd.c): New rules.
* Makefile.in: Regenerate.
* configure.tgt (sh-*-uclinux*): Add shelf_fd and shlelf_fd
emulations.
* emulparams/shelf_fd.sh: New file.
* emulparams/shlelf_fd.sh: New file.
* emulparams/shlelf_linux.sh: Update comment.
ld/testsuite/
* ld-sh/sh.exp: Handle uClinux like Linux.
* lib/ld-lib.exp (is_elf_format): Include sh*-*-uclinux*.
* ld-sh/fdpic-funcdesc-shared.d: New file.
* ld-sh/fdpic-funcdesc-shared.s: New file.
* ld-sh/fdpic-funcdesc-static.d: New file.
* ld-sh/fdpic-funcdesc-static.s: New file.
* ld-sh/fdpic-gotfuncdesc-shared.d: New file.
* ld-sh/fdpic-gotfuncdesc-shared.s: New file.
* ld-sh/fdpic-gotfuncdesc-static.d: New file.
* ld-sh/fdpic-gotfuncdesc-static.s: New file.
* ld-sh/fdpic-gotfuncdesci20-shared.d: New file.
* ld-sh/fdpic-gotfuncdesci20-shared.s: New file.
* ld-sh/fdpic-gotfuncdesci20-static.d: New file.
* ld-sh/fdpic-gotfuncdesci20-static.s: New file.
* ld-sh/fdpic-goti20-shared.d: New file.
* ld-sh/fdpic-goti20-shared.s: New file.
* ld-sh/fdpic-goti20-static.d: New file.
* ld-sh/fdpic-goti20-static.s: New file.
* ld-sh/fdpic-gotofffuncdesc-shared.d: New file.
* ld-sh/fdpic-gotofffuncdesc-shared.s: New file.
* ld-sh/fdpic-gotofffuncdesc-static.d: New file.
* ld-sh/fdpic-gotofffuncdesc-static.s: New file.
* ld-sh/fdpic-gotofffuncdesci20-shared.d: New file.
* ld-sh/fdpic-gotofffuncdesci20-shared.s: New file.
* ld-sh/fdpic-gotofffuncdesci20-static.d: New file.
* ld-sh/fdpic-gotofffuncdesci20-static.s: New file.
* ld-sh/fdpic-gotoffi20-shared.d: New file.
* ld-sh/fdpic-gotoffi20-shared.s: New file.
* ld-sh/fdpic-gotoffi20-static.d: New file.
* ld-sh/fdpic-gotoffi20-static.s: New file.
* ld-sh/fdpic-plt-be.d: New file.
* ld-sh/fdpic-plt-le.d: New file.
* ld-sh/fdpic-plt.s: New file.
* ld-sh/fdpic-plti20-be.d: New file.
* ld-sh/fdpic-plti20-le.d: New file.
* ld-sh/fdpic-stack-default.d: New file.
* ld-sh/fdpic-stack-size.d: New file.
* ld-sh/fdpic-stack.s: New file.
Diffstat (limited to 'gas')
-rw-r--r-- | gas/ChangeLog | 21 | ||||
-rw-r--r-- | gas/config/tc-sh.c | 111 | ||||
-rw-r--r-- | gas/config/tc-sh.h | 17 | ||||
-rw-r--r-- | gas/configure.tgt | 3 | ||||
-rw-r--r-- | gas/doc/c-sh.texi | 8 | ||||
-rw-r--r-- | gas/testsuite/ChangeLog | 12 | ||||
-rw-r--r-- | gas/testsuite/gas/sh/basic.exp | 4 | ||||
-rw-r--r-- | gas/testsuite/gas/sh/fdpic.d | 13 | ||||
-rw-r--r-- | gas/testsuite/gas/sh/fdpic.s | 8 | ||||
-rw-r--r-- | gas/testsuite/gas/sh/reg-prefix.d | 5 | ||||
-rw-r--r-- | gas/testsuite/gas/sh/sh2a-pic.d | 16 | ||||
-rw-r--r-- | gas/testsuite/gas/sh/sh2a-pic.s | 6 | ||||
-rw-r--r-- | gas/testsuite/lib/gas-defs.exp | 1 |
13 files changed, 201 insertions, 24 deletions
diff --git a/gas/ChangeLog b/gas/ChangeLog index 028388d..9779979 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,24 @@ +2010-05-25 Daniel Jacobowitz <dan@codesourcery.com> + Joseph Myers <joseph@codesourcery.com> + Andrew Stubbs <ams@codesourcery.com> + + * config/tc-sh.c (sh_fdpic): New. + (sh_check_fixup): Handle relocations on movi20. + (parse_exp): Do not reject PIC operators here. + (build_Mytes): Check for unhandled PIC operators here. Use + sh_check_fixup for movi20. + (enum options): Add OPTION_FDPIC. + (md_longopts, md_parse_option, md_show_usage): Add --fdpic. + (sh_fix_adjustable, md_apply_fix): Handle FDPIC and movi20 relocations. + (sh_elf_final_processing): Handle --fdpic. + (sh_uclinux_target_format): New. + (sh_parse_name): Handle FDPIC relocation operators. + * config/tc-sh.h (TARGET_FORMAT): Define specially for TE_UCLINUX. + (sh_uclinux_target_format): Declare for TE_UCLINUX. + * configure.tgt (sh-*-uclinux* | sh[12]-*-uclinux*): Set + em=uclinux. + * doc/c-sh.texi (SH Options): Document --fdpic. + 2010-05-25 Jay Krell <jay.krell@cornell.edu> PR ld/11621 diff --git a/gas/config/tc-sh.c b/gas/config/tc-sh.c index a7cdd0e..4e49e4e 100644 --- a/gas/config/tc-sh.c +++ b/gas/config/tc-sh.c @@ -145,6 +145,9 @@ static unsigned int preset_target_arch; accommodate the insns seen so far. */ static unsigned int valid_arch; +/* Whether --fdpic was given. */ +static int sh_fdpic; + const char EXP_CHARS[] = "eE"; /* Chars that mean this number is a floating point constant. */ @@ -612,7 +615,6 @@ sh_check_fixup (expressionS *main_exp, bfd_reloc_code_real_type *r_type_p) if (exp->X_op == O_PIC_reloc) { -#ifdef HAVE_SH64 switch (*r_type_p) { case BFD_RELOC_NONE: @@ -620,6 +622,31 @@ sh_check_fixup (expressionS *main_exp, bfd_reloc_code_real_type *r_type_p) *r_type_p = exp->X_md; break; + case BFD_RELOC_SH_DISP20: + switch (exp->X_md) + { + case BFD_RELOC_32_GOT_PCREL: + *r_type_p = BFD_RELOC_SH_GOT20; + break; + + case BFD_RELOC_32_GOTOFF: + *r_type_p = BFD_RELOC_SH_GOTOFF20; + break; + + case BFD_RELOC_SH_GOTFUNCDESC: + *r_type_p = BFD_RELOC_SH_GOTFUNCDESC20; + break; + + case BFD_RELOC_SH_GOTOFFFUNCDESC: + *r_type_p = BFD_RELOC_SH_GOTOFFFUNCDESC20; + break; + + default: + abort (); + } + break; + +#ifdef HAVE_SH64 case BFD_RELOC_SH_IMM_LOW16: switch (exp->X_md) { @@ -715,13 +742,11 @@ sh_check_fixup (expressionS *main_exp, bfd_reloc_code_real_type *r_type_p) abort (); } break; +#endif default: abort (); } -#else - *r_type_p = exp->X_md; -#endif if (exp == main_exp) exp->X_op = O_symbol; else @@ -1358,12 +1383,6 @@ parse_exp (char *s, sh_operand_info *op) expression (&op->immediate); if (op->immediate.X_op == O_absent) as_bad (_("missing operand")); -#ifdef OBJ_ELF - else if (op->immediate.X_op == O_PIC_reloc - || sh_PIC_related_p (op->immediate.X_add_symbol) - || sh_PIC_related_p (op->immediate.X_op_symbol)) - as_bad (_("misplaced PIC operand")); -#endif new_pointer = input_line_pointer; input_line_pointer = save; return new_pointer; @@ -2327,6 +2346,8 @@ build_Mytes (sh_opcode_info *opcode, sh_operand_info *operand) unsigned int size = 2; int low_byte = target_big_endian ? 1 : 0; int max_index = 4; + bfd_reloc_code_real_type r_type; + int unhandled_pic = 0; nbuf[0] = 0; nbuf[1] = 0; @@ -2337,6 +2358,14 @@ build_Mytes (sh_opcode_info *opcode, sh_operand_info *operand) nbuf[6] = 0; nbuf[7] = 0; + for (indx = 0; indx < 3; indx++) + if (opcode->arg[indx] == A_IMM + && operand[indx].type == A_IMM + && (operand[indx].immediate.X_op == O_PIC_reloc + || sh_PIC_related_p (operand[indx].immediate.X_add_symbol) + || sh_PIC_related_p (operand[indx].immediate.X_op_symbol))) + unhandled_pic = 1; + if (SH_MERGE_ARCH_SET (opcode->arch, arch_op32)) { output = frag_more (4); @@ -2415,7 +2444,11 @@ build_Mytes (sh_opcode_info *opcode, sh_operand_info *operand) case IMM0_20_4: break; case IMM0_20: - insert4 (output, BFD_RELOC_SH_DISP20, 0, operand); + r_type = BFD_RELOC_SH_DISP20; + if (sh_check_fixup (&operand->immediate, &r_type)) + as_bad (_("Invalid PIC expression.")); + unhandled_pic = 0; + insert4 (output, r_type, 0, operand); break; case IMM0_20BY8: insert4 (output, BFD_RELOC_SH_DISP20BY8, 0, operand); @@ -2474,6 +2507,8 @@ build_Mytes (sh_opcode_info *opcode, sh_operand_info *operand) } } } + if (unhandled_pic) + as_bad (_("misplaced PIC operand")); if (!target_big_endian) { output[1] = (nbuf[0] << 4) | (nbuf[1]); @@ -3098,6 +3133,9 @@ enum options OPTION_PT32, #endif OPTION_H_TICK_HEX, +#ifdef OBJ_ELF + OPTION_FDPIC, +#endif OPTION_DUMMY /* Not used. This is just here to make it easy to add and subtract options from this enum. */ }; @@ -3126,6 +3164,10 @@ struct option md_longopts[] = #endif /* HAVE_SH64 */ { "h-tick-hex", no_argument, NULL, OPTION_H_TICK_HEX }, +#ifdef OBJ_ELF + {"fdpic", no_argument, NULL, OPTION_FDPIC}, +#endif + {NULL, no_argument, NULL, 0} }; size_t md_longopts_size = sizeof (md_longopts); @@ -3259,6 +3301,12 @@ md_parse_option (int c, char *arg ATTRIBUTE_UNUSED) enable_h_tick_hex = 1; break; +#ifdef OBJ_ELF + case OPTION_FDPIC: + sh_fdpic = TRUE; + break; +#endif /* OBJ_ELF */ + default: return 0; } @@ -3311,6 +3359,10 @@ SH options:\n\ --expand-pt32 with -abi=64, expand PT, PTA and PTB instructions\n\ to 32 bits only\n")); #endif /* HAVE_SH64 */ +#ifdef OBJ_ELF + fprintf (stream, _("\ +--fdpic generate an FDPIC object file\n")); +#endif /* OBJ_ELF */ } /* This struct is used to pass arguments to sh_count_relocs through @@ -3804,7 +3856,13 @@ sh_fix_adjustable (fixS *fixP) { if (fixP->fx_r_type == BFD_RELOC_32_PLT_PCREL || fixP->fx_r_type == BFD_RELOC_32_GOT_PCREL + || fixP->fx_r_type == BFD_RELOC_SH_GOT20 || fixP->fx_r_type == BFD_RELOC_SH_GOTPC + || fixP->fx_r_type == BFD_RELOC_SH_GOTFUNCDESC + || fixP->fx_r_type == BFD_RELOC_SH_GOTFUNCDESC20 + || fixP->fx_r_type == BFD_RELOC_SH_GOTOFFFUNCDESC + || fixP->fx_r_type == BFD_RELOC_SH_GOTOFFFUNCDESC20 + || fixP->fx_r_type == BFD_RELOC_SH_FUNCDESC || ((fixP->fx_r_type == BFD_RELOC_32) && dont_adjust_reloc_32) || fixP->fx_r_type == BFD_RELOC_RVA) return 0; @@ -3843,6 +3901,22 @@ sh_elf_final_processing (void) elf_elfheader (stdoutput)->e_flags &= ~EF_SH_MACH_MASK; elf_elfheader (stdoutput)->e_flags |= val; + + if (sh_fdpic) + elf_elfheader (stdoutput)->e_flags |= EF_SH_FDPIC; +} +#endif + +#ifdef TE_UCLINUX +/* Return the target format for uClinux. */ + +const char * +sh_uclinux_target_format (void) +{ + if (sh_fdpic) + return (!target_big_endian ? "elf32-sh-fdpic" : "elf32-shbig-fdpic"); + else + return (!target_big_endian ? "elf32-shl" : "elf32-sh"); } #endif @@ -4151,7 +4225,13 @@ md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED) S_SET_THREAD_LOCAL (fixP->fx_addsy); /* Fallthrough */ case BFD_RELOC_32_GOT_PCREL: + case BFD_RELOC_SH_GOT20: case BFD_RELOC_SH_GOTPLT32: + case BFD_RELOC_SH_GOTFUNCDESC: + case BFD_RELOC_SH_GOTFUNCDESC20: + case BFD_RELOC_SH_GOTOFFFUNCDESC: + case BFD_RELOC_SH_GOTOFFFUNCDESC20: + case BFD_RELOC_SH_FUNCDESC: * valP = 0; /* Fully resolved at runtime. No addend. */ apply_full_field_fix (fixP, buf, 0, 4); break; @@ -4161,6 +4241,7 @@ md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED) S_SET_THREAD_LOCAL (fixP->fx_addsy); /* Fallthrough */ case BFD_RELOC_32_GOTOFF: + case BFD_RELOC_SH_GOTOFF20: apply_full_field_fix (fixP, buf, val, 4); break; #endif @@ -4468,6 +4549,14 @@ sh_parse_name (char const *name, reloc_type = BFD_RELOC_SH_TLS_LE_32; else if ((next_end = sh_end_of_match (next + 1, "DTPOFF"))) reloc_type = BFD_RELOC_SH_TLS_LDO_32; + else if ((next_end = sh_end_of_match (next + 1, "PCREL"))) + reloc_type = BFD_RELOC_32_PCREL; + else if ((next_end = sh_end_of_match (next + 1, "GOTFUNCDESC"))) + reloc_type = BFD_RELOC_SH_GOTFUNCDESC; + else if ((next_end = sh_end_of_match (next + 1, "GOTOFFFUNCDESC"))) + reloc_type = BFD_RELOC_SH_GOTOFFFUNCDESC; + else if ((next_end = sh_end_of_match (next + 1, "FUNCDESC"))) + reloc_type = BFD_RELOC_SH_FUNCDESC; else goto no_suffix; diff --git a/gas/config/tc-sh.h b/gas/config/tc-sh.h index 1b5ec26..2a69627 100644 --- a/gas/config/tc-sh.h +++ b/gas/config/tc-sh.h @@ -1,6 +1,6 @@ /* This file is tc-sh.h Copyright 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, - 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. + 2003, 2004, 2005, 2006, 2007, 2008, 2010 Free Software Foundation, Inc. This file is part of GAS, the GNU Assembler. @@ -134,7 +134,7 @@ extern void sh_frob_file (void); #define COFF_MAGIC (!target_big_endian ? SH_ARCH_MAGIC_LITTLE : SH_ARCH_MAGIC_BIG) -#define tc_coff_symbol_emit_hook(a) ; /* not used */ +#define tc_coff_symbol_emit_hook(a) ; /* Not used. */ #define TC_KEEP_FX_OFFSET 1 @@ -155,7 +155,7 @@ extern void sh_frob_file (void); #ifdef OBJ_ELF /* ELF specific definitions. */ -/* Whether or not the target is big endian */ +/* Whether or not the target is big endian. */ extern int target_big_endian; #ifdef TE_LINUX #define TARGET_FORMAT (!target_big_endian ? "elf32-sh-linux" : "elf32-shbig-linux") @@ -165,6 +165,9 @@ extern int target_big_endian; #define TARGET_FORMAT (!target_big_endian ? "elf32-shl-symbian" : "elf32-sh-symbian") #elif defined (TE_VXWORKS) #define TARGET_FORMAT (!target_big_endian ? "elf32-shl-vxworks" : "elf32-sh-vxworks") +#elif defined (TE_UCLINUX) +#define TARGET_FORMAT sh_uclinux_target_format () +extern const char * sh_uclinux_target_format (void); #else #define TARGET_FORMAT (!target_big_endian ? "elf32-shl" : "elf32-sh") #endif @@ -172,7 +175,7 @@ extern int target_big_endian; #define elf_tc_final_processing sh_elf_final_processing extern void sh_elf_final_processing (void); -#define DIFF_EXPR_OK /* foo-. gets turned into PC relative relocs */ +#define DIFF_EXPR_OK /* foo-. gets turned into PC relative relocs. */ #define GLOBAL_OFFSET_TABLE_NAME "_GLOBAL_OFFSET_TABLE_" @@ -227,8 +230,8 @@ extern bfd_boolean sh_fix_adjustable (struct fix *); #define md_parse_name(name, exprP, mode, nextcharP) \ sh_parse_name ((name), (exprP), (mode), (nextcharP)) -int sh_parse_name (char const *name, expressionS *exprP, - enum expr_mode mode, char *nextchar); +int sh_parse_name (char const *, expressionS *, + enum expr_mode, char *); #define TC_CONS_FIX_NEW(FRAG, OFF, LEN, EXP) \ sh_cons_fix_new ((FRAG), (OFF), (LEN), (EXP)) @@ -244,7 +247,7 @@ void sh_cons_fix_new (fragS *, int, int, expressionS *); extern void sh_cfi_frame_initial_instructions (void); #define tc_regname_to_dw2regnum sh_regname_to_dw2regnum -extern int sh_regname_to_dw2regnum (char *regname); +extern int sh_regname_to_dw2regnum (char *); /* All SH instructions are multiples of 16 bits. */ #define DWARF2_LINE_MIN_INSN_LENGTH 2 diff --git a/gas/configure.tgt b/gas/configure.tgt index 23d8662..77cbac1 100644 --- a/gas/configure.tgt +++ b/gas/configure.tgt @@ -360,7 +360,8 @@ case ${generic_target} in *) endian=big ;; esac ;; sh*-*-symbianelf*) fmt=elf endian=little ;; - sh-*-elf* | sh-*-uclinux* | sh[12]-*-uclinux*) fmt=elf ;; + sh-*-elf*) fmt=elf ;; + sh-*-uclinux* | sh[12]-*-uclinux*) fmt=elf em=uclinux ;; sh-*-coff*) fmt=coff ;; sh-*-nto*) fmt=elf ;; sh-*-pe*) fmt=coff em=pe bfd_gas=yes endian=little ;; diff --git a/gas/doc/c-sh.texi b/gas/doc/c-sh.texi index 00c95d7..619f022 100644 --- a/gas/doc/c-sh.texi +++ b/gas/doc/c-sh.texi @@ -1,5 +1,5 @@ -@c Copyright 1991, 1992, 1993, 1994, 1995, 1997, 2001, 2003, 2004, 2005, 2008 -@c Free Software Foundation, Inc. +@c Copyright 1991, 1992, 1993, 1994, 1995, 1997, 2001, 2003, 2004, +@c 2005, 2008, 2010 Free Software Foundation, Inc. @c This is part of the GAS manual. @c For copying conditions, see the file as.texinfo. @page @@ -54,6 +54,10 @@ Renesas assembler. @item --allow-reg-prefix Allow '$' as a register name prefix. +@kindex --fdpic +@item --fdpic +Generate an FDPIC object file. + @item --isa=sh4 | sh4a Specify the sh4 or sh4a instruction set. @item --isa=dsp diff --git a/gas/testsuite/ChangeLog b/gas/testsuite/ChangeLog index 59f9830..5d2a4f3 100644 --- a/gas/testsuite/ChangeLog +++ b/gas/testsuite/ChangeLog @@ -1,3 +1,15 @@ +2010-05-25 Daniel Jacobowitz <dan@codesourcery.com> + Joseph Myers <joseph@codesourcery.com> + Andrew Stubbs <ams@codesourcery.com> + + * gas/sh/basic.exp: Run new tests. Handle uClinux like Linux. + * gas/sh/fdpic.d: New file. + * gas/sh/fdpic.s: New file. + * gas/sh/reg-prefix.d: Force big-endian. + * gas/sh/sh2a-pic.d: New file. + * gas/sh/sh2a-pic.s: New file. + * lib/gas-defs.exp (is_elf_format): Include sh*-*-uclinux*. + 2010-05-18 H.J. Lu <hongjiu.lu@intel.com> PR gas/11600 diff --git a/gas/testsuite/gas/sh/basic.exp b/gas/testsuite/gas/sh/basic.exp index 3bb7931..2daa038 100644 --- a/gas/testsuite/gas/sh/basic.exp +++ b/gas/testsuite/gas/sh/basic.exp @@ -142,7 +142,7 @@ if [istarget sh*-*-*] then { run_dump_test "pcrel2" } - if {[istarget sh*-*elf] || [istarget sh*-linux*]} then { + if {[istarget sh*-*elf] || [istarget sh*-*linux*]} then { if {![istarget "sh64*-*-*"] && ![istarget "sh5*-*-*"]} then { run_dump_test "sh4a" run_dump_test "sh4a-fp" @@ -151,9 +151,11 @@ if [istarget sh*-*-*] then { run_dump_test "sh4al-dsp" run_dump_test "sh2a" + run_dump_test "sh2a-pic" } run_dump_test "pic" + run_dump_test "fdpic" # Test TLS. run_dump_test "tlsd" diff --git a/gas/testsuite/gas/sh/fdpic.d b/gas/testsuite/gas/sh/fdpic.d new file mode 100644 index 0000000..33dfc71 --- /dev/null +++ b/gas/testsuite/gas/sh/fdpic.d @@ -0,0 +1,13 @@ +#objdump: -dr --prefix-addresses --show-raw-insn +#name: FDPIC relocations + +dump.o: file format elf32-sh.* + +Disassembly of section .text: + \.\.\. + 0: R_SH_REL32 foo + 4: R_SH_FUNCDESC foo + 8: R_SH_GOT32 foo + c: R_SH_GOTOFF foo + 10: R_SH_GOTFUNCDESC foo + 14: R_SH_GOTOFFFUNCDESC foo diff --git a/gas/testsuite/gas/sh/fdpic.s b/gas/testsuite/gas/sh/fdpic.s new file mode 100644 index 0000000..7a7ad0f --- /dev/null +++ b/gas/testsuite/gas/sh/fdpic.s @@ -0,0 +1,8 @@ + .text + + .long foo@PCREL + .long foo@FUNCDESC + .long foo@GOT + .long foo@GOTOFF + .long foo@GOTFUNCDESC + .long foo@GOTOFFFUNCDESC diff --git a/gas/testsuite/gas/sh/reg-prefix.d b/gas/testsuite/gas/sh/reg-prefix.d index 1821bbc..a42e8c4 100644 --- a/gas/testsuite/gas/sh/reg-prefix.d +++ b/gas/testsuite/gas/sh/reg-prefix.d @@ -1,10 +1,11 @@ #objdump: -dr --prefix-addresses --show-raw-insn -#as: --allow-reg-prefix -little +#as: --allow-reg-prefix -big #name: SH --allow-reg-prefix option +#skip: sh*-*-symbian* # Test SH register names prefixed with $: .*: file format elf.*sh.* Disassembly of section .text: -0x00000000 12 60 mov\.l @r1,r0 +0x00000000 60 12 mov\.l @r1,r0 diff --git a/gas/testsuite/gas/sh/sh2a-pic.d b/gas/testsuite/gas/sh/sh2a-pic.d new file mode 100644 index 0000000..c7fe12b --- /dev/null +++ b/gas/testsuite/gas/sh/sh2a-pic.d @@ -0,0 +1,16 @@ +#objdump: -dr --prefix-addresses --show-raw-insn +#name: SH2a PIC relocations +#as: -isa=sh2a +#skip: sh*-*-symbian* + +dump.o: file format elf32-sh.* + +Disassembly of section .text: +0x00000000 01 00 00 00 movi20 #0,r1 + 0: R_SH_GOT20 foo +0x00000004 01 00 00 00 movi20 #0,r1 + 4: R_SH_GOTOFF20 foo +0x00000008 01 00 00 00 movi20 #0,r1 + 8: R_SH_GOTFUNCDESC20 foo +0x0000000c 01 00 00 00 movi20 #0,r1 + c: R_SH_GOTOFFFUNCDESC20 foo diff --git a/gas/testsuite/gas/sh/sh2a-pic.s b/gas/testsuite/gas/sh/sh2a-pic.s new file mode 100644 index 0000000..888a7c9 --- /dev/null +++ b/gas/testsuite/gas/sh/sh2a-pic.s @@ -0,0 +1,6 @@ + .text + + movi20 #foo@GOT, r1 + movi20 #foo@GOTOFF, r1 + movi20 #foo@GOTFUNCDESC, r1 + movi20 #foo@GOTOFFFUNCDESC, r1 diff --git a/gas/testsuite/lib/gas-defs.exp b/gas/testsuite/lib/gas-defs.exp index 0506b94..fd2f179 100644 --- a/gas/testsuite/lib/gas-defs.exp +++ b/gas/testsuite/lib/gas-defs.exp @@ -289,6 +289,7 @@ proc is_elf_format {} { && ![istarget hppa*64*-*-hpux*] \ && ![istarget *-*-linux*] \ && ![istarget frv-*-uclinux*] \ + && ![istarget sh*-*-uclinux*] \ && ![istarget *-*-irix5*] \ && ![istarget *-*-irix6*] \ && ![istarget *-*-netbsd*] \ |