Skip to content

Commit

Permalink
[AsmPrinter] Do not define local aliases for global objects in a comdat
Browse files Browse the repository at this point in the history
A global symbol that is defined in a comdat should not generate an alias since
call sites that would've referred to that symbol will refer to their own
independent local aliases rather than the surviving global comdat one. This
could result in something that looks like:

```
ld.lld: error: relocation refers to a discarded section: .text._ZN3fbl8internal18NullFunctionTargetIvJjjPjEED1Ev.stub
>>> defined in user-x64-clang/obj/system/ulib/minfs/libminfs.a(minfs._sources.file.cc.o)
>>> section group signature: _ZN3fbl8internal18NullFunctionTargetIvJjjPjEED1Ev.stub
>>> prevailing definition is in user-x64-clang/obj/system/ulib/minfs/libminfs.a(minfs._sources.vnode.cc.o)
>>> referenced by function.h:169 (../../zircon/system/ulib/fbl/include/fbl/function.h:169)
>>>               minfs._sources.file.cc.o:(minfs::File::AllocateAndCommitData(std::__2::unique_ptr<minfs::Transaction, std::__2::default_delete<minfs::Transaction> >)) in archive user-x64-clang/obj/system/ulib/minfs/libminfs.a
```

We ran into this when experimenting with a new C++ ABI for fuchsia
(refer to D72959) which takes relative offsets between comdat'd functions
which is why the normal C++ user wouldn't run into this.

Differential Revision: https://reviews.llvm.org/D77429
  • Loading branch information
PiJoules committed Apr 6, 2020
1 parent 6c1a9fb commit a0222ac
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 1 deletion.
2 changes: 1 addition & 1 deletion llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
Expand Up @@ -460,7 +460,7 @@ MCSymbol *AsmPrinter::getSymbolPreferLocal(const GlobalValue &GV) const {
// assumed it.
if (TM.getTargetTriple().isOSBinFormatELF() &&
GlobalObject::isExternalLinkage(GV.getLinkage()) && GV.isDSOLocal() &&
!GV.isDeclaration() && !isa<GlobalIFunc>(GV))
!GV.isDeclaration() && !isa<GlobalIFunc>(GV) && !GV.hasComdat())
return getSymbolWithGlobalValueBase(&GV, "$local");
return TM.getSymbol(&GV);
}
Expand Down
23 changes: 23 additions & 0 deletions llvm/test/CodeGen/X86/semantic-interposition-comdat.ll
@@ -0,0 +1,23 @@
; RUN: llc -mtriple x86_64-unknown-linux-gnu %s -o - | FileCheck %s

$comdat_func = comdat any

; CHECK-LABEL: func2:
; CHECK-NEXT: .Lfunc2$local

declare void @func()

define hidden void @func2() {
entry:
call void @func()
ret void
}

; CHECK: comdat_func:
; CHECK-NOT: .Lcomdat_func$local

define hidden void @comdat_func() comdat {
entry:
call void @func()
ret void
}

0 comments on commit a0222ac

Please sign in to comment.