Changes in directory llvm/lib/Transforms/Instrumentation:
RSProfiling.cpp updated: 1.3 -> 1.4 --- Log message: a few more comments on the interfaces and functions --- Diffs of the changes: (+20 -3) RSProfiling.cpp | 23 ++++++++++++++++++++--- 1 files changed, 20 insertions(+), 3 deletions(-) Index: llvm/lib/Transforms/Instrumentation/RSProfiling.cpp diff -u llvm/lib/Transforms/Instrumentation/RSProfiling.cpp:1.3 llvm/lib/Transforms/Instrumentation/RSProfiling.cpp:1.4 --- llvm/lib/Transforms/Instrumentation/RSProfiling.cpp:1.3 Mon Nov 28 12:00:38 2005 +++ llvm/lib/Transforms/Instrumentation/RSProfiling.cpp Mon Nov 28 12:10:59 2005 @@ -70,6 +70,9 @@ clEnumValN(HOSTCC, "rdcc", "cycle counter"), clEnumValEnd)); + /// NullProfilerRS - The basic profiler that does nothing. It is the default + /// profiler and thus terminates RSProfiler chains. It is useful for + /// measuring framework overhead class NullProfilerRS : public RSProfilers { public: bool isProfiling(Value* v) { @@ -88,15 +91,21 @@ "Measure profiling framework overhead"); static RegisterAnalysisGroup<RSProfilers, NullProfilerRS, true> NPT; - //Something that chooses how to sample + /// Chooser - Something that chooses when to make a sample of the profiled code class Chooser { public: + /// ProcessChoicePoint - is called for each basic block inserted to choose + /// between normal and sample code virtual void ProcessChoicePoint(BasicBlock*) = 0; + /// PrepFunction - is called once per function before other work is done. + /// This gives the opertunity to insert new allocas and such. virtual void PrepFunction(Function*) = 0; virtual ~Chooser() {} }; //Things that implement sampling policies + //A global value that is read-mod-stored to choose when to sample. + //A sample is taken when the global counter hits 0 class GlobalRandomCounter : public Chooser { GlobalVariable* Counter; Value* ResetValue; @@ -108,6 +117,7 @@ virtual void ProcessChoicePoint(BasicBlock* bb); }; + //Same is GRC, but allow register allocation of the global counter class GlobalRandomCounterOpt : public Chooser { GlobalVariable* Counter; Value* ResetValue; @@ -120,6 +130,8 @@ virtual void ProcessChoicePoint(BasicBlock* bb); }; + //Use the cycle counter intrinsic as a source of pseudo randomness when + //deciding when to sample. class CycleCounter : public Chooser { uint64_t rm; Function* F; @@ -130,14 +142,18 @@ virtual void ProcessChoicePoint(BasicBlock* bb); }; - + /// ProfilerRS - Insert the random sampling framework struct ProfilerRS : public FunctionPass { std::map<Value*, Value*> TransCache; std::set<BasicBlock*> ChoicePoints; Chooser* c; + //Translate and duplicate values for the new profile free version of stuff Value* Translate(Value* v); + //Duplicate an entire function (with out profiling) void Duplicate(Function& F, RSProfilers& LI); + //Called once for each backedge, handle the insertion of choice points and + //the interconection of the two versions of the code void ProcessBackEdge(BasicBlock* src, BasicBlock* dst, Function& F); bool runOnFunction(Function& F); bool doInitialization(Module &M); @@ -224,7 +240,8 @@ LoadInst* l = new LoadInst(Counter, "counterload", AI->getNext()); new StoreInst(l, AI, l->getNext()); - //modify all functions and return values + //modify all functions and return values to restore the local variable to/from + //the global variable for(Function::iterator fib = F->begin(), fie = F->end(); fib != fie; ++fib) for(BasicBlock::iterator bib = fib->begin(), bie = fib->end(); _______________________________________________ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits