diff options
author | Lang Hames <lhames@gmail.com> | 2018-08-05 22:35:37 +0000 |
---|---|---|
committer | Lang Hames <lhames@gmail.com> | 2018-08-05 22:35:37 +0000 |
commit | c0514f00bfdc10c87b80b67109fc77b8f24cfd2d (patch) | |
tree | ba41be7b25cc3704917025ade3c82d8a927c847b /llvm/lib/ExecutionEngine/Orc/Layer.cpp | |
parent | b7fcd10700e917ba7d77ebfdd6097721c4a5246c (diff) | |
download | bcm5719-llvm-c0514f00bfdc10c87b80b67109fc77b8f24cfd2d.tar.gz bcm5719-llvm-c0514f00bfdc10c87b80b67109fc77b8f24cfd2d.zip |
[ORC] Change JITSymbolFlags debug output, add a function for getting a symbol
flags map from a buffer representing an object file.
llvm-svn: 338974
Diffstat (limited to 'llvm/lib/ExecutionEngine/Orc/Layer.cpp')
-rw-r--r-- | llvm/lib/ExecutionEngine/Orc/Layer.cpp | 53 |
1 files changed, 31 insertions, 22 deletions
diff --git a/llvm/lib/ExecutionEngine/Orc/Layer.cpp b/llvm/lib/ExecutionEngine/Orc/Layer.cpp index 49bc54aede8..46b9e5738f6 100644 --- a/llvm/lib/ExecutionEngine/Orc/Layer.cpp +++ b/llvm/lib/ExecutionEngine/Orc/Layer.cpp @@ -9,7 +9,6 @@ #include "llvm/ExecutionEngine/Orc/Layer.h" #include "llvm/Object/ObjectFile.h" -#include "llvm/Support/MemoryBuffer.h" namespace llvm { namespace orc { @@ -78,33 +77,20 @@ Error ObjectLayer::add(VSO &V, VModuleKey K, std::unique_ptr<MemoryBuffer> O) { Expected<std::unique_ptr<BasicObjectLayerMaterializationUnit>> BasicObjectLayerMaterializationUnit::Create(ObjectLayer &L, VModuleKey K, std::unique_ptr<MemoryBuffer> O) { - auto &ES = L.getExecutionSession(); - auto Obj = object::ObjectFile::createObjectFile(O->getMemBufferRef()); + auto SymbolFlags = + getObjectSymbolFlags(L.getExecutionSession(), O->getMemBufferRef()); - if (!Obj) - return Obj.takeError(); - - SymbolFlagsMap SymbolFlags; - for (auto &Sym : (*Obj)->symbols()) { - if (!(Sym.getFlags() & object::BasicSymbolRef::SF_Undefined) && - (Sym.getFlags() & object::BasicSymbolRef::SF_Exported)) { - auto InternedName = - ES.getSymbolStringPool().intern(cantFail(Sym.getName())); - auto SymFlags = JITSymbolFlags::fromObjectSymbol(Sym); - if (!SymFlags) - return SymFlags.takeError(); - SymbolFlags[InternedName] = std::move(*SymFlags); - } - } + if (!SymbolFlags) + return SymbolFlags.takeError(); return std::unique_ptr<BasicObjectLayerMaterializationUnit>( - new BasicObjectLayerMaterializationUnit(std::move(SymbolFlags), L, K, - std::move(O))); + new BasicObjectLayerMaterializationUnit(L, K, std::move(O), + std::move(*SymbolFlags))); } BasicObjectLayerMaterializationUnit::BasicObjectLayerMaterializationUnit( - SymbolFlagsMap SymbolFlags, ObjectLayer &L, VModuleKey K, - std::unique_ptr<MemoryBuffer> O) + ObjectLayer &L, VModuleKey K, std::unique_ptr<MemoryBuffer> O, + SymbolFlagsMap SymbolFlags) : MaterializationUnit(std::move(SymbolFlags)), L(L), K(std::move(K)), O(std::move(O)) {} @@ -119,5 +105,28 @@ void BasicObjectLayerMaterializationUnit::discard(const VSO &V, // filter to pass to the object layer along with the object itself. } +Expected<SymbolFlagsMap> getObjectSymbolFlags(ExecutionSession &ES, + MemoryBufferRef ObjBuffer) { + auto Obj = object::ObjectFile::createObjectFile(ObjBuffer); + + if (!Obj) + return Obj.takeError(); + + SymbolFlagsMap SymbolFlags; + for (auto &Sym : (*Obj)->symbols()) { + if (!(Sym.getFlags() & object::BasicSymbolRef::SF_Undefined) && + (Sym.getFlags() & object::BasicSymbolRef::SF_Exported)) { + auto InternedName = + ES.getSymbolStringPool().intern(cantFail(Sym.getName())); + auto SymFlags = JITSymbolFlags::fromObjectSymbol(Sym); + if (!SymFlags) + return SymFlags.takeError(); + SymbolFlags[InternedName] = std::move(*SymFlags); + } + } + + return SymbolFlags; +} + } // End namespace orc. } // End namespace llvm. |