Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(318)

Unified Diff: src/IceASanInstrumentation.cpp

Issue 2183643002: Subzero: Elide checks of known valid accesses of locals (Closed) Base URL: https://chromium.googlesource.com/native_client/pnacl-subzero.git@master
Patch Set: Added test Created 4 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: src/IceASanInstrumentation.cpp
diff --git a/src/IceASanInstrumentation.cpp b/src/IceASanInstrumentation.cpp
index e31e4b6e3fadf2936bad2528d75d049f34e64c53..b53de0d4063186e5e58d8e8f58269a200bf5027a 100644
--- a/src/IceASanInstrumentation.cpp
+++ b/src/IceASanInstrumentation.cpp
@@ -41,15 +41,15 @@ const llvm::NaClBitcodeRecord::RecordVector RzContents =
// In order to instrument the code correctly, the .pexe must not have had its
// symbols stripped.
-using string_map = std::unordered_map<std::string, std::string>;
-using string_set = std::unordered_set<std::string>;
+using StringMap = std::unordered_map<std::string, std::string>;
+using StringSet = std::unordered_set<std::string>;
// TODO(tlively): Handle all allocation functions
-const string_map FuncSubstitutions = {{"malloc", "__asan_malloc"},
- {"free", "__asan_free"},
- {"calloc", "__asan_calloc"},
- {"__asan_dummy_calloc", "__asan_calloc"},
- {"realloc", "__asan_realloc"}};
-const string_set FuncBlackList = {"_Balloc"};
+const StringMap FuncSubstitutions = {{"malloc", "__asan_malloc"},
+ {"free", "__asan_free"},
+ {"calloc", "__asan_calloc"},
+ {"__asan_dummy_calloc", "__asan_calloc"},
+ {"realloc", "__asan_realloc"}};
+const StringSet FuncBlackList = {"_Balloc"};
llvm::NaClBitcodeRecord::RecordVector sizeToByteVec(SizeT Size) {
llvm::NaClBitcodeRecord::RecordVector SizeContents;
@@ -62,6 +62,7 @@ llvm::NaClBitcodeRecord::RecordVector sizeToByteVec(SizeT Size) {
} // end of anonymous namespace
+ICE_TLS_DEFINE_FIELD(VarSizeMap *, ASanInstrumentation, LocalVars);
ICE_TLS_DEFINE_FIELD(std::vector<InstCall *> *, ASanInstrumentation,
LocalDtors);
@@ -157,8 +158,10 @@ std::string ASanInstrumentation::nextRzName() {
// Check for an alloca signaling the presence of local variables and add a
// redzone if it is found
void ASanInstrumentation::instrumentFuncStart(LoweringContext &Context) {
- if (ICE_TLS_GET_FIELD(LocalDtors) == nullptr)
+ if (ICE_TLS_GET_FIELD(LocalDtors) == nullptr) {
ICE_TLS_SET_FIELD(LocalDtors, new std::vector<InstCall *>());
+ ICE_TLS_SET_FIELD(LocalVars, new VarSizeMap());
+ }
Cfg *Func = Context.getNode()->getCfg();
bool HasLocals = false;
LoweringContext C;
@@ -179,6 +182,7 @@ void ASanInstrumentation::instrumentFuncStart(LoweringContext &Context) {
// create the new alloca that includes a redzone
SizeT VarSize = VarSizeOp->getValue();
Variable *Dest = Cur->getDest();
+ ICE_TLS_GET_FIELD(LocalVars)->insert({Dest, VarSize});
SizeT RzPadding = RzSize + Utils::OffsetToAlignment(VarSize, RzSize);
auto *ByteCount =
ConstantInteger32::create(Ctx, IceType_i32, VarSize + RzPadding);
@@ -286,10 +290,13 @@ void ASanInstrumentation::instrumentStore(LoweringContext &Context,
typeWidthInBytes(Instr->getData()->getType()), Func);
}
-// TODO(tlively): Take size of access into account as well
void ASanInstrumentation::instrumentAccess(LoweringContext &Context,
Operand *Op, SizeT Size,
Constant *CheckFunc) {
+ VarSizeMap::iterator LocalSize = ICE_TLS_GET_FIELD(LocalVars)->find(Op);
+ if (LocalSize != ICE_TLS_GET_FIELD(LocalVars)->end() &&
+ LocalSize->second >= Size)
+ return;
constexpr SizeT NumArgs = 2;
constexpr Variable *Void = nullptr;
constexpr bool NoTailCall = false;
@@ -342,6 +349,7 @@ void ASanInstrumentation::instrumentStart(Cfg *Func) {
// TODO(tlively): make this more efficient with swap idiom
void ASanInstrumentation::finishFunc(Cfg *) {
+ ICE_TLS_GET_FIELD(LocalVars)->clear();
ICE_TLS_GET_FIELD(LocalDtors)->clear();
}

Powered by Google App Engine
This is Rietveld 408576698