-fsection-anchors and -fdata-sections in ARM
Mike via D.gnu
d.gnu at puremagic.com
Thu Jan 22 03:34:27 PST 2015
I'm trying to track down an optimization bug.
I have written a D program and a C program that are essentially
identical, and compiled them to assembly code with my
arm-none-eabi-gdc/gcc build.
C Code: https://bpaste.net/show/6f420de3a892
C ASM : https://bpaste.net/show/42c75f6763bf
arm-none-eabi-gcc -O1 -S -ffunction-sections test.c -o test.s
D Code: https://bpaste.net/show/20faec5c4bb6
D ASM : https://bpaste.net/show/b2c200705d5d
arm-none-eabi-gdc -O1 -S -ffunction-sections test.d -o test.d.s
The problem is with the string literals at the very end of the
ASM files:
C
****
.L12:
.align 2
.L11:
.word .LC1
.word .LC2
.word .LC3
.size _start, .-_start
.section .rodata.str1.4,"aMS",%progbits,1
.align 2
.LC0:
.ascii "\015\012\000"
.space 1
.LC1:
.ascii "a\000"
.space 2
.LC2:
.ascii "another string\000"
.space 1
.LC3:
.ascii "do it again\000"
.ident "GCC: (GNU) 4.9.2"
D
****
.L6:
.word .LANCHOR0
... { blah blah }
.L13:
.align 2
.L12:
.word .LANCHOR0
.cantunwind
.fnend
.size _D5start6_startFZv, .-_D5start6_startFZv
.section .rodata
.align 2
.set .LANCHOR0,. + 0
.LC0:
.ascii "\015\012"
.space 2
.LC1:
.ascii "a"
.space 3
.LC2:
.ascii "another string"
.space 2
.LC3:
.ascii "do it again"
.ident "GCC: (GNU) 4.9.2"
Notice how the D code adds the section anchor .LANCHOR0, but the
C code does not.
The D code then refers to the sting literals with something like
this...
ldr r3, .L6
add r3, sp, #16
... essentially referring to the string literal as an offset from
.LANCHOR
This is causing a problem for me because if I put my string
literals in separate sections (i.e. -fdata-sections), compile
with -O1 (i.e. -fsection-anchors), and link with --gc-section,
then the linker strips out my string literals because it doesn't
see the link to the string literal. (At least that's my theory).
The C code, on the other hand, does not use the section anchor
and instead seems to put them in some kind of array of strings
like this:
.L11:
.word .LC1
.word .LC2
.word .LC3
Therefore, the linker can see the link to the string literals and
doesn't strip them out (Again, that's my theory)
Can anything be done about this in GDC?
Thanks always for the help,
Mike
More information about the D.gnu
mailing list