@@ -501,9 +501,13 @@ lldb::FunctionSP SymbolFileNativePDB::CreateFunction(PdbCompilandSymId func_id,
501501 return nullptr ;
502502
503503 PdbTypeSymId sig_id (proc.FunctionType , false );
504+
504505 std::optional<llvm::StringRef> mangled_opt =
505506 FindMangledSymbol (SegmentOffset (proc.Segment , proc.CodeOffset ));
507+ if (mangled_opt)
508+ mangled_opt = StripMangledFunctionName (*mangled_opt, proc.FunctionType );
506509 Mangled mangled (mangled_opt.value_or (proc.Name ));
510+
507511 FunctionSP func_sp = std::make_shared<Function>(
508512 &comp_unit, toOpaqueUid (func_id), toOpaqueUid (sig_id), mangled,
509513 func_type.get (), func_addr,
@@ -2678,7 +2682,11 @@ SymbolFileNativePDB::FindMangledFunctionName(PdbCompilandSymId func_id) {
26782682 ProcSym proc (static_cast <SymbolRecordKind>(sym_record.kind ()));
26792683 cantFail (SymbolDeserializer::deserializeAs<ProcSym>(sym_record, proc));
26802684
2681- return FindMangledSymbol (SegmentOffset (proc.Segment , proc.CodeOffset ));
2685+ std::optional<llvm::StringRef> mangled =
2686+ FindMangledSymbol (SegmentOffset (proc.Segment , proc.CodeOffset ));
2687+ if (mangled)
2688+ mangled = StripMangledFunctionName (*mangled, proc.FunctionType );
2689+ return mangled;
26822690}
26832691
26842692std::optional<llvm::StringRef>
@@ -2688,20 +2696,48 @@ SymbolFileNativePDB::FindMangledSymbol(SegmentOffset so) {
26882696 if (!symbol)
26892697 return std::nullopt ;
26902698
2691- llvm::StringRef name = symbol->first .Name ;
2699+ return symbol->first .Name ;
2700+ }
2701+
2702+ llvm::StringRef
2703+ SymbolFileNativePDB::StripMangledFunctionName (const llvm::StringRef mangled,
2704+ PdbTypeSymId func_ty) {
26922705 // "In non-64 bit environments" (on x86 in pactice), __cdecl functions get
26932706 // prefixed with an underscore. For compilers using LLVM, this happens in LLVM
26942707 // (as opposed to the compiler frontend). Because of this, DWARF doesn't
26952708 // contain the "full" mangled name in DW_AT_linkage_name for these functions.
26962709 // We strip the mangling here for compatibility with DWARF. See
26972710 // llvm.org/pr161676 and
26982711 // https://learn.microsoft.com/en-us/cpp/build/reference/decorated-names#FormatC
2699- if ((symbol->first .Flags & PublicSymFlags::Function) !=
2700- PublicSymFlags::None &&
2701- m_index->dbi ().getMachineType () == PDB_Machine::x86)
2702- name = StripCDeclPrefix (name);
27032712
2704- return name;
2713+ if (!mangled.starts_with (' _' ) ||
2714+ m_index->dbi ().getMachineType () != PDB_Machine::x86)
2715+ return mangled;
2716+
2717+ CVType cvt = m_index->tpi ().getType (func_ty.index );
2718+ PDB_CallingConv cc = PDB_CallingConv::NearC;
2719+ if (cvt.kind () == LF_PROCEDURE) {
2720+ ProcedureRecord proc;
2721+ if (llvm::Error error =
2722+ TypeDeserializer::deserializeAs<ProcedureRecord>(cvt, proc))
2723+ llvm::consumeError (std::move (error));
2724+ cc = proc.CallConv ;
2725+ } else if (cvt.kind () == LF_MFUNCTION) {
2726+ MemberFunctionRecord mfunc;
2727+ if (llvm::Error error =
2728+ TypeDeserializer::deserializeAs<MemberFunctionRecord>(cvt, mfunc))
2729+ llvm::consumeError (std::move (error));
2730+ cc = mfunc.CallConv ;
2731+ } else {
2732+ LLDB_LOG (GetLog (LLDBLog::Symbols), " Unexpected function type, got {0}" ,
2733+ cvt.kind ());
2734+ return mangled;
2735+ }
2736+
2737+ if (cc == PDB_CallingConv::NearC || cc == PDB_CallingConv::FarC)
2738+ return mangled.drop_front ();
2739+
2740+ return mangled;
27052741}
27062742
27072743void SymbolFileNativePDB::CacheUdtDeclarations () {
0 commit comments