OSDN Git Service

e1222b4fff3b95d074dac2a16c44c87b27f4a9d4
[android-x86/external-swiftshader.git] / src / IceASanInstrumentation.h
1 //===- subzero/src/IceASanInstrumentation.h - AddressSanitizer --*- C++ -*-===//
2 //
3 //                        The Subzero Code Generator
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 ///
10 /// \file
11 /// \brief Declares the AddressSanitizer instrumentation class.
12 ///
13 /// This class is responsible for inserting redzones around global and stack
14 /// variables, inserting code responsible for poisoning those redzones, and
15 /// performing any other instrumentation necessary to implement
16 /// AddressSanitizer.
17 ///
18 //===----------------------------------------------------------------------===//
19
20 #ifndef SUBZERO_SRC_ICEASANINSTRUMENTATION_H
21 #define SUBZERO_SRC_ICEASANINSTRUMENTATION_H
22
23 #include "IceGlobalInits.h"
24 #include "IceInstrumentation.h"
25
26 namespace Ice {
27
28 class ASanInstrumentation : public Instrumentation {
29   ASanInstrumentation() = delete;
30   ASanInstrumentation(const ASanInstrumentation &) = delete;
31   ASanInstrumentation &operator=(const ASanInstrumentation &) = delete;
32
33 public:
34   ASanInstrumentation(GlobalContext *Ctx) : Instrumentation(Ctx) {}
35   void instrumentGlobals(VariableDeclarationList &Globals) override;
36
37 private:
38   std::string nextRzName();
39   VariableDeclaration *createRz(VariableDeclarationList *List,
40                                 VariableDeclaration *RzArray,
41                                 SizeT &RzArraySize,
42                                 VariableDeclaration *Global);
43   void instrumentCall(LoweringContext &Context, InstCall *Instr) override;
44   void instrumentLoad(LoweringContext &Context, InstLoad *Instr) override;
45   void instrumentStore(LoweringContext &Context, InstStore *Instr) override;
46   void instrumentAccess(LoweringContext &Context, Operand *Op, SizeT Size);
47   void instrumentStart(Cfg *Func) override;
48   bool DidInsertRedZones = false;
49   uint32_t RzNum = 0;
50 };
51 } // end of namespace Ice
52
53 #endif // SUBZERO_SRC_ICEASANINSTRUMENTATION_H