| //===- 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 |