[llvm] 0589351 - [Orc][examples] Adopt ExecutorProcessControl API and re-enable LLJITWithRemoteDebugging

Azhar Mohammed via llvm-commits llvm-commits at lists.llvm.org
Wed Aug 4 09:36:07 PDT 2021


Hi Stefan

I see the OrcV2 examples tests are failing on Darwin, when built with the sanitizers enabled. Can you please take a look? 

Refer to https://green.lab.llvm.org/green/job/clang-stage2-cmake-RgSan/7992/testReport/ <https://green.lab.llvm.org/green/job/clang-stage2-cmake-RgSan/7992/testReport/>. 

Failed Tests (5):
  LLVM :: Examples/OrcV2Examples/orcv2-cbindings-add-object-file.test
  LLVM :: Examples/OrcV2Examples/orcv2-cbindings-basic-usage.test
  LLVM :: Examples/OrcV2Examples/orcv2-cbindings-lazy.test
  LLVM :: Examples/OrcV2Examples/orcv2-cbindings-reflect-process-symbols.test
  LLVM :: Examples/OrcV2Examples/orcv2-cbindings-removable-code.test

Thanks
Azhar

> On Jul 29, 2021, at 5:41 AM, Stefan Gränitz via llvm-commits <llvm-commits at lists.llvm.org> wrote:
> 
> 
> Author: Stefan Gränitz
> Date: 2021-07-29T14:40:42+02:00
> New Revision: 058935145d6b0c600c35e8b83fa150896c725f8d
> 
> URL: https://github.com/llvm/llvm-project/commit/058935145d6b0c600c35e8b83fa150896c725f8d
> DIFF: https://github.com/llvm/llvm-project/commit/058935145d6b0c600c35e8b83fa150896c725f8d.diff
> 
> LOG: [Orc][examples] Adopt ExecutorProcessControl API and re-enable LLJITWithRemoteDebugging
> 
> The API change originated from D104694. The LLJITWithRemoteDebugging example and the test for it were disabled while it was in the works.
> 
> Added: 
> 
> 
> Modified: 
>    llvm/examples/OrcV2Examples/LLJITWithRemoteDebugging/CMakeLists.txt
>    llvm/examples/OrcV2Examples/LLJITWithRemoteDebugging/LLJITWithRemoteDebugging.cpp
>    llvm/examples/OrcV2Examples/LLJITWithRemoteDebugging/RemoteJITUtils.cpp
>    llvm/examples/OrcV2Examples/LLJITWithRemoteDebugging/RemoteJITUtils.h
>    llvm/test/Examples/OrcV2Examples/lljit-with-remote-debugging.test
>    llvm/test/Examples/lit.local.cfg
> 
> Removed: 
> 
> 
> 
> ################################################################################
> diff  --git a/llvm/examples/OrcV2Examples/LLJITWithRemoteDebugging/CMakeLists.txt b/llvm/examples/OrcV2Examples/LLJITWithRemoteDebugging/CMakeLists.txt
> index 06dfe88a898d5..2f8db1976107d 100644
> --- a/llvm/examples/OrcV2Examples/LLJITWithRemoteDebugging/CMakeLists.txt
> +++ b/llvm/examples/OrcV2Examples/LLJITWithRemoteDebugging/CMakeLists.txt
> @@ -10,7 +10,7 @@ set(LLVM_LINK_COMPONENTS
>   nativecodegen
>   )
> 
> -if (LLVM_INCLUDE_UTILS AND NOT LLVM_INCLUDE_UTILS)
> +if (LLVM_INCLUDE_UTILS)
>   add_llvm_example(LLJITWithRemoteDebugging
>     LLJITWithRemoteDebugging.cpp
>     RemoteJITUtils.cpp
> @@ -18,7 +18,4 @@ if (LLVM_INCLUDE_UTILS AND NOT LLVM_INCLUDE_UTILS)
>     DEPENDS
>       llvm-jitlink-executor
>   )
> -else()
> -  # Use a temporary no-op target until D104694 lands.
> -  add_custom_target(LLJITWithRemoteDebugging)
> endif()
> 
> diff  --git a/llvm/examples/OrcV2Examples/LLJITWithRemoteDebugging/LLJITWithRemoteDebugging.cpp b/llvm/examples/OrcV2Examples/LLJITWithRemoteDebugging/LLJITWithRemoteDebugging.cpp
> index ca0953550e090..227ad09d7ae79 100644
> --- a/llvm/examples/OrcV2Examples/LLJITWithRemoteDebugging/LLJITWithRemoteDebugging.cpp
> +++ b/llvm/examples/OrcV2Examples/LLJITWithRemoteDebugging/LLJITWithRemoteDebugging.cpp
> @@ -133,12 +133,12 @@ static cl::opt<bool>
> 
> ExitOnError ExitOnErr;
> 
> -static std::unique_ptr<JITLinkExecutor> connectExecutor(const char *Argv0,
> -                                                        ExecutionSession &ES) {
> +static std::unique_ptr<JITLinkExecutor> connectExecutor(const char *Argv0) {
>   // Connect to a running out-of-process executor through a TCP socket.
>   if (!OOPExecutorConnect.empty()) {
>     std::unique_ptr<TCPSocketJITLinkExecutor> Exec =
> -        ExitOnErr(JITLinkExecutor::ConnectTCPSocket(OOPExecutorConnect, ES));
> +        ExitOnErr(JITLinkExecutor::ConnectTCPSocket(OOPExecutorConnect,
> +                                                    std::ref(ExitOnErr)));
> 
>     outs() << "Connected to executor at " << OOPExecutorConnect << "\n";
>     if (WaitForDebugger) {
> @@ -157,7 +157,7 @@ static std::unique_ptr<JITLinkExecutor> connectExecutor(const char *Argv0,
> 
>   outs() << "Found out-of-process executor: " << Exec->getPath() << "\n";
> 
> -  ExitOnErr(Exec->launch(ES));
> +  ExitOnErr(Exec->launch(std::ref(ExitOnErr)));
>   if (WaitForDebugger) {
>     outs() << "Launched executor in subprocess: " << Exec->getPID() << "\n"
>            << "Attach a debugger and press any key to continue.\n";
> @@ -177,11 +177,8 @@ int main(int argc, char *argv[]) {
>   ExitOnErr.setBanner(std::string(argv[0]) + ": ");
>   cl::ParseCommandLineOptions(argc, argv, "LLJITWithRemoteDebugging");
> 
> -  auto ES = std::make_unique<ExecutionSession>();
> -  ES->setErrorReporter([&](Error Err) { ExitOnErr(std::move(Err)); });
> -
>   // Launch/connect the out-of-process executor.
> -  std::unique_ptr<JITLinkExecutor> Executor = connectExecutor(argv[0], *ES);
> +  std::unique_ptr<JITLinkExecutor> Executor = connectExecutor(argv[0]);
> 
>   // Load the given IR files.
>   std::vector<ThreadSafeModule> TSMs;
> @@ -215,6 +212,8 @@ int main(int argc, char *argv[]) {
> 
>   // Create LLJIT and destroy it before disconnecting the target process.
>   {
> +    std::unique_ptr<ExecutionSession> ES = Executor->startSession();
> +
>     outs() << "Initializing LLJIT for remote executor\n";
>     auto J = ExitOnErr(LLJITBuilder()
>                            .setExecutionSession(std::move(ES))
> @@ -253,6 +252,5 @@ int main(int argc, char *argv[]) {
>     outs() << "Exit code: " << Result << "\n";
>   }
> 
> -  ExitOnErr(Executor->disconnect());
>   return 0;
> }
> 
> diff  --git a/llvm/examples/OrcV2Examples/LLJITWithRemoteDebugging/RemoteJITUtils.cpp b/llvm/examples/OrcV2Examples/LLJITWithRemoteDebugging/RemoteJITUtils.cpp
> index 8e4a283556617..2616dd225d021 100644
> --- a/llvm/examples/OrcV2Examples/LLJITWithRemoteDebugging/RemoteJITUtils.cpp
> +++ b/llvm/examples/OrcV2Examples/LLJITWithRemoteDebugging/RemoteJITUtils.cpp
> @@ -47,9 +47,9 @@ class RemoteExecutorProcessControl
> public:
>   using BaseT::initializeORCRPCEPCBase;
> 
> -  RemoteExecutorProcessControl(ExecutionSession &ES,
> -                               std::unique_ptr<RPCChannel> Channel,
> -                               std::unique_ptr<RPCEndpoint> Endpoint);
> +  RemoteExecutorProcessControl(std::unique_ptr<RPCChannel> Channel,
> +                               std::unique_ptr<RPCEndpoint> Endpoint,
> +                               BaseT::ErrorReporter ReportError);
> 
>   void initializeMemoryManagement();
>   Error disconnect() override;
> @@ -64,10 +64,10 @@ class RemoteExecutorProcessControl
> };
> 
> RemoteExecutorProcessControl::RemoteExecutorProcessControl(
> -    ExecutionSession &ES, std::unique_ptr<RPCChannel> Channel,
> -    std::unique_ptr<RPCEndpoint> Endpoint)
> -    : BaseT(ES.getSymbolStringPool(), *Endpoint,
> -            [&ES](Error Err) { ES.reportError(std::move(Err)); }),
> +    std::unique_ptr<RPCChannel> Channel, std::unique_ptr<RPCEndpoint> Endpoint,
> +    BaseT::ErrorReporter ReportError)
> +    : BaseT(std::make_shared<SymbolStringPool>(), *Endpoint,
> +            std::move(ReportError)),
>       Channel(std::move(Channel)), Endpoint(std::move(Endpoint)) {
> 
>   ListenerThread = std::thread([&]() {
> @@ -109,11 +109,17 @@ JITLinkExecutor::~JITLinkExecutor() = default;
> 
> Expected<std::unique_ptr<ObjectLayer>>
> JITLinkExecutor::operator()(ExecutionSession &ES, const Triple &TT) {
> +  assert(EPC && "RemoteExecutorProcessControl must be initialized");
>   return std::make_unique<ObjectLinkingLayer>(ES, EPC->getMemMgr());
> }
> 
> +std::unique_ptr<ExecutionSession> JITLinkExecutor::startSession() {
> +  assert(OwnedEPC && "RemoteExecutorProcessControl must be initialized");
> +  return std::make_unique<ExecutionSession>(std::move(OwnedEPC));
> +}
> +
> Error JITLinkExecutor::addDebugSupport(ObjectLayer &ObjLayer) {
> -  auto Registrar = createJITLoaderGDBRegistrar(*EPC);
> +  auto Registrar = createJITLoaderGDBRegistrar(EPC->getExecutionSession());
>   if (!Registrar)
>     return Registrar.takeError();
> 
> @@ -127,7 +133,8 @@ Error JITLinkExecutor::addDebugSupport(ObjectLayer &ObjLayer) {
> Expected<std::unique_ptr<DefinitionGenerator>>
> JITLinkExecutor::loadDylib(StringRef RemotePath) {
>   if (auto Handle = EPC->loadDylib(RemotePath.data()))
> -    return std::make_unique<EPCDynamicLibrarySearchGenerator>(*EPC, *Handle);
> +    return std::make_unique<EPCDynamicLibrarySearchGenerator>(
> +        EPC->getExecutionSession(), *Handle);
>   else
>     return Handle.takeError();
> }
> @@ -174,7 +181,8 @@ JITLinkExecutor::CreateLocal(std::string ExecutablePath) {
> 
> TCPSocketJITLinkExecutor::TCPSocketJITLinkExecutor(
>     std::unique_ptr<RemoteExecutorProcessControl> EPC) {
> -  this->EPC = std::move(EPC);
> +  this->OwnedEPC = std::move(EPC);
> +  this->EPC = this->OwnedEPC.get();
> }
> 
> #ifndef LLVM_ON_UNIX
> @@ -197,7 +205,8 @@ JITLinkExecutor::ConnectTCPSocket(StringRef NetworkAddress,
> 
> #else
> 
> -Error ChildProcessJITLinkExecutor::launch(ExecutionSession &ES) {
> +Error ChildProcessJITLinkExecutor::launch(
> +    unique_function<void(Error)> ErrorReporter) {
>   constexpr int ReadEnd = 0;
>   constexpr int WriteEnd = 1;
> 
> @@ -252,13 +261,14 @@ Error ChildProcessJITLinkExecutor::launch(ExecutionSession &ES) {
>   auto Endpoint = std::make_unique<RemoteExecutorProcessControl::RPCEndpoint>(
>       *Channel, true);
> 
> -  EPC = std::make_unique<RemoteExecutorProcessControl>(ES, std::move(Channel),
> -                                                       std::move(Endpoint));
> +  OwnedEPC = std::make_unique<RemoteExecutorProcessControl>(
> +      std::move(Channel), std::move(Endpoint), std::move(ErrorReporter));
> 
> -  if (auto Err = EPC->initializeORCRPCEPCBase())
> -    return joinErrors(std::move(Err), EPC->disconnect());
> +  if (auto Err = OwnedEPC->initializeORCRPCEPCBase())
> +    return joinErrors(std::move(Err), OwnedEPC->disconnect());
> 
> -  EPC->initializeMemoryManagement();
> +  OwnedEPC->initializeMemoryManagement();
> +  EPC = OwnedEPC.get();
> 
>   shared::registerStringError<RPCChannel>();
>   return Error::success();
> @@ -305,7 +315,7 @@ static Expected<int> connectTCPSocketImpl(std::string Host,
> 
> Expected<std::unique_ptr<TCPSocketJITLinkExecutor>>
> JITLinkExecutor::ConnectTCPSocket(StringRef NetworkAddress,
> -                                  ExecutionSession &ES) {
> +                                  unique_function<void(Error)> ErrorReporter) {
>   auto CreateErr = [NetworkAddress](StringRef Details) {
>     return make_error<StringError>(
>         formatv("Failed to connect TCP socket '{0}': {1}", NetworkAddress,
> @@ -332,7 +342,7 @@ JITLinkExecutor::ConnectTCPSocket(StringRef NetworkAddress,
>       *Channel, true);
> 
>   auto EPC = std::make_unique<RemoteExecutorProcessControl>(
> -      ES, std::move(Channel), std::move(Endpoint));
> +      std::move(Channel), std::move(Endpoint), std::move(ErrorReporter));
> 
>   if (auto Err = EPC->initializeORCRPCEPCBase())
>     return joinErrors(std::move(Err), EPC->disconnect());
> 
> diff  --git a/llvm/examples/OrcV2Examples/LLJITWithRemoteDebugging/RemoteJITUtils.h b/llvm/examples/OrcV2Examples/LLJITWithRemoteDebugging/RemoteJITUtils.h
> index baa376003a67b..5b15b1e9964f7 100644
> --- a/llvm/examples/OrcV2Examples/LLJITWithRemoteDebugging/RemoteJITUtils.h
> +++ b/llvm/examples/OrcV2Examples/LLJITWithRemoteDebugging/RemoteJITUtils.h
> @@ -56,12 +56,16 @@ class JITLinkExecutor {
>   /// through a TCP socket. A valid NetworkAddress provides hostname and port,
>   /// e.g. localhost:20000.
>   static Expected<std::unique_ptr<TCPSocketJITLinkExecutor>>
> -  ConnectTCPSocket(StringRef NetworkAddress, ExecutionSession &ES);
> +  ConnectTCPSocket(StringRef NetworkAddress,
> +                   unique_function<void(Error)> ErrorReporter);
> 
>   // Implement ObjectLinkingLayerCreator
>   Expected<std::unique_ptr<ObjectLayer>> operator()(ExecutionSession &,
>                                                     const Triple &);
> 
> +  std::unique_ptr<ExecutionSession> startSession();
> +  Error disconnect();
> +
>   Error addDebugSupport(ObjectLayer &ObjLayer);
> 
>   Expected<std::unique_ptr<DefinitionGenerator>>
> @@ -69,12 +73,12 @@ class JITLinkExecutor {
> 
>   Expected<int> runAsMain(JITEvaluatedSymbol MainSym,
>                           ArrayRef<std::string> Args);
> -  Error disconnect();
> 
>   virtual ~JITLinkExecutor();
> 
> protected:
> -  std::unique_ptr<RemoteExecutorProcessControl> EPC;
> +  std::unique_ptr<RemoteExecutorProcessControl> OwnedEPC{nullptr};
> +  RemoteExecutorProcessControl *EPC{nullptr};
> 
>   JITLinkExecutor();
> };
> @@ -82,7 +86,7 @@ class JITLinkExecutor {
> /// JITLinkExecutor that runs in a child process on the local machine.
> class ChildProcessJITLinkExecutor : public JITLinkExecutor {
> public:
> -  Error launch(ExecutionSession &ES);
> +  Error launch(unique_function<void(Error)> ErrorReporter);
> 
>   pid_t getPID() const { return ProcessID; }
>   StringRef getPath() const { return ExecutablePath; }
> 
> diff  --git a/llvm/test/Examples/OrcV2Examples/lljit-with-remote-debugging.test b/llvm/test/Examples/OrcV2Examples/lljit-with-remote-debugging.test
> index a1ea7f9db1fd0..a09d72a76bef9 100644
> --- a/llvm/test/Examples/OrcV2Examples/lljit-with-remote-debugging.test
> +++ b/llvm/test/Examples/OrcV2Examples/lljit-with-remote-debugging.test
> @@ -1,10 +1,10 @@
> # This test makes sure that the example builds and executes as expected.
> # Instructions for debugging can be found in LLJITWithRemoteDebugging.cpp
> 
> -# RUN: LLJITWithRemoteDebugging %p/Inputs/argc_sub1_elf.ll | FileCheck --check-prefix=CHECK1 %s
> -# CHECK1: Parsing input IR code from: {{.*}}/Inputs/argc_sub1_elf.ll
> -# CHECK1: Running: main()
> -# CHECK1: Exit code: 0
> +# RUN: LLJITWithRemoteDebugging %p/Inputs/argc_sub1_elf.ll | FileCheck --check-prefix=CHECK0 %s
> +# CHECK0: Parsing input IR code from: {{.*}}/Inputs/argc_sub1_elf.ll
> +# CHECK0: Running: main()
> +# CHECK0: Exit code: 0
> 
> # RUN: LLJITWithRemoteDebugging %p/Inputs/argc_sub1_elf.ll --args 2nd 3rd 4th | FileCheck --check-prefix=CHECK3 %s
> # CHECK3: Parsing input IR code from: {{.*}}/Inputs/argc_sub1_elf.ll
> 
> diff  --git a/llvm/test/Examples/lit.local.cfg b/llvm/test/Examples/lit.local.cfg
> index f23a918956ba7..a9f3860333603 100644
> --- a/llvm/test/Examples/lit.local.cfg
> +++ b/llvm/test/Examples/lit.local.cfg
> @@ -1,7 +1,5 @@
> -#if not config.build_examples or sys.platform in ['win32']:
> -
> -# Mark both lljit-with-* tests unsupported until D104694 lands.
> -config.unsupported = True
> +if not config.build_examples or sys.platform in ['win32']:
> +  config.unsupported = True
> 
> # Test discovery should ignore subdirectories that contain test inputs.
> config.excludes = ['Inputs']
> 
> 
> 
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20210804/0c99995f/attachment.html>


More information about the llvm-commits mailing list