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
@@ -769,6 +778,180 @@ class LoadAddressResolver {
769778 lldb::addr_t m_best_internal_load_address = LLDB_INVALID_ADDRESS;
770779};
771780
781+ using namespace lldb_private ::plugin::dwarf;
782+
783+ struct StructorVariant {
784+ std::variant<clang::CXXCtorType, clang::CXXDtorType> m_variant;
785+ };
786+
787+ static llvm::Expected<StructorVariant>
788+ MakeStructorVariant (llvm::StringRef variant_num) {
789+ if (variant_num.consume_front (" D" )) {
790+ std::underlying_type_t <clang::CXXDtorType> dtor_type;
791+ if (variant_num.consumeInteger (10 , dtor_type))
792+ return llvm::createStringError (" Invalid ctor variant code." );
793+
794+ return StructorVariant{.m_variant =
795+ static_cast <clang::CXXDtorType>(dtor_type)};
796+ }
797+
798+ if (variant_num.consume_front (" C" )) {
799+ std::underlying_type_t <clang::CXXCtorType> ctor_type;
800+ if (variant_num.consumeInteger (10 , ctor_type))
801+ return llvm::createStringError (" Invalid dtor variant code." );
802+
803+ return StructorVariant{.m_variant =
804+ static_cast <clang::CXXCtorType>(ctor_type)};
805+ }
806+
807+ return llvm::createStringError (" Incorrect structor variant prefix." );
808+ }
809+
810+ static int GetItaniumVariantCode (StructorVariant structor) {
811+ if (auto const *ctor = std::get_if<clang::CXXCtorType>(&structor.m_variant )) {
812+ switch (*ctor) {
813+ case clang::CXXCtorType::Ctor_Complete:
814+ return 1 ;
815+ case clang::CXXCtorType::Ctor_Base:
816+ return 2 ;
817+ default :
818+ llvm_unreachable (" Unimplemented" );
819+ }
820+ } else {
821+ switch (std::get<clang::CXXDtorType>(structor.m_variant )) {
822+ case clang::CXXDtorType::Dtor_Complete:
823+ return 1 ;
824+ case clang::CXXDtorType::Dtor_Base:
825+ return 2 ;
826+ default :
827+ llvm_unreachable (" Unimplemented" );
828+ }
829+ }
830+ }
831+
832+ // TODO:
833+ // 1. MS-ABI
834+ // 2. GCC-style dtor/ctor declarations
835+ // 3. Inheriting ctors
836+ // 4. Regular functions
837+ static std::string FindStructorLinkageName (DWARFDIE die,
838+ StructorVariant structor_variant) {
839+ auto *dwarf = die.GetDWARF ();
840+ assert (dwarf);
841+
842+ // Note, GCC only puts DW_AT_linkage_name (not DW_AT_name) on constructor
843+ // decls Will those cases still work?
844+ ConstString func_name (die.GetName ());
845+ assert (func_name);
846+
847+ SymbolContextList sc_list;
848+ Module::LookupInfo lookup_info (
849+ func_name,
850+ lldb::FunctionNameType::eFunctionNameTypeMethod |
851+ lldb::FunctionNameType::eFunctionNameTypeFull,
852+ lldb::LanguageType::eLanguageTypeUnknown);
853+ dwarf->FindFunctions (lookup_info, {}, true , sc_list);
854+
855+ llvm::DenseMap<int , std::string> variants;
856+
857+ for (auto const &sc : sc_list.SymbolContexts ()) {
858+ if (!sc.function )
859+ continue ;
860+
861+ auto func_die = dwarf->GetDIE (sc.function ->GetID ());
862+ if (!func_die.IsValid ())
863+ continue ;
864+
865+ auto spec_die = func_die.GetAttributeValueAsReferenceDIE (
866+ llvm::dwarf::DW_AT_specification);
867+ if (!spec_die.IsValid () || spec_die != die)
868+ continue ;
869+
870+ llvm::ItaniumPartialDemangler D;
871+ if (D.partialDemangle (func_die.GetMangledName ()))
872+ continue ;
873+
874+ const auto maybe_structor_kind = D.getCtorDtorVariant ();
875+ // TODO: this need not be true
876+ assert (maybe_structor_kind);
877+
878+ variants.insert ({*maybe_structor_kind, func_die.GetMangledName ()});
879+ }
880+
881+ auto itanium_code = GetItaniumVariantCode (structor_variant);
882+ auto it = variants.find (itanium_code);
883+ if (it != variants.end ())
884+ return it->second ;
885+
886+ // If only C2 was emitted but we tried calling C1,
887+ // we can probably (?) safely call C2.
888+ if (itanium_code == 1 && variants.size () == 1 )
889+ if (auto retry = variants.find (2 ); retry != variants.end ())
890+ return retry->second ;
891+
892+ return {};
893+ }
894+
895+ static lldb::addr_t FindSpecialLinkageName (
896+ LoadAddressResolver &resolver,ConstString name, llvm::StringRef symbol) {
897+ uintptr_t module_ptr;
898+ if (symbol.consumeInteger (0 , module_ptr))
899+ return LLDB_INVALID_ADDRESS;
900+
901+ if (module_ptr == 0 ) {
902+ // TODO: log this case. We should ever be putting a null module pointer
903+ // here
904+ return LLDB_INVALID_ADDRESS;
905+ }
906+
907+ auto *mod = (lldb_private::Module *)module_ptr;
908+ assert (mod);
909+ auto *sym = mod->GetSymbolFile ();
910+ assert (sym);
911+
912+ if (!symbol.consume_front (" :" ))
913+ return LLDB_INVALID_ADDRESS;
914+
915+ lldb::user_id_t die_id;
916+ if (symbol.consumeInteger (10 , die_id))
917+ return LLDB_INVALID_ADDRESS;
918+
919+ auto *dwarf = llvm::dyn_cast<plugin::dwarf::SymbolFileDWARF>(sym);
920+ if (!dwarf)
921+ return LLDB_INVALID_ADDRESS;
922+
923+ auto die = dwarf->GetDIE (die_id);
924+ if (!die.IsValid ())
925+ return LLDB_INVALID_ADDRESS;
926+
927+ // TODO: account for MS-ABI (where there are no ctor variants in the
928+ // mangling)
929+ if (!symbol.consume_front (" :" ))
930+ return LLDB_INVALID_ADDRESS;
931+
932+ auto structor_variant_or_err = MakeStructorVariant (symbol);
933+ if (!structor_variant_or_err) {
934+ LLDB_LOG_ERROR (GetLog (LLDBLog::Expressions),
935+ structor_variant_or_err.takeError (),
936+ " Failed to parse structor variant encoding for {1}: {0}" ,
937+ name.GetStringRef ());
938+ return LLDB_INVALID_ADDRESS;
939+ }
940+
941+ ConstString mangled (
942+ FindStructorLinkageName (die, *structor_variant_or_err));
943+
944+ Module::LookupInfo lookup_info (
945+ mangled, lldb::FunctionNameType::eFunctionNameTypeAny,
946+ lldb::LanguageType::eLanguageTypeC_plus_plus);
947+ SymbolContextList sc_list;
948+ dwarf->FindFunctions (lookup_info, {}, false , sc_list);
949+ if (auto load_addr = resolver.Resolve (sc_list))
950+ return *load_addr;
951+
952+ return LLDB_INVALID_ADDRESS;
953+ }
954+
772955lldb::addr_t
773956IRExecutionUnit::FindInSymbols (const std::vector<ConstString> &names,
774957 const lldb_private::SymbolContext &sc,
@@ -795,6 +978,9 @@ IRExecutionUnit::FindInSymbols(const std::vector<ConstString> &names,
795978 function_options.include_inlines = false ;
796979
797980 for (const ConstString &name : names) {
981+ if (auto ref = name.GetStringRef (); ref.consume_front (" $__lldb_func_" ))
982+ return FindSpecialLinkageName (resolver, name, ref);
983+
798984 // The lookup order here is as follows:
799985 // 1) Functions in `sc.module_sp`
800986 // 2) Functions in the preferred modules list
0 commit comments