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: _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits