Index: src/IceInstrumentation.cpp |
diff --git a/src/IceInstrumentation.cpp b/src/IceInstrumentation.cpp |
new file mode 100644 |
index 0000000000000000000000000000000000000000..383e1512cde1198989d2be9626f261618504077f |
--- /dev/null |
+++ b/src/IceInstrumentation.cpp |
@@ -0,0 +1,108 @@ |
+//===- subzero/src/IceInstrumentation.cpp - ICE instrumentation framework -===// |
+// |
+// The Subzero Code Generator |
+// |
+// This file is distributed under the University of Illinois Open Source |
+// License. See LICENSE.TXT for details. |
+// |
+//===----------------------------------------------------------------------===// |
+/// |
+/// \file |
+/// \brief Implements the Ice::Instrumentation class. |
+/// |
+/// Subclasses can override particular instrumentation methods to specify how |
+/// the the target program should be instrumented. |
+/// |
+//===----------------------------------------------------------------------===// |
+ |
+#include "IceInstrumentation.h" |
+ |
+#include "IceCfg.h" |
+#include "IceInst.h" |
+#include "IceTargetLowering.h" |
+ |
+namespace Ice { |
+ |
+// Iterate through the instructions in the given CFG and instrument each one. |
+// Also instrument the beginning of the function. |
+void Instrumentation::instrumentFunc(Cfg *Func) { |
+ assert(Func); |
+ assert(!Func->getNodes().empty()); |
+ |
+ LoweringContext Context; |
+ Context.init(Func->getNodes().front()); |
+ instrumentFuncStart(Context); |
+ for (CfgNode *Node : Func->getNodes()) { |
+ Context.init(Node); |
+ while (!Context.atEnd()) { |
+ instrumentInst(Context); |
+ // go to next undeleted instruction |
+ Context.advanceCur(); |
+ Context.advanceNext(); |
+ } |
+ } |
+} |
+ |
+void Instrumentation::instrumentInst(LoweringContext &Context) { |
+ assert(!Context.atEnd()); |
+ Inst *Instr = iteratorToInst(Context.getCur()); |
+ switch (Instr->getKind()) { |
+ case Inst::Alloca: |
+ instrumentAlloca(Context, llvm::cast<InstAlloca>(Instr)); |
+ break; |
+ case Inst::Arithmetic: |
+ instrumentArithmetic(Context, llvm::cast<InstArithmetic>(Instr)); |
+ break; |
+ case Inst::Br: |
+ instrumentBr(Context, llvm::cast<InstBr>(Instr)); |
+ break; |
+ case Inst::Call: |
+ instrumentCall(Context, llvm::cast<InstCall>(Instr)); |
+ break; |
+ case Inst::Cast: |
+ instrumentCast(Context, llvm::cast<InstCast>(Instr)); |
+ break; |
+ case Inst::ExtractElement: |
+ instrumentExtractElement(Context, llvm::cast<InstExtractElement>(Instr)); |
+ break; |
+ case Inst::Fcmp: |
+ instrumentFcmp(Context, llvm::cast<InstFcmp>(Instr)); |
+ break; |
+ case Inst::Icmp: |
+ instrumentIcmp(Context, llvm::cast<InstIcmp>(Instr)); |
+ break; |
+ case Inst::InsertElement: |
+ instrumentInsertElement(Context, llvm::cast<InstInsertElement>(Instr)); |
+ break; |
+ case Inst::IntrinsicCall: |
+ instrumentIntrinsicCall(Context, llvm::cast<InstIntrinsicCall>(Instr)); |
+ break; |
+ case Inst::Load: |
+ instrumentLoad(Context, llvm::cast<InstLoad>(Instr)); |
+ break; |
+ case Inst::Phi: |
+ instrumentPhi(Context, llvm::cast<InstPhi>(Instr)); |
+ break; |
+ case Inst::Ret: |
+ instrumentRet(Context, llvm::cast<InstRet>(Instr)); |
+ break; |
+ case Inst::Select: |
+ instrumentSelect(Context, llvm::cast<InstSelect>(Instr)); |
+ break; |
+ case Inst::Store: |
+ instrumentStore(Context, llvm::cast<InstStore>(Instr)); |
+ break; |
+ case Inst::Switch: |
+ instrumentSwitch(Context, llvm::cast<InstSwitch>(Instr)); |
+ break; |
+ case Inst::Unreachable: |
+ instrumentUnreachable(Context, llvm::cast<InstUnreachable>(Instr)); |
+ break; |
+ default: |
+ // Only instrument high-level ICE instructions |
+ assert(false && "Instrumentation encountered an unexpected instruction"); |
+ break; |
+ } |
+} |
+ |
+} // end of namespace Ice |