Example #1
0
        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;
            }
        }