]> granicus.if.org Git - clang/commitdiff
Quick patch for PR2784, assert genereting debug info for opaque
authorDaniel Dunbar <daniel@zuster.org>
Fri, 17 Oct 2008 01:07:56 +0000 (01:07 +0000)
committerDaniel Dunbar <daniel@zuster.org>
Fri, 17 Oct 2008 01:07:56 +0000 (01:07 +0000)
structure.
 - I'm not sure yet about the behavior, but this at least prevents the
   crash.

Add some asserts on RegionStack usage.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@57661 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/CGDebugInfo.cpp
test/CodeGen/PR2784-debug-info-opaque-struct.c [new file with mode: 0644]

index d6902bb93e782e31dc135fbbd48cbd404591a867..240343dd82236c14f3c2d5e4cb4ffabac5842257 100644 (file)
@@ -383,6 +383,10 @@ CGDebugInfo::getOrCreateRecordType(QualType type, llvm::CompileUnitDesc *Unit)
     return NULL;
 
   RecordDecl *RecDecl = type->getAsRecordType()->getDecl();
+  // We can not get the type for forward declarations. 
+  // FIXME: What *should* we be doing here?
+  if (!RecDecl->getDefinition(M->getContext()))
+    return NULL;
   const ASTRecordLayout &RL = M->getContext().getASTRecordLayout(RecDecl);
 
   SourceManager &SM = M->getContext().getSourceManager();
@@ -676,7 +680,7 @@ void CGDebugInfo::EmitRegionStart(llvm::Function *Fn,
                                   llvm::IRBuilder<> &Builder) 
 {
   llvm::BlockDesc *Block = new llvm::BlockDesc();
-  if (RegionStack.size() > 0)
+  if (!RegionStack.empty())
     Block->setContext(RegionStack.back());
   RegionStack.push_back(Block);
 
@@ -693,6 +697,8 @@ void CGDebugInfo::EmitRegionStart(llvm::Function *Fn,
 /// region - "llvm.dbg.region.end."
 void CGDebugInfo::EmitRegionEnd(llvm::Function *Fn, llvm::IRBuilder<> &Builder) 
 {
+  assert(!RegionStack.empty() && "Region stack mismatch, stack empty!");
+
   // Lazily construct llvm.dbg.region.end function.
   if (!RegionEndFn)
     RegionEndFn =llvm::Intrinsic::getDeclaration(&M->getModule(), 
@@ -712,6 +718,8 @@ void CGDebugInfo::EmitDeclare(const VarDecl *decl, unsigned Tag,
                               llvm::Value *AI,
                               llvm::IRBuilder<> &Builder)
 {
+  assert(!RegionStack.empty() && "Region stack mismatch, stack empty!");
+
   // FIXME: If it is a compiler generated temporary then return.
 
   // Construct llvm.dbg.declare function.
diff --git a/test/CodeGen/PR2784-debug-info-opaque-struct.c b/test/CodeGen/PR2784-debug-info-opaque-struct.c
new file mode 100644 (file)
index 0000000..5886359
--- /dev/null
@@ -0,0 +1,6 @@
+// RUN: clang -g -emit-llvm -o %t %s
+// PR2784
+
+struct OPAQUE;
+typedef struct OPAQUE *PTR;
+PTR p;