| //===- 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 |