From 60511582d7181e0226455a0b05b921e97156f7e1 Mon Sep 17 00:00:00 2001 From: Lang Hames Date: Sun, 26 Aug 2018 16:46:02 +0000 Subject: [PATCH] [ORC] Do not include non-global symbols in getObjectSymbolFlags. Private symbols are not visible outside the object file, and so not defined by the object file from ORC's perspective. No test case yet. Ideally this would be a unit test parsing a checked-in binary, but I am not aware of any way to reference the LLVM source root from a unit test. llvm-svn: 340703 --- llvm/lib/ExecutionEngine/Orc/Layer.cpp | 27 ++++++++++++++++----------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/llvm/lib/ExecutionEngine/Orc/Layer.cpp b/llvm/lib/ExecutionEngine/Orc/Layer.cpp index cbe1300..7e2f830 100644 --- a/llvm/lib/ExecutionEngine/Orc/Layer.cpp +++ b/llvm/lib/ExecutionEngine/Orc/Layer.cpp @@ -115,17 +115,22 @@ Expected getObjectSymbolFlags(ExecutionSession &ES, SymbolFlagsMap SymbolFlags; for (auto &Sym : (*Obj)->symbols()) { - if (!(Sym.getFlags() & object::BasicSymbolRef::SF_Undefined) && - (Sym.getFlags() & object::BasicSymbolRef::SF_Exported)) { - auto Name = Sym.getName(); - if (!Name) - return Name.takeError(); - auto InternedName = ES.getSymbolStringPool().intern(*Name); - auto SymFlags = JITSymbolFlags::fromObjectSymbol(Sym); - if (!SymFlags) - return SymFlags.takeError(); - SymbolFlags[InternedName] = std::move(*SymFlags); - } + // Skip symbols not defined in this object file. + if (Sym.getFlags() & object::BasicSymbolRef::SF_Undefined) + continue; + + // Skip symbols that are not global. + if (!(Sym.getFlags() & object::BasicSymbolRef::SF_Global)) + continue; + + auto Name = Sym.getName(); + if (!Name) + return Name.takeError(); + auto InternedName = ES.getSymbolStringPool().intern(*Name); + auto SymFlags = JITSymbolFlags::fromObjectSymbol(Sym); + if (!SymFlags) + return SymFlags.takeError(); + SymbolFlags[InternedName] = std::move(*SymFlags); } return SymbolFlags; -- 2.7.4