Ramkumar Ramachandra
2015-Jan-20 18:11 UTC
[LLVMdev] [INCOMPLETE] [GC] Support wrapping vararg functions in statepoint
Philip Reames wrote:> Any change outside of statepoint lowering is highly suspect.Notice that SelectionDAGBuilder::LowerCallTo (the one I'm modifying) has exactly one other caller: visitCall, which doesn't match vararg functions. Every other codepath directly calls TargetLowering::LowerCallTo, supplying CallLoweringInfo information explicity (it's a structure with a vararg field). I suspect I'm not overloading SelectionDAGBuilder enough.> I'm pretty sure that calling a vararg function through a statepoint already > works without code change (other than the verifier). (Or at least simple > cases work.) Figuring out which work and which don't would give some > insight.AFAICT, extracting the result from a statepoint wrapping a vararg function is the problem. If it's a void function, there's no problem.
Philip Reames
2015-Jan-20 18:45 UTC
[LLVMdev] [INCOMPLETE] [GC] Support wrapping vararg functions in statepoint
On 01/20/2015 10:11 AM, Ramkumar Ramachandra wrote:> Philip Reames wrote: >> Any change outside of statepoint lowering is highly suspect. > Notice that SelectionDAGBuilder::LowerCallTo (the one I'm modifying) > has exactly one other caller: visitCall, which doesn't match vararg > functions. Every other codepath directly calls > TargetLowering::LowerCallTo, supplying CallLoweringInfo information > explicity (it's a structure with a vararg field).I think I'm missing something here. What leads you to believe that visitCall doesn't handle vararg functions? Also, I see calls in both visitInvoke and visitCall. I would assume these are the primary entry points...> > I suspect I'm not overloading SelectionDAGBuilder enough. > >> I'm pretty sure that calling a vararg function through a statepoint already >> works without code change (other than the verifier). (Or at least simple >> cases work.) Figuring out which work and which don't would give some >> insight. > AFAICT, extracting the result from a statepoint wrapping a vararg > function is the problem. If it's a void function, there's no problem.Ah! That helps to understand the problem. Can you separate out a change to the verifier which accepts void returning varargs and post that for review? I can sign off quickly.
Ramkumar Ramachandra
2015-Jan-20 19:09 UTC
[LLVMdev] [INCOMPLETE] [GC] Support wrapping vararg functions in statepoint
Philip Reames wrote:> Can you separate out a change to the verifier which accepts void returning > varargs and post that for review?Please double-check that it works on your end.
Ramkumar Ramachandra
2015-Jan-20 19:28 UTC
[LLVMdev] [INCOMPLETE] [GC] Support wrapping vararg functions in statepoint
Philip Reames wrote:> I think I'm missing something here. What leads you to believe that > visitCall doesn't handle vararg functions? > > Also, I see calls in both visitInvoke and visitCall. I would assume these > are the primary entry points...I'm probably more confused about this than you are. The callchain is approximately SelectionDAGBuilder::LowerCallTo -> SelectionDAGBuilder::lowerInvokable -> TargetLowering::LowerCallTo -> X86TargetLowering::LowerCall. Now, the isVarArg information needs to be conveyed to LowerCall, and that happens via CLI.IsVarArg, which TargetLowering::LowerCallTo accepts as a parameter. SelectionDAGBuilder::LowerCallTo isn't passed that information, and doesn't compute it to send to lowerInvokable (which builds the CLI for TargetLowering::LowerCallTo). How could SelectionDAGBuilder::LowerCallTo possibly handle vararg?