/// <summary> /// Abstracts and returns the spawned thread. /// </summary> /// <param name="parent">Parent</param> /// <param name="impl">Implementation</param> /// <param name="tidExpr">Expr</param> /// <param name="spawner">CallCmd</param> private Thread GetAbstractSpawnedThread(Thread parent, Implementation impl, Expr tidExpr, CallCmd spawner) { ThreadId tid = this.GetAbstractThreadId(tidExpr, impl, spawner); string threadName = ""; if (spawner.Ins[2] is IdentifierExpr) { threadName = (spawner.Ins[2] as IdentifierExpr).Name; } else if (spawner.Ins[2] is NAryExpr) { var threadExpr = spawner.Ins[2] as NAryExpr; if (threadExpr.Fun.FunctionName.StartsWith("$bitcast.")) { threadName = (threadExpr.Args[0] as IdentifierExpr).Name; } } var thread = Thread.Create(this.AC, tid, threadName, spawner.Ins[3], parent); parent.AddChild(thread); if (ToolCommandLineOptions.Get().SuperVerboseMode) { Output.PrintLine("..... {0} spawns {1}", parent, thread); } return(thread); }