Пример #1
0
        public string ToDirective(string line)
        {
            InstructionTranslator instructionTranslator = new InstructionTranslator();
            string directive = instructionTranslator.ToDirective(line);

            return(directive);
        }
Пример #2
0
        public override StatementList AllocObject(IVariable var, InstructionTranslator instTranslator)
        {
            var freshVariable = instTranslator.GetFreshVariable(Helpers.GetBoogieType(var));
            var stmts         = new StatementList();

            stmts.Add(dispatcher.AllocObject(freshVariable));
            stmts.Add(bg.VariableAssignment(var, freshVariable));
            return(stmts);
        }
Пример #3
0
 public override StatementList AllocObject(IVariable var, InstructionTranslator instTranslator)
 {
     if (RequiresAllocation(var))
     {
         return(memAddr.AllocObject(var, instTranslator));
     }
     else
     {
         return(memBCT.AllocObject(var, instTranslator));
     }
 }
Пример #4
0
        StatementList TranslateInstructions(out Dictionary <string, BoogieVariable> temporalVariables)
        {
            InstructionTranslator instTranslator = new InstructionTranslator(this.CHA, methodBody, CFG, inputAssemblies);

            instTranslator.Translate();

            foreach (var v in instTranslator.RemovedVariables)
            {
                methodBody.Variables.Remove(v);
            }

            foreach (var v in instTranslator.AddedVariables)
            {
                methodBody.Variables.Add(v);
            }
            temporalVariables = instTranslator.temporalVariables;
            return(instTranslator.Boogie());
        }
Пример #5
0
        // called from Traverser
        // set in Main
        public static void IMethodDefinitionTraverse(IMethodDefinition mD, IMetadataHost host, ISourceLocationProvider sourceLocationProvider)
        {
            // TODO: Hack to for treating a method as nondet
            var method     = mD.ResolvedMethod;
            var methodName = method.ContainingType.FullName() + "." + method.Name.Value;

            if (methodName.Equals("SVX.ContractBase.getNondet"))
            {
                InstructionTranslator.AddToExternalMethods(method);
                return;
            }
            // End Hack

            if (!mD.IsExternal)
            {
                try
                {
                    if (whitelistContains(mD.ContainingType.FullName()))
                    {
                        var        disassembler = new Disassembler(host, mD, sourceLocationProvider);
                        MethodBody mB           = disassembler.Execute();
                        transformBody(mB);

                        MethodTranslator methodTranslator = new MethodTranslator(mD, mB, Traverser.CHA);
                        // todo: improve this piece of code
                        StreamWriter streamWriter = Program.streamWriter;
                        streamWriter.WriteLine(methodTranslator.Translate());
                        Helpers.addTranslatedMethod(mD);
                    }
                }
                catch (InvalidOperationException ex)
                {
                    Console.WriteLine("WARNING: Exception thrown while translating method (omitting): " + BoogieMethod.From(mD).Name);
                    if (!Settings.SilentExceptionsForMethods)
                    {
                        throw ex;
                    }
                }
            }
        }
Пример #6
0
        private void TranslateInstruction(TranslationContext context, Instruction instruction)
        {
            context.Provider.SourceInstruction = instruction;

            _debugInfo.Inject(context, instruction);
            AddInstructionPrefix(context, instruction);

            context.CastToParamType = true;

            var core = new InstructionTranslator(context);

            core.Translate(instruction);

            var castToParamType = context.CastToParamType;

            var code = context.Code;
            var set  = code.ToArray();

            //we should box receiver for call on boxable types
            BoxReceiver(context, instruction, ref set);

            if (instruction.IsEndOfBasicBlock())
            {
                CastToBlockParam(context);
                PopScope(context.New());
            }

            if (WithSuffix(instruction))
            {
                context.Emit(set);
                if (castToParamType)
                {
                    CastToParamType(context, instruction);
                }
                AddInstructionSuffix(context, instruction);
            }
        }
Пример #7
0
 public override StatementList WriteInstanceField(InstanceFieldAccess instanceFieldAccess, Expression value, InstructionTranslator instTranslator)
 {
     if (RequiresAllocation(instanceFieldAccess))
     {
         return(memAddr.WriteInstanceField(instanceFieldAccess, value, instTranslator));
     }
     else
     {
         return(memBCT.WriteInstanceField(instanceFieldAccess, value, instTranslator));
     }
 }
Пример #8
0
 public StatementList WriteInstanceField(InstanceFieldAccess instanceFieldAccess, IVariable value, InstructionTranslator instTranslator)
 {
     return(WriteInstanceField(instanceFieldAccess, ReadAddr(value), instTranslator));
 }
Пример #9
0
        public override StatementList WriteInstanceField(InstanceFieldAccess instanceFieldAccess, Expression expr, InstructionTranslator instTranslator)
        {
            StatementList stmts = new StatementList();

            String fieldName = FieldTranslator.GetFieldName(instanceFieldAccess.Field);

            //var addr = AddressOf(instanceFieldAccess);
            //var writeAddr = WriteAddr(addr, value);

            if (!Settings.SplitFieldsEnabled())
            {
                if (!Helpers.IsBoogieRefType(expr.Type)) // int, bool, real
                {
                    stmts.Add(Expression.AssumeInverseRelationUnionAndPrimitiveType(expr));
                    stmts.Add(dispatcher.WriteAddr(dispatcher.AddressOf(instanceFieldAccess), Expression.PrimitiveType2Union(expr, instTranslator.Boogie())));
                    //sb.AppendLine(String.Format("\t\t$Heap := Write($Heap, {0}, {1}, {2});", instanceFieldAccess.Instance, fieldName, PrimitiveType2Union(Helpers.GetBoogieType(value.Type), value.Name)));
                }
                else
                {
                    stmts.Add(dispatcher.WriteAddr(dispatcher.AddressOf(instanceFieldAccess), expr));
                    //sb.AppendLine(String.Format("\t\t$Heap := Write($Heap, {0}, {1}, {2});", instanceFieldAccess.Instance, fieldName, value.Name));
                }
            }
            else
            {
                var boogieType = expr.Type;
                // var heapAccess = String.Format("{0}[{1}]", fieldName, instanceFieldAccess.Instance);
                //F$ConsoleApplication3.Foo.p[f_Ref] := $ArrayContents[args][0];

                if (Helpers.IsGenericField(instanceFieldAccess.Field) && !boogieType.Equals(Helpers.BoogieType.Ref))
                {
                    stmts.Add(Expression.AssumeInverseRelationUnionAndPrimitiveType(expr));
                    //sb.AppendLine(VariableAssignment(heapAccess, PrimitiveType2Union(boogieType, value.Name)));
                    stmts.Add(dispatcher.WriteAddr(dispatcher.AddressOf(instanceFieldAccess), Expression.PrimitiveType2Union(expr, instTranslator.Boogie())));
                }
                else
                {
                    stmts.Add(dispatcher.WriteAddr(dispatcher.AddressOf(instanceFieldAccess), expr));
                }
            }

            return(stmts);
        }
Пример #10
0
        public override StatementList CallReadArrayElement(IVariable resultVariable, Expression array, Expression index, InstructionTranslator instructionTranslator)
        {
            StatementList stmts = new StatementList();

            return(dispatcher.CallReadArrayElement(BoogieVariable.FromDotNetVariable(resultVariable), array, index));
        }
Пример #11
0
        public override StatementList CallReadArrayElement(IVariable resultVariable, Expression array, Expression index, InstructionTranslator instructionTranslator)
        {
            StatementList stmts = new StatementList();

            BoogieVariable boogieResVar = null;

            if (resultVariable != null)
            {
                boogieResVar = instructionTranslator.GetFreshVariable(Helpers.GetBoogieType(resultVariable));
            }
            stmts.Add(dispatcher.CallReadArrayElement(boogieResVar, array, index));
            if (resultVariable != null)
            {
                stmts.Add(dispatcher.WriteAddr(dispatcher.AddressOf(resultVariable), boogieResVar));
            }
            return(stmts);
        }
Пример #12
0
 public override StatementList AllocObject(IVariable var, InstructionTranslator instTranslator)
 {
     return(this.AllocObject(BoogieVariable.FromDotNetVariable(var)));
 }
Пример #13
0
        public override StatementList WriteInstanceField(InstanceFieldAccess instanceFieldAccess, Expression expr, InstructionTranslator instTranslator)
        {
            StatementList stmts = new StatementList();

            var boogieType = expr.Type;

            if (Helpers.IsGenericField(instanceFieldAccess.Field) && !boogieType.Equals(Helpers.BoogieType.Object))
            {
                stmts.Add(Expression.AssumeInverseRelationUnionAndPrimitiveType(expr));
                stmts.Add(dispatcher.WriteAddr(dispatcher.AddressOf(instanceFieldAccess), Expression.PrimitiveType2Union(expr, instTranslator.Boogie())));
            }
            else
            {
                stmts.Add(dispatcher.WriteAddr(dispatcher.AddressOf(instanceFieldAccess), expr));
            }

            return(stmts);
        }
Пример #14
0
 public override StatementList CallReadArrayElement(IVariable resultVariable, Expression array, Expression index, InstructionTranslator instructionTranslator)
 {
     if (RequiresAllocation(resultVariable))
     {
         return(memAddr.CallReadArrayElement(resultVariable, array, index, instructionTranslator));
     }
     else
     {
         return(memBCT.CallReadArrayElement(resultVariable, array, index, instructionTranslator));
     }
 }
Пример #15
0
 public abstract StatementList AllocObject(IVariable var, InstructionTranslator instTranslator);
Пример #16
0
 public abstract StatementList WriteInstanceField(InstanceFieldAccess instanceFieldAccess, Expression value, InstructionTranslator instTranslator);
Пример #17
0
 public abstract StatementList CallReadArrayElement(IVariable resultVariable, Expression array, Expression index, InstructionTranslator instructionTranslator);