Chromium Code Reviews| Index: src/IceASanInstrumentation.cpp |
| diff --git a/src/IceASanInstrumentation.cpp b/src/IceASanInstrumentation.cpp |
| index 62862990b7c67cdbdc36799b61b3290efb4cf2d0..9333d16d310a21a761e6863045bcba049c97f15a 100644 |
| --- a/src/IceASanInstrumentation.cpp |
| +++ b/src/IceASanInstrumentation.cpp |
| @@ -70,6 +70,8 @@ llvm::NaClBitcodeRecord::RecordVector sizeToByteVec(SizeT Size) { |
| ICE_TLS_DEFINE_FIELD(VarSizeMap *, ASanInstrumentation, LocalVars); |
| ICE_TLS_DEFINE_FIELD(std::vector<InstStore *> *, ASanInstrumentation, |
| LocalDtors); |
| +ICE_TLS_DEFINE_FIELD(CfgNode *, ASanInstrumentation, CurNode); |
| +ICE_TLS_DEFINE_FIELD(VarSizeMap *, ASanInstrumentation, CheckedVars); |
| bool ASanInstrumentation::isInstrumentable(Cfg *Func) { |
| std::string FuncName = Func->getFunctionName().toStringOrEmpty(); |
| @@ -329,6 +331,23 @@ void ASanInstrumentation::instrumentStore(LoweringContext &Context, |
| void ASanInstrumentation::instrumentAccess(LoweringContext &Context, |
| Operand *Op, SizeT Size, |
| Constant *CheckFunc) { |
| + // Skip redundant checks within basic blocks |
| + VarSizeMap *Checked = ICE_TLS_GET_FIELD(CheckedVars); |
| + if (ICE_TLS_GET_FIELD(CurNode) != Context.getNode()) { |
| + ICE_TLS_SET_FIELD(CurNode, Context.getNode()); |
| + if (Checked == NULL) { |
| + Checked = new VarSizeMap(); |
| + ICE_TLS_SET_FIELD(CheckedVars, Checked); |
| + } |
| + Checked->clear(); |
| + } |
| + VarSizeMap::iterator PrevCheck = Checked->find(Op); |
| + if (PrevCheck != Checked->end() && PrevCheck->second >= Size) |
| + return; |
| + else |
|
Karl
2016/08/11 14:51:17
Nit:
The typical style is to drop the else keywor
|
| + Checked->insert({Op, Size}); |
| + |
| + // check for known good local access |
| VarSizeMap::iterator LocalSize = ICE_TLS_GET_FIELD(LocalVars)->find(Op); |
| if (LocalSize != ICE_TLS_GET_FIELD(LocalVars)->end() && |
| LocalSize->second >= Size) |