Debug Info: PR14763/r183329 - specify that non-trivial pass-by-value parameters are...
authorDavid Blaikie <dblaikie@gmail.com>
Wed, 19 Jun 2013 21:53:53 +0000 (21:53 +0000)
committerDavid Blaikie <dblaikie@gmail.com>
Wed, 19 Jun 2013 21:53:53 +0000 (21:53 +0000)
This is to fix the location information for such parameters to refer to
the object accessible through the pointer rather than to the pointer
parameter itself.

llvm-svn: 184367

clang/lib/CodeGen/CGDebugInfo.cpp
clang/test/CodeGenCXX/debug-info.cpp

index 563faa4..8240c08 100644 (file)
@@ -2622,6 +2622,9 @@ void CGDebugInfo::EmitDeclare(const VarDecl *VD, unsigned Tag,
   // otherwise it is 'self' or 'this'.
   if (isa<ImplicitParamDecl>(VD) && ArgNo == 1)
     Flags |= llvm::DIDescriptor::FlagObjectPointer;
+  if (llvm::Argument *Arg = dyn_cast<llvm::Argument>(Storage))
+    if (Arg->getType()->isPointerTy() && !Arg->hasByValAttr() && !VD->getType()->isPointerType())
+      Flags |= llvm::DIDescriptor::FlagIndirectVariable;
 
   llvm::MDNode *Scope = LexicalBlockStack.back();
 
index 9413575..2d1b518 100644 (file)
@@ -92,7 +92,7 @@ incomplete (*x)[3];
 }
 
 // For some reason the argument for PR14763 ended up all the way down here
-// CHECK: = metadata !{i32 {{[0-9]*}}, metadata [[FUNC]], {{.*}}, metadata [[FOO]], i32 0, i32 0} ; [ DW_TAG_arg_variable ] [f]
+// CHECK: = metadata !{i32 {{[0-9]*}}, metadata [[FUNC]], {{.*}}, metadata [[FOO]], i32 8192, i32 0} ; [ DW_TAG_arg_variable ] [f]
 
 namespace pr16214 {
 struct a {