[Lldb-commits] [lldb] 3b0f38b - [LLDB][NativePDB] Fix parameter size for member functions LF_MFUNCTION
Zequan Wu via lldb-commits
lldb-commits at lists.llvm.org
Thu Oct 27 16:36:12 PDT 2022
Author: Zequan Wu
Date: 2022-10-27T16:36:05-07:00
New Revision: 3b0f38bb5186cdda52ab38b13965678036aba22c
URL: https://github.com/llvm/llvm-project/commit/3b0f38bb5186cdda52ab38b13965678036aba22c
DIFF: https://github.com/llvm/llvm-project/commit/3b0f38bb5186cdda52ab38b13965678036aba22c.diff
LOG: [LLDB][NativePDB] Fix parameter size for member functions LF_MFUNCTION
Fix the problem that it was treating member functions as non-member functions
when trying to get the parameter size. This causes some non-parameter variables
showing up in function signature. Suprisingly,
`cantFail(TypeDeserializer::deserializeAs<ProcedureRecord>(...))` just sliently
parse it without error and gave the wrong result.
It's hard to test it. This only causes problem when `params_remaining`
is larger than the real parameter size. If it's smaller, we also check
individual local variable's attribute to see it's a parameter. When I trying to
come up with a test, the parameter size is always 0 if we parse LF_MFUNCTION as
LF_PROCEDURE.
Reviewed By: labath
Differential Revision: https://reviews.llvm.org/D136209
Added:
Modified:
lldb/source/Plugins/SymbolFile/NativePDB/SymbolFileNativePDB.cpp
Removed:
################################################################################
diff --git a/lldb/source/Plugins/SymbolFile/NativePDB/SymbolFileNativePDB.cpp b/lldb/source/Plugins/SymbolFile/NativePDB/SymbolFileNativePDB.cpp
index a34ce045e6759..8fdd23d942d85 100644
--- a/lldb/source/Plugins/SymbolFile/NativePDB/SymbolFileNativePDB.cpp
+++ b/lldb/source/Plugins/SymbolFile/NativePDB/SymbolFileNativePDB.cpp
@@ -1897,9 +1897,24 @@ size_t SymbolFileNativePDB::ParseVariablesForBlock(PdbCompilandSymId block_id) {
ProcSym proc(static_cast<SymbolRecordKind>(sym.kind()));
cantFail(SymbolDeserializer::deserializeAs<ProcSym>(sym, proc));
CVType signature = m_index->tpi().getType(proc.FunctionType);
- ProcedureRecord sig;
- cantFail(TypeDeserializer::deserializeAs<ProcedureRecord>(signature, sig));
- params_remaining = sig.getParameterCount();
+ if (signature.kind() == LF_PROCEDURE) {
+ ProcedureRecord sig;
+ if (llvm::Error e = TypeDeserializer::deserializeAs<ProcedureRecord>(
+ signature, sig)) {
+ llvm::consumeError(std::move(e));
+ return 0;
+ }
+ params_remaining = sig.getParameterCount();
+ } else if (signature.kind() == LF_MFUNCTION) {
+ MemberFunctionRecord sig;
+ if (llvm::Error e = TypeDeserializer::deserializeAs<MemberFunctionRecord>(
+ signature, sig)) {
+ llvm::consumeError(std::move(e));
+ return 0;
+ }
+ params_remaining = sig.getParameterCount();
+ } else
+ return 0;
break;
}
case S_BLOCK32:
More information about the lldb-commits
mailing list