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