[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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@349060 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Francis Visoiu Mistrih
2018-12-13 17:23:30 +00:00
parent ad397e7b26
commit 4e2709968c
2 changed files with 43 additions and 3 deletions
+22 -3
View File
@@ -1100,6 +1100,22 @@ const MCExpr *TargetLoweringObjectFileMachO::getIndirectSymViaGOTPCRel(
// .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 *TargetLoweringObjectFileMachO::getIndirectSymViaGOTPCRel(
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);