
Our code for locating the shared library directory works via dladdr (or the windows equivalent) to locate the path of an address known to reside in liblldb. This works great for C++ programs, but there's a catch. When (lib)lldb is used from python (like in our test suite), this dladdr call will return a path to the _lldb.so (or such) file in the python directory. To compensate for this, we have code which attempts to resolve this symlink, to ensure we get the canonical location. However, here's the second catch. On windows, this file is not a symlink (but a copy), so this logic fails. Since most of our other paths are derived from the liblldb location, all of these paths will be wrong, when running the test suite. One effect of this was the failure to find lldb-server in D96202. To fix this issue, I add some windows-specific code to locate the liblldb directory. Since it cannot rely on symlinks, it works by manually walking the directory tree -- essentially doing the opposite of what we do when computing the python directory. To avoid python leaking back into the host code, I implement this with the help of a callback which can be passed to HostInfo::Initialize in order to assist with the directory location. The callback lives inside the python plugin. I also strenghten the existing path test to ensure the returned path is the right one. Differential Revision: https://reviews.llvm.org/D96779
64 lines
2.2 KiB
C++
64 lines
2.2 KiB
C++
//===-- ScriptInterpreterPython.h -------------------------------*- 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
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef LLDB_PLUGINS_SCRIPTINTERPRETER_PYTHON_SCRIPTINTERPRETERPYTHON_H
|
|
#define LLDB_PLUGINS_SCRIPTINTERPRETER_PYTHON_SCRIPTINTERPRETERPYTHON_H
|
|
|
|
#include "lldb/Host/Config.h"
|
|
|
|
#if LLDB_ENABLE_PYTHON
|
|
|
|
#include "lldb/Breakpoint/BreakpointOptions.h"
|
|
#include "lldb/Core/IOHandler.h"
|
|
#include "lldb/Core/StructuredDataImpl.h"
|
|
#include "lldb/Interpreter/ScriptInterpreter.h"
|
|
#include "lldb/lldb-private.h"
|
|
|
|
#include <memory>
|
|
#include <string>
|
|
#include <vector>
|
|
|
|
namespace lldb_private {
|
|
/// Abstract interface for the Python script interpreter.
|
|
class ScriptInterpreterPython : public ScriptInterpreter,
|
|
public IOHandlerDelegateMultiline {
|
|
public:
|
|
class CommandDataPython : public BreakpointOptions::CommandData {
|
|
public:
|
|
CommandDataPython() : BreakpointOptions::CommandData() {
|
|
interpreter = lldb::eScriptLanguagePython;
|
|
}
|
|
CommandDataPython(StructuredData::ObjectSP extra_args_sp) :
|
|
BreakpointOptions::CommandData(),
|
|
m_extra_args_up(new StructuredDataImpl()) {
|
|
interpreter = lldb::eScriptLanguagePython;
|
|
m_extra_args_up->SetObjectSP(extra_args_sp);
|
|
}
|
|
lldb::StructuredDataImplUP m_extra_args_up;
|
|
};
|
|
|
|
ScriptInterpreterPython(Debugger &debugger)
|
|
: ScriptInterpreter(debugger, lldb::eScriptLanguagePython),
|
|
IOHandlerDelegateMultiline("DONE") {}
|
|
|
|
static void Initialize();
|
|
static void Terminate();
|
|
static lldb_private::ConstString GetPluginNameStatic();
|
|
static const char *GetPluginDescriptionStatic();
|
|
static FileSpec GetPythonDir();
|
|
static void SharedLibraryDirectoryHelper(FileSpec &this_file);
|
|
|
|
protected:
|
|
static void ComputePythonDirForApple(llvm::SmallVectorImpl<char> &path);
|
|
static void ComputePythonDir(llvm::SmallVectorImpl<char> &path);
|
|
};
|
|
} // namespace lldb_private
|
|
|
|
#endif // LLDB_ENABLE_PYTHON
|
|
#endif // LLDB_PLUGINS_SCRIPTINTERPRETER_PYTHON_SCRIPTINTERPRETERPYTHON_H
|