[ORC] Do not include non-global symbols in getObjectSymbolFlags.
authorLang Hames <lhames@gmail.com>
Sun, 26 Aug 2018 16:46:02 +0000 (16:46 +0000)
committerLang Hames <lhames@gmail.com>
Sun, 26 Aug 2018 16:46:02 +0000 (16:46 +0000)
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

index cbe1300..7e2f830 100644 (file)
@@ -115,17 +115,22 @@ Expected<SymbolFlagsMap> 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;