Performance issues lead to the libc++ std::function formatter to be disabled. This change is the first of two changes that should address the performance issues and allow us to enable the formatter again. In some cases we end up scanning the symbol table for the callable wrapped by std::function for those cases we will now cache the results and used the cache in subsequent look-ups. This still leaves a large cost for the initial lookup which will be addressed in the next change. Differential Revision: https://reviews.llvm.org/D67111
99 lines
2.8 KiB
C++
99 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 liblldb_CPPLanguageRuntime_h_
|
|
#define liblldb_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);
|
|
|
|
~CPPLanguageRuntime() override;
|
|
|
|
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
|
|
/// Curent 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 IsWhitelistedRuntimeValue(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;
|
|
|
|
DISALLOW_COPY_AND_ASSIGN(CPPLanguageRuntime);
|
|
};
|
|
|
|
} // namespace lldb_private
|
|
|
|
#endif // liblldb_CPPLanguageRuntime_h_
|