1*03ce13f7SAndroid Build Coastguard Worker //===- subzero/src/IceInstrumentation.h - ICE instrumentation ---*- C++ -*-===// 2*03ce13f7SAndroid Build Coastguard Worker // 3*03ce13f7SAndroid Build Coastguard Worker // The Subzero Code Generator 4*03ce13f7SAndroid Build Coastguard Worker // 5*03ce13f7SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source 6*03ce13f7SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details. 7*03ce13f7SAndroid Build Coastguard Worker // 8*03ce13f7SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===// 9*03ce13f7SAndroid Build Coastguard Worker /// 10*03ce13f7SAndroid Build Coastguard Worker /// \file 11*03ce13f7SAndroid Build Coastguard Worker /// \brief Declares the Ice::Instrumentation class. 12*03ce13f7SAndroid Build Coastguard Worker /// 13*03ce13f7SAndroid Build Coastguard Worker /// Instrumentation is an abstract class used to drive the instrumentation 14*03ce13f7SAndroid Build Coastguard Worker /// process for tools such as AddressSanitizer and MemorySanitizer. It uses a 15*03ce13f7SAndroid Build Coastguard Worker /// LoweringContext to enable the insertion of new instructions into a given 16*03ce13f7SAndroid Build Coastguard Worker /// Cfg. Although Instrumentation is an abstract class, each of its virtual 17*03ce13f7SAndroid Build Coastguard Worker /// functions has a trivial default implementation to make subclasses more 18*03ce13f7SAndroid Build Coastguard Worker /// succinct. 19*03ce13f7SAndroid Build Coastguard Worker /// 20*03ce13f7SAndroid Build Coastguard Worker /// If instrumentation is required by the command line arguments, a single 21*03ce13f7SAndroid Build Coastguard Worker /// Instrumentation subclass is instantiated and installed in the 22*03ce13f7SAndroid Build Coastguard Worker /// GlobalContext. If multiple types of instrumentation are requested, a single 23*03ce13f7SAndroid Build Coastguard Worker /// subclass is still responsible for driving the instrumentation, but it can 24*03ce13f7SAndroid Build Coastguard Worker /// use other Instrumentation subclasses however it needs to. 25*03ce13f7SAndroid Build Coastguard Worker /// 26*03ce13f7SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===// 27*03ce13f7SAndroid Build Coastguard Worker 28*03ce13f7SAndroid Build Coastguard Worker #ifndef SUBZERO_SRC_ICEINSTRUMENTATION_H 29*03ce13f7SAndroid Build Coastguard Worker #define SUBZERO_SRC_ICEINSTRUMENTATION_H 30*03ce13f7SAndroid Build Coastguard Worker 31*03ce13f7SAndroid Build Coastguard Worker #include "IceDefs.h" 32*03ce13f7SAndroid Build Coastguard Worker 33*03ce13f7SAndroid Build Coastguard Worker #include <condition_variable> 34*03ce13f7SAndroid Build Coastguard Worker 35*03ce13f7SAndroid Build Coastguard Worker namespace Ice { 36*03ce13f7SAndroid Build Coastguard Worker 37*03ce13f7SAndroid Build Coastguard Worker class LoweringContext; 38*03ce13f7SAndroid Build Coastguard Worker 39*03ce13f7SAndroid Build Coastguard Worker class Instrumentation { 40*03ce13f7SAndroid Build Coastguard Worker Instrumentation() = delete; 41*03ce13f7SAndroid Build Coastguard Worker Instrumentation(const Instrumentation &) = delete; 42*03ce13f7SAndroid Build Coastguard Worker Instrumentation &operator=(const Instrumentation &) = delete; 43*03ce13f7SAndroid Build Coastguard Worker 44*03ce13f7SAndroid Build Coastguard Worker public: Instrumentation(GlobalContext * Ctx)45*03ce13f7SAndroid Build Coastguard Worker Instrumentation(GlobalContext *Ctx) : Ctx(Ctx) {} 46*03ce13f7SAndroid Build Coastguard Worker virtual ~Instrumentation() = default; instrumentGlobals(VariableDeclarationList &)47*03ce13f7SAndroid Build Coastguard Worker virtual void instrumentGlobals(VariableDeclarationList &) {} 48*03ce13f7SAndroid Build Coastguard Worker void instrumentFunc(Cfg *Func); 49*03ce13f7SAndroid Build Coastguard Worker void setHasSeenGlobals(); 50*03ce13f7SAndroid Build Coastguard Worker 51*03ce13f7SAndroid Build Coastguard Worker protected: 52*03ce13f7SAndroid Build Coastguard Worker virtual void instrumentInst(LoweringContext &Context); 53*03ce13f7SAndroid Build Coastguard Worker LockedPtr<VariableDeclarationList> getGlobals(); 54*03ce13f7SAndroid Build Coastguard Worker 55*03ce13f7SAndroid Build Coastguard Worker private: isInstrumentable(Cfg *)56*03ce13f7SAndroid Build Coastguard Worker virtual bool isInstrumentable(Cfg *) { return true; } instrumentFuncStart(LoweringContext &)57*03ce13f7SAndroid Build Coastguard Worker virtual void instrumentFuncStart(LoweringContext &) {} instrumentAlloca(LoweringContext &,class InstAlloca *)58*03ce13f7SAndroid Build Coastguard Worker virtual void instrumentAlloca(LoweringContext &, class InstAlloca *) {} instrumentArithmetic(LoweringContext &,class InstArithmetic *)59*03ce13f7SAndroid Build Coastguard Worker virtual void instrumentArithmetic(LoweringContext &, class InstArithmetic *) { 60*03ce13f7SAndroid Build Coastguard Worker } instrumentBr(LoweringContext &,class InstBr *)61*03ce13f7SAndroid Build Coastguard Worker virtual void instrumentBr(LoweringContext &, class InstBr *) {} instrumentCall(LoweringContext &,class InstCall *)62*03ce13f7SAndroid Build Coastguard Worker virtual void instrumentCall(LoweringContext &, class InstCall *) {} instrumentCast(LoweringContext &,class InstCast *)63*03ce13f7SAndroid Build Coastguard Worker virtual void instrumentCast(LoweringContext &, class InstCast *) {} instrumentExtractElement(LoweringContext &,class InstExtractElement *)64*03ce13f7SAndroid Build Coastguard Worker virtual void instrumentExtractElement(LoweringContext &, 65*03ce13f7SAndroid Build Coastguard Worker class InstExtractElement *) {} instrumentFcmp(LoweringContext &,class InstFcmp *)66*03ce13f7SAndroid Build Coastguard Worker virtual void instrumentFcmp(LoweringContext &, class InstFcmp *) {} instrumentIcmp(LoweringContext &,class InstIcmp *)67*03ce13f7SAndroid Build Coastguard Worker virtual void instrumentIcmp(LoweringContext &, class InstIcmp *) {} instrumentInsertElement(LoweringContext &,class InstInsertElement *)68*03ce13f7SAndroid Build Coastguard Worker virtual void instrumentInsertElement(LoweringContext &, 69*03ce13f7SAndroid Build Coastguard Worker class InstInsertElement *) {} instrumentIntrinsic(LoweringContext &,class InstIntrinsic *)70*03ce13f7SAndroid Build Coastguard Worker virtual void instrumentIntrinsic(LoweringContext &, class InstIntrinsic *) {} instrumentLoad(LoweringContext &,class InstLoad *)71*03ce13f7SAndroid Build Coastguard Worker virtual void instrumentLoad(LoweringContext &, class InstLoad *) {} instrumentPhi(LoweringContext &,class InstPhi *)72*03ce13f7SAndroid Build Coastguard Worker virtual void instrumentPhi(LoweringContext &, class InstPhi *) {} instrumentRet(LoweringContext &,class InstRet *)73*03ce13f7SAndroid Build Coastguard Worker virtual void instrumentRet(LoweringContext &, class InstRet *) {} instrumentSelect(LoweringContext &,class InstSelect *)74*03ce13f7SAndroid Build Coastguard Worker virtual void instrumentSelect(LoweringContext &, class InstSelect *) {} instrumentStore(LoweringContext &,class InstStore *)75*03ce13f7SAndroid Build Coastguard Worker virtual void instrumentStore(LoweringContext &, class InstStore *) {} instrumentSwitch(LoweringContext &,class InstSwitch *)76*03ce13f7SAndroid Build Coastguard Worker virtual void instrumentSwitch(LoweringContext &, class InstSwitch *) {} instrumentUnreachable(LoweringContext &,class InstUnreachable *)77*03ce13f7SAndroid Build Coastguard Worker virtual void instrumentUnreachable(LoweringContext &, 78*03ce13f7SAndroid Build Coastguard Worker class InstUnreachable *) {} instrumentStart(Cfg *)79*03ce13f7SAndroid Build Coastguard Worker virtual void instrumentStart(Cfg *) {} instrumentLocalVars(Cfg *)80*03ce13f7SAndroid Build Coastguard Worker virtual void instrumentLocalVars(Cfg *) {} finishFunc(Cfg *)81*03ce13f7SAndroid Build Coastguard Worker virtual void finishFunc(Cfg *) {} 82*03ce13f7SAndroid Build Coastguard Worker 83*03ce13f7SAndroid Build Coastguard Worker protected: 84*03ce13f7SAndroid Build Coastguard Worker GlobalContext *Ctx; 85*03ce13f7SAndroid Build Coastguard Worker 86*03ce13f7SAndroid Build Coastguard Worker private: 87*03ce13f7SAndroid Build Coastguard Worker bool HasSeenGlobals = false; 88*03ce13f7SAndroid Build Coastguard Worker std::mutex GlobalsSeenMutex; 89*03ce13f7SAndroid Build Coastguard Worker std::condition_variable GlobalsSeenCV; 90*03ce13f7SAndroid Build Coastguard Worker }; 91*03ce13f7SAndroid Build Coastguard Worker 92*03ce13f7SAndroid Build Coastguard Worker } // end of namespace Ice 93*03ce13f7SAndroid Build Coastguard Worker 94*03ce13f7SAndroid Build Coastguard Worker #endif // SUBZERO_SRC_ICEINSTRUMENTATION_H 95