From 435e106f94a4e17bbbf6b1ad82185b305943ad3f Mon Sep 17 00:00:00 2001 From: Eric Christopher Date: Fri, 16 Dec 2011 23:40:14 +0000 Subject: [PATCH] Start down the path of getting clang to internally agree on structs versus classes. Part of rdar://10520586 and a couple others. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@146778 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/CGDebugInfo.cpp | 27 ++++++++++++++------------ test/CodeGenCXX/debug-info-fwd-ref.cpp | 23 ++++++++++++++++++++++ 2 files changed, 38 insertions(+), 12 deletions(-) create mode 100644 test/CodeGenCXX/debug-info-fwd-ref.cpp diff --git a/lib/CodeGen/CGDebugInfo.cpp b/lib/CodeGen/CGDebugInfo.cpp index fa057e2e4b..dd76640ba3 100644 --- a/lib/CodeGen/CGDebugInfo.cpp +++ b/lib/CodeGen/CGDebugInfo.cpp @@ -499,7 +499,12 @@ llvm::DIType CGDebugInfo::CreatePointeeType(QualType PointeeTy, llvm::DIDescriptor FDContext = getContextDescriptor(cast(RD->getDeclContext())); - if (RD->isStruct()) + CXXRecordDecl *CXXDecl = dyn_cast(RD); + if (CXXDecl) + return DBuilder.createClassType(FDContext, RD->getName(), DefUnit, + Line, 0, 0, 0, llvm::DIType::FlagFwdDecl, + llvm::DIType(), llvm::DIArray()); + else if (RD->isStruct()) return DBuilder.createStructType(FDContext, RD->getName(), DefUnit, Line, 0, 0, llvm::DIType::FlagFwdDecl, llvm::DIArray()); @@ -507,12 +512,8 @@ llvm::DIType CGDebugInfo::CreatePointeeType(QualType PointeeTy, return DBuilder.createUnionType(FDContext, RD->getName(), DefUnit, Line, 0, 0, llvm::DIType::FlagFwdDecl, llvm::DIArray()); - else { - assert(RD->isClass() && "Unknown RecordType!"); - return DBuilder.createClassType(FDContext, RD->getName(), DefUnit, - Line, 0, 0, 0, llvm::DIType::FlagFwdDecl, - llvm::DIType(), llvm::DIArray()); - } + else + llvm_unreachable("Unknown RecordDecl type!"); } return getOrCreateType(PointeeTy, Unit); @@ -1175,11 +1176,13 @@ llvm::DIType CGDebugInfo::CreateType(const RecordType *Ty) { else if (CXXDecl->isDynamicClass()) ContainingType = FwdDecl; - RealDecl = DBuilder.createClassType(RDContext, RDName, DefUnit, Line, - Size, Align, 0, 0, llvm::DIType(), - Elements, ContainingType, - TParamsArray); - } else + // FIXME: This could be a struct type giving a default visibility different + // than C++ class type, but needs llvm metadata changes first. + RealDecl = DBuilder.createClassType(RDContext, RDName, DefUnit, Line, + Size, Align, 0, 0, llvm::DIType(), + Elements, ContainingType, + TParamsArray); + } else RealDecl = DBuilder.createStructType(RDContext, RDName, DefUnit, Line, Size, Align, 0, Elements); diff --git a/test/CodeGenCXX/debug-info-fwd-ref.cpp b/test/CodeGenCXX/debug-info-fwd-ref.cpp new file mode 100644 index 0000000000..e01733c777 --- /dev/null +++ b/test/CodeGenCXX/debug-info-fwd-ref.cpp @@ -0,0 +1,23 @@ +// RUN: %clang_cc1 -emit-llvm -g %s -o - | FileCheck %s + +struct baz { + int h; + baz(int a) : h(a) {} +}; + +struct bar { + baz b; + baz& b_ref; + bar(int x) : b(x), b_ref(b) {} +}; + +int main(int argc, char** argv) { + bar myBar(1); + return 0; +} + +// Make sure we have two DW_TAG_class_types for baz and bar for their forward +// references. +// FIXME: These should be struct types to match the declaration. +// CHECK: !17 = metadata !{i32 720898, null, metadata !"baz", metadata !6, i32 3, i64 0, i64 0, i32 0, i32 4, null, null, i32 0, null, null} ; [ DW_TAG_class_type ] +// CHECK: !26 = metadata !{i32 720898, null, metadata !"bar", metadata !6, i32 8, i64 0, i64 0, i32 0, i32 4, null, null, i32 0, null, null} ; [ DW_TAG_class_type ] -- 2.40.0