Edmund Grimley-Evans wrote:> Could some kind soul point me at the documentation, or the appropriate
header file, or an example of the best way to write a pass that modifies the IR?
>
A few places to start:
http://llvm.org/docs/ProgrammersManual.html
http://llvm.org/docs/WritingAnLLVMPass.html
http://llvm.org/doxygen/
http://llvm.org/docs/CommandLine.html
> Suppose, for example, that I wanted to replace every call to the intrinsic
i1 with a call to i2 followed by a call to i3: i1(X) -> i3(i2(X))
>
> I'm currently playing around with a class that inherits from
FunctionPass and InstVisitor and I can add instructions but I'm not yet able
to use the output from the new instruction. I suspect there's a much easier
way of doing what I want to do.
>
First, you should understand what an LLVM Pass is. I think you more or
less understand this.
Second, you need to understand the C++ classes that represent and
manipulate the LLVM IR. Some of this is documented near the end of the
Programmer's Manual (the URL for which is given above). The doxygen
documentation is invaluable for learning the nuts and bolts of the API;
there is essentially one class for each kind of object in the LLVM IR,
and the doxygen documentation provides information on the methods one
can use on those classes to do what you want.
Now, to answer your specific questions:
1) How do I use the result of an Instruction?
In LLVM IR, an instruction and its result are one and the same. To use
an instruction, you just pass a pointer to the object representing the
instruction.
For example, let us say that I have somehow created an instruction like so:
Instruction * I = AllocaInst::Create (...);
To use the result of the instruction in a pointer for a store
instruction, I just do the following:
/* V is a Value * and BB is a BasicBlock * that have been defined
earlier in the code */
Instruction * I = AllocaInst::Create (...);
StoreInst * SI = new StoreInst (V, I, BB);
2) How do I replace the use of one value with another?
In most cases, you use the replaceAllUsesWith() method of Value * (which
is inherited by Instruction * and a bunch of other classes). There is
also some documentation in the Programmer's manual as well.
You may also want to look at the IRBuilder class in doxygen; it is
apparently the "new" way to create LLVM IR and is less likely to
change
between LLVM releases.
-- John T.
> Edmund
>