72 lines
2.7 KiB
C++
72 lines
2.7 KiB
C++
//===- 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
|