* [PATCH] Indicate dependency on personality routines for ARM EHABI - take 2
@ 2005-03-03 22:43 Julian Brown
2005-03-03 23:31 ` Paul Brook
0 siblings, 1 reply; 11+ messages in thread
From: Julian Brown @ 2005-03-03 22:43 UTC (permalink / raw)
To: binutils
[-- Attachment #1: Type: text/plain, Size: 1406 bytes --]
Hi,
This is a second attempt at a patch to make gas emit dependencies on
exception-handling personality routines (__aeabi_unwind_cpp_pr[012]) in
accordance with the ARM EHABI, using relocations of type R_ARM_NONE.
The previous patch is here:
http://sourceware.org/ml/binutils/2005-02/msg00172.html
This version fixes some missing cases in the previous patch (eg, where
there is a .personalityindex directive in an assembly source file but
nothing is written to an .extab section), and outputs only one
relocation for each personality routine per-file to save unnecessary bloat.
I'm not sure if the way this is implemented is good enough though: a
global variable is initialised at load-time to indicate that no PR
dependencies have been output yet. Are there any situations where gas
processes more than one file consecutively, or is there any other reason
why this might break?
Tested with no regressions with cross to arm-none-eabi, and natively on
i686-pc-linux-gnu with all targets enabled.
OK to apply?
ChangeLog:
* gas/config/tc-arm.c (marked_pr_dependency): New static global
(bitmask).
(create_unwind_entry): Don't output dependencies on PR routines
here.
(s_arm_unwind_fnend): Output dependency on unwinding routines, if it
hasn't been done already.
* gas/testsuite/arm/unwind.d: Update expected output.
--
Julian Brown
CodeSourcery, LLC
[-- Attachment #2: patch-10 --]
[-- Type: text/plain, Size: 4754 bytes --]
? bfd/doc/bfd.info
? bfd/doc/bfd.info-1
? gas/doc/as.info
? gas/doc/as.info-1
? gprof/gprof.info
? gprof/gprof.info-1
Index: gas/config/tc-arm.c
===================================================================
RCS file: /cvs/src/src/gas/config/tc-arm.c,v
retrieving revision 1.193
diff -c -p -r1.193 tc-arm.c
*** gas/config/tc-arm.c 23 Feb 2005 12:28:03 -0000 1.193
--- gas/config/tc-arm.c 3 Mar 2005 22:18:25 -0000
*************** static struct
*** 83,88 ****
--- 83,93 ----
unsigned sp_restored:1;
} unwind;
+ /* Bit N indicates that an R_ARM_NONE relocation has been output for
+ __aeabi_unwind_cpp_prN already if set. This enables dependencies to be
+ emitted only once per file, to save unnecessary bloat. */
+ static unsigned int marked_pr_dependency = 0;
+
#endif /* OBJ_ELF */
enum arm_float_abi
*************** create_unwind_entry (int have_data)
*** 13902,13914 ****
fix_new (frag_now, where, 4, unwind.personality_routine, 0, 1,
BFD_RELOC_ARM_PREL31);
- /* Indicate dependency to linker. */
- {
- char *name = "__aeabi_unwind_cpp_pr0";
- symbolS *pr = symbol_find_or_make (name);
- fix_new (frag_now, where, 4, pr, 0, 1, BFD_RELOC_NONE);
- }
-
where += 4;
ptr += 4;
--- 13907,13912 ----
*************** create_unwind_entry (int have_data)
*** 13922,13945 ****
/* Three opcodes bytes are packed into the first word. */
data = 0x80;
n = 3;
! goto emit_reloc;
case 1:
case 2:
/* The size and first two opcode bytes go in the first word. */
data = ((0x80 + unwind.personality_index) << 8) | size;
n = 2;
- goto emit_reloc;
-
- emit_reloc:
- {
- /* Indicate dependency to linker. */
- char *name[] = { "__aeabi_unwind_cpp_pr0",
- "__aeabi_unwind_cpp_pr1",
- "__aeabi_unwind_cpp_pr2" };
- symbolS *pr = symbol_find_or_make (name[unwind.personality_index]);
- fix_new (frag_now, where, 4, pr, 0, 1, BFD_RELOC_NONE);
- }
break;
default:
--- 13920,13932 ----
/* Three opcodes bytes are packed into the first word. */
data = 0x80;
n = 3;
! break;
case 1:
case 2:
/* The size and first two opcode bytes go in the first word. */
data = ((0x80 + unwind.personality_index) << 8) | size;
n = 2;
break;
default:
*************** s_arm_unwind_fnend (int ignored ATTRIBUT
*** 14048,14053 ****
--- 14035,14055 ----
fix_new (frag_now, where, 4, unwind.proc_start, 0, 1,
BFD_RELOC_ARM_PREL31);
+ /* Indicate dependency on EHABI-defined personality routines to the
+ linker, if it hasn't been done already. */
+ if (unwind.personality_index >= 0 && unwind.personality_index < 3)
+ {
+ char *name[] = { "__aeabi_unwind_cpp_pr0",
+ "__aeabi_unwind_cpp_pr1",
+ "__aeabi_unwind_cpp_pr2" };
+ if (!(marked_pr_dependency & (1 << unwind.personality_index)))
+ {
+ symbolS *pr = symbol_find_or_make (name[unwind.personality_index]);
+ fix_new (frag_now, where, 0, pr, 0, 1, BFD_RELOC_NONE);
+ marked_pr_dependency |= 1 << unwind.personality_index;
+ }
+ }
+
if (val)
/* Inline exception table entry. */
md_number_to_chars (ptr + 4, val, 4);
Index: gas/testsuite/gas/arm/unwind.d
===================================================================
RCS file: /cvs/src/src/gas/testsuite/gas/arm/unwind.d,v
retrieving revision 1.4
diff -c -p -r1.4 unwind.d
*** gas/testsuite/gas/arm/unwind.d 10 Feb 2005 12:39:17 -0000 1.4
--- gas/testsuite/gas/arm/unwind.d 3 Mar 2005 22:18:30 -0000
***************
*** 5,20 ****
RELOCATION RECORDS FOR \[.ARM.extab\]:
OFFSET TYPE VALUE
- 00000000 R_ARM_NONE __aeabi_unwind_cpp_pr1
0000000c R_ARM_PREL31 .text
- 0000000c R_ARM_NONE __aeabi_unwind_cpp_pr0
- 0000001c R_ARM_NONE __aeabi_unwind_cpp_pr1
RELOCATION RECORDS FOR \[.ARM.exidx\]:
OFFSET TYPE VALUE
00000000 R_ARM_PREL31 .text
00000008 R_ARM_PREL31 .text
0000000c R_ARM_PREL31 .ARM.extab
00000010 R_ARM_PREL31 .text
00000014 R_ARM_PREL31 .ARM.extab
--- 5,19 ----
RELOCATION RECORDS FOR \[.ARM.extab\]:
OFFSET TYPE VALUE
0000000c R_ARM_PREL31 .text
RELOCATION RECORDS FOR \[.ARM.exidx\]:
OFFSET TYPE VALUE
00000000 R_ARM_PREL31 .text
+ 00000000 R_ARM_NONE __aeabi_unwind_cpp_pr0
00000008 R_ARM_PREL31 .text
+ 00000008 R_ARM_NONE __aeabi_unwind_cpp_pr1
0000000c R_ARM_PREL31 .ARM.extab
00000010 R_ARM_PREL31 .text
00000014 R_ARM_PREL31 .ARM.extab
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH] Indicate dependency on personality routines for ARM EHABI - take 2
2005-03-03 22:43 [PATCH] Indicate dependency on personality routines for ARM EHABI - take 2 Julian Brown
@ 2005-03-03 23:31 ` Paul Brook
2005-03-07 15:36 ` Julian Brown
0 siblings, 1 reply; 11+ messages in thread
From: Paul Brook @ 2005-03-03 23:31 UTC (permalink / raw)
To: binutils; +Cc: Julian Brown
On Thursday 03 March 2005 22:43, Julian Brown wrote:
> Hi,
>
> This is a second attempt at a patch to make gas emit dependencies on
> exception-handling personality routines (__aeabi_unwind_cpp_pr[012]) in
> accordance with the ARM EHABI, using relocations of type R_ARM_NONE.
>
> The previous patch is here:
>
> http://sourceware.org/ml/binutils/2005-02/msg00172.html
>
> This version fixes some missing cases in the previous patch (eg, where
> there is a .personalityindex directive in an assembly source file but
> nothing is written to an .extab section), and outputs only one
> relocation for each personality routine per-file to save unnecessary bloat.
Is one per file sufficient? I'd expect one per section would be needed to
prevent bad things happening with partial linking.
Paul
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH] Indicate dependency on personality routines for ARM EHABI - take 2
2005-03-03 23:31 ` Paul Brook
@ 2005-03-07 15:36 ` Julian Brown
2005-03-07 16:08 ` Paul Brook
0 siblings, 1 reply; 11+ messages in thread
From: Julian Brown @ 2005-03-07 15:36 UTC (permalink / raw)
To: Paul Brook; +Cc: binutils, julian
[-- Attachment #1: Type: text/plain, Size: 1575 bytes --]
Paul Brook wrote:
> On Thursday 03 March 2005 22:43, Julian Brown wrote:
>
>>Hi,
>>
>>This is a second attempt at a patch to make gas emit dependencies on
>>exception-handling personality routines (__aeabi_unwind_cpp_pr[012]) in
>>accordance with the ARM EHABI, using relocations of type R_ARM_NONE.
>>
>>The previous patch is here:
>>
>> http://sourceware.org/ml/binutils/2005-02/msg00172.html
>>
>>This version fixes some missing cases in the previous patch (eg, where
>>there is a .personalityindex directive in an assembly source file but
>>nothing is written to an .extab section), and outputs only one
>>relocation for each personality routine per-file to save unnecessary bloat.
>
>
> Is one per file sufficient? I'd expect one per section would be needed to
> prevent bad things happening with partial linking.
Yes, you are probably right. This version should fix that: it resets the
bitmap of relocations which have been output when the section is changed
to one of type SHT_ARM_EXIDX.
Tested with cross to arm-none-eabi, and natively with all targets on
i686-pc-unknown-none.
OK to apply?
ChangeLog:
* gas/config/tc-arm.c (marked_pr_dependency): New static global
(bitmask).
(arm_elf_change_section): Reset bitmap of dependencies which have
been output when a new EXIDX section is seen.
(create_unwind_entry): Don't output dependencies on PR routines
here.
(s_arm_unwind_fnend): Output dependency on unwinding routines, if it
hasn't been done already.
* gas/testsuite/arm/unwind.d: Update expected output.
[-- Attachment #2: patch-11 --]
[-- Type: text/plain, Size: 5514 bytes --]
? bfd/doc/bfd.info
? bfd/doc/bfd.info-1
? gas/doc/as.info
? gas/doc/as.info-1
? gprof/gprof.info
? gprof/gprof.info-1
Index: gas/config/tc-arm.c
===================================================================
RCS file: /cvs/src/src/gas/config/tc-arm.c,v
retrieving revision 1.193
diff -c -p -r1.193 tc-arm.c
*** gas/config/tc-arm.c 23 Feb 2005 12:28:03 -0000 1.193
--- gas/config/tc-arm.c 4 Mar 2005 18:54:20 -0000
*************** static struct
*** 83,88 ****
--- 83,93 ----
unsigned sp_restored:1;
} unwind;
+ /* Bit N indicates that an R_ARM_NONE relocation has been output for
+ __aeabi_unwind_cpp_prN already if set. This enables dependencies to be
+ emitted only once per file, to save unnecessary bloat. */
+ static unsigned int marked_pr_dependency = 0;
+
#endif /* OBJ_ELF */
enum arm_float_abi
*************** arm_elf_change_section (void)
*** 1376,1385 ****
{
flagword flags;
! /* Link an unlinked unwind index table section to the .text section. */
! if (elf_section_type (now_seg) == SHT_ARM_EXIDX
! && elf_linked_to_section (now_seg) == NULL)
! elf_linked_to_section (now_seg) = text_section;
if (!SEG_NORMAL (now_seg))
return;
--- 1381,1394 ----
{
flagword flags;
! if (elf_section_type (now_seg) == SHT_ARM_EXIDX)
! {
! /* Link an unlinked unwind index table section to the .text section. */
! if (elf_linked_to_section (now_seg) == NULL)
! elf_linked_to_section (now_seg) = text_section;
!
! marked_pr_dependency = 0;
! }
if (!SEG_NORMAL (now_seg))
return;
*************** create_unwind_entry (int have_data)
*** 13902,13914 ****
fix_new (frag_now, where, 4, unwind.personality_routine, 0, 1,
BFD_RELOC_ARM_PREL31);
- /* Indicate dependency to linker. */
- {
- char *name = "__aeabi_unwind_cpp_pr0";
- symbolS *pr = symbol_find_or_make (name);
- fix_new (frag_now, where, 4, pr, 0, 1, BFD_RELOC_NONE);
- }
-
where += 4;
ptr += 4;
--- 13911,13916 ----
*************** create_unwind_entry (int have_data)
*** 13922,13945 ****
/* Three opcodes bytes are packed into the first word. */
data = 0x80;
n = 3;
! goto emit_reloc;
case 1:
case 2:
/* The size and first two opcode bytes go in the first word. */
data = ((0x80 + unwind.personality_index) << 8) | size;
n = 2;
- goto emit_reloc;
-
- emit_reloc:
- {
- /* Indicate dependency to linker. */
- char *name[] = { "__aeabi_unwind_cpp_pr0",
- "__aeabi_unwind_cpp_pr1",
- "__aeabi_unwind_cpp_pr2" };
- symbolS *pr = symbol_find_or_make (name[unwind.personality_index]);
- fix_new (frag_now, where, 4, pr, 0, 1, BFD_RELOC_NONE);
- }
break;
default:
--- 13924,13936 ----
/* Three opcodes bytes are packed into the first word. */
data = 0x80;
n = 3;
! break;
case 1:
case 2:
/* The size and first two opcode bytes go in the first word. */
data = ((0x80 + unwind.personality_index) << 8) | size;
n = 2;
break;
default:
*************** s_arm_unwind_fnend (int ignored ATTRIBUT
*** 14048,14053 ****
--- 14039,14059 ----
fix_new (frag_now, where, 4, unwind.proc_start, 0, 1,
BFD_RELOC_ARM_PREL31);
+ /* Indicate dependency on EHABI-defined personality routines to the
+ linker, if it hasn't been done already. */
+ if (unwind.personality_index >= 0 && unwind.personality_index < 3)
+ {
+ char *name[] = { "__aeabi_unwind_cpp_pr0",
+ "__aeabi_unwind_cpp_pr1",
+ "__aeabi_unwind_cpp_pr2" };
+ if (!(marked_pr_dependency & (1 << unwind.personality_index)))
+ {
+ symbolS *pr = symbol_find_or_make (name[unwind.personality_index]);
+ fix_new (frag_now, where, 0, pr, 0, 1, BFD_RELOC_NONE);
+ marked_pr_dependency |= 1 << unwind.personality_index;
+ }
+ }
+
if (val)
/* Inline exception table entry. */
md_number_to_chars (ptr + 4, val, 4);
Index: gas/testsuite/gas/arm/unwind.d
===================================================================
RCS file: /cvs/src/src/gas/testsuite/gas/arm/unwind.d,v
retrieving revision 1.4
diff -c -p -r1.4 unwind.d
*** gas/testsuite/gas/arm/unwind.d 10 Feb 2005 12:39:17 -0000 1.4
--- gas/testsuite/gas/arm/unwind.d 4 Mar 2005 18:54:22 -0000
***************
*** 5,20 ****
RELOCATION RECORDS FOR \[.ARM.extab\]:
OFFSET TYPE VALUE
- 00000000 R_ARM_NONE __aeabi_unwind_cpp_pr1
0000000c R_ARM_PREL31 .text
- 0000000c R_ARM_NONE __aeabi_unwind_cpp_pr0
- 0000001c R_ARM_NONE __aeabi_unwind_cpp_pr1
RELOCATION RECORDS FOR \[.ARM.exidx\]:
OFFSET TYPE VALUE
00000000 R_ARM_PREL31 .text
00000008 R_ARM_PREL31 .text
0000000c R_ARM_PREL31 .ARM.extab
00000010 R_ARM_PREL31 .text
00000014 R_ARM_PREL31 .ARM.extab
--- 5,19 ----
RELOCATION RECORDS FOR \[.ARM.extab\]:
OFFSET TYPE VALUE
0000000c R_ARM_PREL31 .text
RELOCATION RECORDS FOR \[.ARM.exidx\]:
OFFSET TYPE VALUE
00000000 R_ARM_PREL31 .text
+ 00000000 R_ARM_NONE __aeabi_unwind_cpp_pr0
00000008 R_ARM_PREL31 .text
+ 00000008 R_ARM_NONE __aeabi_unwind_cpp_pr1
0000000c R_ARM_PREL31 .ARM.extab
00000010 R_ARM_PREL31 .text
00000014 R_ARM_PREL31 .ARM.extab
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH] Indicate dependency on personality routines for ARM EHABI - take 2
2005-03-07 15:36 ` Julian Brown
@ 2005-03-07 16:08 ` Paul Brook
2005-03-07 18:40 ` Julian Brown
0 siblings, 1 reply; 11+ messages in thread
From: Paul Brook @ 2005-03-07 16:08 UTC (permalink / raw)
To: Julian Brown; +Cc: binutils
> > Is one per file sufficient? I'd expect one per section would be needed to
> > prevent bad things happening with partial linking.
>
> Yes, you are probably right. This version should fix that: it resets the
> bitmap of relocations which have been output when the section is changed
> to one of type SHT_ARM_EXIDX.
I still only get one R_ARM_NONE relocation for the example below.
Paul
$ cat test.s
.text
.fnstart
.global foo
foo:
bx lr
.fnend
.fnstart
.global bar
bar:
bx lr
.fnend
.section .text.other,"ax",%progbits
.fnstart
.global other
other:
bx lr
.fnend
$ arm-unknown-eabi-as test.s -o test.o
$ arm-unknown-eabi-objdump -r test.o
test.o: file format elf32-littlearm
RELOCATION RECORDS FOR [.ARM.exidx]:
OFFSET TYPE VALUE
00000000 R_ARM_PREL31 .text
00000000 R_ARM_NONE __aeabi_unwind_cpp_pr0
00000008 R_ARM_PREL31 .text
RELOCATION RECORDS FOR [.ARM.exidx.text.other]:
OFFSET TYPE VALUE
00000000 R_ARM_PREL31 .text.other
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH] Indicate dependency on personality routines for ARM EHABI - take 2
2005-03-07 16:08 ` Paul Brook
@ 2005-03-07 18:40 ` Julian Brown
2005-03-09 12:57 ` Nick Clifton
2005-03-09 15:26 ` Richard Earnshaw
0 siblings, 2 replies; 11+ messages in thread
From: Julian Brown @ 2005-03-07 18:40 UTC (permalink / raw)
To: Paul Brook; +Cc: binutils, julian
[-- Attachment #1: Type: text/plain, Size: 1107 bytes --]
Paul Brook wrote:
>>>Is one per file sufficient? I'd expect one per section would be needed to
>>>prevent bad things happening with partial linking.
>>
>>Yes, you are probably right. This version should fix that: it resets the
>>bitmap of relocations which have been output when the section is changed
>>to one of type SHT_ARM_EXIDX.
>
>
> I still only get one R_ARM_NONE relocation for the example below.
> [snipped example]
This version fixes that example, and my previous tests - it now tests
for the section being changed to one of type SHT_PROGBITS, rather than
SHT_ARM_EXIDX.
Tests have been re-run.
OK to apply?
ChangeLog:
* gas/config/tc-arm.c (marked_pr_dependency): New static global
(bitmap).
(arm_elf_change_section): Reset bitmap of dependencies which have
been output when a new section with type SHT_PROGBITS is seen.
(create_unwind_entry): Don't output dependencies on PR routines
here.
(s_arm_unwind_fnend): Output dependency on unwinding routines, if it
hasn't been done already.
* gas/testsuite/arm/unwind.d: Update expected output.
[-- Attachment #2: patch-12 --]
[-- Type: text/plain, Size: 5082 bytes --]
? bfd/doc/bfd.info
? bfd/doc/bfd.info-1
? gas/doc/as.info
? gas/doc/as.info-1
? gprof/gprof.info
? gprof/gprof.info-1
Index: gas/config/tc-arm.c
===================================================================
RCS file: /cvs/src/src/gas/config/tc-arm.c,v
retrieving revision 1.193
diff -c -p -r1.193 tc-arm.c
*** gas/config/tc-arm.c 23 Feb 2005 12:28:03 -0000 1.193
--- gas/config/tc-arm.c 7 Mar 2005 18:13:31 -0000
*************** static struct
*** 83,88 ****
--- 83,93 ----
unsigned sp_restored:1;
} unwind;
+ /* Bit N indicates that an R_ARM_NONE relocation has been output for
+ __aeabi_unwind_cpp_prN already if set. This enables dependencies to be
+ emitted only once per file, to save unnecessary bloat. */
+ static unsigned int marked_pr_dependency = 0;
+
#endif /* OBJ_ELF */
enum arm_float_abi
*************** arm_elf_change_section (void)
*** 1381,1386 ****
--- 1386,1394 ----
&& elf_linked_to_section (now_seg) == NULL)
elf_linked_to_section (now_seg) = text_section;
+ if (elf_section_type (now_seg) == SHT_PROGBITS)
+ marked_pr_dependency = 0;
+
if (!SEG_NORMAL (now_seg))
return;
*************** create_unwind_entry (int have_data)
*** 13902,13914 ****
fix_new (frag_now, where, 4, unwind.personality_routine, 0, 1,
BFD_RELOC_ARM_PREL31);
- /* Indicate dependency to linker. */
- {
- char *name = "__aeabi_unwind_cpp_pr0";
- symbolS *pr = symbol_find_or_make (name);
- fix_new (frag_now, where, 4, pr, 0, 1, BFD_RELOC_NONE);
- }
-
where += 4;
ptr += 4;
--- 13910,13915 ----
*************** create_unwind_entry (int have_data)
*** 13922,13945 ****
/* Three opcodes bytes are packed into the first word. */
data = 0x80;
n = 3;
! goto emit_reloc;
case 1:
case 2:
/* The size and first two opcode bytes go in the first word. */
data = ((0x80 + unwind.personality_index) << 8) | size;
n = 2;
- goto emit_reloc;
-
- emit_reloc:
- {
- /* Indicate dependency to linker. */
- char *name[] = { "__aeabi_unwind_cpp_pr0",
- "__aeabi_unwind_cpp_pr1",
- "__aeabi_unwind_cpp_pr2" };
- symbolS *pr = symbol_find_or_make (name[unwind.personality_index]);
- fix_new (frag_now, where, 4, pr, 0, 1, BFD_RELOC_NONE);
- }
break;
default:
--- 13923,13935 ----
/* Three opcodes bytes are packed into the first word. */
data = 0x80;
n = 3;
! break;
case 1:
case 2:
/* The size and first two opcode bytes go in the first word. */
data = ((0x80 + unwind.personality_index) << 8) | size;
n = 2;
break;
default:
*************** s_arm_unwind_fnend (int ignored ATTRIBUT
*** 14048,14053 ****
--- 14038,14058 ----
fix_new (frag_now, where, 4, unwind.proc_start, 0, 1,
BFD_RELOC_ARM_PREL31);
+ /* Indicate dependency on EHABI-defined personality routines to the
+ linker, if it hasn't been done already. */
+ if (unwind.personality_index >= 0 && unwind.personality_index < 3)
+ {
+ char *name[] = { "__aeabi_unwind_cpp_pr0",
+ "__aeabi_unwind_cpp_pr1",
+ "__aeabi_unwind_cpp_pr2" };
+ if (!(marked_pr_dependency & (1 << unwind.personality_index)))
+ {
+ symbolS *pr = symbol_find_or_make (name[unwind.personality_index]);
+ fix_new (frag_now, where, 0, pr, 0, 1, BFD_RELOC_NONE);
+ marked_pr_dependency |= 1 << unwind.personality_index;
+ }
+ }
+
if (val)
/* Inline exception table entry. */
md_number_to_chars (ptr + 4, val, 4);
Index: gas/testsuite/gas/arm/unwind.d
===================================================================
RCS file: /cvs/src/src/gas/testsuite/gas/arm/unwind.d,v
retrieving revision 1.4
diff -c -p -r1.4 unwind.d
*** gas/testsuite/gas/arm/unwind.d 10 Feb 2005 12:39:17 -0000 1.4
--- gas/testsuite/gas/arm/unwind.d 7 Mar 2005 18:13:34 -0000
***************
*** 5,20 ****
RELOCATION RECORDS FOR \[.ARM.extab\]:
OFFSET TYPE VALUE
- 00000000 R_ARM_NONE __aeabi_unwind_cpp_pr1
0000000c R_ARM_PREL31 .text
- 0000000c R_ARM_NONE __aeabi_unwind_cpp_pr0
- 0000001c R_ARM_NONE __aeabi_unwind_cpp_pr1
RELOCATION RECORDS FOR \[.ARM.exidx\]:
OFFSET TYPE VALUE
00000000 R_ARM_PREL31 .text
00000008 R_ARM_PREL31 .text
0000000c R_ARM_PREL31 .ARM.extab
00000010 R_ARM_PREL31 .text
00000014 R_ARM_PREL31 .ARM.extab
--- 5,19 ----
RELOCATION RECORDS FOR \[.ARM.extab\]:
OFFSET TYPE VALUE
0000000c R_ARM_PREL31 .text
RELOCATION RECORDS FOR \[.ARM.exidx\]:
OFFSET TYPE VALUE
00000000 R_ARM_PREL31 .text
+ 00000000 R_ARM_NONE __aeabi_unwind_cpp_pr0
00000008 R_ARM_PREL31 .text
+ 00000008 R_ARM_NONE __aeabi_unwind_cpp_pr1
0000000c R_ARM_PREL31 .ARM.extab
00000010 R_ARM_PREL31 .text
00000014 R_ARM_PREL31 .ARM.extab
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH] Indicate dependency on personality routines for ARM EHABI - take 2
2005-03-07 18:40 ` Julian Brown
@ 2005-03-09 12:57 ` Nick Clifton
2005-03-09 15:13 ` Richard Earnshaw
2005-03-09 15:26 ` Richard Earnshaw
1 sibling, 1 reply; 11+ messages in thread
From: Nick Clifton @ 2005-03-09 12:57 UTC (permalink / raw)
To: Julian Brown; +Cc: Paul Brook, binutils
Hi Julian,
> This version fixes that example, and my previous tests - it now tests
> for the section being changed to one of type SHT_PROGBITS, rather than
> SHT_ARM_EXIDX.
>
> Tests have been re-run.
I have only be vaguely following this thread but one thing does occur to
me. Will your patch work if the programmer uses sub-segments and/or the
.pushsection/.popsection pseudo ops ? If so, then please consider this
patch approved for the mainline only, not the 2.16 branch.
Cheers
Nick
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH] Indicate dependency on personality routines for ARM EHABI - take 2
2005-03-09 12:57 ` Nick Clifton
@ 2005-03-09 15:13 ` Richard Earnshaw
0 siblings, 0 replies; 11+ messages in thread
From: Richard Earnshaw @ 2005-03-09 15:13 UTC (permalink / raw)
To: Nick Clifton; +Cc: Julian Brown, Paul Brook, binutils
On Wed, 2005-03-09 at 13:09, Nick Clifton wrote:
> Hi Julian,
>
> > This version fixes that example, and my previous tests - it now tests
> > for the section being changed to one of type SHT_PROGBITS, rather than
> > SHT_ARM_EXIDX.
> >
> > Tests have been re-run.
>
> I have only be vaguely following this thread but one thing does occur to
> me. Will your patch work if the programmer uses sub-segments and/or the
> .pushsection/.popsection pseudo ops ? If so, then please consider this
> patch approved for the mainline only, not the 2.16 branch.
A quick look at the code suggests that most of the unwinding code in the
assembler will probably break horribly if we try to nest building
partial unwind descriptions in multiple sections. So I don't think it
would be reasonable to expect that to be fixed here first.
R.
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH] Indicate dependency on personality routines for ARM EHABI - take 2
2005-03-07 18:40 ` Julian Brown
2005-03-09 12:57 ` Nick Clifton
@ 2005-03-09 15:26 ` Richard Earnshaw
2005-03-29 6:42 ` [PATCH] Indicate dependency on personality routines for ARM EHABI - take 3 Julian Brown
1 sibling, 1 reply; 11+ messages in thread
From: Richard Earnshaw @ 2005-03-09 15:26 UTC (permalink / raw)
To: Julian Brown; +Cc: Paul Brook, binutils
On Mon, 2005-03-07 at 18:40, Julian Brown wrote:
> Paul Brook wrote:
> >>>Is one per file sufficient? I'd expect one per section would be needed to
> >>>prevent bad things happening with partial linking.
> >>
> >>Yes, you are probably right. This version should fix that: it resets the
> >>bitmap of relocations which have been output when the section is changed
> >>to one of type SHT_ARM_EXIDX.
> >
> >
> > I still only get one R_ARM_NONE relocation for the example below.
> > [snipped example]
>
> This version fixes that example, and my previous tests - it now tests
> for the section being changed to one of type SHT_PROGBITS, rather than
> SHT_ARM_EXIDX.
>
> Tests have been re-run.
>
> OK to apply?
I fear we aren't there yet. Consider emitting unwind sections for a
real C++ application that goes something like
.text
.text.foo (eg a common function definition)
.text
We'll get two references added to the .text section. That's not
necessarily fatal, but it is indicative of a design flaw.
Nick's point about making push/pop section work correctly made me think
about this for a moment. I think the correct way to handle this is to
rework the TC_SEGMENT_INFO_TYPE code (and hence the mapping symbol code)
so that it is a structure rather than a single datum type. You could
then add marked_pr_dependency to that type and all segment
pushing/popping should just work magically, solving both Nick's question
and the case above once and for all.
R.
^ permalink raw reply [flat|nested] 11+ messages in thread
* [PATCH] Indicate dependency on personality routines for ARM EHABI - take 3
2005-03-09 15:26 ` Richard Earnshaw
@ 2005-03-29 6:42 ` Julian Brown
2005-03-29 17:38 ` Richard Earnshaw
0 siblings, 1 reply; 11+ messages in thread
From: Julian Brown @ 2005-03-29 6:42 UTC (permalink / raw)
To: Richard Earnshaw; +Cc: Paul Brook, binutils
[-- Attachment #1: Type: text/plain, Size: 1169 bytes --]
Hi,
This patch fixes output of dependencies on ARM EABI personality routines
for stack unwinding, using R_ARM_NONE relocations. It should output only
one dependency per-section, and should handle .pushsection/.popsection
correctly. These are the previous version of the patch:
http://sourceware.org/ml/binutils/2005-03/msg00126.html
http://sourceware.org/ml/binutils/2005-02/msg00172.html
Tested on arm-none-eabi and i686-pc-linux-gnu with all targets.
OK to apply?
ChangeLog:
* gas/config/tc-arm.c (marked_pr_dependency): New bitmap, bit N
indicates whether personality routine index N has been output for this
section.
(mapping_state): tc_segment_info_data now struct not enum.
(arm_elf_change_section): Likewise, and marked_pr_dependency is now
handled on section change.
(create_unwind_entry): Previous code to output dependency removed.
(s_arm_unwind_fnend): Output dependency if it hasn't been done
already for this section.
* gas/config/tc-arm.h (TC_SEGMENT_INFO_TYPE): Redefined as struct
arm_segment_info_type.
(arm_segment_info_type): New struct.
* gas/testsuite/gas/arm/unwind.d: Update expected output.
[-- Attachment #2: patch-13 --]
[-- Type: text/plain, Size: 7241 bytes --]
? bfd/doc/bfd.info
? bfd/doc/bfd.info-1
? gas/doc/as.info
? gas/doc/as.info-1
? gprof/gprof.info
? gprof/gprof.info-1
Index: gas/config/tc-arm.c
===================================================================
RCS file: /cvs/src/src/gas/config/tc-arm.c,v
retrieving revision 1.197
diff -c -p -r1.197 tc-arm.c
*** gas/config/tc-arm.c 23 Mar 2005 15:49:02 -0000 1.197
--- gas/config/tc-arm.c 28 Mar 2005 23:31:26 -0000
*************** static struct
*** 83,88 ****
--- 83,93 ----
unsigned sp_restored:1;
} unwind;
+ /* Bit N indicates that an R_ARM_NONE relocation has been output for
+ __aeabi_unwind_cpp_prN already if set. This enables dependencies to be
+ emitted only once per section, to save unnecessary bloat. */
+ static unsigned int marked_pr_dependency = 0;
+
#endif /* OBJ_ELF */
enum arm_float_abi
*************** mapping_state (enum mstate state)
*** 1347,1353 ****
abort ();
}
! seg_info (now_seg)->tc_segment_info_data = state;
symbolP = symbol_new (symname, now_seg, (valueT) frag_now_fix (), frag_now);
symbol_table_insert (symbolP);
--- 1352,1358 ----
abort ();
}
! seg_info (now_seg)->tc_segment_info_data.mapstate = state;
symbolP = symbol_new (symname, now_seg, (valueT) frag_now_fix (), frag_now);
symbol_table_insert (symbolP);
*************** void
*** 1379,1384 ****
--- 1384,1390 ----
arm_elf_change_section (void)
{
flagword flags;
+ segment_info_type *seginfo;
/* Link an unlinked unwind index table section to the .text section. */
if (elf_section_type (now_seg) == SHT_ARM_EXIDX
*************** arm_elf_change_section (void)
*** 1394,1400 ****
if ((flags & SEC_ALLOC) == 0)
return;
! mapstate = seg_info (now_seg)->tc_segment_info_data;
}
int
--- 1400,1408 ----
if ((flags & SEC_ALLOC) == 0)
return;
! seginfo = seg_info (now_seg);
! mapstate = seginfo->tc_segment_info_data.mapstate;
! marked_pr_dependency = seginfo->tc_segment_info_data.marked_pr_dependency;
}
int
*************** create_unwind_entry (int have_data)
*** 14303,14315 ****
fix_new (frag_now, where, 4, unwind.personality_routine, 0, 1,
BFD_RELOC_ARM_PREL31);
- /* Indicate dependency to linker. */
- {
- char *name = "__aeabi_unwind_cpp_pr0";
- symbolS *pr = symbol_find_or_make (name);
- fix_new (frag_now, where, 4, pr, 0, 1, BFD_RELOC_NONE);
- }
-
where += 4;
ptr += 4;
--- 14311,14316 ----
*************** create_unwind_entry (int have_data)
*** 14323,14346 ****
/* Three opcodes bytes are packed into the first word. */
data = 0x80;
n = 3;
! goto emit_reloc;
case 1:
case 2:
/* The size and first two opcode bytes go in the first word. */
data = ((0x80 + unwind.personality_index) << 8) | size;
n = 2;
- goto emit_reloc;
-
- emit_reloc:
- {
- /* Indicate dependency to linker. */
- char *name[] = { "__aeabi_unwind_cpp_pr0",
- "__aeabi_unwind_cpp_pr1",
- "__aeabi_unwind_cpp_pr2" };
- symbolS *pr = symbol_find_or_make (name[unwind.personality_index]);
- fix_new (frag_now, where, 4, pr, 0, 1, BFD_RELOC_NONE);
- }
break;
default:
--- 14324,14336 ----
/* Three opcodes bytes are packed into the first word. */
data = 0x80;
n = 3;
! break;
case 1:
case 2:
/* The size and first two opcode bytes go in the first word. */
data = ((0x80 + unwind.personality_index) << 8) | size;
n = 2;
break;
default:
*************** s_arm_unwind_fnend (int ignored ATTRIBUT
*** 14449,14454 ****
--- 14439,14461 ----
fix_new (frag_now, where, 4, unwind.proc_start, 0, 1,
BFD_RELOC_ARM_PREL31);
+ /* Indicate dependency on EHABI-defined personality routines to the
+ linker, if it hasn't been done already. */
+ if (unwind.personality_index >= 0 && unwind.personality_index < 3)
+ {
+ char *name[] = { "__aeabi_unwind_cpp_pr0",
+ "__aeabi_unwind_cpp_pr1",
+ "__aeabi_unwind_cpp_pr2" };
+ if (!(marked_pr_dependency & (1 << unwind.personality_index)))
+ {
+ symbolS *pr = symbol_find_or_make (name[unwind.personality_index]);
+ fix_new (frag_now, where, 0, pr, 0, 1, BFD_RELOC_NONE);
+ marked_pr_dependency |= 1 << unwind.personality_index;
+ seg_info (now_seg)->tc_segment_info_data.marked_pr_dependency
+ = marked_pr_dependency;
+ }
+ }
+
if (val)
/* Inline exception table entry. */
md_number_to_chars (ptr + 4, val, 4);
Index: gas/config/tc-arm.h
===================================================================
RCS file: /cvs/src/src/gas/config/tc-arm.h,v
retrieving revision 1.25
diff -c -p -r1.25 tc-arm.h
*** gas/config/tc-arm.h 3 Mar 2005 11:47:49 -0000 1.25
--- gas/config/tc-arm.h 28 Mar 2005 23:31:26 -0000
*************** struct fix;
*** 170,176 ****
# 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 enum mstate
enum mstate
{
--- 170,176 ----
# 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
{
*************** enum mstate
*** 180,185 ****
--- 180,191 ----
MAP_THUMB
};
+ struct arm_segment_info_type
+ {
+ enum mstate mapstate;
+ unsigned int marked_pr_dependency;
+ };
+
/* We want .cfi_* pseudo-ops for generating unwind info. */
#define TARGET_USE_CFIPOP 1
Index: gas/testsuite/gas/arm/unwind.d
===================================================================
RCS file: /cvs/src/src/gas/testsuite/gas/arm/unwind.d,v
retrieving revision 1.5
diff -c -p -r1.5 unwind.d
*** gas/testsuite/gas/arm/unwind.d 4 Mar 2005 15:28:36 -0000 1.5
--- gas/testsuite/gas/arm/unwind.d 28 Mar 2005 23:31:26 -0000
***************
*** 5,20 ****
RELOCATION RECORDS FOR \[.ARM.extab\]:
OFFSET TYPE VALUE
- 00000000 R_ARM_NONE __aeabi_unwind_cpp_pr1
0000000c R_ARM_PREL31 .text
- 0000000c R_ARM_NONE __aeabi_unwind_cpp_pr0
- 0000001c R_ARM_NONE __aeabi_unwind_cpp_pr1
RELOCATION RECORDS FOR \[.ARM.exidx\]:
OFFSET TYPE VALUE
00000000 R_ARM_PREL31 .text
00000008 R_ARM_PREL31 .text.*
0000000c R_ARM_PREL31 .ARM.extab
00000010 R_ARM_PREL31 .text.*
00000014 R_ARM_PREL31 .ARM.extab.*
--- 5,19 ----
RELOCATION RECORDS FOR \[.ARM.extab\]:
OFFSET TYPE VALUE
0000000c R_ARM_PREL31 .text
RELOCATION RECORDS FOR \[.ARM.exidx\]:
OFFSET TYPE VALUE
00000000 R_ARM_PREL31 .text
+ 00000000 R_ARM_NONE __aeabi_unwind_cpp_pr0
00000008 R_ARM_PREL31 .text.*
+ 00000008 R_ARM_NONE __aeabi_unwind_cpp_pr1
0000000c R_ARM_PREL31 .ARM.extab
00000010 R_ARM_PREL31 .text.*
00000014 R_ARM_PREL31 .ARM.extab.*
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH] Indicate dependency on personality routines for ARM EHABI - take 3
2005-03-29 6:42 ` [PATCH] Indicate dependency on personality routines for ARM EHABI - take 3 Julian Brown
@ 2005-03-29 17:38 ` Richard Earnshaw
2005-03-29 20:00 ` Julian Brown
0 siblings, 1 reply; 11+ messages in thread
From: Richard Earnshaw @ 2005-03-29 17:38 UTC (permalink / raw)
To: Julian Brown; +Cc: Paul Brook, binutils
On Tue, 2005-03-29 at 01:02, Julian Brown wrote:
> Hi,
>
> This patch fixes output of dependencies on ARM EABI personality routines
> for stack unwinding, using R_ARM_NONE relocations. It should output only
> one dependency per-section, and should handle .pushsection/.popsection
> correctly. These are the previous version of the patch:
>
> http://sourceware.org/ml/binutils/2005-03/msg00126.html
> http://sourceware.org/ml/binutils/2005-02/msg00172.html
>
> Tested on arm-none-eabi and i686-pc-linux-gnu with all targets.
>
> OK to apply?
>
> ChangeLog:
>
> * gas/config/tc-arm.c (marked_pr_dependency): New bitmap, bit N
> indicates whether personality routine index N has been output for this
> section.
> (mapping_state): tc_segment_info_data now struct not enum.
> (arm_elf_change_section): Likewise, and marked_pr_dependency is now
> handled on section change.
> (create_unwind_entry): Previous code to output dependency removed.
> (s_arm_unwind_fnend): Output dependency if it hasn't been done
> already for this section.
> * gas/config/tc-arm.h (TC_SEGMENT_INFO_TYPE): Redefined as struct
> arm_segment_info_type.
> (arm_segment_info_type): New struct.
> * gas/testsuite/gas/arm/unwind.d: Update expected output.
>
> ______________________________________________________________________
OK.
R.
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH] Indicate dependency on personality routines for ARM EHABI - take 3
2005-03-29 17:38 ` Richard Earnshaw
@ 2005-03-29 20:00 ` Julian Brown
0 siblings, 0 replies; 11+ messages in thread
From: Julian Brown @ 2005-03-29 20:00 UTC (permalink / raw)
To: Richard Earnshaw; +Cc: Paul Brook, binutils, Julian Brown
Richard Earnshaw wrote:
> On Tue, 2005-03-29 at 01:02, Julian Brown wrote:
>
>>Hi,
>>
>>This patch fixes output of dependencies on ARM EABI personality routines
>>for stack unwinding, using R_ARM_NONE relocations. It should output only
>>one dependency per-section, and should handle .pushsection/.popsection
>>correctly. These are the previous version of the patch:
>>
>> http://sourceware.org/ml/binutils/2005-03/msg00126.html
>> http://sourceware.org/ml/binutils/2005-02/msg00172.html
>>
>>Tested on arm-none-eabi and i686-pc-linux-gnu with all targets.
>>
>>OK to apply?
>>
>>ChangeLog:
>>
>> * gas/config/tc-arm.c (marked_pr_dependency): New bitmap, bit N
>> indicates whether personality routine index N has been output for this
>> section.
>> (mapping_state): tc_segment_info_data now struct not enum.
>> (arm_elf_change_section): Likewise, and marked_pr_dependency is now
>> handled on section change.
>> (create_unwind_entry): Previous code to output dependency removed.
>> (s_arm_unwind_fnend): Output dependency if it hasn't been done
>> already for this section.
>> * gas/config/tc-arm.h (TC_SEGMENT_INFO_TYPE): Redefined as struct
>> arm_segment_info_type.
>> (arm_segment_info_type): New struct.
>> * gas/testsuite/gas/arm/unwind.d: Update expected output.
>>
>>______________________________________________________________________
>
> OK.
Applied on mainline and binutils-csl-arm-2005q1-branch.
Julian
^ permalink raw reply [flat|nested] 11+ messages in thread
end of thread, other threads:[~2005-03-29 16:38 UTC | newest]
Thread overview: 11+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2005-03-03 22:43 [PATCH] Indicate dependency on personality routines for ARM EHABI - take 2 Julian Brown
2005-03-03 23:31 ` Paul Brook
2005-03-07 15:36 ` Julian Brown
2005-03-07 16:08 ` Paul Brook
2005-03-07 18:40 ` Julian Brown
2005-03-09 12:57 ` Nick Clifton
2005-03-09 15:13 ` Richard Earnshaw
2005-03-09 15:26 ` Richard Earnshaw
2005-03-29 6:42 ` [PATCH] Indicate dependency on personality routines for ARM EHABI - take 3 Julian Brown
2005-03-29 17:38 ` Richard Earnshaw
2005-03-29 20:00 ` Julian Brown
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).