This is a polymorphic class, copying it is a bad idea. This was not a problem because most classes inheriting from it were deleting their copy operations themselves. However, this enables us to delete those explicit deletions, and ensure noone forgets to add them in the future.
95 lines
2.8 KiB
C++
95 lines
2.8 KiB
C++
//===-- CPPLanguageRuntime.h
|
|
//
|
|
// 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_SOURCE_PLUGINS_LANGUAGERUNTIME_CPLUSPLUS_CPPLANGUAGERUNTIME_H
|
|
#define LLDB_SOURCE_PLUGINS_LANGUAGERUNTIME_CPLUSPLUS_CPPLANGUAGERUNTIME_H
|
|
|
|
#include <vector>
|
|
|
|
#include "llvm/ADT/StringMap.h"
|
|
|
|
#include "lldb/Core/PluginInterface.h"
|
|
#include "lldb/Target/LanguageRuntime.h"
|
|
#include "lldb/lldb-private.h"
|
|
|
|
namespace lldb_private {
|
|
|
|
class CPPLanguageRuntime : public LanguageRuntime {
|
|
public:
|
|
enum class LibCppStdFunctionCallableCase {
|
|
Lambda = 0,
|
|
CallableObject,
|
|
FreeOrMemberFunction,
|
|
Invalid
|
|
};
|
|
|
|
struct LibCppStdFunctionCallableInfo {
|
|
Symbol callable_symbol;
|
|
Address callable_address;
|
|
LineEntry callable_line_entry;
|
|
lldb::addr_t member__f_pointer_value = 0u;
|
|
LibCppStdFunctionCallableCase callable_case =
|
|
LibCppStdFunctionCallableCase::Invalid;
|
|
};
|
|
|
|
LibCppStdFunctionCallableInfo
|
|
FindLibCppStdFunctionCallableInfo(lldb::ValueObjectSP &valobj_sp);
|
|
|
|
static char ID;
|
|
|
|
bool isA(const void *ClassID) const override {
|
|
return ClassID == &ID || LanguageRuntime::isA(ClassID);
|
|
}
|
|
|
|
static bool classof(const LanguageRuntime *runtime) {
|
|
return runtime->isA(&ID);
|
|
}
|
|
|
|
lldb::LanguageType GetLanguageType() const override {
|
|
return lldb::eLanguageTypeC_plus_plus;
|
|
}
|
|
|
|
static CPPLanguageRuntime *Get(Process &process) {
|
|
return llvm::cast_or_null<CPPLanguageRuntime>(
|
|
process.GetLanguageRuntime(lldb::eLanguageTypeC_plus_plus));
|
|
}
|
|
|
|
bool GetObjectDescription(Stream &str, ValueObject &object) override;
|
|
|
|
bool GetObjectDescription(Stream &str, Value &value,
|
|
ExecutionContextScope *exe_scope) override;
|
|
|
|
/// Obtain a ThreadPlan to get us into C++ constructs such as std::function.
|
|
///
|
|
/// \param[in] thread
|
|
/// Current thrad of execution.
|
|
///
|
|
/// \param[in] stop_others
|
|
/// True if other threads should pause during execution.
|
|
///
|
|
/// \return
|
|
/// A ThreadPlan Shared pointer
|
|
lldb::ThreadPlanSP GetStepThroughTrampolinePlan(Thread &thread,
|
|
bool stop_others) override;
|
|
|
|
bool IsAllowedRuntimeValue(ConstString name) override;
|
|
protected:
|
|
// Classes that inherit from CPPLanguageRuntime can see and modify these
|
|
CPPLanguageRuntime(Process *process);
|
|
|
|
private:
|
|
using OperatorStringToCallableInfoMap =
|
|
llvm::StringMap<CPPLanguageRuntime::LibCppStdFunctionCallableInfo>;
|
|
|
|
OperatorStringToCallableInfoMap CallableLookupCache;
|
|
};
|
|
|
|
} // namespace lldb_private
|
|
|
|
#endif // LLDB_SOURCE_PLUGINS_LANGUAGERUNTIME_CPLUSPLUS_CPPLANGUAGERUNTIME_H
|