]> granicus.if.org Git - clang/commitdiff
If an aggregate argument is passed indirectly because it has non trivial
authorDevang Patel <dpatel@apple.com>
Wed, 9 Feb 2011 00:37:30 +0000 (00:37 +0000)
committerDevang Patel <dpatel@apple.com>
Wed, 9 Feb 2011 00:37:30 +0000 (00:37 +0000)
destructor or copy constructor than let debug info know about it.

Radar 8945514.

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

lib/CodeGen/CGCall.cpp
lib/CodeGen/CGDebugInfo.cpp
lib/CodeGen/CGDebugInfo.h
lib/CodeGen/CGDecl.cpp
lib/CodeGen/CodeGenFunction.h

index c517cf3d09d749d36d430e1b70225a1a88508b96..60a138c4194fe3520815f8aadf95ece811d3331e 100644 (file)
@@ -898,7 +898,7 @@ void CodeGenFunction::EmitFunctionProlog(const CGFunctionInfo &FI,
           V = EmitScalarConversion(V, Ty, Arg->getType());
         }
       }
-      EmitParmDecl(*Arg, V);
+      EmitParmDecl(*Arg, V, true /*ABIArgInfo::Indirect*/);
       break;
     }
 
index ccf9c501259f7ab18ebd0065e845b510e2d09e24..cb907d451589d2a9f00edb62efde1670203b26a0 100644 (file)
@@ -1735,7 +1735,8 @@ llvm::DIType CGDebugInfo::EmitTypeForVarWithBlocksAttr(const ValueDecl *VD,
 
 /// EmitDeclare - Emit local variable declaration debug info.
 void CGDebugInfo::EmitDeclare(const VarDecl *VD, unsigned Tag,
-                              llvm::Value *Storage, CGBuilderTy &Builder) {
+                              llvm::Value *Storage, CGBuilderTy &Builder,
+                              bool IndirectArgument) {
   assert(!RegionStack.empty() && "Region stack mismatch, stack empty!");
 
   llvm::DIFile Unit = getOrCreateFile(VD->getLocation());
@@ -1751,6 +1752,12 @@ void CGDebugInfo::EmitDeclare(const VarDecl *VD, unsigned Tag,
   if (!Ty)
     return;
 
+  // If an aggregate variable has non trivial destructor or non trivial copy
+  // constructor than it is pass indirectly. Let debug info know about this
+  // by using reference of the aggregate type as a argument type.
+  if (IndirectArgument && VD->getType()->isRecordType())
+    Ty = DBuilder.CreateReferenceType(Ty);
+
   // Get location information.
   unsigned Line = getLineNumber(VD->getLocation());
   unsigned Column = getColumnNumber(VD->getLocation());
@@ -1911,8 +1918,10 @@ void CGDebugInfo::EmitDeclareOfBlockDeclRefVariable(
 /// EmitDeclareOfArgVariable - Emit call to llvm.dbg.declare for an argument
 /// variable declaration.
 void CGDebugInfo::EmitDeclareOfArgVariable(const VarDecl *VD, llvm::Value *AI,
-                                           CGBuilderTy &Builder) {
-  EmitDeclare(VD, llvm::dwarf::DW_TAG_arg_variable, AI, Builder);
+                                           CGBuilderTy &Builder, 
+                                           bool IndirectArgument) {
+  EmitDeclare(VD, llvm::dwarf::DW_TAG_arg_variable, AI, Builder, 
+              IndirectArgument);
 }
 
 
index 6a9ab9c58b5293482c806fc18d75406d8b5a10e9..8efb7851817e55736e8e4727406b9b9c8e6e3613 100644 (file)
@@ -178,7 +178,7 @@ public:
   /// EmitDeclareOfArgVariable - Emit call to llvm.dbg.declare for an argument
   /// variable declaration.
   void EmitDeclareOfArgVariable(const VarDecl *Decl, llvm::Value *AI,
-                                CGBuilderTy &Builder);
+                                CGBuilderTy &Builder, bool IndirectArg = false);
 
   /// EmitGlobalVariable - Emit information about a global variable.
   void EmitGlobalVariable(llvm::GlobalVariable *GV, const VarDecl *Decl);
@@ -194,7 +194,7 @@ public:
 private:
   /// EmitDeclare - Emit call to llvm.dbg.declare for a variable declaration.
   void EmitDeclare(const VarDecl *decl, unsigned Tag, llvm::Value *AI,
-                   CGBuilderTy &Builder);
+                   CGBuilderTy &Builder, bool IndirectArgument = false);
 
   /// EmitDeclare - Emit call to llvm.dbg.declare for a variable
   /// declaration from an enclosing block.
index c3708d1efdd46e701f38decdfb6212fce65049ee..44568bc2aa676fe8081c216333449d7c4a265cd8 100644 (file)
@@ -927,7 +927,8 @@ void CodeGenFunction::EmitAutoVarDecl(const VarDecl &D,
 
 /// Emit an alloca (or GlobalValue depending on target)
 /// for the specified parameter and set up LocalDeclMap.
-void CodeGenFunction::EmitParmDecl(const VarDecl &D, llvm::Value *Arg) {
+void CodeGenFunction::EmitParmDecl(const VarDecl &D, llvm::Value *Arg, 
+                                   bool IndirectArg) {
   // FIXME: Why isn't ImplicitParamDecl a ParmVarDecl?
   assert((isa<ParmVarDecl>(D) || isa<ImplicitParamDecl>(D)) &&
          "Invalid argument to EmitParmDecl");
@@ -956,6 +957,6 @@ void CodeGenFunction::EmitParmDecl(const VarDecl &D, llvm::Value *Arg) {
   // Emit debug info for param declaration.
   if (CGDebugInfo *DI = getDebugInfo()) {
     DI->setLocation(D.getLocation());
-    DI->EmitDeclareOfArgVariable(&D, DeclPtr, Builder);
+    DI->EmitDeclareOfArgVariable(&D, DeclPtr, Builder, IndirectArg);
   }
 }
index f591840d92beefd15006a1583b1143b104de9bdf..19fbf5ca98936c1583d6aa365b9acb6fa7e0ae7b 100644 (file)
@@ -1438,7 +1438,8 @@ public:
                          llvm::GlobalValue::LinkageTypes Linkage);
 
   /// EmitParmDecl - Emit a ParmVarDecl or an ImplicitParamDecl.
-  void EmitParmDecl(const VarDecl &D, llvm::Value *Arg);
+  void EmitParmDecl(const VarDecl &D, llvm::Value *Arg, 
+                    bool IndirectArgument = false);
 
   //===--------------------------------------------------------------------===//
   //                             Statement Emission