66//
77// ===----------------------------------------------------------------------===//
88
9+ #include " clang/Basic/ABI.h"
10+ #include " llvm/Demangle/Demangle.h"
911#include " llvm/ExecutionEngine/ExecutionEngine.h"
1012#include " llvm/ExecutionEngine/ObjectCache.h"
1113#include " llvm/IR/Constants.h"
1214#include " llvm/IR/DiagnosticHandler.h"
1315#include " llvm/IR/DiagnosticInfo.h"
1416#include " llvm/IR/LLVMContext.h"
1517#include " llvm/IR/Module.h"
18+ #include " llvm/Support/ErrorHandling.h"
1619#include " llvm/Support/SourceMgr.h"
1720#include " llvm/Support/raw_ostream.h"
1821
22+ #include " Plugins/SymbolFile/DWARF/DWARFBaseDIE.h"
23+ #include " Plugins/SymbolFile/DWARF/DWARFDIE.h"
24+ #include " Plugins/SymbolFile/DWARF/SymbolFileDWARF.h"
25+
1926#include " lldb/Core/Debugger.h"
2027#include " lldb/Core/Disassembler.h"
2128#include " lldb/Core/Module.h"
3643#include " lldb/Utility/LLDBAssert.h"
3744#include " lldb/Utility/LLDBLog.h"
3845#include " lldb/Utility/Log.h"
46+ #include " lldb/lldb-defines.h"
3947
4048#include < optional>
49+ #include < variant>
4150
4251using namespace lldb_private ;
4352
@@ -762,6 +771,120 @@ class LoadAddressResolver {
762771 lldb::addr_t m_best_internal_load_address = LLDB_INVALID_ADDRESS;
763772};
764773
774+ using namespace lldb_private ::plugin::dwarf;
775+
776+ struct StructorVariant {
777+ std::variant<clang::CXXCtorType, clang::CXXDtorType> m_variant;
778+ };
779+
780+ static llvm::Expected<StructorVariant>
781+ MakeStructorVariant (llvm::StringRef variant_num) {
782+ if (variant_num.consume_front (" D" )) {
783+ std::underlying_type_t <clang::CXXDtorType> dtor_type;
784+ if (variant_num.consumeInteger (10 , dtor_type))
785+ return llvm::createStringError (" Invalid ctor variant code." );
786+
787+ return StructorVariant{.m_variant =
788+ static_cast <clang::CXXDtorType>(dtor_type)};
789+ }
790+
791+ if (variant_num.consume_front (" C" )) {
792+ std::underlying_type_t <clang::CXXCtorType> ctor_type;
793+ if (variant_num.consumeInteger (10 , ctor_type))
794+ return llvm::createStringError (" Invalid dtor variant code." );
795+
796+ return StructorVariant{.m_variant =
797+ static_cast <clang::CXXCtorType>(ctor_type)};
798+ }
799+
800+ return llvm::createStringError (" Incorrect structor variant prefix." );
801+ }
802+
803+ static int GetItaniumVariantCode (StructorVariant structor) {
804+ if (auto const *ctor = std::get_if<clang::CXXCtorType>(&structor.m_variant )) {
805+ switch (*ctor) {
806+ case clang::CXXCtorType::Ctor_Complete:
807+ return 1 ;
808+ case clang::CXXCtorType::Ctor_Base:
809+ return 2 ;
810+ default :
811+ llvm_unreachable (" Unimplemented" );
812+ }
813+ } else {
814+ switch (std::get<clang::CXXDtorType>(structor.m_variant )) {
815+ case clang::CXXDtorType::Dtor_Complete:
816+ return 1 ;
817+ case clang::CXXDtorType::Dtor_Base:
818+ return 2 ;
819+ default :
820+ llvm_unreachable (" Unimplemented" );
821+ }
822+ }
823+ }
824+
825+ // TODO:
826+ // 1. MS-ABI
827+ // 2. GCC-style dtor/ctor declarations
828+ // 3. Inheriting ctors
829+ // 4. Regular functions
830+ static std::string FindStructorLinkageName (DWARFDIE die,
831+ StructorVariant structor_variant) {
832+ auto *dwarf = die.GetDWARF ();
833+ assert (dwarf);
834+
835+ // Note, GCC only puts DW_AT_linkage_name (not DW_AT_name) on constructor
836+ // decls Will those cases still work?
837+ ConstString func_name (die.GetName ());
838+ assert (func_name);
839+
840+ SymbolContextList sc_list;
841+ Module::LookupInfo lookup_info (
842+ func_name,
843+ lldb::FunctionNameType::eFunctionNameTypeMethod |
844+ lldb::FunctionNameType::eFunctionNameTypeFull,
845+ lldb::LanguageType::eLanguageTypeUnknown);
846+ dwarf->FindFunctions (lookup_info, {}, true , sc_list);
847+
848+ llvm::DenseMap<int , std::string> variants;
849+
850+ for (auto const &sc : sc_list.SymbolContexts ()) {
851+ if (!sc.function )
852+ continue ;
853+
854+ auto func_die = dwarf->GetDIE (sc.function ->GetID ());
855+ if (!func_die.IsValid ())
856+ continue ;
857+
858+ auto spec_die = func_die.GetAttributeValueAsReferenceDIE (
859+ llvm::dwarf::DW_AT_specification);
860+ if (!spec_die.IsValid () || spec_die != die)
861+ continue ;
862+
863+ llvm::ItaniumPartialDemangler D;
864+ if (D.partialDemangle (func_die.GetMangledName ()))
865+ continue ;
866+
867+ const auto maybe_structor_kind = D.getCtorDtorVariant ();
868+ // TODO: this need not be true
869+ assert (maybe_structor_kind);
870+
871+ variants.insert ({*maybe_structor_kind, func_die.GetMangledName ()});
872+ }
873+
874+ auto itanium_code = GetItaniumVariantCode (structor_variant);
875+ auto it = variants.find (itanium_code);
876+ if (it != variants.end ())
877+ return it->second ;
878+
879+ // If only C2 was emitted but we tried calling C1,
880+ // we can probably (?) safely call C2.
881+ if (itanium_code == 1 && variants.size () == 1 )
882+ if (auto retry = variants.find (2 ); retry != variants.end ())
883+ return retry->second ;
884+
885+ return {};
886+ }
887+
765888lldb::addr_t
766889IRExecutionUnit::FindInSymbols (const std::vector<ConstString> &names,
767890 const lldb_private::SymbolContext &sc,
@@ -781,6 +904,64 @@ IRExecutionUnit::FindInSymbols(const std::vector<ConstString> &names,
781904 function_options.include_inlines = false ;
782905
783906 for (const ConstString &name : names) {
907+ auto ref = name.GetStringRef ();
908+ if (ref.consume_front (" $__lldb_func_" )) {
909+ uintptr_t module_ptr;
910+ if (ref.consumeInteger (0 , module_ptr))
911+ return LLDB_INVALID_ADDRESS;
912+
913+ if (module_ptr == 0 ) {
914+ // TODO: log this case. We should ever be putting a null module pointer
915+ // here
916+ return LLDB_INVALID_ADDRESS;
917+ }
918+
919+ auto *mod = (lldb_private::Module *)module_ptr;
920+ assert (mod);
921+ auto *sym = mod->GetSymbolFile ();
922+ assert (sym);
923+
924+ if (!ref.consume_front (" :" ))
925+ return LLDB_INVALID_ADDRESS;
926+
927+ lldb::user_id_t die_id;
928+ if (ref.consumeInteger (10 , die_id))
929+ return LLDB_INVALID_ADDRESS;
930+
931+ auto *dwarf = llvm::dyn_cast<plugin::dwarf::SymbolFileDWARF>(sym);
932+ if (!dwarf)
933+ return LLDB_INVALID_ADDRESS;
934+
935+ auto die = dwarf->GetDIE (die_id);
936+ if (!die.IsValid ())
937+ return LLDB_INVALID_ADDRESS;
938+
939+ // TODO: account for MS-ABI (where there are no ctor variants in the
940+ // mangling)
941+ if (!ref.consume_front (" :" ))
942+ return LLDB_INVALID_ADDRESS;
943+
944+ auto structor_variant_or_err = MakeStructorVariant (ref);
945+ if (!structor_variant_or_err) {
946+ LLDB_LOG_ERROR (GetLog (LLDBLog::Expressions),
947+ structor_variant_or_err.takeError (),
948+ " Failed to parse structor variant encoding for {1}: {0}" ,
949+ name.GetStringRef ());
950+ return LLDB_INVALID_ADDRESS;
951+ }
952+
953+ ConstString mangled (
954+ FindStructorLinkageName (die, *structor_variant_or_err));
955+
956+ Module::LookupInfo lookup_info (
957+ mangled, lldb::FunctionNameType::eFunctionNameTypeAny,
958+ lldb::LanguageType::eLanguageTypeC_plus_plus);
959+ SymbolContextList sc_list;
960+ dwarf->FindFunctions (lookup_info, {}, false , sc_list);
961+ if (auto load_addr = resolver.Resolve (sc_list))
962+ return *load_addr;
963+ }
964+
784965 if (sc.module_sp ) {
785966 SymbolContextList sc_list;
786967 sc.module_sp ->FindFunctions (name, CompilerDeclContext (),
0 commit comments