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