[LLVMdev] InstVisitor Example

Brice Lin brice.lin at gmail.com
Tue Apr 14 13:23:01 PDT 2009


Thanks for providing me with those examples. My rather inefficient
pass, which inherits from ModulePass, currently iterates through the
Module, Functions, and BasicBlocks multiple times (once to find
strcpy, another to find strcat, and so on for various other
functions). If I only care about the direct calls, would I benefit
more from switching to multiple use_iterators or the InstVisitor
template?

- Brice

On Tue, Apr 14, 2009 at 1:13 PM, Luke Dalessandro
<luked at cs.rochester.edu> wrote:
>
> On Apr 14, 2009, at 1:49 PM, Luke Dalessandro wrote:
>
> I guess I should note that the "use iteration" will only work for
> direct calls. If you are concerned with indirect calls you need an
> alias analysis or call graph or some such thing. There are lots of
> ways to deal with this.
>
> Also, you might need to be smarter about the Instruction check if you
> expect ConstantExpr casts or any other such use of the declaration.
>
> Luke
>
>>
>>
>>   Function* const strcpy = m.getFunction("strcpy");
>>   for (Value::use_iterator i = strcpy->use_begin(), e = strcpy-
>>> use_end(); i != e; ++i)
>>     if (Instruction* const use = dyn_cast<Instruction>(i)) {
>>       // Do what you need here
>>       CallSite call(use);
>>       ...
>>     }
>>
>> If you want to know how to use InstVisitor for other purposes, you
>> just derive a class from the InstVisitor template, and overload the
>> visit routines that you want.
>>
>>   class StrcpyVisitor : public InstVisitor<StrcpyVisitor> {
>>     void handleStrcpy(CallSite strcpy);
>>     string strcpyName;
>>    public:
>>     void visitCallInst(CallInst& call) {
>>       if (call.getName() == strcpyName)
>>         handleStrcpy(&call);
>>     }
>>     void visitInvokeInst(InvokeInst& invoke) {
>>       if (call.getName() == strcpyName)
>>         handleStrcpy(&invoke);
>>     }
>>   };
>>
>> Then, you probably want to inherit from ModulePass, or FunctionPass,
>> or BasicBlockPass, or whatever makes sense, and in the relevant
>> runOnX(X& x) callback you say:
>>
>>   bool runOnX(X& x) {
>>     visit(x);
>>     return true/false/something_computed;
>>   }
>>
>> Hope this helps,
>> Luke




More information about the llvm-dev mailing list