[PATCH] D11476: Marked call instruction in thunk function with musttail attribute when applicable

Amjad Aboud amjad.aboud at intel.com
Thu Jul 23 14:15:46 PDT 2015


aaboud created this revision.
aaboud added reviewers: rnk, hans.
aaboud added a subscriber: cfe-commits.
aaboud set the repository for this revision to rL LLVM.

This patch fix PR24235.
When thunk function is being generated with a call to the original adjusted function, the thunk function will appear in the call stack of the debugger.
To solve this issue, the thunk function should try replace the call instruction with a jump instruction.

This patch mark the call function with musttail attribute, when it is applicable, to force the backend to replace the call with a jump.

Notice that marking the call with a tail might be safer, however, it is not good enough to remove the call in the 32-bit mode.

Repository:
  rL LLVM

http://reviews.llvm.org/D11476

Files:
  lib/CodeGen/CGVTables.cpp
  test/CodeGenCXX/microsoft-abi-structors.cpp

Index: lib/CodeGen/CGVTables.cpp
===================================================================
--- lib/CodeGen/CGVTables.cpp
+++ lib/CodeGen/CGVTables.cpp
@@ -312,6 +312,8 @@
   // Consider return adjustment if we have ThunkInfo.
   if (Thunk && !Thunk->Return.isEmpty())
     RV = PerformReturnAdjustment(*this, ResultType, RV, *Thunk);
+  else if (llvm::CallInst* Call = dyn_cast<llvm::CallInst>(CallOrInvoke))
+    Call->setTailCallKind(llvm::CallInst::TCK_MustTail);
 
   // Emit return.
   if (!ResultType->isVoidType() && Slot.isNull())
Index: test/CodeGenCXX/microsoft-abi-structors.cpp
===================================================================
--- test/CodeGenCXX/microsoft-abi-structors.cpp
+++ test/CodeGenCXX/microsoft-abi-structors.cpp
@@ -176,7 +176,7 @@
 //      Do an adjustment from B* to C*.
 // DTORS2:   getelementptr i8, i8* %{{.*}}, i32 -4
 // DTORS2:   bitcast i8* %{{.*}} to %"struct.dtor_in_second_nvbase::C"*
-// DTORS2:   %[[CALL:.*]] = call x86_thiscallcc i8* @"\01??_GC at dtor_in_second_nvbase@@UAEPAXI at Z"
+// DTORS2:   %[[CALL:.*]] = musttail call x86_thiscallcc i8* @"\01??_GC at dtor_in_second_nvbase@@UAEPAXI at Z"
 // DTORS2:   ret i8* %[[CALL]]
 
 }


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D11476.30524.patch
Type: text/x-patch
Size: 1208 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20150723/768fb27d/attachment.bin>


More information about the cfe-commits mailing list