Fix debug tag type of forward declarations of struct/class in C++.

llvm-svn: 167308
This commit is contained in:
David Blaikie 2012-11-02 20:49:01 +00:00
parent 7df3501b49
commit d37bbc3e00
3 changed files with 23 additions and 16 deletions

View File

@ -518,21 +518,17 @@ llvm::DIType CGDebugInfo::createRecordFwdDecl(const RecordDecl *RD,
llvm::DIDescriptor Ctx) {
llvm::DIFile DefUnit = getOrCreateFile(RD->getLocation());
unsigned Line = getLineNumber(RD->getLocation());
StringRef RDName = RD->getName();
StringRef RDName = getClassName(RD);
// Get the tag.
const CXXRecordDecl *CXXDecl = dyn_cast<CXXRecordDecl>(RD);
unsigned Tag = 0;
if (CXXDecl) {
RDName = getClassName(RD);
Tag = llvm::dwarf::DW_TAG_class_type;
}
else if (RD->isStruct() || RD->isInterface())
if (RD->isStruct() || RD->isInterface())
Tag = llvm::dwarf::DW_TAG_structure_type;
else if (RD->isUnion())
Tag = llvm::dwarf::DW_TAG_union_type;
else
llvm_unreachable("Unknown RecordDecl type!");
else {
assert(RD->isClass());
Tag = llvm::dwarf::DW_TAG_class_type;
}
// Create the type.
return DBuilder.createForwardDecl(Tag, RDName, Ctx, DefUnit, Line);

View File

@ -1,5 +1,4 @@
// RUN: %clang_cc1 -triple x86_64-unk-unk -o %t -emit-llvm -g %s
// RUN: FileCheck --input-file=%t %s
// RUN: %clang_cc1 -triple x86_64-unk-unk -o - -emit-llvm -g %s | FileCheck %s
// PR3023
void convert(void) {
@ -8,7 +7,7 @@ void convert(void) {
// PR2784
struct OPAQUE;
struct OPAQUE; // CHECK: DW_TAG_structure_type
typedef struct OPAQUE *PTR;
PTR p;

View File

@ -1,12 +1,24 @@
// RUN: %clang -emit-llvm -g -S %s -o - | grep HdrSize
struct A {
// RUN: %clang -emit-llvm -g -S %s -o - | FileCheck %s
struct foo;
void func(foo *f) { // CHECK: DW_TAG_structure_type
}
class bar;
void func(bar *f) { // CHECK: DW_TAG_class_type
}
union baz;
void func(baz *f) { // CHECK: DW_TAG_union_type
}
struct A { // FIXME: we're still emitting this as DW_TAG_class_type
int one;
static const int HdrSize = 52;
static const int HdrSize = 52; // CHECK: HdrSize
int two;
A() {
int x = 1;
}
};
class B { // CHECK: DW_TAG_class_type
};
int main() {
A a;
B b;
}