Greetings,
I am rather new to LLVM, so please excuse my limited knowledge about it.
Currently I am trying to modify the X86TargetLowering::LowerCALL method by
inserting additional instructions before the call.
As far as I understand, nodes are created by calling the getNode method on
the DAG. If, for example, I insert the following code
Ops.push_back(Chain);
Chain = DAG.getNode(ISD::TRAP, DAG.getVTList(MVT::Other), &Ops[0],
Ops.size());
then an X86 instruction (namely ud2) appears in the output files compiled by
llc.
So, is my understanding correct that
1) the Chain determines the ordering of the nodes?
2) the second parameter is a set of return types, i. e. in my example,
MVT::Other says that a Chain object will be returned?
Now, as soon as I try to generate more complex instructions, I get lost.
Say, I want to insert the following instruction
mov eax, 42
then the best I can come up with is
Ops.push_back(Chain);
Ops.push_back(DAG.getRegister(X86::EAX, MVT::i32));
Ops.push_back(DAG.getConstant(42, MVT::i32));
Chain = DAG.getNode(X86::MOV32ri, DAG.getVTList(MVT::Other), &Ops[0],
Ops.size());
But there are a few problems:
3) It seems I am not allowed to use concrete X86 instructions here (at least
that's what I think llc's error message "cannot yet select" could mean). Is
there an appropriate instruction in ISD? I can't find it...
4) Do I get the parameter passing right? Fooling around with other
expressions suggests that I get it wrong.
5) What exactly is the meaning of further result types? If I get the new
Chain object back, are the other results inside?
Could you help me out?
Sincerely,
Artjom Kochtchi