]> granicus.if.org Git - clang/commitdiff
IRgen: Fix debug info regression in r106970; when we eliminate the return value
authorDaniel Dunbar <daniel@zuster.org>
Wed, 30 Jun 2010 21:27:58 +0000 (21:27 +0000)
committerDaniel Dunbar <daniel@zuster.org>
Wed, 30 Jun 2010 21:27:58 +0000 (21:27 +0000)
store make sure to move the debug metadata from the store (which is actual
'return' statement location) to the return instruction (which otherwise would
have the function end location as its debug info).
 - Tested by gdb test suite.

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

lib/CodeGen/CGCall.cpp

index 24a64cfa4434e7c3433e0a3f8d003fe070d7c014..29104424acb0fa46cd08911690cadf7393bb591b 100644 (file)
@@ -975,7 +975,8 @@ void CodeGenFunction::EmitFunctionEpilog(const CGFunctionInfo &FI) {
     Builder.CreateRetVoid();
     return;
   }
-  
+
+  llvm::MDNode *RetDbgInfo = 0;
   llvm::Value *RV = 0;
   QualType RetTy = FI.getReturnType();
   const ABIArgInfo &RetAI = FI.getReturnInfo();
@@ -1009,6 +1010,7 @@ void CodeGenFunction::EmitFunctionEpilog(const CGFunctionInfo &FI) {
       RV = Builder.CreateLoad(ReturnValue);
     } else {
       // Get the stored value and nuke the now-dead store.
+      RetDbgInfo = SI->getDbgMetadata();
       RV = SI->getValueOperand();
       SI->eraseFromParent();
       
@@ -1031,10 +1033,9 @@ void CodeGenFunction::EmitFunctionEpilog(const CGFunctionInfo &FI) {
     assert(0 && "Invalid ABI kind for return argument");
   }
 
-  if (RV)
-    Builder.CreateRet(RV);
-  else
-    Builder.CreateRetVoid();
+  llvm::Instruction *Ret = RV ? Builder.CreateRet(RV) : Builder.CreateRetVoid();
+  if (RetDbgInfo)
+    Ret->setDbgMetadata(RetDbgInfo);
 }
 
 RValue CodeGenFunction::EmitDelegateCallArg(const VarDecl *Param) {