diff --git a/clang/lib/Interpreter/IncrementalExecutor.cpp b/clang/lib/Interpreter/IncrementalExecutor.cpp index 2692d0618b864..2c4dfc9a611e0 100644 --- a/clang/lib/Interpreter/IncrementalExecutor.cpp +++ b/clang/lib/Interpreter/IncrementalExecutor.cpp @@ -17,7 +17,6 @@ #include "clang/Interpreter/PartialTranslationUnit.h" #include "llvm/ExecutionEngine/ExecutionEngine.h" #include "llvm/ExecutionEngine/Orc/CompileUtils.h" -#include "llvm/ExecutionEngine/Orc/DebuggerSupport.h" #include "llvm/ExecutionEngine/Orc/ExecutionUtils.h" #include "llvm/ExecutionEngine/Orc/IRCompileLayer.h" #include "llvm/ExecutionEngine/Orc/LLJIT.h" @@ -47,13 +46,8 @@ IncrementalExecutor::IncrementalExecutor(llvm::orc::ThreadSafeContext &TSC, JTMB.addFeatures(TI.getTargetOpts().Features); LLJITBuilder Builder; Builder.setJITTargetMachineBuilder(JTMB); - Builder.setPrePlatformSetup( - [](LLJIT &J) { - // Try to enable debugging of JIT'd code (only works with JITLink for - // ELF and MachO). - consumeError(enableDebuggerSupport(J)); - return llvm::Error::success(); - }); + // Enable debugging of JIT'd code (only works on JITLink for ELF and MachO). + Builder.setEnableDebuggerSupport(true); if (auto JitOrErr = Builder.create()) Jit = std::move(*JitOrErr); diff --git a/clang/tools/clang-repl/ClangRepl.cpp b/clang/tools/clang-repl/ClangRepl.cpp index a29a2ebac434a..51741fd1a27ef 100644 --- a/clang/tools/clang-repl/ClangRepl.cpp +++ b/clang/tools/clang-repl/ClangRepl.cpp @@ -152,7 +152,9 @@ int main(int argc, const char **argv) { llvm::InitializeAllAsmPrinters(); if (OptHostSupportsJit) { - auto J = llvm::orc::LLJITBuilder().create(); + auto J = llvm::orc::LLJITBuilder() + .setEnableDebuggerSupport(true) + .create(); if (J) llvm::outs() << "true\n"; else { diff --git a/clang/unittests/Interpreter/ExceptionTests/InterpreterExceptionTest.cpp b/clang/unittests/Interpreter/ExceptionTests/InterpreterExceptionTest.cpp index 70e10b1e53bd9..8700f506d9b17 100644 --- a/clang/unittests/Interpreter/ExceptionTests/InterpreterExceptionTest.cpp +++ b/clang/unittests/Interpreter/ExceptionTests/InterpreterExceptionTest.cpp @@ -52,7 +52,9 @@ TEST(InterpreterTest, CatchException) { llvm::InitializeNativeTargetAsmPrinter(); { - auto J = llvm::orc::LLJITBuilder().create(); + auto J = llvm::orc::LLJITBuilder() + .setEnableDebuggerSupport(true) + .create(); if (!J) { // The platform does not support JITs. // Using llvm::consumeError will require typeinfo for ErrorInfoBase, we diff --git a/clang/unittests/Interpreter/InterpreterTest.cpp b/clang/unittests/Interpreter/InterpreterTest.cpp index 5f2911e9a7ada..62e5bacbdd0b6 100644 --- a/clang/unittests/Interpreter/InterpreterTest.cpp +++ b/clang/unittests/Interpreter/InterpreterTest.cpp @@ -191,7 +191,9 @@ static std::string MangleName(NamedDecl *ND) { } static bool HostSupportsJit() { - auto J = llvm::orc::LLJITBuilder().create(); + auto J = llvm::orc::LLJITBuilder() + .setEnableDebuggerSupport(true) + .create(); if (J) return true; LLVMConsumeError(llvm::wrap(J.takeError())); diff --git a/llvm/include/llvm/ExecutionEngine/Orc/DebuggerSupport.h b/llvm/include/llvm/ExecutionEngine/Orc/DebuggerSupport.h deleted file mode 100644 index 1b47d7d41bb9b..0000000000000 --- a/llvm/include/llvm/ExecutionEngine/Orc/DebuggerSupport.h +++ /dev/null @@ -1,28 +0,0 @@ -//===-- DebugerSupport.h - Utils for enabling debugger support --*- C++ -*-===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// -// -// Utilities for enabling debugger support. -// -//===----------------------------------------------------------------------===// - -#ifndef LLVM_EXECUTIONENGINE_ORC_DEBUGGERSUPPORT_H -#define LLVM_EXECUTIONENGINE_ORC_DEBUGGERSUPPORT_H - -#include "llvm/Support/Error.h" - -namespace llvm { -namespace orc { - -class LLJIT; - -Error enableDebuggerSupport(LLJIT &J); - -} // namespace orc -} // namespace llvm - -#endif // LLVM_EXECUTIONENGINE_ORC_DEBUGGERSUPPORT_H diff --git a/llvm/include/llvm/ExecutionEngine/Orc/LLJIT.h b/llvm/include/llvm/ExecutionEngine/Orc/LLJIT.h index 8ab8ff8a0034b..415ec7228f058 100644 --- a/llvm/include/llvm/ExecutionEngine/Orc/LLJIT.h +++ b/llvm/include/llvm/ExecutionEngine/Orc/LLJIT.h @@ -322,6 +322,7 @@ class LLJITBuilderState { unique_function PrePlatformSetup; PlatformSetupFunction SetUpPlatform; unsigned NumCompileThreads = 0; + bool EnableDebuggerSupport = false; /// Called prior to JIT class construcion to fix up defaults. Error prepareForConstruction(); @@ -454,6 +455,12 @@ class LLJITBuilderSetters { return impl(); } + /// Enable / disable debugger support (off by default). + SetterImpl &setEnableDebuggerSupport(bool EnableDebuggerSupport) { + impl().EnableDebuggerSupport = EnableDebuggerSupport; + return impl(); + } + /// Set an ExecutorProcessControl object. /// /// If the platform uses ObjectLinkingLayer by default and no diff --git a/llvm/lib/ExecutionEngine/Orc/CMakeLists.txt b/llvm/lib/ExecutionEngine/Orc/CMakeLists.txt index 5956a898de125..3256ed8b7362c 100644 --- a/llvm/lib/ExecutionEngine/Orc/CMakeLists.txt +++ b/llvm/lib/ExecutionEngine/Orc/CMakeLists.txt @@ -13,7 +13,6 @@ add_llvm_component_library(LLVMOrcJIT CompileUtils.cpp Core.cpp DebugObjectManagerPlugin.cpp - DebuggerSupport.cpp DebuggerSupportPlugin.cpp DebugUtils.cpp EPCDynamicLibrarySearchGenerator.cpp diff --git a/llvm/lib/ExecutionEngine/Orc/DebuggerSupport.cpp b/llvm/lib/ExecutionEngine/Orc/DebuggerSupport.cpp deleted file mode 100644 index 68d68f07b5862..0000000000000 --- a/llvm/lib/ExecutionEngine/Orc/DebuggerSupport.cpp +++ /dev/null @@ -1,61 +0,0 @@ -//===------ DebuggerSupport.cpp - Utils for enabling debugger support -----===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -#include "llvm/ExecutionEngine/Orc/DebuggerSupport.h" -#include "llvm/ExecutionEngine/Orc/DebugObjectManagerPlugin.h" -#include "llvm/ExecutionEngine/Orc/DebuggerSupportPlugin.h" -#include "llvm/ExecutionEngine/Orc/LLJIT.h" - -#define DEBUG_TYPE "orc" - -using namespace llvm; -using namespace llvm::orc; - -namespace llvm::orc { - -Error enableDebuggerSupport(LLJIT &J) { - auto *ObjLinkingLayer = dyn_cast(&J.getObjLinkingLayer()); - if (!ObjLinkingLayer) - return make_error("Cannot enable LLJIT debugger support: " - "Debugger support requires JITLink", - inconvertibleErrorCode()); - auto ProcessSymsJD = J.getProcessSymbolsJITDylib(); - if (!ProcessSymsJD) - return make_error("Cannot enable LLJIT debugger support: " - "Process symbols are not available", - inconvertibleErrorCode()); - - auto &ES = J.getExecutionSession(); - const auto &TT = J.getTargetTriple(); - - switch (TT.getObjectFormat()) { - case Triple::ELF: { - auto Registrar = createJITLoaderGDBRegistrar(ES); - if (!Registrar) - return Registrar.takeError(); - ObjLinkingLayer->addPlugin(std::make_unique( - ES, std::move(*Registrar), true, true)); - return Error::success(); - } - case Triple::MachO: { - auto DS = GDBJITDebugInfoRegistrationPlugin::Create(ES, *ProcessSymsJD, TT); - if (!DS) - return DS.takeError(); - ObjLinkingLayer->addPlugin(std::move(*DS)); - return Error::success(); - } - default: - return make_error( - "Cannot enable LLJIT debugger support: " + - Triple::getObjectFormatTypeName(TT.getObjectFormat()) + - " is not supported", - inconvertibleErrorCode()); - } -} - -} // namespace llvm::orc diff --git a/llvm/lib/ExecutionEngine/Orc/LLJIT.cpp b/llvm/lib/ExecutionEngine/Orc/LLJIT.cpp index 1a4251353e2da..01ce7a4c64ec1 100644 --- a/llvm/lib/ExecutionEngine/Orc/LLJIT.cpp +++ b/llvm/lib/ExecutionEngine/Orc/LLJIT.cpp @@ -10,6 +10,8 @@ #include "llvm/ExecutionEngine/JITLink/EHFrameSupport.h" #include "llvm/ExecutionEngine/JITLink/JITLinkMemoryManager.h" #include "llvm/ExecutionEngine/Orc/COFFPlatform.h" +#include "llvm/ExecutionEngine/Orc/DebugObjectManagerPlugin.h" +#include "llvm/ExecutionEngine/Orc/DebuggerSupportPlugin.h" #include "llvm/ExecutionEngine/Orc/ELFNixPlatform.h" #include "llvm/ExecutionEngine/Orc/EPCDynamicLibrarySearchGenerator.h" #include "llvm/ExecutionEngine/Orc/EPCEHFrameRegistrar.h" @@ -779,8 +781,18 @@ Error LLJITBuilderState::prepareForConstruction() { // If we need a process JITDylib but no setup function has been given then // create a default one. - if (!SetupProcessSymbolsJITDylib && LinkProcessSymbolsByDefault) { - LLVM_DEBUG(dbgs() << "Creating default Process JD setup function\n"); + if (!SetupProcessSymbolsJITDylib && + (LinkProcessSymbolsByDefault || EnableDebuggerSupport)) { + + LLVM_DEBUG({ + dbgs() << "Creating default Process JD setup function (neeeded for"; + if (LinkProcessSymbolsByDefault) + dbgs() << " "; + if (EnableDebuggerSupport) + dbgs() << " "; + dbgs() << ")\n"; + }); + SetupProcessSymbolsJITDylib = [this](LLJIT &J) -> Expected { auto &JD = J.getExecutionSession().createBareJITDylib(""); @@ -1002,6 +1014,46 @@ LLJIT::LLJIT(LLJITBuilderState &S, Error &Err) } } + if (S.EnableDebuggerSupport) { + if (auto *OLL = dyn_cast(ObjLinkingLayer.get())) { + switch (TT.getObjectFormat()) { + case Triple::ELF: { + auto Registrar = createJITLoaderGDBRegistrar(*ES); + if (!Registrar) { + Err = Registrar.takeError(); + return; + } + OLL->addPlugin(std::make_unique( + *ES, std::move(*Registrar), true, true)); + break; + } + case Triple::MachO: { + assert(ProcessSymbols && "ProcessSymbols JD should be available when " + "EnableDebuggerSupport is set"); + auto DS = + GDBJITDebugInfoRegistrationPlugin::Create(*ES, *ProcessSymbols, TT); + if (!DS) { + Err = DS.takeError(); + return; + } + OLL->addPlugin(std::move(*DS)); + break; + } + default: + LLVM_DEBUG({ + dbgs() << "Cannot enable LLJIT debugger support: " + << Triple::getObjectFormatTypeName(TT.getObjectFormat()) + << " not supported.\n"; + }); + } + } else { + LLVM_DEBUG({ + dbgs() << "Cannot enable LLJIT debugger support: " + " debugger support is only available when using JITLink.\n"; + }); + } + } + if (S.PrePlatformSetup) { if (auto Err2 = S.PrePlatformSetup(*this)) { Err = std::move(Err2); diff --git a/llvm/tools/lli/lli.cpp b/llvm/tools/lli/lli.cpp index abe1c7556699b..360ffa628a47b 100644 --- a/llvm/tools/lli/lli.cpp +++ b/llvm/tools/lli/lli.cpp @@ -26,7 +26,6 @@ #include "llvm/ExecutionEngine/MCJIT.h" #include "llvm/ExecutionEngine/ObjectCache.h" #include "llvm/ExecutionEngine/Orc/DebugUtils.h" -#include "llvm/ExecutionEngine/Orc/DebuggerSupport.h" #include "llvm/ExecutionEngine/Orc/EPCDynamicLibrarySearchGenerator.h" #include "llvm/ExecutionEngine/Orc/EPCEHFrameRegistrar.h" #include "llvm/ExecutionEngine/Orc/EPCGenericRTDyldMemoryManager.h" @@ -845,17 +844,6 @@ int mingw_noop_main(void) { return 0; } -// Try to enable debugger support for the given instance. -// This alway returns success, but prints a warning if it's not able to enable -// debugger support. -Error tryEnableDebugSupport(orc::LLJIT &J) { - if (auto Err = enableDebuggerSupport(J)) { - [[maybe_unused]] std::string ErrMsg = toString(std::move(Err)); - LLVM_DEBUG(dbgs() << "lli: " << ErrMsg << "\n"); - } - return Error::success(); -} - int runOrcJIT(const char *ProgName) { // Start setting up the JIT environment. @@ -936,9 +924,6 @@ int runOrcJIT(const char *ProgName) { }); } - // Enable debugging of JIT'd code (only works on JITLink for ELF and MachO). - Builder.setPrePlatformSetup(tryEnableDebugSupport); - // Set up LLJIT platform. LLJITPlatform P = Platform; if (P == LLJITPlatform::Auto) @@ -975,6 +960,9 @@ int runOrcJIT(const char *ProgName) { }); } + // Enable debugging of JIT'd code (only works on JITLink for ELF and MachO). + Builder.setEnableDebuggerSupport(true); + auto J = ExitOnErr(Builder.create()); auto *ObjLayer = &J->getObjLinkingLayer();