From 7d0500a0950532afcbee13cdbd19600bd2df38df Mon Sep 17 00:00:00 2001 From: Nerixyz Date: Thu, 20 Nov 2025 18:02:06 +0100 Subject: [PATCH] [LLDB] Add empty Microsoft ABI language runtime --- .../LanguageRuntime/CPlusPlus/CMakeLists.txt | 2 +- .../CPlusPlus/CPPLanguageRuntime.cpp | 7 ++ .../CPlusPlus/CPPLanguageRuntime.h | 2 + .../ItaniumABI/ItaniumABILanguageRuntime.cpp | 6 +- .../CPlusPlus/MicrosoftABI/CMakeLists.txt | 6 ++ .../MicrosoftABILanguageRuntime.cpp | 71 +++++++++++++++++++ .../MicrosoftABILanguageRuntime.h | 67 +++++++++++++++++ 7 files changed, 157 insertions(+), 4 deletions(-) create mode 100644 lldb/source/Plugins/LanguageRuntime/CPlusPlus/MicrosoftABI/CMakeLists.txt create mode 100644 lldb/source/Plugins/LanguageRuntime/CPlusPlus/MicrosoftABI/MicrosoftABILanguageRuntime.cpp create mode 100644 lldb/source/Plugins/LanguageRuntime/CPlusPlus/MicrosoftABI/MicrosoftABILanguageRuntime.h diff --git a/lldb/source/Plugins/LanguageRuntime/CPlusPlus/CMakeLists.txt b/lldb/source/Plugins/LanguageRuntime/CPlusPlus/CMakeLists.txt index 727c8290bceb4..699d028151f86 100644 --- a/lldb/source/Plugins/LanguageRuntime/CPlusPlus/CMakeLists.txt +++ b/lldb/source/Plugins/LanguageRuntime/CPlusPlus/CMakeLists.txt @@ -11,4 +11,4 @@ add_lldb_library(lldbPluginCPPRuntime ) add_subdirectory(ItaniumABI) -#add_subdirectory(MicrosoftABI) +add_subdirectory(MicrosoftABI) diff --git a/lldb/source/Plugins/LanguageRuntime/CPlusPlus/CPPLanguageRuntime.cpp b/lldb/source/Plugins/LanguageRuntime/CPlusPlus/CPPLanguageRuntime.cpp index 913678b629f2f..074af4202e658 100644 --- a/lldb/source/Plugins/LanguageRuntime/CPlusPlus/CPPLanguageRuntime.cpp +++ b/lldb/source/Plugins/LanguageRuntime/CPlusPlus/CPPLanguageRuntime.cpp @@ -491,3 +491,10 @@ bool CPPLanguageRuntime::IsSymbolARuntimeThunk(const Symbol &symbol) { return mangled_name.starts_with("_ZTh") || mangled_name.starts_with("_ZTv") || mangled_name.starts_with("_ZTc"); } + +bool CPPLanguageRuntime::ShouldUseMicrosoftABI(Process *process) { + return process->GetTarget() + .GetArchitecture() + .GetTriple() + .isWindowsMSVCEnvironment(); +} diff --git a/lldb/source/Plugins/LanguageRuntime/CPlusPlus/CPPLanguageRuntime.h b/lldb/source/Plugins/LanguageRuntime/CPlusPlus/CPPLanguageRuntime.h index 05639e9798917..fc1dd7d249212 100644 --- a/lldb/source/Plugins/LanguageRuntime/CPlusPlus/CPPLanguageRuntime.h +++ b/lldb/source/Plugins/LanguageRuntime/CPlusPlus/CPPLanguageRuntime.h @@ -81,6 +81,8 @@ class CPPLanguageRuntime : public LanguageRuntime { bool IsSymbolARuntimeThunk(const Symbol &symbol) override; + static bool ShouldUseMicrosoftABI(Process *process); + protected: // Classes that inherit from CPPLanguageRuntime can see and modify these CPPLanguageRuntime(Process *process); diff --git a/lldb/source/Plugins/LanguageRuntime/CPlusPlus/ItaniumABI/ItaniumABILanguageRuntime.cpp b/lldb/source/Plugins/LanguageRuntime/CPlusPlus/ItaniumABI/ItaniumABILanguageRuntime.cpp index 75b00518aac53..cc810c0c837a0 100644 --- a/lldb/source/Plugins/LanguageRuntime/CPlusPlus/ItaniumABI/ItaniumABILanguageRuntime.cpp +++ b/lldb/source/Plugins/LanguageRuntime/CPlusPlus/ItaniumABI/ItaniumABILanguageRuntime.cpp @@ -397,9 +397,9 @@ TypeAndOrName ItaniumABILanguageRuntime::FixUpDynamicType( LanguageRuntime * ItaniumABILanguageRuntime::CreateInstance(Process *process, lldb::LanguageType language) { - // FIXME: We have to check the process and make sure we actually know that - // this process supports - // the Itanium ABI. + if (ShouldUseMicrosoftABI(process)) + return nullptr; + if (language == eLanguageTypeC_plus_plus || language == eLanguageTypeC_plus_plus_03 || language == eLanguageTypeC_plus_plus_11 || diff --git a/lldb/source/Plugins/LanguageRuntime/CPlusPlus/MicrosoftABI/CMakeLists.txt b/lldb/source/Plugins/LanguageRuntime/CPlusPlus/MicrosoftABI/CMakeLists.txt new file mode 100644 index 0000000000000..21e75d3d5b099 --- /dev/null +++ b/lldb/source/Plugins/LanguageRuntime/CPlusPlus/MicrosoftABI/CMakeLists.txt @@ -0,0 +1,6 @@ +add_lldb_library(lldbPluginCXXMicrosoftABI PLUGIN + MicrosoftABILanguageRuntime.cpp + + LINK_LIBS + lldbPluginCPPRuntime +) diff --git a/lldb/source/Plugins/LanguageRuntime/CPlusPlus/MicrosoftABI/MicrosoftABILanguageRuntime.cpp b/lldb/source/Plugins/LanguageRuntime/CPlusPlus/MicrosoftABI/MicrosoftABILanguageRuntime.cpp new file mode 100644 index 0000000000000..bc45b3016a3fe --- /dev/null +++ b/lldb/source/Plugins/LanguageRuntime/CPlusPlus/MicrosoftABI/MicrosoftABILanguageRuntime.cpp @@ -0,0 +1,71 @@ +//===----------------------------------------------------------------------===// +// +// 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 "MicrosoftABILanguageRuntime.h" + +#include "lldb/Core/PluginManager.h" +#include "lldb/Target/Process.h" + +using namespace lldb; +using namespace lldb_private; + +LLDB_PLUGIN_DEFINE_ADV(MicrosoftABILanguageRuntime, CXXMicrosoftABI) + +char MicrosoftABILanguageRuntime::ID = 0; + +void MicrosoftABILanguageRuntime::Initialize() { + PluginManager::RegisterPlugin(GetPluginNameStatic(), + "Microsoft ABI for the C++ language", + CreateInstance); +} + +void MicrosoftABILanguageRuntime::Terminate() { + PluginManager::UnregisterPlugin(CreateInstance); +} + +LanguageRuntime * +MicrosoftABILanguageRuntime::CreateInstance(Process *process, + lldb::LanguageType language) { + if (!ShouldUseMicrosoftABI(process)) + return nullptr; + + if (!(language == eLanguageTypeC_plus_plus || + language == eLanguageTypeC_plus_plus_03 || + language == eLanguageTypeC_plus_plus_11 || + language == eLanguageTypeC_plus_plus_14)) + return nullptr; + + return new MicrosoftABILanguageRuntime(process); +} + +llvm::Expected +MicrosoftABILanguageRuntime::GetVTableInfo(ValueObject &in_value, + bool check_type) { + return llvm::createStringError("Not implemented"); +} + +bool MicrosoftABILanguageRuntime::GetDynamicTypeAndAddress( + ValueObject &in_value, lldb::DynamicValueType use_dynamic, + TypeAndOrName &class_type_or_name, Address &address, + Value::ValueType &value_type, llvm::ArrayRef &local_buffer) { + return false; +} + +TypeAndOrName MicrosoftABILanguageRuntime::FixUpDynamicType( + const TypeAndOrName &type_and_or_name, ValueObject &static_value) { + return type_and_or_name; +} + +bool MicrosoftABILanguageRuntime::CouldHaveDynamicValue(ValueObject &in_value) { + return false; +} + +lldb::BreakpointResolverSP MicrosoftABILanguageRuntime::CreateExceptionResolver( + const lldb::BreakpointSP &bkpt, bool catch_bp, bool throw_bp) { + return nullptr; +} diff --git a/lldb/source/Plugins/LanguageRuntime/CPlusPlus/MicrosoftABI/MicrosoftABILanguageRuntime.h b/lldb/source/Plugins/LanguageRuntime/CPlusPlus/MicrosoftABI/MicrosoftABILanguageRuntime.h new file mode 100644 index 0000000000000..20555f9855ec3 --- /dev/null +++ b/lldb/source/Plugins/LanguageRuntime/CPlusPlus/MicrosoftABI/MicrosoftABILanguageRuntime.h @@ -0,0 +1,67 @@ +//===----------------------------------------------------------------------===// +// +// 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_MICROSOFTABI_MICROSOFTABILANGUAGERUNTIME_H +#define LLDB_SOURCE_PLUGINS_LANGUAGERUNTIME_CPLUSPLUS_MICROSOFTABI_MICROSOFTABILANGUAGERUNTIME_H + +#include "lldb/Core/Value.h" +#include "lldb/Symbol/Type.h" +#include "lldb/Target/LanguageRuntime.h" + +#include "Plugins/LanguageRuntime/CPlusPlus/CPPLanguageRuntime.h" + +namespace lldb_private { + +class MicrosoftABILanguageRuntime : public CPPLanguageRuntime { +public: + static void Initialize(); + + static void Terminate(); + + static lldb_private::LanguageRuntime * + CreateInstance(Process *process, lldb::LanguageType language); + + static llvm::StringRef GetPluginNameStatic() { return "microsoft-abi"; } + + static char ID; + + bool isA(const void *ClassID) const override { + return ClassID == &ID || CPPLanguageRuntime::isA(ClassID); + } + + static bool classof(const LanguageRuntime *runtime) { + return runtime->isA(&ID); + } + + llvm::Expected + GetVTableInfo(ValueObject &in_value, bool check_type) override; + + bool GetDynamicTypeAndAddress(ValueObject &in_value, + lldb::DynamicValueType use_dynamic, + TypeAndOrName &class_type_or_name, + Address &address, Value::ValueType &value_type, + llvm::ArrayRef &local_buffer) override; + + TypeAndOrName FixUpDynamicType(const TypeAndOrName &type_and_or_name, + ValueObject &static_value) override; + + bool CouldHaveDynamicValue(ValueObject &in_value) override; + + llvm::StringRef GetPluginName() override { return GetPluginNameStatic(); } + + lldb::BreakpointResolverSP + CreateExceptionResolver(const lldb::BreakpointSP &bkpt, bool catch_bp, + bool throw_bp) override; + +private: + MicrosoftABILanguageRuntime(Process *process) : CPPLanguageRuntime(process) {} +}; + +} // namespace lldb_private + +#endif