On Mon, Jan 29, 2024 at 06:36:47AM -0800, H.J. Lu wrote:
> TARGET_ASM_SELECT_RTX_SECTION is for constant in RTL.
> It should have a non-public label reference which can't be used
> by other TUs. The same section can contain other constants.
> If there is a COMAT issue, linker will catch it.
Let me try to explain on short assembly snippet what I believe your patch is
doing and what I'm afraid of. I believe your patch when we need to emit
a RTL constant foo or foo+1 or foo+2 (where foo is defined in a comdat
section) instead of emitting using say foo in assembly puts those
constants into .data.rel.ro.local section determined by the decl that is
referenced.
Now, when first_tu.o wins and emits the qux comdat, it will contain
the .data.rel.ro.local.foo which bar function refers to, but in second_tu.o
it wants to refer to different offsets from the same function and loses.
I simply believe the constants need to be in section based on what refers
to those symbols, not the value of those constants, and that is what we used
to do before your patch (and I'd like to understand what's wrong with what
GCC emits and why).
first_tu.s:
============
.section .text.foo,"axG",@progbits,qux,comdat
.p2align 4
.type foo, @function
foo:
xorl %eax, %eax
ret
.size foo, .-foo
.text
.p2align 4
.type bar, @function
bar:
movq .LC0(%rip), %xmm0
ret
.size bar, .-bar
.section .data.rel.ro.local.foo,"awG",@progbits,qux,comdat
.align 8
.LC0:
.quad foo
second_tu.s:
============
.section .text.foo,"axG",@progbits,qux,comdat
.p2align 4
.type foo, @function
foo:
xorl %eax, %eax
ret
.size foo, .-foo
.text
.p2align 4
.type baz, @function
baz:
movq .LC0(%rip), %xmm0
ret
.size baz, .-baz
.section .data.rel.ro.local.foo,"awG",@progbits,qux,comdat
.align 8
.LC0:
.quad foo+1
.text
.p2align 4
.type corge, @function
corge:
movq .LC1(%rip), %xmm0
ret
.size corge, .-corge
.section .data.rel.ro.local.foo,"awG",@progbits,qux,comdat
.align 8
.LC1:
.quad foo+2
gcc -shared -o test.so first_tu.s second_tu.s
`.data.rel.ro.local.foo' referenced in section `.text' of /tmp/cceeUWyH.o:
defined in discarded section `.data.rel.ro.local.foo[qux]' of /tmp/cceeUWyH.o
`.data.rel.ro.local.foo' referenced in section `.text' of /tmp/cceeUWyH.o:
defined in discarded section `.data.rel.ro.local.foo[qux]' of /tmp/cceeUWyH.o
collect2: error: ld returned 1 exit status
Jakub