xref: /aosp_15_r20/external/swiftshader/third_party/subzero/src/IceASanInstrumentation.h (revision 03ce13f70fcc45d86ee91b7ee4cab1936a95046e)
1*03ce13f7SAndroid Build Coastguard Worker //===- subzero/src/IceASanInstrumentation.h - AddressSanitizer --*- 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 AddressSanitizer instrumentation class.
12*03ce13f7SAndroid Build Coastguard Worker ///
13*03ce13f7SAndroid Build Coastguard Worker /// This class is responsible for inserting redzones around global and stack
14*03ce13f7SAndroid Build Coastguard Worker /// variables, inserting code responsible for poisoning those redzones, and
15*03ce13f7SAndroid Build Coastguard Worker /// performing any other instrumentation necessary to implement
16*03ce13f7SAndroid Build Coastguard Worker /// AddressSanitizer.
17*03ce13f7SAndroid Build Coastguard Worker ///
18*03ce13f7SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
19*03ce13f7SAndroid Build Coastguard Worker 
20*03ce13f7SAndroid Build Coastguard Worker #ifndef SUBZERO_SRC_ICEASANINSTRUMENTATION_H
21*03ce13f7SAndroid Build Coastguard Worker #define SUBZERO_SRC_ICEASANINSTRUMENTATION_H
22*03ce13f7SAndroid Build Coastguard Worker 
23*03ce13f7SAndroid Build Coastguard Worker #include "IceGlobalInits.h"
24*03ce13f7SAndroid Build Coastguard Worker #include "IceInstrumentation.h"
25*03ce13f7SAndroid Build Coastguard Worker 
26*03ce13f7SAndroid Build Coastguard Worker namespace Ice {
27*03ce13f7SAndroid Build Coastguard Worker 
28*03ce13f7SAndroid Build Coastguard Worker using VarSizeMap = std::unordered_map<Operand *, SizeT>;
29*03ce13f7SAndroid Build Coastguard Worker using GlobalSizeMap = std::unordered_map<GlobalString, SizeT>;
30*03ce13f7SAndroid Build Coastguard Worker 
31*03ce13f7SAndroid Build Coastguard Worker class ASanInstrumentation : public Instrumentation {
32*03ce13f7SAndroid Build Coastguard Worker   ASanInstrumentation() = delete;
33*03ce13f7SAndroid Build Coastguard Worker   ASanInstrumentation(const ASanInstrumentation &) = delete;
34*03ce13f7SAndroid Build Coastguard Worker   ASanInstrumentation &operator=(const ASanInstrumentation &) = delete;
35*03ce13f7SAndroid Build Coastguard Worker 
36*03ce13f7SAndroid Build Coastguard Worker public:
ASanInstrumentation(GlobalContext * Ctx)37*03ce13f7SAndroid Build Coastguard Worker   ASanInstrumentation(GlobalContext *Ctx) : Instrumentation(Ctx), RzNum(0) {
38*03ce13f7SAndroid Build Coastguard Worker     ICE_TLS_INIT_FIELD(LocalVars);
39*03ce13f7SAndroid Build Coastguard Worker     ICE_TLS_INIT_FIELD(LocalDtors);
40*03ce13f7SAndroid Build Coastguard Worker     ICE_TLS_INIT_FIELD(CurNode);
41*03ce13f7SAndroid Build Coastguard Worker     ICE_TLS_INIT_FIELD(CheckedVars);
42*03ce13f7SAndroid Build Coastguard Worker   }
43*03ce13f7SAndroid Build Coastguard Worker   void instrumentGlobals(VariableDeclarationList &Globals) override;
44*03ce13f7SAndroid Build Coastguard Worker 
45*03ce13f7SAndroid Build Coastguard Worker private:
46*03ce13f7SAndroid Build Coastguard Worker   std::string nextRzName();
47*03ce13f7SAndroid Build Coastguard Worker   bool isOkGlobalAccess(Operand *Op, SizeT Size);
48*03ce13f7SAndroid Build Coastguard Worker   ConstantRelocatable *instrumentReloc(ConstantRelocatable *Reloc);
49*03ce13f7SAndroid Build Coastguard Worker   bool isInstrumentable(Cfg *Func) override;
50*03ce13f7SAndroid Build Coastguard Worker   void instrumentFuncStart(LoweringContext &Context) override;
51*03ce13f7SAndroid Build Coastguard Worker   void instrumentCall(LoweringContext &Context, InstCall *Instr) override;
52*03ce13f7SAndroid Build Coastguard Worker   void instrumentRet(LoweringContext &Context, InstRet *Instr) override;
53*03ce13f7SAndroid Build Coastguard Worker   void instrumentLoad(LoweringContext &Context, InstLoad *Instr) override;
54*03ce13f7SAndroid Build Coastguard Worker   void instrumentStore(LoweringContext &Context, InstStore *Instr) override;
55*03ce13f7SAndroid Build Coastguard Worker   void instrumentAccess(LoweringContext &Context, Operand *Op, SizeT Size,
56*03ce13f7SAndroid Build Coastguard Worker                         Constant *AccessFunc);
57*03ce13f7SAndroid Build Coastguard Worker   void instrumentStart(Cfg *Func) override;
58*03ce13f7SAndroid Build Coastguard Worker   void finishFunc(Cfg *Func) override;
59*03ce13f7SAndroid Build Coastguard Worker   ICE_TLS_DECLARE_FIELD(VarSizeMap *, LocalVars);
60*03ce13f7SAndroid Build Coastguard Worker   ICE_TLS_DECLARE_FIELD(std::vector<InstStore *> *, LocalDtors);
61*03ce13f7SAndroid Build Coastguard Worker   ICE_TLS_DECLARE_FIELD(CfgNode *, CurNode);
62*03ce13f7SAndroid Build Coastguard Worker   ICE_TLS_DECLARE_FIELD(VarSizeMap *, CheckedVars);
63*03ce13f7SAndroid Build Coastguard Worker   GlobalSizeMap GlobalSizes;
64*03ce13f7SAndroid Build Coastguard Worker   std::atomic<uint32_t> RzNum;
65*03ce13f7SAndroid Build Coastguard Worker   bool DidProcessGlobals = false;
66*03ce13f7SAndroid Build Coastguard Worker   SizeT RzGlobalsNum = 0;
67*03ce13f7SAndroid Build Coastguard Worker   std::mutex GlobalsMutex;
68*03ce13f7SAndroid Build Coastguard Worker };
69*03ce13f7SAndroid Build Coastguard Worker } // end of namespace Ice
70*03ce13f7SAndroid Build Coastguard Worker 
71*03ce13f7SAndroid Build Coastguard Worker #endif // SUBZERO_SRC_ICEASANINSTRUMENTATION_H
72