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