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 <map>
+static map<const StructType *, vector<unsigned> > FieldAccessCounts;
+#endif
+
sigjmp_buf SignalRecoverBuffer;
static bool InInstruction = false;
} else {
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
+
return;
}
const ConstPoolUInt *CPU = cast<ConstPoolUInt>(I->getOperand(ArgOff++));
assert(CPU->getType() == Type::UByteTy);
unsigned Index = CPU->getValue();
+
+#ifdef PROFILE_STRUCTURE_FIELDS
+ if (ProfileStructureFields) {
+ // Do accounting for this field...
+ vector<unsigned> &OfC = FieldAccessCounts[STy];
+ if (OfC.size() == 0) OfC.resize(STy->getElementTypes().size());
+ OfC[Index]++;
+ }
+#endif
+
Total += SLO->MemberOffsets[Index];
Ty = STy->getElementTypes()[Index];
}
#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"
// NULL if main func or debugger invoked fn
};
-
// Interpreter - This class represents the entirety of the interpreter.
//
class Interpreter {