-
Notifications
You must be signed in to change notification settings - Fork 14.5k
[lld] [hexagon] guard allocateAux: only if idx nonzero #149690
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
While building libclang_rt.asan-hexagon.so, lld would assert in lld::elf::hexagonTLSSymbolUpdate().
@llvm/pr-subscribers-lld-elf @llvm/pr-subscribers-lld Author: Brian Cain (androm3da) ChangesWhile building libclang_rt.asan-hexagon.so, lld would assert in lld::elf::hexagonTLSSymbolUpdate(). Full diff: https://github.com/llvm/llvm-project/pull/149690.diff 2 Files Affected:
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: }
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Mention Hexagon in the title
# 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 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
With split-file and cd, we can use out.so
instead of %t.so
(ensure all output files are within %t
)
While building libclang_rt.asan-hexagon.so, lld would assert in lld::elf::hexagonTLSSymbolUpdate().
Fixes #132766