public Expression VisitOutArgumentStorage(OutArgumentStorage arg)
 {
     if (defs.TryGetValue(arg.OriginalIdentifier.Storage, out var binding))
     {
         return(binding.Expression);
     }
     else
     {
         // This out variable is dead, but we need to create a dummy identifier
         // for it to maintain the consistency of the SSA graph.
         var sid = ssaCaller.Identifiers.Add(arg.OriginalIdentifier, stmCall, null, true);
         return(sid.Identifier);
     }
 }
Exemple #2
0
 public void WriteType(bool writeStorage, TextWriter writer)
 {
     if (writeStorage)
     {
         OutArgumentStorage os = Storage as OutArgumentStorage;
         if (os != null)
         {
             writer.Write(os.OriginalIdentifier.Storage.Kind);
             writer.Write(" out ");
         }
         else
         {
             writer.Write(Storage.Kind);
             writer.Write(' ');
         }
     }
     writer.Write(DataType);
 }
Exemple #3
0
            public override void InitializeBlockFlow(Block block, ProgramDataFlow flow, bool isExitBlock)
            {
                BlockFlow bf = flow[block];

                if (isExitBlock && block.Procedure.Signature.ParametersValid)
                {
                    Identifier ret = block.Procedure.Signature.ReturnValue;
                    if (ret != null)
                    {
                        RegisterStorage rs = ret.Storage as RegisterStorage;
                        if (rs != null)
                        {
                            bf.DataOut.UnionWith(arch.GetAliases(rs));
                        }
                    }
                    foreach (Identifier id in block.Procedure.Signature.Parameters)
                    {
                        OutArgumentStorage os = id.Storage as OutArgumentStorage;
                        if (os == null)
                        {
                            continue;
                        }
                        RegisterStorage rs = os.OriginalIdentifier.Storage as RegisterStorage;
                        if (rs != null)
                        {
                            bf.DataOut.UnionWith(arch.GetAliases(rs));
                        }
                    }
                }
                else if (bf.TerminatesProcess)
                {
                    bf.DataOut.Clear();
                }
                else
                {
                    bf.DataOut.Clear();
                    if (isExitBlock)
                    {
                        //Add all registers except preserved registers
                        bf.DataOut.UnionWith(arch.GetRegisters());
                        bf.DataOut.ExceptWith(flow[block.Procedure].PreservedRegisters);
                    }
                }
            }
Exemple #4
0
 public void WriteFormalArgumentType(Identifier arg, bool writeStorage)
 {
     if (writeStorage)
     {
         OutArgumentStorage os = arg.Storage as OutArgumentStorage;
         if (os != null)
         {
             writer.Write(os.OriginalIdentifier.Storage.Kind);
             writer.Write(" out ");
         }
         else
         {
             writer.Write(arg.Storage.Kind);
             writer.Write(" ");
         }
     }
     typeWriter = new TypeGraphWriter(writer);
     typeWriter.WriteReference(arg.DataType);
 }
Exemple #5
0
            public override void InitializeBlockFlow(Block block, ProgramDataFlow flow, bool isExitBlock)
            {
                BlockFlow bf = flow[block];

                if (isExitBlock && block.Procedure.Signature.ParametersValid)
                {
                    Identifier ret = block.Procedure.Signature.ReturnValue;
                    if (ret != null)
                    {
                        RegisterStorage rs = ret.Storage as RegisterStorage;
                        if (rs != null)
                        {
                            rs.SetAliases(bf.DataOut, true);
                        }
                    }
                    foreach (Identifier id in block.Procedure.Signature.Parameters)
                    {
                        OutArgumentStorage os = id.Storage as OutArgumentStorage;
                        if (os == null)
                        {
                            continue;
                        }
                        RegisterStorage rs = os.OriginalIdentifier.Storage as RegisterStorage;
                        if (rs != null)
                        {
                            rs.SetAliases(bf.DataOut, true);
                        }
                    }
                }
                else if (bf.TerminatesProcess)
                {
                    bf.DataOut.SetAll(false);
                }
                else
                {
                    bf.DataOut.SetAll(isExitBlock);
                    bf.DataOut &= ~flow[block.Procedure].PreservedRegisters;
                }
            }
Exemple #6
0
 public Identifier VisitOutArgumentStorage(OutArgumentStorage arg)
 {
     throw new NotImplementedException();
 }
Exemple #7
0
 public Storage VisitOutArgumentStorage(OutArgumentStorage arg)
 {
     Def(arg.OriginalIdentifier);
     return(null);
 }
Exemple #8
0
 public bool VisitOutArgumentStorage(OutArgumentStorage arg, bool defining)
 {
     throw new NotImplementedException();
 }
        public Identifier VisitOutArgumentStorage(OutArgumentStorage ost)
        {
            var idOut = id;

            return(frame.EnsureOutArgument((Identifier)VisitIdentifier(ost.OriginalIdentifier), idOut.DataType));
        }
 public string VisitOutArgumentStorage(OutArgumentStorage arg)
 {
     return("org");
 }
Exemple #11
0
 public Storage VisitOutArgumentStorage(OutArgumentStorage arg)
 {
     arg.OriginalIdentifier.Storage.Accept(this);
     return(null);
 }