[lld] [hexagon] guard allocateAux: only if idx nonzero (#149690)
While building libclang_rt.asan-hexagon.so, lld would assert in lld:🧝:hexagonTLSSymbolUpdate(). Fixes #132766 (cherry picked from commit 3e9ceae29f39456508eef5b4af4d3c895048706a)
This commit is contained in:
parent
275fa26b0c
commit
51245ebda1
@ -2525,7 +2525,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;
|
||||
|
36
lld/test/ELF/hexagon-tls-allocateaux-multiple.s
Normal file
36
lld/test/ELF/hexagon-tls-allocateaux-multiple.s
Normal file
@ -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 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
|
||||
|
||||
#--- a.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
|
||||
|
||||
#--- b.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: }
|
Loading…
x
Reference in New Issue
Block a user