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); } }
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); }
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); } } }
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); }
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; } }
public Identifier VisitOutArgumentStorage(OutArgumentStorage arg) { throw new NotImplementedException(); }
public Storage VisitOutArgumentStorage(OutArgumentStorage arg) { Def(arg.OriginalIdentifier); return(null); }
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"); }
public Storage VisitOutArgumentStorage(OutArgumentStorage arg) { arg.OriginalIdentifier.Storage.Accept(this); return(null); }