diff options
author | Chris Lattner <sabre@nondot.org> | 2001-11-12 16:28:48 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2001-11-12 16:28:48 +0000 |
commit | a95c69997faa0422f135efad2f25281011d1cbf0 (patch) | |
tree | 54be8c60af6c0b8c7d063ed5437e60ad5d09d3cb /lib/ExecutionEngine/Interpreter/Execution.cpp | |
parent | e2409064715ac156ead333a039107b6e14548050 (diff) |
Print profile info if exit() is called
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@1268 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/ExecutionEngine/Interpreter/Execution.cpp')
-rw-r--r-- | lib/ExecutionEngine/Interpreter/Execution.cpp | 56 |
1 files changed, 30 insertions, 26 deletions
diff --git a/lib/ExecutionEngine/Interpreter/Execution.cpp b/lib/ExecutionEngine/Interpreter/Execution.cpp index c19d15cff4..5c763d79fb 100644 --- a/lib/ExecutionEngine/Interpreter/Execution.cpp +++ b/lib/ExecutionEngine/Interpreter/Execution.cpp @@ -599,6 +599,34 @@ static void executeBinaryInst(BinaryOperator *I, ExecutionContext &SF) { // Terminator Instruction Implementations //===----------------------------------------------------------------------===// +static void PerformExitStuff() { +#ifdef PROFILE_STRUCTURE_FIELDS + // Print out structure field accounting information... + if (!FieldAccessCounts.empty()) { + CW << "Field Access Profile Information:\n"; + map<const StructType *, vector<unsigned> >::iterator + I = FieldAccessCounts.begin(), E = FieldAccessCounts.end(); + for (; I != E; ++I) { + vector<unsigned> &OfC = I->second; + CW << " '" << (Value*)I->first << "'\t- Sum="; + + unsigned Sum = 0; + for (unsigned i = 0; i < OfC.size(); ++i) + Sum += OfC[i]; + CW << Sum << " - "; + + for (unsigned i = 0; i < OfC.size(); ++i) { + if (i) CW << ", "; + CW << OfC[i]; + } + CW << endl; + } + CW << endl; + FieldAccessCounts.clear(); + } +#endif +} + void Interpreter::exitCalled(GenericValue GV) { cout << "Program returned "; print(Type::IntTy, GV); @@ -606,6 +634,7 @@ void Interpreter::exitCalled(GenericValue GV) { ExitCode = GV.SByteVal; ECStack.clear(); + PerformExitStuff(); } void Interpreter::executeRetInst(ReturnInst *I, ExecutionContext &SF) { @@ -637,32 +666,7 @@ void Interpreter::executeRetInst(ReturnInst *I, ExecutionContext &SF) { ExitCode = 0; } -#ifdef PROFILE_STRUCTURE_FIELDS - // Print out structure field accounting information... - if (!FieldAccessCounts.empty()) { - CW << "Field Access Profile Information:\n"; - map<const StructType *, vector<unsigned> >::iterator - I = FieldAccessCounts.begin(), E = FieldAccessCounts.end(); - for (; I != E; ++I) { - vector<unsigned> &OfC = I->second; - CW << " '" << (Value*)I->first << "'\t- Sum="; - - unsigned Sum = 0; - for (unsigned i = 0; i < OfC.size(); ++i) - Sum += OfC[i]; - CW << Sum << " - "; - - for (unsigned i = 0; i < OfC.size(); ++i) { - if (i) CW << ", "; - CW << OfC[i]; - } - CW << endl; - } - CW << endl; - FieldAccessCounts.clear(); - } -#endif - + PerformExitStuff(); return; } |