diff --git a/lib/ExecutionEngine/Interpreter/Execution.cpp b/lib/ExecutionEngine/Interpreter/Execution.cpp index 41948c58066..c19d15cff42 100644 --- a/lib/ExecutionEngine/Interpreter/Execution.cpp +++ b/lib/ExecutionEngine/Interpreter/Execution.cpp @@ -26,6 +26,14 @@ static TargetData TD("lli Interpreter"); CachedWriter CW; // Object to accelerate printing of LLVM +#ifdef PROFILE_STRUCTURE_FIELDS +#include "llvm/Support/CommandLine.h" +static cl::Flag ProfileStructureFields("profilestructfields", + "Profile Structure Field Accesses"); +#include +static map > FieldAccessCounts; +#endif + sigjmp_buf SignalRecoverBuffer; static bool InInstruction = false; @@ -628,6 +636,33 @@ void Interpreter::executeRetInst(ReturnInst *I, ExecutionContext &SF) { } else { ExitCode = 0; } + +#ifdef PROFILE_STRUCTURE_FIELDS + // Print out structure field accounting information... + if (!FieldAccessCounts.empty()) { + CW << "Field Access Profile Information:\n"; + map >::iterator + I = FieldAccessCounts.begin(), E = FieldAccessCounts.end(); + for (; I != E; ++I) { + vector &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 + return; } @@ -723,6 +758,16 @@ static PointerTy getElementOffset(Instruction *I, unsigned ArgOff) { const ConstPoolUInt *CPU = cast(I->getOperand(ArgOff++)); assert(CPU->getType() == Type::UByteTy); unsigned Index = CPU->getValue(); + +#ifdef PROFILE_STRUCTURE_FIELDS + if (ProfileStructureFields) { + // Do accounting for this field... + vector &OfC = FieldAccessCounts[STy]; + if (OfC.size() == 0) OfC.resize(STy->getElementTypes().size()); + OfC[Index]++; + } +#endif + Total += SLO->MemberOffsets[Index]; Ty = STy->getElementTypes()[Index]; } diff --git a/lib/ExecutionEngine/Interpreter/Interpreter.h b/lib/ExecutionEngine/Interpreter/Interpreter.h index eba8ea9c327..7e1fde1e8d5 100644 --- a/lib/ExecutionEngine/Interpreter/Interpreter.h +++ b/lib/ExecutionEngine/Interpreter/Interpreter.h @@ -7,6 +7,10 @@ #ifndef LLI_INTERPRETER_H #define LLI_INTERPRETER_H +// Uncomment this line to enable profiling of structure field accesses. +#define PROFILE_STRUCTURE_FIELDS 1 + + #include "llvm/Module.h" #include "llvm/Method.h" #include "llvm/Support/DataTypes.h" @@ -54,7 +58,6 @@ struct ExecutionContext { // NULL if main func or debugger invoked fn }; - // Interpreter - This class represents the entirety of the interpreter. // class Interpreter {