From 37f6032b8594c94b585732cf7ae09affe8614eee Mon Sep 17 00:00:00 2001 From: Zack Weinberg Date: Mon, 13 Jun 2005 15:34:39 +0000 Subject: [PATCH] gas: * config/tc-arm.c (find_real_start): Check S_IS_LOCAL on symbolP as well as for names with a leading dot. Use ACONCAT. (md_apply_fix): For branch relocations, only replace value with fixP->fx_offset (under #ifdef OBJ_ELF) when !fixP->fx_done. (arm_force_relocation): Remove #ifdef OBJ_ELF case. * config/tc-arm.h (LOCAL_LABEL): Remove unnecessary parentheses. (LOCAL_LABEL_PREFIX): Don't define. gas/testsuite: * gas/arm/thumb.s: Only branch to labels defined in this file. * gas/arm/thumb.d, gas/arm/thumb32.d: Adjust expected output. --- gas/ChangeLog | 10 ++++ gas/config/tc-arm.c | 32 ++++++------- gas/config/tc-arm.h | 5 +- gas/testsuite/ChangeLog | 5 ++ gas/testsuite/gas/arm/thumb.d | 81 +++++++++++---------------------- gas/testsuite/gas/arm/thumb.s | 44 +++++++++--------- gas/testsuite/gas/arm/thumb32.d | 12 ++--- 7 files changed, 83 insertions(+), 106 deletions(-) diff --git a/gas/ChangeLog b/gas/ChangeLog index 9925526093..6ca97910d0 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,13 @@ +2005-06-13 Zack Weinberg + + * config/tc-arm.c (find_real_start): Check S_IS_LOCAL on + symbolP as well as for names with a leading dot. Use ACONCAT. + (md_apply_fix): For branch relocations, only replace value + with fixP->fx_offset (under #ifdef OBJ_ELF) when !fixP->fx_done. + (arm_force_relocation): Remove #ifdef OBJ_ELF case. + * config/tc-arm.h (LOCAL_LABEL): Remove unnecessary parentheses. + (LOCAL_LABEL_PREFIX): Don't define. + 2005-06-10 Alan Modra * config/tc-hppa.c (pa_block): Allocate just one byte for the diff --git a/gas/config/tc-arm.c b/gas/config/tc-arm.c index a3cc4329e7..2288d991ee 100644 --- a/gas/config/tc-arm.c +++ b/gas/config/tc-arm.c @@ -1414,15 +1414,15 @@ find_real_start (symbolS * symbolP) if (name == NULL) abort (); - /* Names that start with '.' are local labels, not function entry points. - The compiler may generate BL instructions to these labels because it - needs to perform a branch to a far away location. */ - if (name[0] == '.') + /* The compiler may generate BL instructions to local labels because + it needs to perform a branch to a far away location. These labels + do not have a corresponding ".real_start_of" label. We check + both for S_IS_LOCAL and for a leading dot, to give a way to bypass + the ".real_start_of" convention for nonlocal branches. */ + if (S_IS_LOCAL (symbolP) || name[0] == '.') return symbolP; - real_start = malloc (strlen (name) + strlen (STUB_NAME) + 1); - sprintf (real_start, "%s%s", STUB_NAME, name); - + real_start = ACONCAT ((STUB_NAME, name, NULL)); new_target = symbol_find (real_start); if (new_target == NULL) @@ -1431,8 +1431,6 @@ find_real_start (symbolS * symbolP) new_target = symbolP; } - free (real_start); - return new_target; } @@ -10513,7 +10511,8 @@ md_apply_fix (fixS * fixP, #define SEXT24(x) ((((x) & 0xffffff) ^ (~ 0x7fffff)) + 0x800000) #ifdef OBJ_ELF - value = fixP->fx_offset; + if (!fixP->fx_done) + value = fixP->fx_offset; #endif /* We are going to store value (shifted right by two) in the @@ -10583,7 +10582,8 @@ md_apply_fix (fixS * fixP, newval = md_chars_to_number (buf, INSN_SIZE); #ifdef OBJ_ELF - value = fixP->fx_offset; + if (!fixP->fx_done) + value = fixP->fx_offset; #endif hbit = (value >> 1) & 1; value = (value >> 2) & 0x00ffffff; @@ -10742,7 +10742,8 @@ md_apply_fix (fixS * fixP, if (diff & 0x400000) diff |= ~0x3fffff; #ifdef OBJ_ELF - value = fixP->fx_offset; + if (!fixP->fx_done) + value = fixP->fx_offset; #endif value += diff; @@ -11353,13 +11354,6 @@ arm_force_relocation (struct fix * fixp) if (fixp->fx_r_type == BFD_RELOC_RVA) return 1; #endif -#ifdef OBJ_ELF - if (fixp->fx_r_type == BFD_RELOC_ARM_PCREL_BRANCH - || fixp->fx_r_type == BFD_RELOC_ARM_PCREL_BLX - || fixp->fx_r_type == BFD_RELOC_THUMB_PCREL_BLX - || fixp->fx_r_type == BFD_RELOC_THUMB_PCREL_BRANCH23) - return 1; -#endif /* Resolve these relocations even if the symbol is extern or weak. */ if (fixp->fx_r_type == BFD_RELOC_ARM_IMMEDIATE diff --git a/gas/config/tc-arm.h b/gas/config/tc-arm.h index 09a49ad426..c17d176f6d 100644 --- a/gas/config/tc-arm.h +++ b/gas/config/tc-arm.h @@ -127,8 +127,8 @@ struct fix; #define OPTIONAL_REGISTER_PREFIX '%' -#define LOCAL_LABEL(name) (name[0] == '.' && (name[1] == 'L')) -#define LOCAL_LABELS_FB 1 +#define LOCAL_LABEL(name) (name[0] == '.' && name[1] == 'L') +#define LOCAL_LABELS_FB 1 /* This expression evaluates to true if the relocation is for a local object for which we still want to do the relocation at runtime. @@ -168,7 +168,6 @@ struct fix; # define md_elf_section_change_hook() arm_elf_change_section () # define md_elf_section_type(str, len) arm_elf_section_type (str, len) # define GLOBAL_OFFSET_TABLE_NAME "_GLOBAL_OFFSET_TABLE_" -# define LOCAL_LABEL_PREFIX '.' # define TC_SEGMENT_INFO_TYPE struct arm_segment_info_type enum mstate diff --git a/gas/testsuite/ChangeLog b/gas/testsuite/ChangeLog index 84261dc3d2..35f59b9f85 100644 --- a/gas/testsuite/ChangeLog +++ b/gas/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2005-06-13 Zack Weinberg + + * gas/arm/thumb.s: Only branch to labels defined in this file. + * gas/arm/thumb.d, gas/arm/thumb32.d: Adjust expected output. + 2005-06-01 Maciej W. Rozycki * gas/mips/ldstla-32-1.l: Update to handle leading zeroes. diff --git a/gas/testsuite/gas/arm/thumb.d b/gas/testsuite/gas/arm/thumb.d index 35614419bb..5c33adfb5b 100644 --- a/gas/testsuite/gas/arm/thumb.d +++ b/gas/testsuite/gas/arm/thumb.d @@ -119,68 +119,41 @@ Disassembly of section \.text: 0+0de <[^>]+> 2f68 cmp r7, #104 0+0e0 <[^>]+> 46c0 nop \(mov r8, r8\) 0+0e2 <[^>]+> 46c0 nop \(mov r8, r8\) -0+0e4 <[^>]+> ea000037 b 0+0e4 <[^>]+> - e4: R_ARM_PC24 \.text -0+0e8 <[^>]+> eafffffe b 0+000 <[^>]+> - e8: R_ARM_PC24 \.wombat -0+0ec <[^>]+> eb000037 bl 0+0e4 <[^>]+> - ec: R_ARM_PC24 \.text -0+0f0 <[^>]+> ebfffffe bl 0+000 <[^>]+> - f0: R_ARM_PC24 \.wombat +0+0e4 <[^>]+> eafffffe b 0+0e4 <[^>]+> +0+0e8 <[^>]+> ea000011 b 0+134 <[^>]+> +0+0ec <[^>]+> ebfffffc bl 0+0e4 <[^>]+> +0+0f0 <[^>]+> eb00000f bl 0+134 <[^>]+> 0+0f4 <[^>]+> e12fff10 bx r0 0+0f8 <[^>]+> ef123456 swi 0x00123456 0+0fc <[^>]+> a004 add r0, pc, #16 \(adr r0,0+110 <[^>]+>\) 0+0fe <[^>]+> e77f b.n 0+000 <[^>]+> -0+100 <[^>]+> e7fe b.n 0+000 <[^>]+> - 100: R_ARM_THM_JUMP11 \.wombat -0+102 <[^>]+> f7ff fffe bl 0+000 <[^>]+> - 102: R_ARM_THM_CALL \.text -0+106 <[^>]+> f7ff fffe bl 0+000 <[^>]+> - 106: R_ARM_THM_CALL \.wombat +0+100 <[^>]+> e018 b.n 0+134 <[^>]+> +0+102 <[^>]+> f7ff ff7d bl 0+000 <[^>]+> +0+106 <[^>]+> f000 f815 bl 0+134 <[^>]+> 0+10a <[^>]+> 4700 bx r0 0+10c <[^>]+> dfff swi 255 \.\.\. -0+110 <[^>]+> d0fe beq.n 0+000 <[^>]+> - 110: R_ARM_THM_JUMP8 \.wombat -0+112 <[^>]+> d1fe bne.n 0+000 <[^>]+> - 112: R_ARM_THM_JUMP8 \.wombat -0+114 <[^>]+> d2fe bcs.n 0+000 <[^>]+> - 114: R_ARM_THM_JUMP8 \.wombat -0+116 <[^>]+> d3fe bcc.n 0+000 <[^>]+> - 116: R_ARM_THM_JUMP8 \.wombat -0+118 <[^>]+> d4fe bmi.n 0+000 <[^>]+> - 118: R_ARM_THM_JUMP8 \.wombat -0+11a <[^>]+> d5fe bpl.n 0+000 <[^>]+> - 11a: R_ARM_THM_JUMP8 \.wombat -0+11c <[^>]+> d6fe bvs.n 0+000 <[^>]+> - 11c: R_ARM_THM_JUMP8 \.wombat -0+11e <[^>]+> d7fe bvc.n 0+000 <[^>]+> - 11e: R_ARM_THM_JUMP8 \.wombat -0+120 <[^>]+> d8fe bhi.n 0+000 <[^>]+> - 120: R_ARM_THM_JUMP8 \.wombat -0+122 <[^>]+> d9fe bls.n 0+000 <[^>]+> - 122: R_ARM_THM_JUMP8 \.wombat -0+124 <[^>]+> dafe bge.n 0+000 <[^>]+> - 124: R_ARM_THM_JUMP8 \.wombat -0+126 <[^>]+> dcfe bgt.n 0+000 <[^>]+> - 126: R_ARM_THM_JUMP8 \.wombat -0+128 <[^>]+> dbfe blt.n 0+000 <[^>]+> - 128: R_ARM_THM_JUMP8 \.wombat -0+12a <[^>]+> dcfe bgt.n 0+000 <[^>]+> - 12a: R_ARM_THM_JUMP8 \.wombat -0+12c <[^>]+> ddfe ble.n 0+000 <[^>]+> - 12c: R_ARM_THM_JUMP8 \.wombat -0+12e <[^>]+> d8fe bhi.n 0+000 <[^>]+> - 12e: R_ARM_THM_JUMP8 \.wombat -0+130 <[^>]+> d3fe bcc.n 0+000 <[^>]+> - 130: R_ARM_THM_JUMP8 \.wombat -0+132 <[^>]+> d3fe bcc.n 0+000 <[^>]+> - 132: R_ARM_THM_JUMP8 \.wombat -0+134 <[^>]+> f000 fc9a bl 0+938 <[^>]+> - 134: R_ARM_THM_CALL \.text +0+110 <[^>]+> d010 beq.n 0+134 <[^>]+> +0+112 <[^>]+> d10f bne.n 0+134 <[^>]+> +0+114 <[^>]+> d20e bcs.n 0+134 <[^>]+> +0+116 <[^>]+> d30d bcc.n 0+134 <[^>]+> +0+118 <[^>]+> d40c bmi.n 0+134 <[^>]+> +0+11a <[^>]+> d50b bpl.n 0+134 <[^>]+> +0+11c <[^>]+> d60a bvs.n 0+134 <[^>]+> +0+11e <[^>]+> d709 bvc.n 0+134 <[^>]+> +0+120 <[^>]+> d808 bhi.n 0+134 <[^>]+> +0+122 <[^>]+> d907 bls.n 0+134 <[^>]+> +0+124 <[^>]+> da06 bge.n 0+134 <[^>]+> +0+126 <[^>]+> dc05 bgt.n 0+134 <[^>]+> +0+128 <[^>]+> db04 blt.n 0+134 <[^>]+> +0+12a <[^>]+> dc03 bgt.n 0+134 <[^>]+> +0+12c <[^>]+> dd02 ble.n 0+134 <[^>]+> +0+12e <[^>]+> d801 bhi.n 0+134 <[^>]+> +0+130 <[^>]+> d300 bcc.n 0+134 <[^>]+> +0+132 <[^>]+> d3ff bcc.n 0+134 <[^>]+> +0+134 <[^>]+> f000 fc00 bl 0+938 <[^>]+> \.\.\. -0+938 <[^>]+> f000 f898 bl 0+134 <[^>]+> - 938: R_ARM_THM_CALL \.text +0+938 <[^>]+> f7ff fbfc bl 0+134 <[^>]+> 0+93c <[^>]+> 4801 ldr r0, \[pc, #4\] \(0+944 <[^>]+>\) 0+93e <[^>]+> 4801 ldr r0, \[pc, #4\] \(0+944 <[^>]+>\) 0+940 <[^>]+> 4801 ldr r0, \[pc, #4\] \(0+948 <[^>]+>\) diff --git a/gas/testsuite/gas/arm/thumb.s b/gas/testsuite/gas/arm/thumb.s index 82c1ccd55d..d1e43394ef 100644 --- a/gas/testsuite/gas/arm/thumb.s +++ b/gas/testsuite/gas/arm/thumb.s @@ -145,9 +145,9 @@ near: .arm .localbar: b .localbar - b .wombat + b .back bl .localbar - bl .wombat + bl .back bx r0 swi 0x123456 @@ -159,33 +159,33 @@ morethumb: adr r0, forwardonly b .foo - b .wombat + b .back bl .foo - bl .wombat + bl .back bx r0 swi 0xff .align 0 forwardonly: - beq .wombat - bne .wombat - bcs .wombat - bcc .wombat - bmi .wombat - bpl .wombat - bvs .wombat - bvc .wombat - bhi .wombat - bls .wombat - bge .wombat - bgt .wombat - blt .wombat - bgt .wombat - ble .wombat - bhi .wombat - blo .wombat - bul .wombat + beq .back + bne .back + bcs .back + bcc .back + bmi .back + bpl .back + bvs .back + bvc .back + bhi .back + bls .back + bge .back + bgt .back + blt .back + bgt .back + ble .back + bhi .back + blo .back + bul .back .back: bl .local diff --git a/gas/testsuite/gas/arm/thumb32.d b/gas/testsuite/gas/arm/thumb32.d index 3d0fc6dcc3..6bd07ace84 100644 --- a/gas/testsuite/gas/arm/thumb32.d +++ b/gas/testsuite/gas/arm/thumb32.d @@ -295,14 +295,10 @@ Disassembly of section .text: 0+3cc <[^>]+> f340 800c ble\.w 0+3e8 <[^>]+> 0+3d0 <[^>]+> f7ff bfae b\.w 0+330 <[^>]+> 0+3d4 <[^>]+> f000 b808 b\.w 0+3e8 <[^>]+> -0+3d8 <[^>]+> f000 f996 bl 0+330 <[^>]+> - 3d8: R_ARM_THM_CALL \.text -0+3dc <[^>]+> f000 f9f2 bl 0+3e8 <[^>]+> - 3dc: R_ARM_THM_CALL \.text -0+3e0 <[^>]+> f000 e996 blx 0+330 <[^>]+> - 3e0: R_ARM_THM_XPC22 \.text -0+3e4 <[^>]+> f000 e9f2 blx 0+3e8 <[^>]+> - 3e4: R_ARM_THM_XPC22 \.text +0+3d8 <[^>]+> f7ff ffaa bl 0+330 <[^>]+> +0+3dc <[^>]+> f000 f804 bl 0+3e8 <[^>]+> +0+3e0 <[^>]+> f7ff efa6 blx 0+330 <[^>]+> +0+3e4 <[^>]+> f000 e800 blx 0+3e8 <[^>]+> 0+3e8 <[^>]+> 4748 bx r9 0+3ea <[^>]+> 4780 blx r0 0+3ec <[^>]+> 47c8 blx r9 -- 2.34.1