//===- subzero/src/IceInstrumentation.h - ICE instrumentation ---*- C++ -*-===// // // The Subzero Code Generator // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// /// /// \file /// \brief Declares the Ice::Instrumentation class. /// /// Instrumentation is an abstract class used to drive the instrumentation /// process for tools such as AddressSanitizer and MemorySanitizer. It uses a /// LoweringContext to enable the insertion of new instructions into a given /// Cfg. Although Instrumentation is an abstract class, each of its virtual /// functions has a trivial default implementation to make subclasses more /// succinct. /// /// If instrumentation is required by the command line arguments, a single /// Instrumentation subclass is instantiated and installed in the /// GlobalContext. If multiple types of instrumentation are requested, a single /// subclass is still responsible for driving the instrumentation, but it can /// use other Instrumentation subclasses however it needs to. /// //===----------------------------------------------------------------------===// #ifndef SUBZERO_SRC_ICEINSTRUMENTATION_H #define SUBZERO_SRC_ICEINSTRUMENTATION_H #include "IceDefs.h" #include <condition_variable> namespace Ice { class LoweringContext; class Instrumentation { Instrumentation() = delete; Instrumentation(const Instrumentation &) = delete; Instrumentation &operator=(const Instrumentation &) = delete; public: Instrumentation(GlobalContext *Ctx) : Ctx(Ctx) {} virtual ~Instrumentation() = default; virtual void instrumentGlobals(VariableDeclarationList &) {} void instrumentFunc(Cfg *Func); void setHasSeenGlobals(); protected: virtual void instrumentInst(LoweringContext &Context); LockedPtr<VariableDeclarationList> getGlobals(); private: virtual bool isInstrumentable(Cfg *) { return true; } virtual void instrumentFuncStart(LoweringContext &) {} virtual void instrumentAlloca(LoweringContext &, class InstAlloca *) {} virtual void instrumentArithmetic(LoweringContext &, class InstArithmetic *) { } virtual void instrumentBr(LoweringContext &, class InstBr *) {} virtual void instrumentCall(LoweringContext &, class InstCall *) {} virtual void instrumentCast(LoweringContext &, class InstCast *) {} virtual void instrumentExtractElement(LoweringContext &, class InstExtractElement *) {} virtual void instrumentFcmp(LoweringContext &, class InstFcmp *) {} virtual void instrumentIcmp(LoweringContext &, class InstIcmp *) {} virtual void instrumentInsertElement(LoweringContext &, class InstInsertElement *) {} virtual void instrumentIntrinsicCall(LoweringContext &, class InstIntrinsicCall *) {} virtual void instrumentLoad(LoweringContext &, class InstLoad *) {} virtual void instrumentPhi(LoweringContext &, class InstPhi *) {} virtual void instrumentRet(LoweringContext &, class InstRet *) {} virtual void instrumentSelect(LoweringContext &, class InstSelect *) {} virtual void instrumentStore(LoweringContext &, class InstStore *) {} virtual void instrumentSwitch(LoweringContext &, class InstSwitch *) {} virtual void instrumentUnreachable(LoweringContext &, class InstUnreachable *) {} virtual void instrumentStart(Cfg *) {} virtual void instrumentLocalVars(Cfg *) {} virtual void finishFunc(Cfg *) {} protected: GlobalContext *Ctx; private: bool HasSeenGlobals = false; std::mutex GlobalsSeenMutex; std::condition_variable GlobalsSeenCV; }; } // end of namespace Ice #endif // SUBZERO_SRC_ICEINSTRUMENTATION_H