zequanwu created this revision.
zequanwu added reviewers: rnk, labath.
Herald added a reviewer: shafik.
Herald added a project: All.
zequanwu requested review of this revision.
Herald added a project: LLDB.
Herald added a subscriber: lldb-commits.

This is needed for object files with MS ABI and debug info in Dwarf.
MSInheritanceAttr is required for record decls under MS ABI.

Fixes #56458


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D130942

Files:
  lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp
  lldb/source/Plugins/SymbolFile/NativePDB/PdbAstBuilder.cpp
  lldb/test/Shell/SymbolFile/DWARF/x86/ms_abi.cpp

Index: lldb/test/Shell/SymbolFile/DWARF/x86/ms_abi.cpp
===================================================================
--- /dev/null
+++ lldb/test/Shell/SymbolFile/DWARF/x86/ms_abi.cpp
@@ -0,0 +1,56 @@
+// REQUIRES: lld
+
+// RUN: %clang -c --target=x86_64-windows-msvc -gdwarf %s -o %t.obj
+// RUN: lld-link /out:%t.exe %t.obj /nodefaultlib /entry:main /debug
+// RUN: %lldb -f %t.exe \
+// RUN:   -o "target variable mp1 mp2 mp3 mp4 mp5 mp6 mp7 mp8 mp9" -o "exit" \
+// RUN:   | FileCheck %s
+
+// The following tests that MSInheritanceAttr are set for record decls.
+class SI {
+  int si;
+};
+struct SI2 {
+  int si2;
+};
+class MI : SI, SI2 {
+  int mi;
+};
+class MI2 : MI {
+  int mi2;
+};
+class VI : virtual MI {
+  int vi;
+};
+class VI2 : virtual SI, virtual SI2 {
+  int vi;
+};
+class /* __unspecified_inheritance*/ UI;
+
+typedef void (SI::*SITYPE)();
+typedef void (MI::*MITYPE)();
+typedef void (MI2::*MI2TYPE)();
+typedef void (VI::*VITYPE)();
+typedef void (VI2::*VI2TYPE)();
+typedef void (UI::*UITYPE)();
+SITYPE mp1 = nullptr;
+MITYPE mp2 = nullptr;
+MI2TYPE mp3 = nullptr;
+VITYPE mp4 = nullptr;
+VI2TYPE mp5 = nullptr;
+UITYPE mp6 = nullptr;
+MITYPE *mp7 = nullptr;
+VI2TYPE *mp8 = nullptr;
+int SI::*mp9 = nullptr;
+
+// CHECK: (SITYPE) mp1 = 00 00 00 00 00 00 00 00
+// CHECK: (MITYPE) mp2 = 00 00 00 00 00 00 00 00
+// CHECK: (MI2TYPE) mp3 = 00 00 00 00 00 00 00 00
+// CHECK: (VITYPE) mp4 = 00 00 00 00 00 00 00 00
+// CHECK: (VI2TYPE) mp5 = 00 00 00 00 00 00 00 00
+// CHECK: (UITYPE) mp6 = 00 00 00 00 00 00 00 00
+// CHECK: (MITYPE *) mp7 = 0x0000000000000000
+// CHECK: (VI2TYPE *) mp8 = 0x0000000000000000
+// CHECK: (int SI::*) mp9 = ff ff ff ff
+
+int main() {}
Index: lldb/source/Plugins/SymbolFile/NativePDB/PdbAstBuilder.cpp
===================================================================
--- lldb/source/Plugins/SymbolFile/NativePDB/PdbAstBuilder.cpp
+++ lldb/source/Plugins/SymbolFile/NativePDB/PdbAstBuilder.cpp
@@ -816,7 +816,7 @@
     clang::QualType class_type = GetOrCreateType(mpi.ContainingType);
     if (class_type.isNull())
       return {};
-    if (clang::TagDecl *tag = class_type->getAsTagDecl()) {
+    if (clang::CXXRecordDecl *record_decl = class_type->getAsCXXRecordDecl()) {
       clang::MSInheritanceAttr::Spelling spelling;
       switch (mpi.Representation) {
       case llvm::codeview::PointerToMemberRepresentation::SingleInheritanceData:
@@ -847,7 +847,7 @@
         spelling = clang::MSInheritanceAttr::Spelling::SpellingNotCalculated;
         break;
       }
-      tag->addAttr(clang::MSInheritanceAttr::CreateImplicit(
+      record_decl->addAttr(clang::MSInheritanceAttr::CreateImplicit(
           m_clang.getASTContext(), spelling));
     }
     return m_clang.getASTContext().getMemberPointerType(
Index: lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp
===================================================================
--- lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp
+++ lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp
@@ -1743,6 +1743,18 @@
     }
   }
 
+  // Microsoft abi requires tag decl to have MSInheritanceAttr.
+  if (m_ast.getASTContext().getTargetInfo().getCXXABI().isMicrosoft() &&
+      clang_type_was_created) {
+    clang::QualType class_qt =
+        clang::QualType::getFromOpaquePtr(clang_type.GetOpaqueQualType());
+    if (clang::CXXRecordDecl *record_decl = class_qt->getAsCXXRecordDecl()) {
+      record_decl->addAttr(clang::MSInheritanceAttr::CreateImplicit(
+          m_ast.getASTContext(),
+          clang::MSInheritanceAttr::Spelling::Keyword_unspecified_inheritance));
+    }
+  }
+
   // Store a forward declaration to this class type in case any
   // parameters in any class methods need it for the clang types for
   // function prototypes.
_______________________________________________
lldb-commits mailing list
lldb-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to