diff options
author | Reid Kleckner <reid@kleckner.net> | 2014-08-29 21:25:28 +0000 |
---|---|---|
committer | Reid Kleckner <reid@kleckner.net> | 2014-08-29 21:25:28 +0000 |
commit | 329d4a2b292ec19e2bb0eeb03889c7a6757e137d (patch) | |
tree | 7281cef693a4fa6278ea9530254fc1fd12258430 /llvm/lib/IR/Verifier.cpp | |
parent | 2e84650768a57d81692b89b5bdfa297cb114f254 (diff) | |
download | bcm5719-llvm-329d4a2b292ec19e2bb0eeb03889c7a6757e137d.tar.gz bcm5719-llvm-329d4a2b292ec19e2bb0eeb03889c7a6757e137d.zip |
Verifier: Don't reject varargs callee cleanup functions
We've rejected these kinds of functions since r28405 in 2006 because
it's impossible to lower the return of a callee cleanup varargs
function. However there are lots of legal ways to leave such a function
without returning, such as aborting. Today we can leave a function with
a musttail call to another function with the correct prototype, and
everything works out.
I'm removing the verifier check declaring that a normal return from such
a function is UB.
Reviewed By: nlewycky
Differential Revision: http://reviews.llvm.org/D5059
llvm-svn: 216779
Diffstat (limited to 'llvm/lib/IR/Verifier.cpp')
-rw-r--r-- | llvm/lib/IR/Verifier.cpp | 9 |
1 files changed, 4 insertions, 5 deletions
diff --git a/llvm/lib/IR/Verifier.cpp b/llvm/lib/IR/Verifier.cpp index eb4e5bde3df..0df257da4a4 100644 --- a/llvm/lib/IR/Verifier.cpp +++ b/llvm/lib/IR/Verifier.cpp @@ -1055,20 +1055,19 @@ void Verifier::visitFunction(const Function &F) { "Attribute 'builtin' can only be applied to a callsite.", &F); // Check that this function meets the restrictions on this calling convention. + // Sometimes varargs is used for perfectly forwarding thunks, so some of these + // restrictions can be lifted. switch (F.getCallingConv()) { default: - break; case CallingConv::C: break; case CallingConv::Fast: case CallingConv::Cold: - case CallingConv::X86_FastCall: - case CallingConv::X86_ThisCall: case CallingConv::Intel_OCL_BI: case CallingConv::PTX_Kernel: case CallingConv::PTX_Device: - Assert1(!F.isVarArg(), - "Varargs functions must have C calling conventions!", &F); + Assert1(!F.isVarArg(), "Calling convention does not support varargs or " + "perfect forwarding!", &F); break; } |