Author: aleksandr.urakov Date: Tue Jan 29 01:32:23 2019 New Revision: 352464
URL: http://llvm.org/viewvc/llvm-project?rev=352464&view=rev Log: [NativePDB] Add basic support of methods recostruction in AST Summary: This patch adds the basic support of methods reconstruction by native PDB plugin. It contains only most obvious changes (it processes LF_ONEMETHOD and LF_METHOD records), some things still remain unsolved: - mangled names retrieving; - support of template methods. Reviewers: zturner, labath, lemo, stella.stamenova Reviewed by: zturner Differential Revision: https://reviews.llvm.org/D56126 Added: lldb/trunk/lit/SymbolFile/NativePDB/Inputs/ast-methods.lldbinit lldb/trunk/lit/SymbolFile/NativePDB/ast-methods.cpp Modified: lldb/trunk/source/Plugins/SymbolFile/NativePDB/PdbAstBuilder.cpp lldb/trunk/source/Plugins/SymbolFile/NativePDB/PdbAstBuilder.h lldb/trunk/source/Plugins/SymbolFile/NativePDB/UdtRecordCompleter.cpp lldb/trunk/source/Plugins/SymbolFile/NativePDB/UdtRecordCompleter.h Added: lldb/trunk/lit/SymbolFile/NativePDB/Inputs/ast-methods.lldbinit URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/lit/SymbolFile/NativePDB/Inputs/ast-methods.lldbinit?rev=352464&view=auto ============================================================================== --- lldb/trunk/lit/SymbolFile/NativePDB/Inputs/ast-methods.lldbinit (added) +++ lldb/trunk/lit/SymbolFile/NativePDB/Inputs/ast-methods.lldbinit Tue Jan 29 01:32:23 2019 @@ -0,0 +1,5 @@ +target variable s + +target modules dump ast + +quit Added: lldb/trunk/lit/SymbolFile/NativePDB/ast-methods.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/lit/SymbolFile/NativePDB/ast-methods.cpp?rev=352464&view=auto ============================================================================== --- lldb/trunk/lit/SymbolFile/NativePDB/ast-methods.cpp (added) +++ lldb/trunk/lit/SymbolFile/NativePDB/ast-methods.cpp Tue Jan 29 01:32:23 2019 @@ -0,0 +1,36 @@ +// clang-format off +// REQUIRES: lld + +// RUN: %build --compiler=clang-cl --nodefaultlib -o %t.exe -- %s +// RUN: env LLDB_USE_NATIVE_PDB_READER=1 %lldb -f %t.exe -s \ +// RUN: %p/Inputs/ast-methods.lldbinit 2>&1 | FileCheck %s + +struct Struct { + void simple_method() {} + + virtual void virtual_method() {} + + static void static_method() {} + + int overloaded_method() {} + int overloaded_method(char c) {} + int overloaded_method(char c, int i, ...) {} +}; + +Struct s; + +int main(int argc, char **argv) { + return 0; +} + +// CHECK: TranslationUnitDecl +// CHECK: |-CXXRecordDecl {{.*}} struct Struct definition +// CHECK: | |-CXXMethodDecl {{.*}} simple_method 'void (){{.*}}' +// CHECK: | |-CXXMethodDecl {{.*}} virtual_method 'void (){{.*}}' virtual +// CHECK: | |-CXXMethodDecl {{.*}} static_method 'void ()' static +// CHECK: | |-CXXMethodDecl {{.*}} overloaded_method 'int (){{.*}}' +// CHECK: | |-CXXMethodDecl {{.*}} overloaded_method 'int (char){{.*}}' +// CHECK: | | `-ParmVarDecl {{.*}} 'char' +// CHECK: | `-CXXMethodDecl {{.*}} overloaded_method 'int (char, int, ...)' +// CHECK: | |-ParmVarDecl {{.*}} 'char' +// CHECK: | `-ParmVarDecl {{.*}} 'int' Modified: lldb/trunk/source/Plugins/SymbolFile/NativePDB/PdbAstBuilder.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/SymbolFile/NativePDB/PdbAstBuilder.cpp?rev=352464&r1=352463&r2=352464&view=diff ============================================================================== --- lldb/trunk/source/Plugins/SymbolFile/NativePDB/PdbAstBuilder.cpp (original) +++ lldb/trunk/source/Plugins/SymbolFile/NativePDB/PdbAstBuilder.cpp Tue Jan 29 01:32:23 2019 @@ -933,7 +933,14 @@ clang::QualType PdbAstBuilder::CreateTyp if (cvt.kind() == LF_PROCEDURE) { ProcedureRecord pr; llvm::cantFail(TypeDeserializer::deserializeAs<ProcedureRecord>(cvt, pr)); - return CreateProcedureType(pr); + return CreateFunctionType(pr.ArgumentList, pr.ReturnType, pr.CallConv); + } + + if (cvt.kind() == LF_MFUNCTION) { + MemberFunctionRecord mfr; + llvm::cantFail( + TypeDeserializer::deserializeAs<MemberFunctionRecord>(cvt, mfr)); + return CreateFunctionType(mfr.ArgumentList, mfr.ReturnType, mfr.CallConv); } return {}; @@ -1117,10 +1124,11 @@ clang::QualType PdbAstBuilder::CreateArr return clang::QualType::getFromOpaquePtr(array_ct.GetOpaqueQualType()); } -clang::QualType -PdbAstBuilder::CreateProcedureType(const ProcedureRecord &proc) { +clang::QualType PdbAstBuilder::CreateFunctionType( + TypeIndex args_type_idx, TypeIndex return_type_idx, + llvm::codeview::CallingConvention calling_convention) { TpiStream &stream = m_index.tpi(); - CVType args_cvt = stream.getType(proc.ArgumentList); + CVType args_cvt = stream.getType(args_type_idx); ArgListRecord args; llvm::cantFail( TypeDeserializer::deserializeAs<ArgListRecord>(args_cvt, args)); @@ -1138,10 +1146,10 @@ PdbAstBuilder::CreateProcedureType(const arg_types.push_back(ToCompilerType(arg_type)); } - clang::QualType return_type = GetOrCreateType(proc.ReturnType); + clang::QualType return_type = GetOrCreateType(return_type_idx); llvm::Optional<clang::CallingConv> cc = - TranslateCallingConvention(proc.CallConv); + TranslateCallingConvention(calling_convention); if (!cc) return {}; Modified: lldb/trunk/source/Plugins/SymbolFile/NativePDB/PdbAstBuilder.h URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/SymbolFile/NativePDB/PdbAstBuilder.h?rev=352464&r1=352463&r2=352464&view=diff ============================================================================== --- lldb/trunk/source/Plugins/SymbolFile/NativePDB/PdbAstBuilder.h (original) +++ lldb/trunk/source/Plugins/SymbolFile/NativePDB/PdbAstBuilder.h Tue Jan 29 01:32:23 2019 @@ -102,7 +102,8 @@ private: clang::QualType CreateEnumType(PdbTypeSymId id, const llvm::codeview::EnumRecord &record); clang::QualType - CreateProcedureType(const llvm::codeview::ProcedureRecord &proc); + CreateFunctionType(TypeIndex args_type_idx, TypeIndex return_type_idx, + llvm::codeview::CallingConvention calling_convention); clang::QualType CreateType(PdbTypeSymId type); void CreateFunctionParameters(PdbCompilandSymId func_id, Modified: lldb/trunk/source/Plugins/SymbolFile/NativePDB/UdtRecordCompleter.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/SymbolFile/NativePDB/UdtRecordCompleter.cpp?rev=352464&r1=352463&r2=352464&view=diff ============================================================================== --- lldb/trunk/source/Plugins/SymbolFile/NativePDB/UdtRecordCompleter.cpp (original) +++ lldb/trunk/source/Plugins/SymbolFile/NativePDB/UdtRecordCompleter.cpp Tue Jan 29 01:32:23 2019 @@ -65,6 +65,22 @@ clang::QualType UdtRecordCompleter::AddB return qt; } +void UdtRecordCompleter::AddMethod(llvm::StringRef name, TypeIndex type_idx, + MemberAccess access, MethodOptions options, + MemberAttributes attrs) { + clang::QualType method_qt = + m_ast_builder.GetOrCreateType(PdbTypeSymId(type_idx)); + m_ast_builder.CompleteType(method_qt); + + lldb::AccessType access_type = TranslateMemberAccess(access); + bool is_artificial = (options & MethodOptions::CompilerGenerated) == + MethodOptions::CompilerGenerated; + m_ast_builder.clang().AddMethodToCXXRecordType( + m_derived_ct.GetOpaqueQualType(), name.data(), nullptr, + m_ast_builder.ToCompilerType(method_qt), access_type, attrs.isVirtual(), + attrs.isStatic(), false, false, false, is_artificial); +} + Error UdtRecordCompleter::visitKnownMember(CVMemberRecord &cvr, BaseClassRecord &base) { clang::QualType base_qt = @@ -158,11 +174,27 @@ Error UdtRecordCompleter::visitKnownMemb Error UdtRecordCompleter::visitKnownMember(CVMemberRecord &cvr, OneMethodRecord &one_method) { + AddMethod(one_method.Name, one_method.Type, one_method.getAccess(), + one_method.getOptions(), one_method.Attrs); + return Error::success(); } Error UdtRecordCompleter::visitKnownMember(CVMemberRecord &cvr, OverloadedMethodRecord &overloaded) { + TypeIndex method_list_idx = overloaded.MethodList; + + CVType method_list_type = m_tpi.getType(method_list_idx); + assert(method_list_type.Type == LF_METHODLIST); + + MethodOverloadListRecord method_list; + llvm::cantFail(TypeDeserializer::deserializeAs<MethodOverloadListRecord>( + method_list_type, method_list)); + + for (const OneMethodRecord &method : method_list.Methods) + AddMethod(overloaded.Name, method.Type, method.getAccess(), + method.getOptions(), method.Attrs); + return Error::success(); } Modified: lldb/trunk/source/Plugins/SymbolFile/NativePDB/UdtRecordCompleter.h URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/SymbolFile/NativePDB/UdtRecordCompleter.h?rev=352464&r1=352463&r2=352464&view=diff ============================================================================== --- lldb/trunk/source/Plugins/SymbolFile/NativePDB/UdtRecordCompleter.h (original) +++ lldb/trunk/source/Plugins/SymbolFile/NativePDB/UdtRecordCompleter.h Tue Jan 29 01:32:23 2019 @@ -66,6 +66,10 @@ public: private: clang::QualType AddBaseClassForTypeIndex(llvm::codeview::TypeIndex ti, llvm::codeview::MemberAccess access); + void AddMethod(llvm::StringRef name, llvm::codeview::TypeIndex type_idx, + llvm::codeview::MemberAccess access, + llvm::codeview::MethodOptions options, + llvm::codeview::MemberAttributes attrs); }; } // namespace npdb _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits