Skip to content

Commit 20356cc

Browse files
committed
fix: check function type to get calling convention
1 parent 5ba3702 commit 20356cc

File tree

6 files changed

+46
-85
lines changed

6 files changed

+46
-85
lines changed

lldb/source/Plugins/SymbolFile/NativePDB/PdbUtil.cpp

Lines changed: 0 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1118,21 +1118,3 @@ size_t lldb_private::npdb::GetSizeOfType(PdbTypeSymId id,
11181118
}
11191119
return 0;
11201120
}
1121-
1122-
llvm::StringRef lldb_private::npdb::StripCDeclPrefix(llvm::StringRef mangled) {
1123-
// See
1124-
// https://learn.microsoft.com/en-us/cpp/build/reference/decorated-names#FormatC
1125-
if (!mangled.starts_with('_'))
1126-
return mangled;
1127-
1128-
// make sure this isn't __stdcall (`_{name}@{sizeof(params)}`) or __vectorcall
1129-
// (`{name}@@{sizeof(params)}`).
1130-
size_t last_at_pos = mangled.find_last_of('@');
1131-
if (last_at_pos != llvm::StringRef::npos &&
1132-
last_at_pos < mangled.size() - 1 &&
1133-
llvm::all_of(mangled.slice(last_at_pos + 1, mangled.size()),
1134-
llvm::isDigit))
1135-
return mangled;
1136-
1137-
return mangled.drop_front();
1138-
}

lldb/source/Plugins/SymbolFile/NativePDB/PdbUtil.h

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -161,18 +161,6 @@ PdbTypeSymId GetBestPossibleDecl(PdbTypeSymId id, llvm::pdb::TpiStream &tpi);
161161

162162
size_t GetSizeOfType(PdbTypeSymId id, llvm::pdb::TpiStream &tpi);
163163

164-
/// Strips the leading underscore of mangled __cdecl functions.
165-
///
166-
/// If the name comes from another calling convention, it is returned as-is.
167-
///
168-
/// \pre \c mangled must not be from a 64-bit environment as __cdecl names
169-
/// aren't mangled there.
170-
///
171-
/// \param[in] mangled A mangled symbol name
172-
/// \returns The stripped name if this name is a mangled __cdecl one. Otherwise,
173-
/// the input is returned.
174-
llvm::StringRef StripCDeclPrefix(llvm::StringRef mangled);
175-
176164
} // namespace npdb
177165
} // namespace lldb_private
178166

lldb/source/Plugins/SymbolFile/NativePDB/SymbolFileNativePDB.cpp

Lines changed: 43 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -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

26842692
std::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

27072743
void SymbolFileNativePDB::CacheUdtDeclarations() {

lldb/source/Plugins/SymbolFile/NativePDB/SymbolFileNativePDB.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -277,6 +277,9 @@ class SymbolFileNativePDB : public SymbolFileCommon {
277277

278278
std::optional<llvm::StringRef> FindMangledSymbol(SegmentOffset so);
279279

280+
llvm::StringRef StripMangledFunctionName(llvm::StringRef mangled,
281+
PdbTypeSymId func_ty);
282+
280283
llvm::BumpPtrAllocator m_allocator;
281284

282285
lldb::addr_t m_obj_load_address = 0;

lldb/unittests/SymbolFile/NativePDB/CMakeLists.txt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
add_lldb_unittest(SymbolFileNativePDBTests
22
PdbFPOProgramToDWARFExpressionTests.cpp
3-
PdbUtilTests.cpp
43
UdtRecordCompleterTests.cpp
54

65
LINK_COMPONENTS

lldb/unittests/SymbolFile/NativePDB/PdbUtilTests.cpp

Lines changed: 0 additions & 47 deletions
This file was deleted.

0 commit comments

Comments
 (0)