[PATCH] D53586: Implement Function Multiversioning for Non-ELF Systems.
Erich Keane via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Wed Oct 24 08:26:40 PDT 2018
erichkeane marked an inline comment as done.
erichkeane added a comment.
@rnk: I looked into the EmitMustTailThunk code, and don't terribly see what I'm doing wrong. I clearly cannot CALL that function (since this works with non-CXXMethodDecls), so I looked into using it. However, I saw that it does a couple of small things that seem useful, but not anything that seems to fix your concerns.
Can you espouse a bit for me? I'm likely missing something, but am out of ideas on what it could be.
================
Comment at: lib/CodeGen/CodeGenFunction.cpp:2395
+
+ llvm::CallInst *Result = Builder.CreateCall(FuncToReturn, Args);
+
----------------
erichkeane wrote:
> rnk wrote:
> > This approach is... not going to work in the general case. Consider, for example, varargs. Then consider 32-bit x86 inalloca, which is quite widespread. Any non-trivially copyable object is not going to be passable through such a thunk. You might consider looking at CodeGenFunction::EmitMustTailThunk instead.
> Oh dear...
> I'm unfamiliar with EmitMustTailThunk, is it self explanatory? Any chance you can expound? Should I call/use that function, or copy out of it?
I looked through that function, and it seems to do very similar things to this...
It FIRST does the small-vector conversion to a value* array like I do.
Second, it 'adjusts' the 'this' parameter. This doesn't seem like it needs to happen, because the type isn't changing, right? my 'this' pointer is still pass-on-able.
Third, it creates the call, then marks it TCK_MustTail.
Forth, it sets the attributes/calling convention of the 'call' object, but I'd expect that to come from the llvm::Function object in the 'CreateCall', right? I can add them after the fact I guess, if we see value.*(see below)
Finally, it does the CreateRetVoid/CreateRet like this function does below.
*I DO have a test that claims that my IR is broken if I set the call attributes. Curiously only 1 of my tests, but the error is:
"cannot guarantee tail call due to mismatched ABI impacting function attributes"
The only difference in attributes is target-features and target-cpu though, so I don't know what causes this.
Repository:
rC Clang
https://reviews.llvm.org/D53586
More information about the cfe-commits
mailing list