public static (SemanticModel SemanticModel, AssemblyCallGraph CallGraph) Run(string resourceFileName, Platform platform) { string source = GetEmbeddedResource(resourceFileName); var tree = CSharpSyntaxTree.ParseText(source, new CSharpParseOptions(LanguageVersion.CSharp7_3)); CSharpCompilation compilation = CreateCSharpCompilation(tree, platform); var tempFileName = Path.GetTempFileName(); try { CreateAssembly(compilation, tempFileName); using (var etwCollector = new EtwCollector(true)) { var targetPlatform = platform == Platform.X64 ? TargetPlatform.X64 : TargetPlatform.X86; JitHostController jitController = new JitHostController(tempFileName, new JitTarget(targetPlatform, TargetRuntime.NetFramework, null), new TargetScope(ScopeType.Project), null, new TestJitPathResolver()); jitController.StartProcess(); jitController.Process.OutputDataReceived += JitHostOutputDataReceived; jitController.Process.ErrorDataReceived += JitHostOutputDataReceived; jitController.Process.BeginOutputReadLine(); etwCollector.StartEventTrace(jitController.Process.Id); jitController.RunJitCompilation(); etwCollector.StopEventTrace(); jitController.Process.OutputDataReceived -= JitHostOutputDataReceived; jitController.Process.ErrorDataReceived -= JitHostOutputDataReceived; CallGraphPostProcessor.Process(etwCollector.AssemblyCallGraph); return(compilation.GetSemanticModel(tree), etwCollector.AssemblyCallGraph); } } finally { if (File.Exists(tempFileName)) { File.Delete(tempFileName); } } }
private AssemblyCallGraph RunJitCompiler(JitHostController jitController) { using (var etwCollector = new EtwCollector(_recordEventDetails)) { jitController.StartProcess(); jitController.Process.OutputDataReceived += JitHostOutputDataReceived; jitController.Process.ErrorDataReceived += JitHostOutputDataReceived; jitController.Process.BeginOutputReadLine(); jitController.Process.BeginErrorReadLine(); etwCollector.StartEventTrace(jitController.Process.Id); jitController.RunJitCompilation(); etwCollector.StopEventTrace(); jitController.Process.OutputDataReceived -= JitHostOutputDataReceived; jitController.Process.ErrorDataReceived -= JitHostOutputDataReceived; CallGraphPostProcessor.Process(etwCollector.AssemblyCallGraph); return(etwCollector.AssemblyCallGraph); } }