//===- subzero/src/IceASanInstrumentation.h - AddressSanitizer --*- 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 AddressSanitizer instrumentation class. /// /// This class is responsible for inserting redzones around global and stack /// variables, inserting code responsible for poisoning those redzones, and /// performing any other instrumentation necessary to implement /// AddressSanitizer. /// //===----------------------------------------------------------------------===// #ifndef SUBZERO_SRC_ICEASANINSTRUMENTATION_H #define SUBZERO_SRC_ICEASANINSTRUMENTATION_H #include "IceGlobalInits.h" #include "IceInstrumentation.h" namespace Ice { using VarSizeMap = std::unordered_map<Operand *, SizeT>; using GlobalSizeMap = std::unordered_map<GlobalString, SizeT>; class ASanInstrumentation : public Instrumentation { ASanInstrumentation() = delete; ASanInstrumentation(const ASanInstrumentation &) = delete; ASanInstrumentation &operator=(const ASanInstrumentation &) = delete; public: ASanInstrumentation(GlobalContext *Ctx) : Instrumentation(Ctx), RzNum(0) { ICE_TLS_INIT_FIELD(LocalVars); ICE_TLS_INIT_FIELD(LocalDtors); ICE_TLS_INIT_FIELD(CurNode); ICE_TLS_INIT_FIELD(CheckedVars); } void instrumentGlobals(VariableDeclarationList &Globals) override; private: std::string nextRzName(); bool isOkGlobalAccess(Operand *Op, SizeT Size); ConstantRelocatable *instrumentReloc(ConstantRelocatable *Reloc); bool isInstrumentable(Cfg *Func) override; void instrumentFuncStart(LoweringContext &Context) override; void instrumentCall(LoweringContext &Context, InstCall *Instr) override; void instrumentRet(LoweringContext &Context, InstRet *Instr) override; void instrumentLoad(LoweringContext &Context, InstLoad *Instr) override; void instrumentStore(LoweringContext &Context, InstStore *Instr) override; void instrumentAccess(LoweringContext &Context, Operand *Op, SizeT Size, Constant *AccessFunc); void instrumentStart(Cfg *Func) override; void finishFunc(Cfg *Func) override; ICE_TLS_DECLARE_FIELD(VarSizeMap *, LocalVars); ICE_TLS_DECLARE_FIELD(std::vector<InstStore *> *, LocalDtors); ICE_TLS_DECLARE_FIELD(CfgNode *, CurNode); ICE_TLS_DECLARE_FIELD(VarSizeMap *, CheckedVars); GlobalSizeMap GlobalSizes; std::atomic<uint32_t> RzNum; bool DidProcessGlobals = false; SizeT RzGlobalsNum = 0; std::mutex GlobalsMutex; }; } // end of namespace Ice #endif // SUBZERO_SRC_ICEASANINSTRUMENTATION_H