mirror of
https://github.com/intel/llvm.git
synced 2026-02-01 08:56:15 +08:00
Module Debugging: Make sure that anonymous tag decls that define global
variables are visited. This shouldn't encourage anyone to put global variables into clang modules. rdar://problem/24199640 llvm-svn: 258250
This commit is contained in:
@@ -59,10 +59,8 @@ class PCHContainerGenerator : public ASTConsumer {
|
||||
struct DebugTypeVisitor : public RecursiveASTVisitor<DebugTypeVisitor> {
|
||||
clang::CodeGen::CGDebugInfo &DI;
|
||||
ASTContext &Ctx;
|
||||
bool SkipTagDecls;
|
||||
DebugTypeVisitor(clang::CodeGen::CGDebugInfo &DI, ASTContext &Ctx,
|
||||
bool SkipTagDecls)
|
||||
: DI(DI), Ctx(Ctx), SkipTagDecls(SkipTagDecls) {}
|
||||
DebugTypeVisitor(clang::CodeGen::CGDebugInfo &DI, ASTContext &Ctx)
|
||||
: DI(DI), Ctx(Ctx) {}
|
||||
|
||||
/// Determine whether this type can be represented in DWARF.
|
||||
static bool CanRepresent(const Type *Ty) {
|
||||
@@ -80,7 +78,8 @@ class PCHContainerGenerator : public ASTConsumer {
|
||||
// TagDecls may be deferred until after all decls have been merged and we
|
||||
// know the complete type. Pure forward declarations will be skipped, but
|
||||
// they don't need to be emitted into the module anyway.
|
||||
if (SkipTagDecls && isa<TagDecl>(D))
|
||||
if (auto *TD = dyn_cast<TagDecl>(D))
|
||||
if (!TD->isCompleteDefinition())
|
||||
return true;
|
||||
|
||||
QualType QualTy = Ctx.getTypeDeclType(D);
|
||||
@@ -173,7 +172,7 @@ public:
|
||||
// Collect debug info for all decls in this group.
|
||||
for (auto *I : D)
|
||||
if (!I->isFromASTFile()) {
|
||||
DebugTypeVisitor DTV(*Builder->getModuleDebugInfo(), *Ctx, true);
|
||||
DebugTypeVisitor DTV(*Builder->getModuleDebugInfo(), *Ctx);
|
||||
DTV.TraverseDecl(I);
|
||||
}
|
||||
return true;
|
||||
@@ -194,7 +193,7 @@ public:
|
||||
if (D->getName().empty())
|
||||
return;
|
||||
|
||||
DebugTypeVisitor DTV(*Builder->getModuleDebugInfo(), *Ctx, false);
|
||||
DebugTypeVisitor DTV(*Builder->getModuleDebugInfo(), *Ctx);
|
||||
DTV.TraverseDecl(D);
|
||||
Builder->UpdateCompletedType(D);
|
||||
}
|
||||
|
||||
@@ -39,6 +39,10 @@ TypedefUnion tdu;
|
||||
TypedefEnum tde;
|
||||
TypedefStruct tds;
|
||||
|
||||
void foo() {
|
||||
GlobalStruct.i = GlobalUnion.i = GlobalEnum;
|
||||
}
|
||||
|
||||
// CHECK: ![[NS:.*]] = !DINamespace(name: "DebugCXX", scope: ![[MOD:[0-9]+]],
|
||||
// CHECK: ![[MOD]] = !DIModule(scope: null, name: {{.*}}DebugCXX
|
||||
|
||||
|
||||
@@ -62,3 +62,7 @@ struct PureForwardDecl;
|
||||
typedef union { int i; } TypedefUnion;
|
||||
typedef enum { e0 = 0 } TypedefEnum;
|
||||
typedef struct { int i; } TypedefStruct;
|
||||
|
||||
union { int i; } GlobalUnion;
|
||||
struct { int i; } GlobalStruct;
|
||||
enum { e5 = 5 } GlobalEnum;
|
||||
|
||||
@@ -28,10 +28,20 @@
|
||||
// CHECK-SAME: identifier: "_ZTSN8DebugCXX4EnumE")
|
||||
// CHECK: !DINamespace(name: "DebugCXX"
|
||||
|
||||
// CHECK: !DICompositeType(tag: DW_TAG_enumeration_type,
|
||||
// CHECK-SAME-NOT: name:
|
||||
|
||||
// CHECK: !DICompositeType(tag: DW_TAG_enumeration_type,
|
||||
// CHECK-SAME-NOT: name:
|
||||
|
||||
// CHECK: !DICompositeType(tag: DW_TAG_enumeration_type,
|
||||
// CHECK-SAME-NOT: name:
|
||||
// CHECK-SAME: identifier: "_ZTS11TypedefEnum")
|
||||
|
||||
// CHECK: !DICompositeType(tag: DW_TAG_enumeration_type,
|
||||
// CHECK-SAME-NOT: name:
|
||||
// CHECK: !DIEnumerator(name: "e5", value: 5)
|
||||
|
||||
// CHECK: !DICompositeType(tag: DW_TAG_structure_type, name: "Struct"
|
||||
// CHECK-SAME: identifier: "_ZTSN8DebugCXX6StructE")
|
||||
|
||||
@@ -65,4 +75,10 @@
|
||||
// CHECK: !DIDerivedType(tag: DW_TAG_typedef, name: "B",
|
||||
// no mangled name here yet.
|
||||
|
||||
// CHECK: !DICompositeType(tag: DW_TAG_union_type,
|
||||
// CHECK-SAME-NOT: name:
|
||||
|
||||
// CHECK: !DICompositeType(tag: DW_TAG_structure_type,
|
||||
// CHECK-SAME-NOT: name:
|
||||
|
||||
// CHECK-NEG-NOT: !DICompositeType(tag: DW_TAG_structure_type, name: "PureForwardDecl"
|
||||
|
||||
Reference in New Issue
Block a user