xref: /aosp_15_r20/external/swiftshader/third_party/subzero/src/IceInstrumentation.h (revision 03ce13f70fcc45d86ee91b7ee4cab1936a95046e)
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