private void InstrumentRaceCheckingCaptureStates(InstrumentationRegion region) { if (region.Implementation().Name.Equals(this.EP.Name)) { AssumeCmd assumeLogHead = new AssumeCmd(Token.NoToken, Expr.True); assumeLogHead.Attributes = new QKeyValue(Token.NoToken, "captureState", new List <object>() { this.EP.Name + "_header_state" }, assumeLogHead.Attributes); region.Header().Cmds.Add(assumeLogHead); } foreach (var b in region.Blocks()) { List <Cmd> newCmds = new List <Cmd>(); foreach (var c in b.Cmds) { if (!(c is CallCmd)) { newCmds.Add(c); continue; } CallCmd call = c as CallCmd; if (!(call.callee.Contains("_WRITE_LS_") || call.callee.Contains("_READ_LS_"))) { newCmds.Add(call); continue; } AssumeCmd assume = new AssumeCmd(Token.NoToken, Expr.True); assume.Attributes = new QKeyValue(Token.NoToken, "column", new List <object>() { new LiteralExpr(Token.NoToken, BigNum.FromInt(QKeyValue.FindIntAttribute(call.Attributes, "column", -1))) }, null); assume.Attributes = new QKeyValue(Token.NoToken, "line", new List <object>() { new LiteralExpr(Token.NoToken, BigNum.FromInt(QKeyValue.FindIntAttribute(call.Attributes, "line", -1))) }, assume.Attributes); if (call.callee.Contains("WRITE")) { assume.Attributes = new QKeyValue(Token.NoToken, "access", new List <object>() { "write" }, assume.Attributes); } else if (call.callee.Contains("READ")) { assume.Attributes = new QKeyValue(Token.NoToken, "access", new List <object>() { "read" }, assume.Attributes); } assume.Attributes = new QKeyValue(Token.NoToken, "entrypoint", new List <object>() { this.EP.Name }, assume.Attributes); assume.Attributes = new QKeyValue(Token.NoToken, "captureState", new List <object>() { "access_state_" + this.LogCounter++ }, assume.Attributes); assume.Attributes = new QKeyValue(Token.NoToken, "resource", new List <object>() { "$" + call.callee.Split(new char[] { '$', '_' })[4] }, assume.Attributes); newCmds.Add(call); newCmds.Add(assume); } b.Cmds = newCmds; } }