diff options
author | Joseph Myers <joseph@codesourcery.com> | 2010-04-20 22:03:00 +0000 |
---|---|---|
committer | Joseph Myers <joseph@codesourcery.com> | 2010-04-20 22:03:00 +0000 |
commit | 418205099be3d614ad92c8c78486b1a60b498916 (patch) | |
tree | 59ac53127fc8941692ce65e25b6667f9af220bf9 | |
parent | 31ef98ae61505d87f8d3098c5fc1dcb19035a6a1 (diff) | |
download | gdb-418205099be3d614ad92c8c78486b1a60b498916.zip gdb-418205099be3d614ad92c8c78486b1a60b498916.tar.gz gdb-418205099be3d614ad92c8c78486b1a60b498916.tar.bz2 |
bfd:
* elf32-tic6x.h: New.
* elf-bfd.h (enum elf_target_id): Define TIC6X_ELF_DATA.
* elf32-tic6x.c (struct elf32_tic6x_obj_tdata, elf32_tic6x_tdata,
elf32_tic6x_howto_table_rel, elf32_tic6x_info_to_howto_rel,
elf32_tic6x_set_use_rela_p, elf32_tic6x_mkobject,
elf32_tic6x_new_section_hook, elf32_tic6x_rel_relocation_p,
bfd_elf32_mkobject, bfd_elf32_new_section_hook): New.
(elf32_tic6x_reloc_type_lookup, elf32_tic6x_reloc_name_lookup,
elf32_tic6x_relocate_section): Handle REL relocations.
(elf_info_to_howto_rel): Define to elf32_tic6x_info_to_howto_rel.
gas:
* config/tc-tic6x.c (OPTION_MGENERATE_REL): New.
(md_longopts): Add -mgenerate-rel.
(tic6x_generate_rela): New.
(md_parse_option): Handle -mgenerate-rel.
(md_show_usage): Add comment that -mgenerate-rel is undocumented.
(tic6x_init_after_args): New.
(md_apply_fix): Correct shift calculations for SB-relative
relocations.
(md_pcrel_from): Change to tic6x_pcrel_from_section. Do not
adjust addresses for relocations referencing symbols in other
sections.
(tc_gen_reloc): Adjust addend calculations for REL relocations.
* config/tc-tic6x.h (MD_PCREL_FROM_SECTION,
tic6x_pcrel_from_section, tc_init_after_args,
tic6x_init_after_args): New.
ld/testsuite:
* ld-tic6x/data-reloc-global-rel.d,
ld-tic6x/data-reloc-global-rel.s,
ld-tic6x/data-reloc-local-r-rel.d,
ld-tic6x/data-reloc-local-rel.d, ld-tic6x/mvk-reloc-global-rel.d,
ld-tic6x/mvk-reloc-global-rel.s, ld-tic6x/mvk-reloc-local-1-rel.s,
ld-tic6x/mvk-reloc-local-2-rel.s,
ld-tic6x/mvk-reloc-local-r-rel.d, ld-tic6x/mvk-reloc-local-rel.d,
ld-tic6x/pcrel-reloc-global-rel.d,
ld-tic6x/pcrel-reloc-local-r-rel.d,
ld-tic6x/pcrel-reloc-local-rel.d, ld-tic6x/sbr-reloc-global-rel.d,
ld-tic6x/sbr-reloc-global-rel.s, ld-tic6x/sbr-reloc-local-1-rel.s,
ld-tic6x/sbr-reloc-local-2-rel.s,
ld-tic6x/sbr-reloc-local-r-rel.d, ld-tic6x/sbr-reloc-local-rel.d:
New.
27 files changed, 1318 insertions, 17 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 8b3cd94..7c1aa05 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,16 @@ +2010-04-20 Joseph Myers <joseph@codesourcery.com> + + * elf32-tic6x.h: New. + * elf-bfd.h (enum elf_target_id): Define TIC6X_ELF_DATA. + * elf32-tic6x.c (struct elf32_tic6x_obj_tdata, elf32_tic6x_tdata, + elf32_tic6x_howto_table_rel, elf32_tic6x_info_to_howto_rel, + elf32_tic6x_set_use_rela_p, elf32_tic6x_mkobject, + elf32_tic6x_new_section_hook, elf32_tic6x_rel_relocation_p, + bfd_elf32_mkobject, bfd_elf32_new_section_hook): New. + (elf32_tic6x_reloc_type_lookup, elf32_tic6x_reloc_name_lookup, + elf32_tic6x_relocate_section): Handle REL relocations. + (elf_info_to_howto_rel): Define to elf32_tic6x_info_to_howto_rel. + 2010-04-20 Jakub Jelinek <jakub@redhat.com> * dwarf2.c (find_abstract_instance_name, scan_unit_for_symbols): Treat diff --git a/bfd/elf-bfd.h b/bfd/elf-bfd.h index 05e17c8..0c975dc 100644 --- a/bfd/elf-bfd.h +++ b/bfd/elf-bfd.h @@ -426,6 +426,7 @@ enum elf_target_id SH_ELF_DATA, SPARC_ELF_DATA, SPU_ELF_DATA, + TIC6X_ELF_DATA, X86_64_ELF_DATA, XTENSA_ELF_DATA, GENERIC_ELF_DATA diff --git a/bfd/elf32-tic6x.c b/bfd/elf32-tic6x.c index 9163833..73fb7061 100644 --- a/bfd/elf32-tic6x.c +++ b/bfd/elf32-tic6x.c @@ -25,6 +25,20 @@ #include "libiberty.h" #include "elf-bfd.h" #include "elf/tic6x.h" +#include "elf32-tic6x.h" + +struct elf32_tic6x_obj_tdata +{ + struct elf_obj_tdata root; + + /* Whether to use RELA relocations when generating relocations. + This is a per-object flag to allow the assembler to generate REL + relocations for use in linker testcases. */ + bfd_boolean use_rela_p; +}; + +#define elf32_tic6x_tdata(abfd) \ + ((struct elf32_tic6x_obj_tdata *) (abfd)->tdata.any) static reloc_howto_type elf32_tic6x_howto_table[] = { @@ -646,6 +660,566 @@ static reloc_howto_type elf32_tic6x_howto_table[] = FALSE) /* pcrel_offset */ }; +static reloc_howto_type elf32_tic6x_howto_table_rel[] = +{ + HOWTO (R_C6000_NONE, /* type */ + 0, /* rightshift */ + 0, /* size (0 = byte, 1 = short, 2 = long) */ + 0, /* bitsize */ + FALSE, /* pc_relative */ + 0, /* bitpos */ + complain_overflow_dont,/* complain_on_overflow */ + bfd_elf_generic_reloc, /* special_function */ + "R_C6000_NONE", /* name */ + TRUE, /* partial_inplace */ + 0, /* src_mask */ + 0, /* dst_mask */ + FALSE), /* pcrel_offset */ + HOWTO (R_C6000_ABS32, /* type */ + 0, /* rightshift */ + 2, /* size (0 = byte, 1 = short, 2 = long) */ + 32, /* bitsize */ + FALSE, /* pc_relative */ + 0, /* bitpos */ + complain_overflow_dont,/* complain_on_overflow */ + bfd_elf_generic_reloc, /* special_function */ + "R_C6000_ABS32", /* name */ + TRUE, /* partial_inplace */ + 0xffffffff, /* src_mask */ + 0xffffffff, /* dst_mask */ + FALSE), /* pcrel_offset */ + HOWTO (R_C6000_ABS16, /* type */ + 0, /* rightshift */ + 1, /* size (0 = byte, 1 = short, 2 = long) */ + 16, /* bitsize */ + FALSE, /* pc_relative */ + 0, /* bitpos */ + complain_overflow_bitfield,/* complain_on_overflow */ + bfd_elf_generic_reloc, /* special_function */ + "R_C6000_ABS16", /* name */ + TRUE, /* partial_inplace */ + 0x0000ffff, /* src_mask */ + 0x0000ffff, /* dst_mask */ + FALSE), /* pcrel_offset */ + HOWTO (R_C6000_ABS8, /* type */ + 0, /* rightshift */ + 0, /* size (0 = byte, 1 = short, 2 = long) */ + 8, /* bitsize */ + FALSE, /* pc_relative */ + 0, /* bitpos */ + complain_overflow_bitfield,/* complain_on_overflow */ + bfd_elf_generic_reloc, /* special_function */ + "R_C6000_ABS8", /* name */ + TRUE, /* partial_inplace */ + 0x000000ff, /* src_mask */ + 0x000000ff, /* dst_mask */ + FALSE), /* pcrel_offset */ + HOWTO (R_C6000_PCR_S21, /* type */ + 2, /* rightshift */ + 2, /* size (0 = byte, 1 = short, 2 = long) */ + 21, /* bitsize */ + TRUE, /* pc_relative */ + 7, /* bitpos */ + complain_overflow_signed,/* complain_on_overflow */ + bfd_elf_generic_reloc, /* special_function */ + "R_C6000_PCR_S21", /* name */ + TRUE, /* partial_inplace */ + 0x0fffff80, /* src_mask */ + 0x0fffff80, /* dst_mask */ + TRUE), /* pcrel_offset */ + HOWTO (R_C6000_PCR_S12, /* type */ + 2, /* rightshift */ + 2, /* size (0 = byte, 1 = short, 2 = long) */ + 12, /* bitsize */ + TRUE, /* pc_relative */ + 16, /* bitpos */ + complain_overflow_signed,/* complain_on_overflow */ + bfd_elf_generic_reloc, /* special_function */ + "R_C6000_PCR_S12", /* name */ + TRUE, /* partial_inplace */ + 0x0fff0000, /* src_mask */ + 0x0fff0000, /* dst_mask */ + TRUE), /* pcrel_offset */ + HOWTO (R_C6000_PCR_S10, /* type */ + 2, /* rightshift */ + 2, /* size (0 = byte, 1 = short, 2 = long) */ + 10, /* bitsize */ + TRUE, /* pc_relative */ + 13, /* bitpos */ + complain_overflow_signed,/* complain_on_overflow */ + bfd_elf_generic_reloc, /* special_function */ + "R_C6000_PCR_S10", /* name */ + TRUE, /* partial_inplace */ + 0x007fe000, /* src_mask */ + 0x007fe000, /* dst_mask */ + TRUE), /* pcrel_offset */ + HOWTO (R_C6000_PCR_S7, /* type */ + 2, /* rightshift */ + 2, /* size (0 = byte, 1 = short, 2 = long) */ + 7, /* bitsize */ + TRUE, /* pc_relative */ + 16, /* bitpos */ + complain_overflow_signed,/* complain_on_overflow */ + bfd_elf_generic_reloc, /* special_function */ + "R_C6000_PCR_S7", /* name */ + TRUE, /* partial_inplace */ + 0x007f0000, /* src_mask */ + 0x007f0000, /* dst_mask */ + TRUE), /* pcrel_offset */ + HOWTO (R_C6000_ABS_S16, /* type */ + 0, /* rightshift */ + 2, /* size (0 = byte, 1 = short, 2 = long) */ + 16, /* bitsize */ + FALSE, /* pc_relative */ + 7, /* bitpos */ + complain_overflow_signed,/* complain_on_overflow */ + bfd_elf_generic_reloc, /* special_function */ + "R_C6000_ABS_S16", /* name */ + TRUE, /* partial_inplace */ + 0x007fff80, /* src_mask */ + 0x007fff80, /* dst_mask */ + FALSE), /* pcrel_offset */ + HOWTO (R_C6000_ABS_L16, /* type */ + 0, /* rightshift */ + 2, /* size (0 = byte, 1 = short, 2 = long) */ + 16, /* bitsize */ + FALSE, /* pc_relative */ + 7, /* bitpos */ + complain_overflow_dont,/* complain_on_overflow */ + bfd_elf_generic_reloc, /* special_function */ + "R_C6000_ABS_L16", /* name */ + TRUE, /* partial_inplace */ + 0x007fff80, /* src_mask */ + 0x007fff80, /* dst_mask */ + FALSE), /* pcrel_offset */ + EMPTY_HOWTO (R_C6000_ABS_H16), + HOWTO (R_C6000_SBR_U15_B, /* type */ + 0, /* rightshift */ + 2, /* size (0 = byte, 1 = short, 2 = long) */ + 15, /* bitsize */ + FALSE, /* pc_relative */ + 8, /* bitpos */ + complain_overflow_unsigned,/* complain_on_overflow */ + bfd_elf_generic_reloc, /* special_function */ + "R_C6000_SBR_U15_B", /* name */ + TRUE, /* partial_inplace */ + 0x007fff00, /* src_mask */ + 0x007fff00, /* dst_mask */ + FALSE), /* pcrel_offset */ + HOWTO (R_C6000_SBR_U15_H, /* type */ + 1, /* rightshift */ + 2, /* size (0 = byte, 1 = short, 2 = long) */ + 15, /* bitsize */ + FALSE, /* pc_relative */ + 8, /* bitpos */ + complain_overflow_unsigned,/* complain_on_overflow */ + bfd_elf_generic_reloc, /* special_function */ + "R_C6000_SBR_U15_H", /* name */ + TRUE, /* partial_inplace */ + 0x007fff00, /* src_mask */ + 0x007fff00, /* dst_mask */ + FALSE), /* pcrel_offset */ + HOWTO (R_C6000_SBR_U15_W, /* type */ + 2, /* rightshift */ + 2, /* size (0 = byte, 1 = short, 2 = long) */ + 15, /* bitsize */ + FALSE, /* pc_relative */ + 8, /* bitpos */ + complain_overflow_unsigned,/* complain_on_overflow */ + bfd_elf_generic_reloc, /* special_function */ + "R_C6000_SBR_U15_W", /* name */ + TRUE, /* partial_inplace */ + 0x007fff00, /* src_mask */ + 0x007fff00, /* dst_mask */ + FALSE), /* pcrel_offset */ + HOWTO (R_C6000_SBR_S16, /* type */ + 0, /* rightshift */ + 2, /* size (0 = byte, 1 = short, 2 = long) */ + 16, /* bitsize */ + FALSE, /* pc_relative */ + 7, /* bitpos */ + complain_overflow_signed,/* complain_on_overflow */ + bfd_elf_generic_reloc, /* special_function */ + "R_C6000_SBR_S16", /* name */ + TRUE, /* partial_inplace */ + 0x007fff80, /* src_mask */ + 0x007fff80, /* dst_mask */ + FALSE), /* pcrel_offset */ + HOWTO (R_C6000_SBR_L16_B, /* type */ + 0, /* rightshift */ + 2, /* size (0 = byte, 1 = short, 2 = long) */ + 16, /* bitsize */ + FALSE, /* pc_relative */ + 7, /* bitpos */ + complain_overflow_dont,/* complain_on_overflow */ + bfd_elf_generic_reloc, /* special_function */ + "R_C6000_SBR_L16_B", /* name */ + TRUE, /* partial_inplace */ + 0x007fff80, /* src_mask */ + 0x007fff80, /* dst_mask */ + FALSE), /* pcrel_offset */ + HOWTO (R_C6000_SBR_L16_H, /* type */ + 1, /* rightshift */ + 2, /* size (0 = byte, 1 = short, 2 = long) */ + 16, /* bitsize */ + FALSE, /* pc_relative */ + 7, /* bitpos */ + complain_overflow_dont,/* complain_on_overflow */ + bfd_elf_generic_reloc, /* special_function */ + "R_C6000_SBR_L16_H", /* name */ + TRUE, /* partial_inplace */ + 0x007fff80, /* src_mask */ + 0x007fff80, /* dst_mask */ + FALSE), /* pcrel_offset */ + HOWTO (R_C6000_SBR_L16_W, /* type */ + 2, /* rightshift */ + 2, /* size (0 = byte, 1 = short, 2 = long) */ + 16, /* bitsize */ + FALSE, /* pc_relative */ + 7, /* bitpos */ + complain_overflow_dont,/* complain_on_overflow */ + bfd_elf_generic_reloc, /* special_function */ + "R_C6000_SBR_L16_W", /* name */ + TRUE, /* partial_inplace */ + 0x007fff80, /* src_mask */ + 0x007fff80, /* dst_mask */ + FALSE), /* pcrel_offset */ + EMPTY_HOWTO (R_C6000_SBR_H16_B), + EMPTY_HOWTO (R_C6000_SBR_H16_H), + EMPTY_HOWTO (R_C6000_SBR_H16_W), + HOWTO (R_C6000_SBR_GOT_U15_W, /* type */ + 2, /* rightshift */ + 2, /* size (0 = byte, 1 = short, 2 = long) */ + 15, /* bitsize */ + FALSE, /* pc_relative */ + 8, /* bitpos */ + complain_overflow_unsigned,/* complain_on_overflow */ + bfd_elf_generic_reloc, /* special_function */ + "R_C6000_SBR_GOT_U15_W",/* name */ + TRUE, /* partial_inplace */ + 0x007fff00, /* src_mask */ + 0x007fff00, /* dst_mask */ + FALSE), /* pcrel_offset */ + HOWTO (R_C6000_SBR_GOT_L16_W, /* type */ + 2, /* rightshift */ + 2, /* size (0 = byte, 1 = short, 2 = long) */ + 16, /* bitsize */ + FALSE, /* pc_relative */ + 7, /* bitpos */ + complain_overflow_dont,/* complain_on_overflow */ + bfd_elf_generic_reloc, /* special_function */ + "R_C6000_SBR_GOT_L16_W",/* name */ + TRUE, /* partial_inplace */ + 0x007fff80, /* src_mask */ + 0x007fff80, /* dst_mask */ + FALSE), /* pcrel_offset */ + EMPTY_HOWTO (R_C6000_SBR_GOT_H16_W), + HOWTO (R_C6000_DSBT_INDEX, /* type */ + 0, /* rightshift */ + 2, /* size (0 = byte, 1 = short, 2 = long) */ + 15, /* bitsize */ + FALSE, /* pc_relative */ + 8, /* bitpos */ + complain_overflow_unsigned,/* complain_on_overflow */ + bfd_elf_generic_reloc, /* special_function */ + "R_C6000_DSBT_INDEX", /* name */ + TRUE, /* partial_inplace */ + 0, /* src_mask */ + 0x007fff00, /* dst_mask */ + FALSE), /* pcrel_offset */ + HOWTO (R_C6000_PREL31, /* type */ + 1, /* rightshift */ + 2, /* size (0 = byte, 1 = short, 2 = long) */ + 31, /* bitsize */ + FALSE, /* pc_relative */ + 0, /* bitpos */ + complain_overflow_dont,/* complain_on_overflow */ + bfd_elf_generic_reloc, /* special_function */ + "R_C6000_PREL31", /* name */ + TRUE, /* partial_inplace */ + 0, /* src_mask */ + 0x7fffffff, /* dst_mask */ + FALSE), /* pcrel_offset */ + HOWTO (R_C6000_COPY, /* type */ + 0, /* rightshift */ + 2, /* size (0 = byte, 1 = short, 2 = long) */ + 32, /* bitsize */ + FALSE, /* pc_relative */ + 0, /* bitpos */ + complain_overflow_dont,/* complain_on_overflow */ + bfd_elf_generic_reloc, /* special_function */ + "R_C6000_COPY", /* name */ + TRUE, /* partial_inplace */ + 0, /* src_mask */ + 0xffffffff, /* dst_mask */ + FALSE), /* pcrel_offset */ + EMPTY_HOWTO (27), + EMPTY_HOWTO (28), + EMPTY_HOWTO (29), + EMPTY_HOWTO (30), + EMPTY_HOWTO (31), + EMPTY_HOWTO (32), + EMPTY_HOWTO (33), + EMPTY_HOWTO (34), + EMPTY_HOWTO (35), + EMPTY_HOWTO (36), + EMPTY_HOWTO (37), + EMPTY_HOWTO (38), + EMPTY_HOWTO (39), + EMPTY_HOWTO (40), + EMPTY_HOWTO (41), + EMPTY_HOWTO (42), + EMPTY_HOWTO (43), + EMPTY_HOWTO (44), + EMPTY_HOWTO (45), + EMPTY_HOWTO (46), + EMPTY_HOWTO (47), + EMPTY_HOWTO (48), + EMPTY_HOWTO (49), + EMPTY_HOWTO (50), + EMPTY_HOWTO (51), + EMPTY_HOWTO (52), + EMPTY_HOWTO (53), + EMPTY_HOWTO (54), + EMPTY_HOWTO (55), + EMPTY_HOWTO (56), + EMPTY_HOWTO (57), + EMPTY_HOWTO (58), + EMPTY_HOWTO (59), + EMPTY_HOWTO (60), + EMPTY_HOWTO (61), + EMPTY_HOWTO (62), + EMPTY_HOWTO (63), + EMPTY_HOWTO (64), + EMPTY_HOWTO (65), + EMPTY_HOWTO (66), + EMPTY_HOWTO (67), + EMPTY_HOWTO (68), + EMPTY_HOWTO (69), + EMPTY_HOWTO (70), + EMPTY_HOWTO (71), + EMPTY_HOWTO (72), + EMPTY_HOWTO (73), + EMPTY_HOWTO (74), + EMPTY_HOWTO (75), + EMPTY_HOWTO (76), + EMPTY_HOWTO (77), + EMPTY_HOWTO (78), + EMPTY_HOWTO (79), + EMPTY_HOWTO (80), + EMPTY_HOWTO (81), + EMPTY_HOWTO (82), + EMPTY_HOWTO (83), + EMPTY_HOWTO (84), + EMPTY_HOWTO (85), + EMPTY_HOWTO (86), + EMPTY_HOWTO (87), + EMPTY_HOWTO (88), + EMPTY_HOWTO (89), + EMPTY_HOWTO (90), + EMPTY_HOWTO (91), + EMPTY_HOWTO (92), + EMPTY_HOWTO (93), + EMPTY_HOWTO (94), + EMPTY_HOWTO (95), + EMPTY_HOWTO (96), + EMPTY_HOWTO (97), + EMPTY_HOWTO (98), + EMPTY_HOWTO (99), + EMPTY_HOWTO (100), + EMPTY_HOWTO (101), + EMPTY_HOWTO (102), + EMPTY_HOWTO (103), + EMPTY_HOWTO (104), + EMPTY_HOWTO (105), + EMPTY_HOWTO (106), + EMPTY_HOWTO (107), + EMPTY_HOWTO (108), + EMPTY_HOWTO (109), + EMPTY_HOWTO (110), + EMPTY_HOWTO (111), + EMPTY_HOWTO (112), + EMPTY_HOWTO (113), + EMPTY_HOWTO (114), + EMPTY_HOWTO (115), + EMPTY_HOWTO (116), + EMPTY_HOWTO (117), + EMPTY_HOWTO (118), + EMPTY_HOWTO (119), + EMPTY_HOWTO (120), + EMPTY_HOWTO (121), + EMPTY_HOWTO (122), + EMPTY_HOWTO (123), + EMPTY_HOWTO (124), + EMPTY_HOWTO (125), + EMPTY_HOWTO (126), + EMPTY_HOWTO (127), + EMPTY_HOWTO (128), + EMPTY_HOWTO (129), + EMPTY_HOWTO (130), + EMPTY_HOWTO (131), + EMPTY_HOWTO (132), + EMPTY_HOWTO (133), + EMPTY_HOWTO (134), + EMPTY_HOWTO (135), + EMPTY_HOWTO (136), + EMPTY_HOWTO (137), + EMPTY_HOWTO (138), + EMPTY_HOWTO (139), + EMPTY_HOWTO (140), + EMPTY_HOWTO (141), + EMPTY_HOWTO (142), + EMPTY_HOWTO (143), + EMPTY_HOWTO (144), + EMPTY_HOWTO (145), + EMPTY_HOWTO (146), + EMPTY_HOWTO (147), + EMPTY_HOWTO (148), + EMPTY_HOWTO (149), + EMPTY_HOWTO (150), + EMPTY_HOWTO (151), + EMPTY_HOWTO (152), + EMPTY_HOWTO (153), + EMPTY_HOWTO (154), + EMPTY_HOWTO (155), + EMPTY_HOWTO (156), + EMPTY_HOWTO (157), + EMPTY_HOWTO (158), + EMPTY_HOWTO (159), + EMPTY_HOWTO (160), + EMPTY_HOWTO (161), + EMPTY_HOWTO (162), + EMPTY_HOWTO (163), + EMPTY_HOWTO (164), + EMPTY_HOWTO (165), + EMPTY_HOWTO (166), + EMPTY_HOWTO (167), + EMPTY_HOWTO (168), + EMPTY_HOWTO (169), + EMPTY_HOWTO (170), + EMPTY_HOWTO (171), + EMPTY_HOWTO (172), + EMPTY_HOWTO (173), + EMPTY_HOWTO (174), + EMPTY_HOWTO (175), + EMPTY_HOWTO (176), + EMPTY_HOWTO (177), + EMPTY_HOWTO (178), + EMPTY_HOWTO (179), + EMPTY_HOWTO (180), + EMPTY_HOWTO (181), + EMPTY_HOWTO (182), + EMPTY_HOWTO (183), + EMPTY_HOWTO (184), + EMPTY_HOWTO (185), + EMPTY_HOWTO (186), + EMPTY_HOWTO (187), + EMPTY_HOWTO (188), + EMPTY_HOWTO (189), + EMPTY_HOWTO (190), + EMPTY_HOWTO (191), + EMPTY_HOWTO (192), + EMPTY_HOWTO (193), + EMPTY_HOWTO (194), + EMPTY_HOWTO (195), + EMPTY_HOWTO (196), + EMPTY_HOWTO (197), + EMPTY_HOWTO (198), + EMPTY_HOWTO (199), + EMPTY_HOWTO (200), + EMPTY_HOWTO (201), + EMPTY_HOWTO (202), + EMPTY_HOWTO (203), + EMPTY_HOWTO (204), + EMPTY_HOWTO (205), + EMPTY_HOWTO (206), + EMPTY_HOWTO (207), + EMPTY_HOWTO (208), + EMPTY_HOWTO (209), + EMPTY_HOWTO (210), + EMPTY_HOWTO (211), + EMPTY_HOWTO (212), + EMPTY_HOWTO (213), + EMPTY_HOWTO (214), + EMPTY_HOWTO (215), + EMPTY_HOWTO (216), + EMPTY_HOWTO (217), + EMPTY_HOWTO (218), + EMPTY_HOWTO (219), + EMPTY_HOWTO (220), + EMPTY_HOWTO (221), + EMPTY_HOWTO (222), + EMPTY_HOWTO (223), + EMPTY_HOWTO (224), + EMPTY_HOWTO (225), + EMPTY_HOWTO (226), + EMPTY_HOWTO (227), + EMPTY_HOWTO (228), + EMPTY_HOWTO (229), + EMPTY_HOWTO (230), + EMPTY_HOWTO (231), + EMPTY_HOWTO (232), + EMPTY_HOWTO (233), + EMPTY_HOWTO (234), + EMPTY_HOWTO (235), + EMPTY_HOWTO (236), + EMPTY_HOWTO (237), + EMPTY_HOWTO (238), + EMPTY_HOWTO (239), + EMPTY_HOWTO (240), + EMPTY_HOWTO (241), + EMPTY_HOWTO (242), + EMPTY_HOWTO (243), + EMPTY_HOWTO (244), + EMPTY_HOWTO (245), + EMPTY_HOWTO (246), + EMPTY_HOWTO (247), + EMPTY_HOWTO (248), + EMPTY_HOWTO (249), + EMPTY_HOWTO (250), + EMPTY_HOWTO (251), + EMPTY_HOWTO (252), + HOWTO (R_C6000_ALIGN, /* type */ + 0, /* rightshift */ + 0, /* size (0 = byte, 1 = short, 2 = long) */ + 0, /* bitsize */ + FALSE, /* pc_relative */ + 0, /* bitpos */ + complain_overflow_dont,/* complain_on_overflow */ + bfd_elf_generic_reloc, /* special_function */ + "R_C6000_ALIGN", /* name */ + TRUE, /* partial_inplace */ + 0, /* src_mask */ + 0, /* dst_mask */ + FALSE), /* pcrel_offset */ + HOWTO (R_C6000_FPHEAD, /* type */ + 0, /* rightshift */ + 0, /* size (0 = byte, 1 = short, 2 = long) */ + 0, /* bitsize */ + FALSE, /* pc_relative */ + 0, /* bitpos */ + complain_overflow_dont,/* complain_on_overflow */ + bfd_elf_generic_reloc, /* special_function */ + "R_C6000_FPHEAD", /* name */ + TRUE, /* partial_inplace */ + 0, /* src_mask */ + 0, /* dst_mask */ + FALSE), /* pcrel_offset */ + HOWTO (R_C6000_NOCMP, /* type */ + 0, /* rightshift */ + 0, /* size (0 = byte, 1 = short, 2 = long) */ + 0, /* bitsize */ + FALSE, /* pc_relative */ + 0, /* bitpos */ + complain_overflow_dont,/* complain_on_overflow */ + bfd_elf_generic_reloc, /* special_function */ + "R_C6000_NOCMP", /* name */ + TRUE, /* partial_inplace */ + 0, /* src_mask */ + 0, /* dst_mask */ + FALSE) /* pcrel_offset */ +}; + /* Map BFD relocations to ELF relocations. */ typedef struct @@ -689,27 +1263,54 @@ static const tic6x_reloc_map elf32_tic6x_reloc_map[] = }; static reloc_howto_type * -elf32_tic6x_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED, - bfd_reloc_code_real_type code) +elf32_tic6x_reloc_type_lookup (bfd *abfd, bfd_reloc_code_real_type code) { unsigned int i; for (i = 0; i < ARRAY_SIZE (elf32_tic6x_reloc_map); i++) if (elf32_tic6x_reloc_map[i].bfd_reloc_val == code) - return &elf32_tic6x_howto_table[elf32_tic6x_reloc_map[i].elf_reloc_val]; + { + enum elf_tic6x_reloc_type elf_reloc_val; + reloc_howto_type *howto; + + elf_reloc_val = elf32_tic6x_reloc_map[i].elf_reloc_val; + if (elf32_tic6x_tdata (abfd)->use_rela_p) + howto = &elf32_tic6x_howto_table[elf_reloc_val]; + else + howto = &elf32_tic6x_howto_table_rel[elf_reloc_val]; + + /* Some relocations are RELA-only; do not return them for + REL. */ + if (howto->name == NULL) + howto = NULL; + + return howto; + } return NULL; } static reloc_howto_type * -elf32_tic6x_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED, const char *r_name) +elf32_tic6x_reloc_name_lookup (bfd *abfd, const char *r_name) { - unsigned int i; + if (elf32_tic6x_tdata (abfd)->use_rela_p) + { + unsigned int i; + + for (i = 0; i < ARRAY_SIZE (elf32_tic6x_howto_table); i++) + if (elf32_tic6x_howto_table[i].name != NULL + && strcasecmp (elf32_tic6x_howto_table[i].name, r_name) == 0) + return &elf32_tic6x_howto_table[i]; + } + else + { + unsigned int i; - for (i = 0; i < ARRAY_SIZE (elf32_tic6x_howto_table); i++) - if (elf32_tic6x_howto_table[i].name != NULL - && strcasecmp (elf32_tic6x_howto_table[i].name, r_name) == 0) - return &elf32_tic6x_howto_table[i]; + for (i = 0; i < ARRAY_SIZE (elf32_tic6x_howto_table_rel); i++) + if (elf32_tic6x_howto_table_rel[i].name != NULL + && strcasecmp (elf32_tic6x_howto_table_rel[i].name, r_name) == 0) + return &elf32_tic6x_howto_table_rel[i]; + } return NULL; } @@ -727,6 +1328,71 @@ elf32_tic6x_info_to_howto (bfd *abfd ATTRIBUTE_UNUSED, arelent *bfd_reloc, bfd_reloc->howto = &elf32_tic6x_howto_table[r_type]; } +static void +elf32_tic6x_info_to_howto_rel (bfd *abfd ATTRIBUTE_UNUSED, arelent *bfd_reloc, + Elf_Internal_Rela *elf_reloc) +{ + unsigned int r_type; + + r_type = ELF32_R_TYPE (elf_reloc->r_info); + if (r_type >= ARRAY_SIZE (elf32_tic6x_howto_table_rel)) + bfd_reloc->howto = NULL; + else + bfd_reloc->howto = &elf32_tic6x_howto_table_rel[r_type]; +} + +void +elf32_tic6x_set_use_rela_p (bfd *abfd, bfd_boolean use_rela_p) +{ + elf32_tic6x_tdata (abfd)->use_rela_p = use_rela_p; +} + +static bfd_boolean +elf32_tic6x_mkobject (bfd *abfd) +{ + bfd_boolean ret; + + ret = bfd_elf_allocate_object (abfd, sizeof (struct elf32_tic6x_obj_tdata), + TIC6X_ELF_DATA); + if (ret) + elf32_tic6x_set_use_rela_p (abfd, TRUE); + return ret; +} + +static bfd_boolean +elf32_tic6x_new_section_hook (bfd *abfd, asection *sec) +{ + bfd_boolean ret; + + ret = _bfd_elf_new_section_hook (abfd, sec); + sec->use_rela_p = elf32_tic6x_tdata (abfd)->use_rela_p; + + return ret; +} + +/* Return true if relocation REL against section SEC is a REL rather + than RELA relocation. RELOCS is the first relocation in the + section and ABFD is the bfd that contains SEC. */ + +static bfd_boolean +elf32_tic6x_rel_relocation_p (bfd *abfd, asection *sec, + const Elf_Internal_Rela *relocs, + const Elf_Internal_Rela *rel) +{ + Elf_Internal_Shdr *rel_hdr; + const struct elf_backend_data *bed; + + /* To determine which flavor of relocation this is, we depend on the + fact that the INPUT_SECTION's REL_HDR is read before its + REL_HDR2. */ + rel_hdr = &elf_section_data (sec)->rel_hdr; + bed = get_elf_backend_data (abfd); + if ((size_t) (rel - relocs) + >= (NUM_SHDR_ENTRIES (rel_hdr) * bed->s->int_rels_per_ext_rel)) + rel_hdr = elf_section_data (sec)->rel_hdr2; + return rel_hdr->sh_entsize == bed->s->sizeof_rel; +} + static bfd_boolean elf32_tic6x_relocate_section (bfd *output_bfd, struct bfd_link_info *info, @@ -761,11 +1427,18 @@ elf32_tic6x_relocate_section (bfd *output_bfd, bfd_boolean unresolved_reloc; bfd_reloc_status_type r; struct bfd_link_hash_entry *sbh; + bfd_boolean is_rel; r_type = ELF32_R_TYPE (rel->r_info); r_symndx = ELF32_R_SYM (rel->r_info); - elf32_tic6x_info_to_howto (input_bfd, &bfd_reloc, rel); + is_rel = elf32_tic6x_rel_relocation_p (input_bfd, input_section, + relocs, rel); + + if (is_rel) + elf32_tic6x_info_to_howto_rel (input_bfd, &bfd_reloc, rel); + else + elf32_tic6x_info_to_howto (input_bfd, &bfd_reloc, rel); howto = bfd_reloc.howto; if (howto == NULL) { @@ -806,7 +1479,19 @@ elf32_tic6x_relocate_section (bfd *output_bfd, } if (info->relocatable) - continue; + { + if (is_rel + && sym != NULL + && ELF_ST_TYPE (sym->st_info) == STT_SECTION) + { + rel->r_addend = 0; + relocation = sec->output_offset + sym->st_value; + r = _bfd_relocate_contents (howto, input_bfd, relocation, + contents + rel->r_offset); + goto done_reloc; + } + continue; + } switch (r_type) { @@ -891,6 +1576,7 @@ elf32_tic6x_relocate_section (bfd *output_bfd, contents, rel->r_offset, relocation, rel->r_addend); + done_reloc: if (r == bfd_reloc_ok && howto->complain_on_overflow == complain_overflow_bitfield) { @@ -988,6 +1674,8 @@ elf32_tic6x_relocate_section (bfd *output_bfd, #define ELF_MAXPAGESIZE 1 #define bfd_elf32_bfd_reloc_type_lookup elf32_tic6x_reloc_type_lookup #define bfd_elf32_bfd_reloc_name_lookup elf32_tic6x_reloc_name_lookup +#define bfd_elf32_mkobject elf32_tic6x_mkobject +#define bfd_elf32_new_section_hook elf32_tic6x_new_section_hook #define elf_backend_can_gc_sections 1 #define elf_backend_default_use_rela_p 1 #define elf_backend_may_use_rel_p 1 @@ -995,6 +1683,6 @@ elf32_tic6x_relocate_section (bfd *output_bfd, #define elf_backend_rela_normal 1 #define elf_backend_relocate_section elf32_tic6x_relocate_section #define elf_info_to_howto elf32_tic6x_info_to_howto -#define elf_info_to_howto_rel _bfd_elf_no_info_to_howto +#define elf_info_to_howto_rel elf32_tic6x_info_to_howto_rel #include "elf32-target.h" diff --git a/bfd/elf32-tic6x.h b/bfd/elf32-tic6x.h new file mode 100644 index 0000000..dfb488c --- /dev/null +++ b/bfd/elf32-tic6x.h @@ -0,0 +1,24 @@ +/* 32-bit ELF support for TI C6X + Copyright 2010 + Free Software Foundation, Inc. + + This file is part of BFD, the Binary File Descriptor library. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +/* This function is provided for use from the assembler. */ + +extern void elf32_tic6x_set_use_rela_p (bfd *, bfd_boolean); diff --git a/gas/ChangeLog b/gas/ChangeLog index 660daad..5ad2e43 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,21 @@ +2010-04-20 Joseph Myers <joseph@codesourcery.com> + + * config/tc-tic6x.c (OPTION_MGENERATE_REL): New. + (md_longopts): Add -mgenerate-rel. + (tic6x_generate_rela): New. + (md_parse_option): Handle -mgenerate-rel. + (md_show_usage): Add comment that -mgenerate-rel is undocumented. + (tic6x_init_after_args): New. + (md_apply_fix): Correct shift calculations for SB-relative + relocations. + (md_pcrel_from): Change to tic6x_pcrel_from_section. Do not + adjust addresses for relocations referencing symbols in other + sections. + (tc_gen_reloc): Adjust addend calculations for REL relocations. + * config/tc-tic6x.h (MD_PCREL_FROM_SECTION, + tic6x_pcrel_from_section, tc_init_after_args, + tic6x_init_after_args): New. + 2010-04-20 Nick Clifton <nickc@redhat.com> PR gas/11507 diff --git a/gas/config/tc-tic6x.c b/gas/config/tc-tic6x.c index 730b786..d746f94 100644 --- a/gas/config/tc-tic6x.c +++ b/gas/config/tc-tic6x.c @@ -24,6 +24,7 @@ #include "safe-ctype.h" #include "subsegs.h" #include "opcode/tic6x.h" +#include "elf32-tic6x.h" /* Truncate and sign-extend at 32 bits, so that building on a 64-bit host gives identical results to a 32-bit host. */ @@ -45,7 +46,8 @@ enum OPTION_MATOMIC, OPTION_MNO_ATOMIC, OPTION_MBIG_ENDIAN, - OPTION_MLITTLE_ENDIAN + OPTION_MLITTLE_ENDIAN, + OPTION_MGENERATE_REL }; struct option md_longopts[] = @@ -55,6 +57,7 @@ struct option md_longopts[] = { "mno-atomic", no_argument, NULL, OPTION_MNO_ATOMIC }, { "mbig-endian", no_argument, NULL, OPTION_MBIG_ENDIAN }, { "mlittle-endian", no_argument, NULL, OPTION_MLITTLE_ENDIAN }, + { "mgenerate-rel", no_argument, NULL, OPTION_MGENERATE_REL }, { NULL, no_argument, NULL, 0 } }; size_t md_longopts_size = sizeof (md_longopts); @@ -95,6 +98,9 @@ static bfd_boolean tic6x_long_data_constraints; /* Whether compact instructions are available. */ static bfd_boolean tic6x_compact_insns; +/* Whether to generate RELA relocations. */ +static bfd_boolean tic6x_generate_rela = TRUE; + /* Table of supported architecture variants. */ typedef struct { @@ -162,6 +168,10 @@ md_parse_option (int c, char *arg) target_big_endian = 0; break; + case OPTION_MGENERATE_REL: + tic6x_generate_rela = FALSE; + break; + default: return 0; } @@ -180,6 +190,8 @@ md_show_usage (FILE *stream ATTRIBUTE_UNUSED) fprintf (stream, _(" -mno-atomic disable atomic operation instructions\n")); fprintf (stream, _(" -mbig-endian generate big-endian code\n")); fprintf (stream, _(" -mlittle-endian generate little-endian code\n")); + /* -mgenerate-rel is only for testsuite use and is deliberately + undocumented. */ fputc ('\n', stream); fprintf (stream, _("Supported ARCH values are:")); @@ -512,6 +524,15 @@ tic6x_cleanup (void) tic6x_end_of_line (); } +/* Do target-specific initialization after arguments have been + processed and the output file created. */ + +void +tic6x_init_after_args (void) +{ + elf32_tic6x_set_use_rela_p (stdoutput, tic6x_generate_rela); +} + /* Handle a data alignment of N bytes. */ void @@ -3111,8 +3132,25 @@ md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED) if (fixP->fx_done || !seg->use_rela_p) { offsetT newval = md_chars_to_number (buf, 4); + int shift; + + switch (fixP->fx_r_type) + { + case BFD_RELOC_C6000_SBR_L16_H: + shift = 1; + break; + + case BFD_RELOC_C6000_SBR_L16_W: + case BFD_RELOC_C6000_SBR_GOT_L16_W: + shift = 2; + break; + + default: + shift = 0; + break; + } - MODIFY_VALUE (newval, value, 0, 7, 16); + MODIFY_VALUE (newval, value, shift, 7, 16); if ((value < -0x8000 || value > 0x7fff) && (fixP->fx_r_type == BFD_RELOC_C6000_ABS_S16 || fixP->fx_r_type == BFD_RELOC_C6000_SBR_S16)) @@ -3135,8 +3173,25 @@ md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED) if (fixP->fx_done || !seg->use_rela_p) { offsetT newval = md_chars_to_number (buf, 4); + int shift; + + switch (fixP->fx_r_type) + { + case BFD_RELOC_C6000_SBR_H16_H: + shift = 17; + break; + + case BFD_RELOC_C6000_SBR_H16_W: + case BFD_RELOC_C6000_SBR_GOT_H16_W: + shift = 18; + break; - MODIFY_VALUE (newval, value, 16, 7, 16); + default: + shift = 16; + break; + } + + MODIFY_VALUE (newval, value, shift, 7, 16); md_number_to_chars (buf, newval, 4); } @@ -3348,8 +3403,12 @@ md_operand (expressionS *op ATTRIBUTE_UNUSED) packet. */ long -md_pcrel_from (fixS *fixp) +tic6x_pcrel_from_section (fixS *fixp, segT sec) { + if (fixp->fx_addsy != NULL + && (!S_IS_DEFINED (fixp->fx_addsy) + || S_GET_SEGMENT (fixp->fx_addsy) != sec)) + return 0; return (fixp->fx_where + fixp->fx_frag->fr_address) & ~(long) 0x1f; } @@ -3386,7 +3445,7 @@ tc_gen_reloc (asection *section ATTRIBUTE_UNUSED, fixS *fixp) reloc->sym_ptr_ptr = xmalloc (sizeof (asymbol *)); *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy); reloc->address = fixp->fx_frag->fr_address + fixp->fx_where; - reloc->addend = fixp->fx_offset; + reloc->addend = (tic6x_generate_rela ? fixp->fx_offset : 0); r_type = fixp->fx_r_type; reloc->howto = bfd_reloc_type_lookup (stdoutput, r_type); @@ -3398,5 +3457,9 @@ tc_gen_reloc (asection *section ATTRIBUTE_UNUSED, fixS *fixp) return NULL; } + /* Correct for adjustments bfd_install_relocation will make. */ + if (reloc->howto->pcrel_offset && reloc->howto->partial_inplace) + reloc->addend += reloc->address; + return reloc; } diff --git a/gas/config/tc-tic6x.h b/gas/config/tc-tic6x.h index 05c3db8..087b9e9 100644 --- a/gas/config/tc-tic6x.h +++ b/gas/config/tc-tic6x.h @@ -96,6 +96,9 @@ extern void tic6x_cons_align (int n); extern int tic6x_parse_name (const char *name, expressionS *exprP, enum expr_mode mode, char *nextchar); +#define MD_PCREL_FROM_SECTION(FIX, SEC) tic6x_pcrel_from_section (FIX, SEC) +extern long tic6x_pcrel_from_section (struct fix *fixp, segT sec); + #define md_start_line_hook() tic6x_start_line_hook () extern void tic6x_start_line_hook (void); @@ -107,5 +110,8 @@ extern void tic6x_cons_fix_new (fragS *frag, int where, int size, #define tc_frob_label(sym) tic6x_frob_label (sym) extern void tic6x_frob_label (symbolS *sym); +#define tc_init_after_args() tic6x_init_after_args () +extern void tic6x_init_after_args (void); + #define tc_unrecognized_line(c) tic6x_unrecognized_line (c) extern int tic6x_unrecognized_line (int c); diff --git a/ld/testsuite/ChangeLog b/ld/testsuite/ChangeLog index dbeb91b..3556c5b 100644 --- a/ld/testsuite/ChangeLog +++ b/ld/testsuite/ChangeLog @@ -1,3 +1,20 @@ +2010-04-20 Joseph Myers <joseph@codesourcery.com> + + * ld-tic6x/data-reloc-global-rel.d, + ld-tic6x/data-reloc-global-rel.s, + ld-tic6x/data-reloc-local-r-rel.d, + ld-tic6x/data-reloc-local-rel.d, ld-tic6x/mvk-reloc-global-rel.d, + ld-tic6x/mvk-reloc-global-rel.s, ld-tic6x/mvk-reloc-local-1-rel.s, + ld-tic6x/mvk-reloc-local-2-rel.s, + ld-tic6x/mvk-reloc-local-r-rel.d, ld-tic6x/mvk-reloc-local-rel.d, + ld-tic6x/pcrel-reloc-global-rel.d, + ld-tic6x/pcrel-reloc-local-r-rel.d, + ld-tic6x/pcrel-reloc-local-rel.d, ld-tic6x/sbr-reloc-global-rel.d, + ld-tic6x/sbr-reloc-global-rel.s, ld-tic6x/sbr-reloc-local-1-rel.s, + ld-tic6x/sbr-reloc-local-2-rel.s, + ld-tic6x/sbr-reloc-local-r-rel.d, ld-tic6x/sbr-reloc-local-rel.d: + New. + 2010-04-15 Matthew Gretton-Dann <matthew.gretton-dann@arm.com> * ld-arm/attr-merge-2.attr: Update for changes in attribute output. diff --git a/ld/testsuite/ld-tic6x/data-reloc-global-rel.d b/ld/testsuite/ld-tic6x/data-reloc-global-rel.d new file mode 100644 index 0000000..82e2caf --- /dev/null +++ b/ld/testsuite/ld-tic6x/data-reloc-global-rel.d @@ -0,0 +1,11 @@ +#name: C6X data relocations, global symbols, REL +#as: -mlittle-endian -mgenerate-rel +#ld: -melf32_tic6x_le -Tgeneric.ld --defsym s0=0 --defsym sff=0xff --defsym sffff=0xffff --defsym s80000000=0x80000000 --defsym sffff8000=0xffff8000 --defsym sffffff80=0xffffff80 --defsym sffffffff=0xffffffff +#source: data-reloc-global-rel.s +#objdump: -r -s -j .data + +.*: *file format elf32-tic6x-le + +Contents of section \.data: +[ \t]*0080 00000080 ffffffff 00000000 feffffff \.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\. +[ \t]*0090 00000000 ffffffff 00800080 ffff8080 \.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\. diff --git a/ld/testsuite/ld-tic6x/data-reloc-global-rel.s b/ld/testsuite/ld-tic6x/data-reloc-global-rel.s new file mode 100644 index 0000000..8c7ba2e --- /dev/null +++ b/ld/testsuite/ld-tic6x/data-reloc-global-rel.s @@ -0,0 +1,21 @@ +.globl s0 +.globl sff +.globl sffff +.globl s80000000 +.globl sffff8000 +.globl sffffff80 +.globl sffffffff +.data + .word s80000000 + .word sffffffff + .word s0 + .word sffffffff+0xffffffff + .word s80000000+0x80000000 + .short sffffffff + .short sffff + .short sffff8000 + .short s0-0x8000 + .byte sffffffff + .byte sff + .byte sffffff80 + .byte s0-0x80 diff --git a/ld/testsuite/ld-tic6x/data-reloc-local-r-rel.d b/ld/testsuite/ld-tic6x/data-reloc-local-r-rel.d new file mode 100644 index 0000000..18f23f9 --- /dev/null +++ b/ld/testsuite/ld-tic6x/data-reloc-local-r-rel.d @@ -0,0 +1,23 @@ +#name: C6X data relocations, local symbols, -r, REL +#as: -mlittle-endian -mgenerate-rel +#ld: -r -melf32_tic6x_le +#source: data-reloc-local-1.s +#source: data-reloc-local-2.s +#objdump: -r -s -j .data + +.*: *file format elf32-tic6x-le + +RELOCATION RECORDS FOR \[\.data\]: +OFFSET TYPE VALUE +0+ R_C6000_ABS32 \.data +0+4 R_C6000_ABS32 \.data +0+8 R_C6000_ABS32 \.data +0+c R_C6000_ABS32 \.data +0+10 R_C6000_ABS16 \.data +0+12 R_C6000_ABS8 \.data +0+13 R_C6000_ABS8 \.data + + +Contents of section \.data: +[ \t]*0000 00000000 04000000 0c000000 08000000 \.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\. +[ \t]*0010 0c00080c \.\.\.\. diff --git a/ld/testsuite/ld-tic6x/data-reloc-local-rel.d b/ld/testsuite/ld-tic6x/data-reloc-local-rel.d new file mode 100644 index 0000000..686ca6e --- /dev/null +++ b/ld/testsuite/ld-tic6x/data-reloc-local-rel.d @@ -0,0 +1,12 @@ +#name: C6X data relocations, local symbols, REL +#as: -mlittle-endian -mgenerate-rel +#ld: -melf32_tic6x_le -Tgeneric.ld +#source: data-reloc-local-1.s +#source: data-reloc-local-2.s +#objdump: -r -s -j .data + +.*: *file format elf32-tic6x-le + +Contents of section \.data: +[ \t]*0080 80000000 84000000 8c000000 88000000 .* +[ \t]*0090 8c00888c .* diff --git a/ld/testsuite/ld-tic6x/mvk-reloc-global-rel.d b/ld/testsuite/ld-tic6x/mvk-reloc-global-rel.d new file mode 100644 index 0000000..a082bbf --- /dev/null +++ b/ld/testsuite/ld-tic6x/mvk-reloc-global-rel.d @@ -0,0 +1,20 @@ +#name: C6X MVK relocations, global symbols, REL +#as: -mlittle-endian -mgenerate-rel +#ld: -melf32_tic6x_le -Tgeneric.ld --defsym s0=0 --defsym s7fff=0x7fff --defsym s80000000=0x80000000 --defsym sffff8000=0xffff8000 --defsym sffffffff=0xffffffff +#source: mvk-reloc-global-rel.s +#objdump: -dr + +.*: *file format elf32-tic6x-le + + +Disassembly of section \.text: + +10000000 <[^>]*>: +10000000:[ \t]+00800028[ \t]+mvk \.S1 0,a1 +10000004:[ \t]+00ffffa8[ \t]+mvk \.S1 -1,a1 +10000008:[ \t]+00800028[ \t]+mvk \.S1 0,a1 +1000000c:[ \t]+00ffff28[ \t]+mvk \.S1 -2,a1 +10000010:[ \t]+00c00028[ \t]+mvk \.S1 -32768,a1 +10000014:[ \t]+00c00028[ \t]+mvk \.S1 -32768,a1 +10000018:[ \t]+00bfffa8[ \t]+mvk \.S1 32767,a1 +1000001c:[ \t]+00000000[ \t]+nop 1 diff --git a/ld/testsuite/ld-tic6x/mvk-reloc-global-rel.s b/ld/testsuite/ld-tic6x/mvk-reloc-global-rel.s new file mode 100644 index 0000000..0690873 --- /dev/null +++ b/ld/testsuite/ld-tic6x/mvk-reloc-global-rel.s @@ -0,0 +1,14 @@ +.globl s0 +.globl s7fff +.globl s80000000 +.globl sffff8000 +.globl sffffffff +.text +.nocmp + mvkl .S1 s80000000,a1 + mvkl .S1 sffffffff,a1 + mvkl .S1 s0,a1 + mvkl .S1 sffffffff+0xffffffff,a1 + mvk .S1 sffff8000,a1 + mvk .S1 s0-0x8000,a1 + mvk .S1 s7fff,a1 diff --git a/ld/testsuite/ld-tic6x/mvk-reloc-local-1-rel.s b/ld/testsuite/ld-tic6x/mvk-reloc-local-1-rel.s new file mode 100644 index 0000000..1255177 --- /dev/null +++ b/ld/testsuite/ld-tic6x/mvk-reloc-local-1-rel.s @@ -0,0 +1,11 @@ +.text +.nocmp + mvk .S1 a,a1 + mvkl .S1 b,a2 +.data +a: + .word 0 +b: + .word 0 +c: + .word 0 diff --git a/ld/testsuite/ld-tic6x/mvk-reloc-local-2-rel.s b/ld/testsuite/ld-tic6x/mvk-reloc-local-2-rel.s new file mode 100644 index 0000000..320c988 --- /dev/null +++ b/ld/testsuite/ld-tic6x/mvk-reloc-local-2-rel.s @@ -0,0 +1,11 @@ +.text +.nocmp + mvk .S1 d,a1 + mvkl .S1 e,a2 +.data +d: + .word 0 +e: + .word 0 +f: + .word 0 diff --git a/ld/testsuite/ld-tic6x/mvk-reloc-local-r-rel.d b/ld/testsuite/ld-tic6x/mvk-reloc-local-r-rel.d new file mode 100644 index 0000000..dcbd55b --- /dev/null +++ b/ld/testsuite/ld-tic6x/mvk-reloc-local-r-rel.d @@ -0,0 +1,23 @@ +#name: C6X MVK relocations, local symbols, -r, REL +#as: -mlittle-endian -mgenerate-rel +#ld: -r -melf32_tic6x_le +#source: mvk-reloc-local-1-rel.s +#source: mvk-reloc-local-2-rel.s +#objdump: -dr + +.*: *file format elf32-tic6x-le + + +Disassembly of section \.text: + +0+ <[^>]*>: +[ \t]*0:[ \t]+00800028[ \t]+mvk \.S1 0,a1 +[ \t]*0: R_C6000_ABS_S16[ \t]+\.data +[ \t]*4:[ \t]+01000228[ \t]+mvk \.S1 4,a2 +[ \t]*4: R_C6000_ABS_L16[ \t]+\.data +[ \t]*\.\.\. +[ \t]*20:[ \t]+00800628[ \t]+mvk \.S1 12,a1 +[ \t]*20: R_C6000_ABS_S16[ \t]+\.data +[ \t]*24:[ \t]+01000828[ \t]+mvk \.S1 16,a2 +[ \t]*24: R_C6000_ABS_L16[ \t]+\.data +[ \t]*\.\.\. diff --git a/ld/testsuite/ld-tic6x/mvk-reloc-local-rel.d b/ld/testsuite/ld-tic6x/mvk-reloc-local-rel.d new file mode 100644 index 0000000..d91a693 --- /dev/null +++ b/ld/testsuite/ld-tic6x/mvk-reloc-local-rel.d @@ -0,0 +1,19 @@ +#name: C6X MVK relocations, local symbols, REL +#as: -mlittle-endian -mgenerate-rel +#ld: -melf32_tic6x_le -Tgeneric.ld +#source: mvk-reloc-local-1-rel.s +#source: mvk-reloc-local-2-rel.s +#objdump: -dr + +.*: *file format elf32-tic6x-le + + +Disassembly of section \.text: + +10000000 <[^>]*>: +10000000:[ \t]+00804028[ \t]+mvk \.S1 128,a1 +10000004:[ \t]+01004228[ \t]+mvk \.S1 132,a2 +[ \t]*\.\.\. +10000020:[ \t]+00804628[ \t]+mvk \.S1 140,a1 +10000024:[ \t]+01004828[ \t]+mvk \.S1 144,a2 +[ \t]*\.\.\. diff --git a/ld/testsuite/ld-tic6x/pcrel-reloc-global-rel.d b/ld/testsuite/ld-tic6x/pcrel-reloc-global-rel.d new file mode 100644 index 0000000..cf564e9 --- /dev/null +++ b/ld/testsuite/ld-tic6x/pcrel-reloc-global-rel.d @@ -0,0 +1,20 @@ +#name: C6X PC-relative relocations, global symbols, REL +#as: -mlittle-endian -mgenerate-rel +#ld: -melf32_tic6x_le -Tgeneric.ld --defsym s7a=0x0fffff00 --defsym s7b=0x100000fc --defsym s10a=0x0ffff800 --defsym s10b=0x100007fc --defsym s12a=0x0fffe000 --defsym s12b=0x10001ffc --defsym s21a=0x0fc00000 --defsym s21b=0x103ffffc +#source: pcrel-reloc-global.s +#objdump: -dr + +.*: *file format elf32-tic6x-le + + +Disassembly of section \.text: + +10000000 <[^>]*>: +10000000:[ \t]+00c00162[ \t]+addkpc \.S2 fffff00 <[^>]*>,b1,0 +10000004:[ \t]+00bf0162[ \t]+addkpc \.S2 100000fc <[^>]*>,b1,0 +10000008:[ \t]+08000012[ \t]+b \.S2 fc00000 <[^>]*> +1000000c:[ \t]+07ffff92[ \t]+b \.S2 103ffffc <[^>]*> +10000010:[ \t]+00c01022[ \t]+bdec \.S2 ffff800 <[^>]*>,b1 +10000014:[ \t]+00bff022[ \t]+bdec \.S2 100007fc <[^>]*>,b1 +10000018:[ \t]+08000122[ \t]+bnop \.S2 fffe000 <[^>]*>,0 +1000001c:[ \t]+07ff0122[ \t]+bnop \.S2 10001ffc <[^>]*>,0 diff --git a/ld/testsuite/ld-tic6x/pcrel-reloc-local-r-rel.d b/ld/testsuite/ld-tic6x/pcrel-reloc-local-r-rel.d new file mode 100644 index 0000000..e54c370 --- /dev/null +++ b/ld/testsuite/ld-tic6x/pcrel-reloc-local-r-rel.d @@ -0,0 +1,62 @@ +#name: C6X PC-relative relocations, local symbols, -r, REL +#as: -mlittle-endian -mgenerate-rel +#ld: -r -melf32_tic6x_le +#source: pcrel-reloc-local-1.s +#source: pcrel-reloc-local-2.s +#objdump: -dr + +.*: *file format elf32-tic6x-le + + +Disassembly of section \.text: + +0+ <[^>]*>: +[ \t]*0:[ \t]+00000000[ \t]+nop 1 +[ \t]*4:[ \t]+00800162[ \t]+addkpc \.S2 0 <[^>]*>,b1,0 +[ \t]*4: R_C6000_PCR_S7[ \t]+\.text\.1 +[ \t]*8:[ \t]+00810162[ \t]+addkpc \.S2 4 <[^>]*>,b1,0 +[ \t]*8: R_C6000_PCR_S7[ \t]+\.text\.1 +[ \t]*c:[ \t]+00000012[ \t]+b \.S2 0 <[^>]*> +[ \t]*c: R_C6000_PCR_S21[ \t]+\.text\.1 +[ \t]*10:[ \t]+00000092[ \t]+b \.S2 4 <[^>]*> +[ \t]*10: R_C6000_PCR_S21[ \t]+\.text\.1 +[ \t]*14:[ \t]+00801022[ \t]+bdec \.S2 0 <[^>]*>,b1 +[ \t]*14: R_C6000_PCR_S10[ \t]+\.text\.1 +[ \t]*18:[ \t]+00803022[ \t]+bdec \.S2 4 <[^>]*>,b1 +[ \t]*18: R_C6000_PCR_S10[ \t]+\.text\.1 +[ \t]*1c:[ \t]+00000122[ \t]+bnop \.S2 0 <[^>]*>,0 +[ \t]*1c: R_C6000_PCR_S12[ \t]+\.text\.1 +[ \t]*20:[ \t]+00010122[ \t]+bnop \.S2 24 <[^>]*>,0 +[ \t]*20: R_C6000_PCR_S12[ \t]+\.text\.1 +[ \t]*\.\.\. +[ \t]*44:[ \t]+00080122[ \t]+bnop \.S2 60 <[^>]*>,0 +[ \t]*44: R_C6000_PCR_S12[ \t]+\.text\.1 +[ \t]*48:[ \t]+00090122[ \t]+bnop \.S2 64 <[^>]*>,0 +[ \t]*48: R_C6000_PCR_S12[ \t]+\.text\.1 +[ \t]*4c:[ \t]+00811022[ \t]+bdec \.S2 60 <[^>]*>,b1 +[ \t]*4c: R_C6000_PCR_S10[ \t]+\.text\.1 +[ \t]*50:[ \t]+00813022[ \t]+bdec \.S2 64 <[^>]*>,b1 +[ \t]*50: R_C6000_PCR_S10[ \t]+\.text\.1 +[ \t]*54:[ \t]+00000412[ \t]+b \.S2 60 <[^>]*> +[ \t]*54: R_C6000_PCR_S21[ \t]+\.text\.1 +[ \t]*58:[ \t]+00000492[ \t]+b \.S2 64 <[^>]*> +[ \t]*58: R_C6000_PCR_S21[ \t]+\.text\.1 +[ \t]*5c:[ \t]+00880162[ \t]+addkpc \.S2 60 <[^>]*>,b1,0 +[ \t]*5c: R_C6000_PCR_S7[ \t]+\.text\.1 +[ \t]*60:[ \t]+00890162[ \t]+addkpc \.S2 84 <[^>]*>,b1,0 +[ \t]*60: R_C6000_PCR_S7[ \t]+\.text\.1 +[ \t]*\.\.\. + +Disassembly of section \.text\.1: + +0+ <[^>]*>: +[ \t]*0:[ \t]+00000000[ \t]+nop 1 + +0+4 <[^>]*>: +[ \t]*\.\.\. + +0+20 <[^>]*>: +[ \t]*20:[ \t]+00000000[ \t]+nop 1 + +0+24 <[^>]*>: +[ \t]*\.\.\. diff --git a/ld/testsuite/ld-tic6x/pcrel-reloc-local-rel.d b/ld/testsuite/ld-tic6x/pcrel-reloc-local-rel.d new file mode 100644 index 0000000..108ad53 --- /dev/null +++ b/ld/testsuite/ld-tic6x/pcrel-reloc-local-rel.d @@ -0,0 +1,44 @@ +#name: C6X PC-relative relocations, local symbols, REL +#as: -mlittle-endian -mgenerate-rel +#ld: -melf32_tic6x_le -Tgeneric.ld +#source: pcrel-reloc-local-1.s +#source: pcrel-reloc-local-2.s +#objdump: -dr + +.*: *file format elf32-tic6x-le + + +Disassembly of section \.text: + +10000000 <[^>]*>: +10000000:[ \t]+00000000[ \t]+nop 1 +10000004:[ \t]+00900162[ \t]+addkpc \.S2 10000040 <[^>]*>,b1,0 +10000008:[ \t]+00910162[ \t]+addkpc \.S2 10000044 <[^>]*>,b1,0 +1000000c:[ \t]+00000812[ \t]+b \.S2 10000040 <[^>]*> +10000010:[ \t]+00000892[ \t]+b \.S2 10000044 <[^>]*> +10000014:[ \t]+00821022[ \t]+bdec \.S2 10000040 <[^>]*>,b1 +10000018:[ \t]+00823022[ \t]+bdec \.S2 10000044 <[^>]*>,b1 +1000001c:[ \t]+00100122[ \t]+bnop \.S2 10000040 <[^>]*>,0 +10000020:[ \t]+00090122[ \t]+bnop \.S2 10000044 <[^>]*>,0 +[ \t]*\.\.\. + +10000040 <[^>]*>: +10000040:[ \t]+00000000[ \t]+nop 1 + +10000044 <[^>]*>: +[ \t]*\.\.\. +10000064:[ \t]+00100122[ \t]+bnop \.S2 100000a0 <[^>]*>,0 +10000068:[ \t]+00110122[ \t]+bnop \.S2 100000a4 <[^>]*>,0 +1000006c:[ \t]+00821022[ \t]+bdec \.S2 100000a0 <[^>]*>,b1 +10000070:[ \t]+00823022[ \t]+bdec \.S2 100000a4 <[^>]*>,b1 +10000074:[ \t]+00000812[ \t]+b \.S2 100000a0 <[^>]*> +10000078:[ \t]+00000892[ \t]+b \.S2 100000a4 <[^>]*> +1000007c:[ \t]+00900162[ \t]+addkpc \.S2 100000a0 <[^>]*>,b1,0 +10000080:[ \t]+00890162[ \t]+addkpc \.S2 100000a4 <[^>]*>,b1,0 +[ \t]*\.\.\. + +100000a0 <[^>]*>: +100000a0:[ \t]+00000000[ \t]+nop 1 + +100000a4 <[^>]*>: +[ \t]*\.\.\. diff --git a/ld/testsuite/ld-tic6x/sbr-reloc-global-rel.d b/ld/testsuite/ld-tic6x/sbr-reloc-global-rel.d new file mode 100644 index 0000000..bc88717 --- /dev/null +++ b/ld/testsuite/ld-tic6x/sbr-reloc-global-rel.d @@ -0,0 +1,24 @@ +#name: C6X SB-relative relocations, global symbols, REL +#as: -mlittle-endian -mgenerate-rel +#ld: -melf32_tic6x_le -Tsbr.ld --defsym sw1=0x80 --defsym sw2=0x2007c --defsym sh1=0x80 --defsym sh2=0x1007e --defsym sb1=0x80 --defsym sb2=0x807f --defsym sb16a=0xffff8080 --defsym sb16b=0x807f --defsym sbw=0x123456f8 --defsym shw=0x2468ad70 --defsym sww=0x48d15a60 +#source: sbr-reloc-global-rel.s +#objdump: -dr + +.*: *file format elf32-tic6x-le + + +Disassembly of section \.text: + +10000000 <[^>]*>: +10000000:[ \t]+0080006e[ \t]+ldw \.D2T2 \*\+b14\(0\),b1 +10000004:[ \t]+00ffff6e[ \t]+ldw \.D2T2 \*\+b14\(131068\),b1 +10000008:[ \t]+0080004e[ \t]+ldh \.D2T2 \*\+b14\(0\),b1 +1000000c:[ \t]+00ffff4e[ \t]+ldh \.D2T2 \*\+b14\(65534\),b1 +10000010:[ \t]+0080002e[ \t]+ldb \.D2T2 \*\+b14\(0\),b1 +10000014:[ \t]+00ffff2e[ \t]+ldb \.D2T2 \*\+b14\(32767\),b1 +10000018:[ \t]+00c00028[ \t]+mvk \.S1 -32768,a1 +1000001c:[ \t]+00bfffa8[ \t]+mvk \.S1 32767,a1 +10000020:[ \t]+00ab3c28[ \t]+mvk \.S1 22136,a1 +10000024:[ \t]+00ab3c28[ \t]+mvk \.S1 22136,a1 +10000028:[ \t]+00ab3c28[ \t]+mvk \.S1 22136,a1 +[ \t]*\.\.\. diff --git a/ld/testsuite/ld-tic6x/sbr-reloc-global-rel.s b/ld/testsuite/ld-tic6x/sbr-reloc-global-rel.s new file mode 100644 index 0000000..515e03e --- /dev/null +++ b/ld/testsuite/ld-tic6x/sbr-reloc-global-rel.s @@ -0,0 +1,24 @@ +.globl sw1 +.globl sw2 +.globl sh1 +.globl sh2 +.globl sb1 +.globl sb2 +.globl sb16a +.globl sb16b +.globl sbw +.globl shw +.globl sww +.text +.nocmp + ldw .D2T2 *+b14(sw1),b1 + ldw .D2T2 *+b14(sw2),b1 + ldh .D2T2 *+b14(sh1),b1 + ldh .D2T2 *+b14(sh2),b1 + ldb .D2T2 *+b14(sb1),b1 + ldb .D2T2 *+b14(sb2),b1 + mvk .S1 $dpr_byte(sb16a),a1 + mvk .S1 $dpr_byte(sb16b),a1 + mvkl .S1 $dpr_byte(sbw),a1 + mvkl .S1 $dpr_hword(shw),a1 + mvkl .S1 $dpr_word(sww),a1 diff --git a/ld/testsuite/ld-tic6x/sbr-reloc-local-1-rel.s b/ld/testsuite/ld-tic6x/sbr-reloc-local-1-rel.s new file mode 100644 index 0000000..1316496 --- /dev/null +++ b/ld/testsuite/ld-tic6x/sbr-reloc-local-1-rel.s @@ -0,0 +1,21 @@ +.text +.nocmp + ldw .D2T2 *+b14(a),b1 + ldw .D2T2 *+b14(b),b1 + ldh .D2T2 *+b14(b),b1 + ldh .D2T2 *+b14(c),b1 + ldb .D2T2 *+b14(c),b1 + ldb .D2T2 *+b14(d),b1 + mvk .S1 $dpr_byte(d),a1 + mvkl .S1 $dpr_byte(c),a1 + mvkl .S1 $dpr_hword(b),a1 + mvkl .S1 $dpr_word(a),a1 +.data +a: + .word 0 +b: + .short 0 +c: + .byte 0 +d: + .byte 0 diff --git a/ld/testsuite/ld-tic6x/sbr-reloc-local-2-rel.s b/ld/testsuite/ld-tic6x/sbr-reloc-local-2-rel.s new file mode 100644 index 0000000..e1268fb --- /dev/null +++ b/ld/testsuite/ld-tic6x/sbr-reloc-local-2-rel.s @@ -0,0 +1,21 @@ +.text +.nocmp + ldw .D2T2 *+b14(e),b1 + ldw .D2T2 *+b14(f),b1 + ldh .D2T2 *+b14(f),b1 + ldh .D2T2 *+b14(g),b1 + ldb .D2T2 *+b14(g),b1 + ldb .D2T2 *+b14(h),b1 + mvk .S1 $dpr_byte(h),a1 + mvkl .S1 $dpr_byte(g),a1 + mvkl .S1 $dpr_hword(f),a1 + mvkl .S1 $dpr_word(e),a1 +.data +e: + .word 0 +f: + .short 0 +g: + .byte 0 +h: + .byte 0 diff --git a/ld/testsuite/ld-tic6x/sbr-reloc-local-r-rel.d b/ld/testsuite/ld-tic6x/sbr-reloc-local-r-rel.d new file mode 100644 index 0000000..801c6a2 --- /dev/null +++ b/ld/testsuite/ld-tic6x/sbr-reloc-local-r-rel.d @@ -0,0 +1,55 @@ +#name: C6X SB-relative relocations, local symbols, -r, REL +#as: -mlittle-endian -mgenerate-rel +#ld: -r -melf32_tic6x_le +#source: sbr-reloc-local-1-rel.s +#source: sbr-reloc-local-2-rel.s +#objdump: -dr + +.*: *file format elf32-tic6x-le + + +Disassembly of section \.text: + +0+ <[^>]*>: +[ \t]*0:[ \t]+0080006e[ \t]+ldw \.D2T2 \*\+b14\(0\),b1 +[ \t]*0: R_C6000_SBR_U15_W[ \t]+\.data +[ \t]*4:[ \t]+0080016e[ \t]+ldw \.D2T2 \*\+b14\(4\),b1 +[ \t]*4: R_C6000_SBR_U15_W[ \t]+\.data +[ \t]*8:[ \t]+0080024e[ \t]+ldh \.D2T2 \*\+b14\(4\),b1 +[ \t]*8: R_C6000_SBR_U15_H[ \t]+\.data +[ \t]*c:[ \t]+0080034e[ \t]+ldh \.D2T2 \*\+b14\(6\),b1 +[ \t]*c: R_C6000_SBR_U15_H[ \t]+\.data +[ \t]*10:[ \t]+0080062e[ \t]+ldb \.D2T2 \*\+b14\(6\),b1 +[ \t]*10: R_C6000_SBR_U15_B[ \t]+\.data +[ \t]*14:[ \t]+0080072e[ \t]+ldb \.D2T2 \*\+b14\(7\),b1 +[ \t]*14: R_C6000_SBR_U15_B[ \t]+\.data +[ \t]*18:[ \t]+008003a8[ \t]+mvk \.S1 7,a1 +[ \t]*18: R_C6000_SBR_S16[ \t]+\.data +[ \t]*1c:[ \t]+00800328[ \t]+mvk \.S1 6,a1 +[ \t]*1c: R_C6000_SBR_L16_B[ \t]+\.data +[ \t]*20:[ \t]+00800128[ \t]+mvk \.S1 2,a1 +[ \t]*20: R_C6000_SBR_L16_H[ \t]+\.data +[ \t]*24:[ \t]+00800028[ \t]+mvk \.S1 0,a1 +[ \t]*24: R_C6000_SBR_L16_W[ \t]+\.data +[ \t]*\.\.\. +[ \t]*40:[ \t]+0080026e[ \t]+ldw \.D2T2 \*\+b14\(8\),b1 +[ \t]*40: R_C6000_SBR_U15_W[ \t]+\.data +[ \t]*44:[ \t]+0080036e[ \t]+ldw \.D2T2 \*\+b14\(12\),b1 +[ \t]*44: R_C6000_SBR_U15_W[ \t]+\.data +[ \t]*48:[ \t]+0080064e[ \t]+ldh \.D2T2 \*\+b14\(12\),b1 +[ \t]*48: R_C6000_SBR_U15_H[ \t]+\.data +[ \t]*4c:[ \t]+0080074e[ \t]+ldh \.D2T2 \*\+b14\(14\),b1 +[ \t]*4c: R_C6000_SBR_U15_H[ \t]+\.data +[ \t]*50:[ \t]+00800e2e[ \t]+ldb \.D2T2 \*\+b14\(14\),b1 +[ \t]*50: R_C6000_SBR_U15_B[ \t]+\.data +[ \t]*54:[ \t]+00800f2e[ \t]+ldb \.D2T2 \*\+b14\(15\),b1 +[ \t]*54: R_C6000_SBR_U15_B[ \t]+\.data +[ \t]*58:[ \t]+008007a8[ \t]+mvk \.S1 15,a1 +[ \t]*58: R_C6000_SBR_S16[ \t]+\.data +[ \t]*5c:[ \t]+00800728[ \t]+mvk \.S1 14,a1 +[ \t]*5c: R_C6000_SBR_L16_B[ \t]+\.data +[ \t]*60:[ \t]+00800328[ \t]+mvk \.S1 6,a1 +[ \t]*60: R_C6000_SBR_L16_H[ \t]+\.data +[ \t]*64:[ \t]+00800128[ \t]+mvk \.S1 2,a1 +[ \t]*64: R_C6000_SBR_L16_W[ \t]+\.data +[ \t]*\.\.\. diff --git a/ld/testsuite/ld-tic6x/sbr-reloc-local-rel.d b/ld/testsuite/ld-tic6x/sbr-reloc-local-rel.d new file mode 100644 index 0000000..005167e --- /dev/null +++ b/ld/testsuite/ld-tic6x/sbr-reloc-local-rel.d @@ -0,0 +1,35 @@ +#name: C6X SB-relative relocations, local symbols, REL +#as: -mlittle-endian -mgenerate-rel +#ld: -melf32_tic6x_le -Tsbr.ld +#source: sbr-reloc-local-1-rel.s +#source: sbr-reloc-local-2-rel.s +#objdump: -dr + +.*: *file format elf32-tic6x-le + + +Disassembly of section \.text: + +10000000 <[^>]*>: +10000000:[ \t]+0080006e[ \t]+ldw \.D2T2 \*\+b14\(0\),b1 +10000004:[ \t]+0080016e[ \t]+ldw \.D2T2 \*\+b14\(4\),b1 +10000008:[ \t]+0080024e[ \t]+ldh \.D2T2 \*\+b14\(4\),b1 +1000000c:[ \t]+0080034e[ \t]+ldh \.D2T2 \*\+b14\(6\),b1 +10000010:[ \t]+0080062e[ \t]+ldb \.D2T2 \*\+b14\(6\),b1 +10000014:[ \t]+0080072e[ \t]+ldb \.D2T2 \*\+b14\(7\),b1 +10000018:[ \t]+008003a8[ \t]+mvk \.S1 7,a1 +1000001c:[ \t]+00800328[ \t]+mvk \.S1 6,a1 +10000020:[ \t]+00800128[ \t]+mvk \.S1 2,a1 +10000024:[ \t]+00800028[ \t]+mvk \.S1 0,a1 +[ \t]*\.\.\. +10000040:[ \t]+0080026e[ \t]+ldw \.D2T2 \*\+b14\(8\),b1 +10000044:[ \t]+0080036e[ \t]+ldw \.D2T2 \*\+b14\(12\),b1 +10000048:[ \t]+0080064e[ \t]+ldh \.D2T2 \*\+b14\(12\),b1 +1000004c:[ \t]+0080074e[ \t]+ldh \.D2T2 \*\+b14\(14\),b1 +10000050:[ \t]+00800e2e[ \t]+ldb \.D2T2 \*\+b14\(14\),b1 +10000054:[ \t]+00800f2e[ \t]+ldb \.D2T2 \*\+b14\(15\),b1 +10000058:[ \t]+008007a8[ \t]+mvk \.S1 15,a1 +1000005c:[ \t]+00800728[ \t]+mvk \.S1 14,a1 +10000060:[ \t]+00800328[ \t]+mvk \.S1 6,a1 +10000064:[ \t]+00800128[ \t]+mvk \.S1 2,a1 +[ \t]*\.\.\. |