[lld] [lld] [hexagon] guard allocateAux: only if idx nonzero (PR #149690)

Brian Cain via llvm-commits llvm-commits at lists.llvm.org
Sun Jul 20 09:45:39 PDT 2025


https://github.com/androm3da updated https://github.com/llvm/llvm-project/pull/149690

>From 6722a5c0d794167a6dcb799a0f6cc8071395fa85 Mon Sep 17 00:00:00 2001
From: Brian Cain <brian.cain at oss.qualcomm.com>
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_ at PCREL)
+  r0 = add(r2,##tls_var at GDGOT)
+  call tls_var at GDPLT
+  jumpr r31
+
+.section .tdata,"awT", at 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 <brian.cain at oss.qualcomm.com>
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
 



More information about the llvm-commits mailing list