From 6722a5c0d794167a6dcb799a0f6cc8071395fa85 Mon Sep 17 00:00:00 2001 From: Brian Cain Date: Sat, 19 Jul 2025 22:04:46 -0500 Subject: [PATCH 1/2] [lld] guard allocateAux: only if idx nonzero While building libclang_rt.asan-hexagon.so, lld would assert in lld::elf::hexagonTLSSymbolUpdate(). --- lld/ELF/Relocations.cpp | 3 +- .../ELF/hexagon-tls-allocateaux-multiple.s | 36 +++++++++++++++++++ 2 files changed, 38 insertions(+), 1 deletion(-) create mode 100644 lld/test/ELF/hexagon-tls-allocateaux-multiple.s diff --git a/lld/ELF/Relocations.cpp b/lld/ELF/Relocations.cpp index 4333b032c9d4e..6f578a29aecd4 100644 --- a/lld/ELF/Relocations.cpp +++ b/lld/ELF/Relocations.cpp @@ -2526,7 +2526,8 @@ void elf::hexagonTLSSymbolUpdate(Ctx &ctx) { for (Relocation &rel : isec->relocs()) if (rel.sym->type == llvm::ELF::STT_TLS && rel.expr == R_PLT_PC) { if (needEntry) { - sym->allocateAux(ctx); + if (sym->auxIdx == 0) + sym->allocateAux(ctx); addPltEntry(ctx, *ctx.in.plt, *ctx.in.gotPlt, *ctx.in.relaPlt, ctx.target->pltRel, *sym); needEntry = false; diff --git a/lld/test/ELF/hexagon-tls-allocateaux-multiple.s b/lld/test/ELF/hexagon-tls-allocateaux-multiple.s new file mode 100644 index 0000000000000..8cfd5130501f6 --- /dev/null +++ b/lld/test/ELF/hexagon-tls-allocateaux-multiple.s @@ -0,0 +1,36 @@ +# REQUIRES: hexagon +# RUN: rm -rf %t && split-file %s %t && cd %t +# RUN: llvm-mc -filetype=obj -triple=hexagon-unknown-elf one.s -o one.o +# RUN: llvm-mc -filetype=obj -triple=hexagon-unknown-elf two.s -o two.o +# RUN: ld.lld -shared one.o two.o -o %t.so +# RUN: llvm-readobj -r %t.so | FileCheck --check-prefix=RELOC %s + +#--- one.s +.globl _start +.type _start, @function + +_start: + r2 = add(pc,##_GLOBAL_OFFSET_TABLE_@PCREL) + r0 = add(r2,##tls_var@GDGOT) + call tls_var@GDPLT + jumpr r31 + +.section .tdata,"awT",@progbits +.globl tls_var +.type tls_var, @object +tls_var: + .word 0x1234 + +#--- two.s +.globl other_func +.type other_func, @function + +other_func: + ## Direct call to __tls_get_addr - this creates another path that may + ## try to allocate auxiliary data for the same symbol + call __tls_get_addr + jumpr r31 + +# RELOC: Section ({{.*}}) .rela.plt { +# RELOC: R_HEX_JMP_SLOT __tls_get_addr 0x0 +# RELOC: } From 3c1544bf4e4579e52005f81b90167859d48fea56 Mon Sep 17 00:00:00 2001 From: Brian Cain Date: Sun, 20 Jul 2025 11:45:26 -0500 Subject: [PATCH 2/2] Use "out.so" for output, s/one/a/ s/two/b/ --- lld/test/ELF/hexagon-tls-allocateaux-multiple.s | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/lld/test/ELF/hexagon-tls-allocateaux-multiple.s b/lld/test/ELF/hexagon-tls-allocateaux-multiple.s index 8cfd5130501f6..a77cc822e67d4 100644 --- a/lld/test/ELF/hexagon-tls-allocateaux-multiple.s +++ b/lld/test/ELF/hexagon-tls-allocateaux-multiple.s @@ -1,11 +1,11 @@ # REQUIRES: hexagon # RUN: rm -rf %t && split-file %s %t && cd %t -# RUN: llvm-mc -filetype=obj -triple=hexagon-unknown-elf one.s -o one.o -# RUN: llvm-mc -filetype=obj -triple=hexagon-unknown-elf two.s -o two.o -# RUN: ld.lld -shared one.o two.o -o %t.so -# RUN: llvm-readobj -r %t.so | FileCheck --check-prefix=RELOC %s +# RUN: llvm-mc -filetype=obj -triple=hexagon-unknown-elf a.s -o a.o +# RUN: llvm-mc -filetype=obj -triple=hexagon-unknown-elf b.s -o b.o +# RUN: ld.lld -shared a.o b.o -o out.so +# RUN: llvm-readobj -r out.so | FileCheck --check-prefix=RELOC %s -#--- one.s +#--- a.s .globl _start .type _start, @function @@ -21,7 +21,7 @@ _start: tls_var: .word 0x1234 -#--- two.s +#--- b.s .globl other_func .type other_func, @function