| OLD | NEW |
| 1 //===- subzero/src/IceASanInstrumentation.cpp - ASan ------------*- C++ -*-===// | 1 //===- subzero/src/IceASanInstrumentation.cpp - ASan ------------*- C++ -*-===// |
| 2 // | 2 // |
| 3 // The Subzero Code Generator | 3 // The Subzero Code Generator |
| 4 // | 4 // |
| 5 // This file is distributed under the University of Illinois Open Source | 5 // This file is distributed under the University of Illinois Open Source |
| 6 // License. See LICENSE.TXT for details. | 6 // License. See LICENSE.TXT for details. |
| 7 // | 7 // |
| 8 //===----------------------------------------------------------------------===// | 8 //===----------------------------------------------------------------------===// |
| 9 /// | 9 /// |
| 10 /// \file | 10 /// \file |
| (...skipping 243 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 254 InstCall::create(Context.getNode()->getCfg(), Instr->getNumArgs(), | 254 InstCall::create(Context.getNode()->getCfg(), Instr->getNumArgs(), |
| 255 Instr->getDest(), NewFunc, Instr->isTailcall()); | 255 Instr->getDest(), NewFunc, Instr->isTailcall()); |
| 256 for (SizeT I = 0, Args = Instr->getNumArgs(); I < Args; ++I) | 256 for (SizeT I = 0, Args = Instr->getNumArgs(); I < Args; ++I) |
| 257 NewCall->addArg(Instr->getArg(I)); | 257 NewCall->addArg(Instr->getArg(I)); |
| 258 Context.insert(NewCall); | 258 Context.insert(NewCall); |
| 259 Instr->setDeleted(); | 259 Instr->setDeleted(); |
| 260 } | 260 } |
| 261 | 261 |
| 262 void ASanInstrumentation::instrumentLoad(LoweringContext &Context, | 262 void ASanInstrumentation::instrumentLoad(LoweringContext &Context, |
| 263 InstLoad *Instr) { | 263 InstLoad *Instr) { |
| 264 Constant *Func = |
| 265 Ctx->getConstantExternSym(Ctx->getGlobalString("__asan_check_load")); |
| 264 instrumentAccess(Context, Instr->getSourceAddress(), | 266 instrumentAccess(Context, Instr->getSourceAddress(), |
| 265 typeWidthInBytes(Instr->getDest()->getType())); | 267 typeWidthInBytes(Instr->getDest()->getType()), Func); |
| 266 } | 268 } |
| 267 | 269 |
| 268 void ASanInstrumentation::instrumentStore(LoweringContext &Context, | 270 void ASanInstrumentation::instrumentStore(LoweringContext &Context, |
| 269 InstStore *Instr) { | 271 InstStore *Instr) { |
| 272 Constant *Func = |
| 273 Ctx->getConstantExternSym(Ctx->getGlobalString("__asan_check_store")); |
| 270 instrumentAccess(Context, Instr->getAddr(), | 274 instrumentAccess(Context, Instr->getAddr(), |
| 271 typeWidthInBytes(Instr->getData()->getType())); | 275 typeWidthInBytes(Instr->getData()->getType()), Func); |
| 272 } | 276 } |
| 273 | 277 |
| 274 // TODO(tlively): Take size of access into account as well | 278 // TODO(tlively): Take size of access into account as well |
| 275 void ASanInstrumentation::instrumentAccess(LoweringContext &Context, | 279 void ASanInstrumentation::instrumentAccess(LoweringContext &Context, |
| 276 Operand *Op, SizeT Size) { | 280 Operand *Op, SizeT Size, |
| 277 Constant *AccessCheck = | 281 Constant *CheckFunc) { |
| 278 Ctx->getConstantExternSym(Ctx->getGlobalString("__asan_check")); | |
| 279 constexpr SizeT NumArgs = 2; | 282 constexpr SizeT NumArgs = 2; |
| 280 constexpr Variable *Void = nullptr; | 283 constexpr Variable *Void = nullptr; |
| 281 constexpr bool NoTailCall = false; | 284 constexpr bool NoTailCall = false; |
| 282 auto *Call = InstCall::create(Context.getNode()->getCfg(), NumArgs, Void, | 285 auto *Call = InstCall::create(Context.getNode()->getCfg(), NumArgs, Void, |
| 283 AccessCheck, NoTailCall); | 286 CheckFunc, NoTailCall); |
| 284 Call->addArg(Op); | 287 Call->addArg(Op); |
| 285 Call->addArg(ConstantInteger32::create(Ctx, IceType_i32, Size)); | 288 Call->addArg(ConstantInteger32::create(Ctx, IceType_i32, Size)); |
| 286 // play games to insert the call before the access instruction | 289 // play games to insert the call before the access instruction |
| 287 InstList::iterator Next = Context.getNext(); | 290 InstList::iterator Next = Context.getNext(); |
| 288 Context.setInsertPoint(Context.getCur()); | 291 Context.setInsertPoint(Context.getCur()); |
| 289 Context.insert(Call); | 292 Context.insert(Call); |
| 290 Context.setNext(Next); | 293 Context.setNext(Next); |
| 291 } | 294 } |
| 292 | 295 |
| 293 void ASanInstrumentation::instrumentRet(LoweringContext &Context, InstRet *) { | 296 void ASanInstrumentation::instrumentRet(LoweringContext &Context, InstRet *) { |
| (...skipping 26 matching lines...) Expand all Loading... |
| 320 Call->addArg(Ctx->getConstantSym(0, Ctx->getGlobalString(RzSizesName))); | 323 Call->addArg(Ctx->getConstantSym(0, Ctx->getGlobalString(RzSizesName))); |
| 321 } | 324 } |
| 322 | 325 |
| 323 // TODO(tlively): make this more efficient with swap idiom | 326 // TODO(tlively): make this more efficient with swap idiom |
| 324 void ASanInstrumentation::finishFunc(Cfg *Func) { | 327 void ASanInstrumentation::finishFunc(Cfg *Func) { |
| 325 (void)Func; | 328 (void)Func; |
| 326 ICE_TLS_GET_FIELD(LocalDtors)->clear(); | 329 ICE_TLS_GET_FIELD(LocalDtors)->clear(); |
| 327 } | 330 } |
| 328 | 331 |
| 329 } // end of namespace Ice | 332 } // end of namespace Ice |
| OLD | NEW |