mirror of
https://github.com/RPCS3/llvm.git
synced 2026-07-20 19:04:10 -04:00
[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:
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user