// Return the set of stubs used along the trace
        public HashSet <string> GetStubs(cba.ErrorTrace trace)
        {
            var ret = new HashSet <string>();

            GetStubs(trace, ret);
            return(ret);
        }
        // Returns file and line of the failing assert. Dumps
        // error trace to disk.
        public Tuple <string, int> PrintErrorTrace(cba.ErrorTrace trace, string filename, List <Tuple <string, int, string> > eeSlicedSourceLines, string failStatus)
        {
            trace = mapBackTrace(trace);

            if (Driver.printTraceMode == Driver.PRINT_TRACE_MODE.Boogie)
            {
                cba.PrintProgramPath.print(input, trace, filename);
                return(null);
            }
            else
            {
                // relevant lines
                cba.PrintSdvPath.relevantLines = null;
                if (eeSlicedSourceLines != null)
                {
                    cba.PrintSdvPath.relevantLines = new HashSet <Tuple <string, int> >();
                    eeSlicedSourceLines.Iter(tup => cba.PrintSdvPath.relevantLines.Add(Tuple.Create(tup.Item1, tup.Item2)));
                }

                cba.PrintSdvPath.failingLocation = null;
                cba.PrintSdvPath.failStatus      = failStatus;


                cba.PrintSdvPath.Print(input.getProgram(), trace, new HashSet <string>(), "",
                                       filename + ".tt", filename + "stack.txt");

                if (cba.PrintSdvPath.abortMessage != null)
                {
                    var am = new TokenTextWriter(filename + ".txt");
                    am.WriteLine(cba.PrintSdvPath.abortMessage);
                    am.Close();
                }


                if (cba.PrintSdvPath.lastDriverLocation == null)
                {
                    return(null);
                }
                cba.PrintSdvPath.failingLocation = Tuple.Create(cba.PrintSdvPath.lastDriverLocation.Item1, cba.PrintSdvPath.lastDriverLocation.Item3);

                cba.PrintSdvPath.Print(input.getProgram(), trace, new HashSet <string>(), "",
                                       filename + ".tt", filename + "stack.txt");

                if (cba.PrintSdvPath.abortMessage != null)
                {
                    var am = new TokenTextWriter(filename + ".txt");
                    am.WriteLine(cba.PrintSdvPath.abortMessage);
                    am.Close();
                }

                cba.PrintSdvPath.relevantLines   = null;
                cba.PrintSdvPath.failingLocation = null;
                cba.PrintSdvPath.failStatus      = null;

                return(Tuple.Create(cba.PrintSdvPath.lastDriverLocation.Item1, cba.PrintSdvPath.lastDriverLocation.Item3));
            }
        }
        void GetStubs(cba.ErrorTrace trace, HashSet <string> ret)
        {
            if (trace == null)
            {
                return;
            }

            if (programStubs.Contains(trace.procName))
            {
                ret.Add(trace.procName);
            }

            trace.Blocks
            .Iter(blk => blk.Cmds.OfType <cba.CallInstr>()
                  .Iter(cc => GetStubs(cc.calleeTrace, ret)));
        }
        public override cba.ErrorTrace mapBackTrace(cba.ErrorTrace trace)
        {
            cba.ErrorTrace ptrace = null;
            if (!Options.DeepAsserts)
            {
                // knock off top-level procedure
                var OldMainName = (input as PersistentProgram).mainProcName;

                foreach (var blk in trace.Blocks)
                {
                    var c = blk.Cmds.OfType <cba.CallInstr>().First(cmd => cmd.callee == OldMainName);
                    if (c == null)
                    {
                        continue;
                    }
                    ptrace = c.calleeTrace;
                    break;
                }
                Debug.Assert(ptrace != null);
            }
            else
            {
                ptrace = da.mapBackTrace(trace);
            }

            trace = ptrace;
            (suppressInfo as IEnumerable <cba.InsertionTrans>)
            .Reverse().Iter(tinfo => trace = tinfo.mapBackTrace(trace));

            trace = assertInstrInfo.mapBackTrace(trace);
            trace = compressBlocks.mapBackTrace(trace);
            //trace = printInfo.mapBackTrace(trace);
            if (sourceInfo != null)
            {
                trace = sourceInfo.mapBackTrace(trace);
            }
            trace = blanksInfo.mapBackTrace(trace);
            return(trace);
        }