| Index: src/IceASanInstrumentation.cpp
 | 
| diff --git a/src/IceASanInstrumentation.cpp b/src/IceASanInstrumentation.cpp
 | 
| index 1cda875a3cd71922efda515f0ad72ee94963b759..589bf1a04f3090c3db04824db05317a8e6a8e145 100644
 | 
| --- a/src/IceASanInstrumentation.cpp
 | 
| +++ b/src/IceASanInstrumentation.cpp
 | 
| @@ -18,6 +18,8 @@
 | 
|  #include "IceCfgNode.h"
 | 
|  #include "IceGlobalInits.h"
 | 
|  #include "IceInst.h"
 | 
| +#include "IceTargetLowering.h"
 | 
| +#include "IceTypes.h"
 | 
|  
 | 
|  #include <sstream>
 | 
|  
 | 
| @@ -111,13 +113,43 @@ ASanInstrumentation::createRz(VariableDeclarationList *List,
 | 
|    return Rz;
 | 
|  }
 | 
|  
 | 
| +void ASanInstrumentation::instrumentLoad(LoweringContext &Context,
 | 
| +                                         const InstLoad *Inst) {
 | 
| +  instrumentAccess(Context, Inst->getSourceAddress(),
 | 
| +                   typeWidthInBytes(Inst->getDest()->getType()));
 | 
| +}
 | 
| +
 | 
| +void ASanInstrumentation::instrumentStore(LoweringContext &Context,
 | 
| +                                          const InstStore *Inst) {
 | 
| +  instrumentAccess(Context, Inst->getAddr(),
 | 
| +                   typeWidthInBytes(Inst->getData()->getType()));
 | 
| +}
 | 
| +
 | 
| +// TODO(tlively): Take size of access into account as well
 | 
| +void ASanInstrumentation::instrumentAccess(LoweringContext &Context,
 | 
| +                                           Operand *Op, SizeT Size) {
 | 
| +  Constant *AccessCheck =
 | 
| +      Ctx->getConstantExternSym(Ctx->getGlobalString("__asan_check"));
 | 
| +  constexpr SizeT NumArgs = 2;
 | 
| +  constexpr Variable *Void = nullptr;
 | 
| +  constexpr bool NoTailCall = false;
 | 
| +  auto *Call = InstCall::create(Context.getNode()->getCfg(), NumArgs, Void,
 | 
| +                                AccessCheck, NoTailCall);
 | 
| +  Call->addArg(Op);
 | 
| +  Call->addArg(ConstantInteger32::create(Ctx, IceType_i32, Size));
 | 
| +  // play games to insert the call before the access instruction
 | 
| +  InstList::iterator Next = Context.getNext();
 | 
| +  Context.setInsertPoint(Context.getCur());
 | 
| +  Context.insert(Call);
 | 
| +  Context.setNext(Next);
 | 
| +}
 | 
| +
 | 
|  void ASanInstrumentation::instrumentStart(Cfg *Func) {
 | 
|    Constant *ShadowMemInit =
 | 
|        Ctx->getConstantExternSym(Ctx->getGlobalString("__asan_init"));
 | 
|    constexpr SizeT NumArgs = 0;
 | 
|    constexpr Variable *Void = nullptr;
 | 
|    constexpr bool NoTailCall = false;
 | 
| -
 | 
|    auto *Call = InstCall::create(Func, NumArgs, Void, ShadowMemInit, NoTailCall);
 | 
|    Func->getEntryNode()->getInsts().push_front(Call);
 | 
|  }
 | 
| 
 |