[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