diff --git a/llvm/docs/ProgrammersManual.html b/llvm/docs/ProgrammersManual.html index 4e6d23baf5ca..d51d958df050 100644 --- a/llvm/docs/ProgrammersManual.html +++ b/llvm/docs/ProgrammersManual.html @@ -285,18 +285,39 @@ pointer value for now, you must cast to void*.
+std::set<Instruction*> worklist; +worklist.insert(inst_begin(F), inst_end(F)); ++The STL set worklist would now contain all instructions in +the Function pointed to by F.
void printNextInstruction(Instruction* inst) { @@ -359,20 +382,20 @@ better to explicitly grab the next instruction directly from inst. more complex example
initialize callCounter to zero for each Function f in the Module for each BasicBlock b in f for each Instruction i in b - if(i is a CallInst and foo is the function it calls) + if(i is a CallInst and calls the given function) increment callCounter@@ -381,49 +404,36 @@ And the actual code is (remember, since we're writing a has to override the runOnFunction method...):
+class OurFunctionPass : public FunctionPass { + public: + OurFunctionPass(Function* func): m_func(func) { } -// Assume callCounter is a private member of the pass class being written, -// and has been initialized in the pass class constructor. + virtual doInitialization(Module& M) { callCounter = 0; }; -virtual runOnFunction(Function& F) { - - // Remember, we assumed that the signature of foo was "int foo(int)"; - // the first thing we'll do is grab the pointer to that function (as a - // Function*) so we can use it later when we're examining the - // parameters of a CallInst. All of the code before the call to - // Module::getOrInsertFunction() is in preparation to do symbol-table - // to find the function pointer. - - vector-We could then print out the value of callCounter (if we wanted to) -inside the doFinalization method of our FunctionPass. - -params; - params.push_back(Type::IntTy); - const FunctionType* fooType = FunctionType::get(Type::IntTy, params); - Function* foo = F.getParent()->getOrInsertFunction("foo", fooType); - - // Start iterating and (as per the pseudocode), increment callCounter. - - for(Function::iterator b = F.begin(), be = F.end(); b != be; ++b) { - for(BasicBlock::iterator i = b->begin(); ie = b->end(); i != ie; ++i) { - if(CallInst* callInst = dyn_cast (&*inst)) { - // we know we've encountered a call instruction, so we - // need to determine if it's a call to foo or not - - if(callInst->getCalledFunction() == foo) - ++callCounter; - } - } + virtual runOnFunction(Function& F) { + for(Function::iterator b = F.begin(), be = F.end(); b != be; ++b) { + for(BasicBlock::iterator i = b->begin(); ie = b->end(); i != ie; ++i) { + if(CallInst* callInst = dyn_cast (&*inst)) { + // we know we've encountered a call instruction, so we + // need to determine if it's a call to the + // function pointed to by m_func or not. + + if(callInst->getCalledFunction() == m_func) + ++callCounter; + } + } } -} + + private: + Function* m_func; // we're counting calls to this function. + static unsigned callCounter; +};