Re: r366511 - Update the SimpleJIT class in the clang-interpreter example to use ORCv2.

2019-07-19 Thread Hans Wennborg via cfe-commits
Merged to 9.0 in r366556.

On Fri, Jul 19, 2019 at 12:46 AM Lang Hames via cfe-commits
 wrote:
>
> Author: lhames
> Date: Thu Jul 18 15:47:18 2019
> New Revision: 366511
>
> URL: http://llvm.org/viewvc/llvm-project?rev=366511=rev
> Log:
> Update the SimpleJIT class in the clang-interpreter example to use ORCv2.
>
> This will remove the ORCv1 deprecation warnings.
>
> Modified:
> cfe/trunk/examples/clang-interpreter/main.cpp
>
> Modified: cfe/trunk/examples/clang-interpreter/main.cpp
> URL: 
> http://llvm.org/viewvc/llvm-project/cfe/trunk/examples/clang-interpreter/main.cpp?rev=366511=366510=366511=diff
> ==
> --- cfe/trunk/examples/clang-interpreter/main.cpp (original)
> +++ cfe/trunk/examples/clang-interpreter/main.cpp Thu Jul 18 15:47:18 2019
> @@ -18,6 +18,7 @@
>  #include "llvm/ADT/SmallString.h"
>  #include "llvm/ExecutionEngine/ExecutionEngine.h"
>  #include "llvm/ExecutionEngine/Orc/CompileUtils.h"
> +#include "llvm/ExecutionEngine/Orc/ExecutionUtils.h"
>  #include "llvm/ExecutionEngine/Orc/IRCompileLayer.h"
>  #include "llvm/ExecutionEngine/Orc/RTDyldObjectLinkingLayer.h"
>  #include "llvm/ExecutionEngine/SectionMemoryManager.h"
> @@ -50,65 +51,69 @@ namespace orc {
>  class SimpleJIT {
>  private:
>ExecutionSession ES;
> -  std::shared_ptr Resolver;
>std::unique_ptr TM;
>const DataLayout DL;
> -  LegacyRTDyldObjectLinkingLayer ObjectLayer;
> -  LegacyIRCompileLayer CompileLayer;
> +  MangleAndInterner Mangle{ES, DL};
> +  RTDyldObjectLinkingLayer ObjectLayer{ES, createMemMgr};
> +  IRCompileLayer CompileLayer{ES, ObjectLayer, SimpleCompiler(*TM)};
>
> -public:
> -  SimpleJIT()
> -  : Resolver(createLegacyLookupResolver(
> -ES,
> -[this](const std::string ) -> JITSymbol {
> -  if (auto Sym = CompileLayer.findSymbol(Name, false))
> -return Sym;
> -  else if (auto Err = Sym.takeError())
> -return std::move(Err);
> -  if (auto SymAddr =
> -  RTDyldMemoryManager::getSymbolAddressInProcess(Name))
> -return JITSymbol(SymAddr, JITSymbolFlags::Exported);
> -  return nullptr;
> -},
> -[](Error Err) { cantFail(std::move(Err), "lookupFlags failed"); 
> })),
> -TM(EngineBuilder().selectTarget()), DL(TM->createDataLayout()),
> -ObjectLayer(ES,
> -[this](VModuleKey) {
> -  return LegacyRTDyldObjectLinkingLayer::Resources{
> -  std::make_shared(), 
> Resolver};
> -}),
> -CompileLayer(ObjectLayer, SimpleCompiler(*TM)) {
> +  static std::unique_ptr createMemMgr() {
> +return llvm::make_unique();
> +  }
> +
> +  SimpleJIT(std::unique_ptr TM, DataLayout DL,
> +DynamicLibrarySearchGenerator ProcessSymbolsGenerator)
> +  : TM(std::move(TM)), DL(std::move(DL)) {
>  llvm::sys::DynamicLibrary::LoadLibraryPermanently(nullptr);
> +ES.getMainJITDylib().setGenerator(std::move(ProcessSymbolsGenerator));
>}
>
> -  const TargetMachine () const { return *TM; }
> +public:
> +  static Expected> Create() {
> +auto JTMB = JITTargetMachineBuilder::detectHost();
> +if (!JTMB)
> +  return JTMB.takeError();
> +
> +auto TM = JTMB->createTargetMachine();
> +if (!TM)
> +  return TM.takeError();
> +
> +auto DL = (*TM)->createDataLayout();
> +
> +auto ProcessSymbolsGenerator =
> +DynamicLibrarySearchGenerator::GetForCurrentProcess(
> +DL.getGlobalPrefix());
> +
> +if (!ProcessSymbolsGenerator)
> +  return ProcessSymbolsGenerator.takeError();
>
> -  VModuleKey addModule(std::unique_ptr M) {
> -// Add the module to the JIT with a new VModuleKey.
> -auto K = ES.allocateVModule();
> -cantFail(CompileLayer.addModule(K, std::move(M)));
> -return K;
> +return std::unique_ptr(new SimpleJIT(
> +std::move(*TM), std::move(DL), std::move(*ProcessSymbolsGenerator)));
>}
>
> -  JITSymbol findSymbol(const StringRef ) {
> -std::string MangledName;
> -raw_string_ostream MangledNameStream(MangledName);
> -Mangler::getNameWithPrefix(MangledNameStream, Name, DL);
> -return CompileLayer.findSymbol(MangledNameStream.str(), true);
> +  const TargetMachine () const { return *TM; }
> +
> +  Error addModule(ThreadSafeModule M) {
> +return CompileLayer.add(ES.getMainJITDylib(), std::move(M));
>}
>
> -  JITTargetAddress getSymbolAddress(const StringRef ) {
> -return cantFail(findSymbol(Name).getAddress());
> +  Expected findSymbol(const StringRef ) {
> +return ES.lookup({()}, Mangle(Name));
>}
>
> -  void removeModule(VModuleKey K) {
> -cantFail(CompileLayer.removeModule(K));
> +  Expected getSymbolAddress(const StringRef ) {
> +auto Sym = findSymbol(Name);
> +if (!Sym)
> +  return Sym.takeError();
> +return Sym->getAddress();
>

r366511 - Update the SimpleJIT class in the clang-interpreter example to use ORCv2.

2019-07-18 Thread Lang Hames via cfe-commits
Author: lhames
Date: Thu Jul 18 15:47:18 2019
New Revision: 366511

URL: http://llvm.org/viewvc/llvm-project?rev=366511=rev
Log:
Update the SimpleJIT class in the clang-interpreter example to use ORCv2.

This will remove the ORCv1 deprecation warnings.

Modified:
cfe/trunk/examples/clang-interpreter/main.cpp

Modified: cfe/trunk/examples/clang-interpreter/main.cpp
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/examples/clang-interpreter/main.cpp?rev=366511=366510=366511=diff
==
--- cfe/trunk/examples/clang-interpreter/main.cpp (original)
+++ cfe/trunk/examples/clang-interpreter/main.cpp Thu Jul 18 15:47:18 2019
@@ -18,6 +18,7 @@
 #include "llvm/ADT/SmallString.h"
 #include "llvm/ExecutionEngine/ExecutionEngine.h"
 #include "llvm/ExecutionEngine/Orc/CompileUtils.h"
+#include "llvm/ExecutionEngine/Orc/ExecutionUtils.h"
 #include "llvm/ExecutionEngine/Orc/IRCompileLayer.h"
 #include "llvm/ExecutionEngine/Orc/RTDyldObjectLinkingLayer.h"
 #include "llvm/ExecutionEngine/SectionMemoryManager.h"
@@ -50,65 +51,69 @@ namespace orc {
 class SimpleJIT {
 private:
   ExecutionSession ES;
-  std::shared_ptr Resolver;
   std::unique_ptr TM;
   const DataLayout DL;
-  LegacyRTDyldObjectLinkingLayer ObjectLayer;
-  LegacyIRCompileLayer CompileLayer;
+  MangleAndInterner Mangle{ES, DL};
+  RTDyldObjectLinkingLayer ObjectLayer{ES, createMemMgr};
+  IRCompileLayer CompileLayer{ES, ObjectLayer, SimpleCompiler(*TM)};
 
-public:
-  SimpleJIT()
-  : Resolver(createLegacyLookupResolver(
-ES,
-[this](const std::string ) -> JITSymbol {
-  if (auto Sym = CompileLayer.findSymbol(Name, false))
-return Sym;
-  else if (auto Err = Sym.takeError())
-return std::move(Err);
-  if (auto SymAddr =
-  RTDyldMemoryManager::getSymbolAddressInProcess(Name))
-return JITSymbol(SymAddr, JITSymbolFlags::Exported);
-  return nullptr;
-},
-[](Error Err) { cantFail(std::move(Err), "lookupFlags failed"); 
})),
-TM(EngineBuilder().selectTarget()), DL(TM->createDataLayout()),
-ObjectLayer(ES,
-[this](VModuleKey) {
-  return LegacyRTDyldObjectLinkingLayer::Resources{
-  std::make_shared(), Resolver};
-}),
-CompileLayer(ObjectLayer, SimpleCompiler(*TM)) {
+  static std::unique_ptr createMemMgr() {
+return llvm::make_unique();
+  }
+
+  SimpleJIT(std::unique_ptr TM, DataLayout DL,
+DynamicLibrarySearchGenerator ProcessSymbolsGenerator)
+  : TM(std::move(TM)), DL(std::move(DL)) {
 llvm::sys::DynamicLibrary::LoadLibraryPermanently(nullptr);
+ES.getMainJITDylib().setGenerator(std::move(ProcessSymbolsGenerator));
   }
 
-  const TargetMachine () const { return *TM; }
+public:
+  static Expected> Create() {
+auto JTMB = JITTargetMachineBuilder::detectHost();
+if (!JTMB)
+  return JTMB.takeError();
+
+auto TM = JTMB->createTargetMachine();
+if (!TM)
+  return TM.takeError();
+
+auto DL = (*TM)->createDataLayout();
+
+auto ProcessSymbolsGenerator =
+DynamicLibrarySearchGenerator::GetForCurrentProcess(
+DL.getGlobalPrefix());
+
+if (!ProcessSymbolsGenerator)
+  return ProcessSymbolsGenerator.takeError();
 
-  VModuleKey addModule(std::unique_ptr M) {
-// Add the module to the JIT with a new VModuleKey.
-auto K = ES.allocateVModule();
-cantFail(CompileLayer.addModule(K, std::move(M)));
-return K;
+return std::unique_ptr(new SimpleJIT(
+std::move(*TM), std::move(DL), std::move(*ProcessSymbolsGenerator)));
   }
 
-  JITSymbol findSymbol(const StringRef ) {
-std::string MangledName;
-raw_string_ostream MangledNameStream(MangledName);
-Mangler::getNameWithPrefix(MangledNameStream, Name, DL);
-return CompileLayer.findSymbol(MangledNameStream.str(), true);
+  const TargetMachine () const { return *TM; }
+
+  Error addModule(ThreadSafeModule M) {
+return CompileLayer.add(ES.getMainJITDylib(), std::move(M));
   }
 
-  JITTargetAddress getSymbolAddress(const StringRef ) {
-return cantFail(findSymbol(Name).getAddress());
+  Expected findSymbol(const StringRef ) {
+return ES.lookup({()}, Mangle(Name));
   }
 
-  void removeModule(VModuleKey K) {
-cantFail(CompileLayer.removeModule(K));
+  Expected getSymbolAddress(const StringRef ) {
+auto Sym = findSymbol(Name);
+if (!Sym)
+  return Sym.takeError();
+return Sym->getAddress();
   }
 };
 
 } // end namespace orc
 } // end namespace llvm
 
+llvm::ExitOnError ExitOnErr;
+
 int main(int argc, const char **argv) {
   // This just needs to be some symbol in the binary; C++ doesn't
   // allow taking the address of ::main however.
@@ -130,6 +135,8 @@ int main(int argc, const char **argv) {