[llvm] r349060 - [MachO][TLOF] Add support for local symbols in the indirect symbol table
Francis Visoiu Mistrih via llvm-commits
llvm-commits at lists.llvm.org
Thu Dec 13 09:23:30 PST 2018
Author: thegameg
Date: Thu Dec 13 09:23:30 2018
New Revision: 349060
URL: http://llvm.org/viewvc/llvm-project?rev=349060&view=rev
Log:
[MachO][TLOF] Add support for local symbols in the indirect symbol table
On 32-bit archs, before, we would assume that an indirect symbol will
never have local linkage. This can lead to miscompiles where the
symbol's value would be 0 and the linker would use that value, because
the indirect symbol table would contain the value
`INDIRECT_SYMBOL_LOCAL` for that specific symbol.
Differential Revision: https://reviews.llvm.org/D55573
Modified:
llvm/trunk/lib/CodeGen/TargetLoweringObjectFileImpl.cpp
llvm/trunk/test/MC/MachO/cstexpr-gotpcrel-32.ll
Modified: llvm/trunk/lib/CodeGen/TargetLoweringObjectFileImpl.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/TargetLoweringObjectFileImpl.cpp?rev=349060&r1=349059&r2=349060&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/TargetLoweringObjectFileImpl.cpp (original)
+++ llvm/trunk/lib/CodeGen/TargetLoweringObjectFileImpl.cpp Thu Dec 13 09:23:30 2018
@@ -1100,6 +1100,22 @@ const MCExpr *TargetLoweringObjectFileMa
// .indirect_symbol _extfoo
// .long 0
//
+ // The indirect symbol table (and sections of non_lazy_symbol_pointers type)
+ // may point to both local (same translation unit) and global (other
+ // translation units) symbols. Example:
+ //
+ // .section __DATA,__pointers,non_lazy_symbol_pointers
+ // L1:
+ // .indirect_symbol _myGlobal
+ // .long 0
+ // L2:
+ // .indirect_symbol _myLocal
+ // .long _myLocal
+ //
+ // If the symbol is local, instead of the symbol's index, the assembler
+ // places the constant INDIRECT_SYMBOL_LOCAL into the indirect symbol table.
+ // Then the linker will notice the constant in the table and will look at the
+ // content of the symbol.
MachineModuleInfoMachO &MachOMMI =
MMI->getObjFileInfo<MachineModuleInfoMachO>();
MCContext &Ctx = getContext();
@@ -1119,9 +1135,12 @@ const MCExpr *TargetLoweringObjectFileMa
MCSymbol *Stub = Ctx.getOrCreateSymbol(Name);
MachineModuleInfoImpl::StubValueTy &StubSym = MachOMMI.getGVStubEntry(Stub);
- if (!StubSym.getPointer())
- StubSym = MachineModuleInfoImpl::
- StubValueTy(const_cast<MCSymbol *>(Sym), true /* access indirectly */);
+ if (!StubSym.getPointer()) {
+ bool IsIndirectLocal = Sym->isDefined() && !Sym->isExternal();
+ // With the assumption that IsIndirectLocal == GV->hasLocalLinkage().
+ StubSym = MachineModuleInfoImpl::StubValueTy(const_cast<MCSymbol *>(Sym),
+ !IsIndirectLocal);
+ }
const MCExpr *BSymExpr =
MCSymbolRefExpr::create(BaseSym, MCSymbolRefExpr::VK_None, Ctx);
Modified: llvm/trunk/test/MC/MachO/cstexpr-gotpcrel-32.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/MachO/cstexpr-gotpcrel-32.ll?rev=349060&r1=349059&r2=349060&view=diff
==============================================================================
--- llvm/trunk/test/MC/MachO/cstexpr-gotpcrel-32.ll (original)
+++ llvm/trunk/test/MC/MachO/cstexpr-gotpcrel-32.ll Thu Dec 13 09:23:30 2018
@@ -72,3 +72,24 @@ define i32 @t0(i32 %a) {
i32 ptrtoint (i32 (i32)* @t0 to i32)), %a
ret i32 %x
}
+
+; Text indirect local symbols.
+; CHECK-LABEL: _localindirect
+; CHECK: .long 65603
+ at localindirect = internal constant i32 65603
+ at got.localindirect = private unnamed_addr constant i32* @localindirect
+
+; CHECK-LABEL: _localindirectuser:
+; CHECK: .long L_localindirect$non_lazy_ptr-_localindirectuser
+ at localindirectuser = internal constant
+ i32 sub (i32 ptrtoint (i32** @got.localindirect to i32),
+ i32 ptrtoint (i32* @localindirectuser to i32))
+
+; CHECK-LABEL: L_localindirect$non_lazy_ptr:
+; CHECK: .indirect_symbol _localindirect
+; CHECK-NOT: .long 0
+; CHECK-NEXT: .long _localindirect
+define i8* @testRelativeIndirectSymbol() {
+ %1 = bitcast i32* @localindirectuser to i8*
+ ret i8* %1
+}
More information about the llvm-commits
mailing list