public static void CompileMethod(WebAssemblyCodegenCompilation compilation, WebAssemblyMethodCodeNode methodCodeNodeNeedingCode) { MethodDesc method = methodCodeNodeNeedingCode.Method; if (compilation.Logger.IsVerbose) { string methodName = method.ToString(); compilation.Logger.Writer.WriteLine("Compiling " + methodName); } if (method.HasCustomAttribute("System.Runtime", "RuntimeImportAttribute")) { methodCodeNodeNeedingCode.CompilationCompleted = true; //throw new NotImplementedException(); //CompileExternMethod(methodCodeNodeNeedingCode, ((EcmaMethod)method).GetRuntimeImportName()); //return; } if (method.IsRawPInvoke()) { //CompileExternMethod(methodCodeNodeNeedingCode, method.GetPInvokeMethodMetadata().Name ?? method.Name); //return; } var methodIL = compilation.GetMethodIL(method); if (methodIL == null) { return; } ILImporter ilImporter = null; try { string mangledName; // TODO: Better detection of the StartupCodeMain method if (methodCodeNodeNeedingCode.Method.Signature.IsStatic && methodCodeNodeNeedingCode.Method.Name == "StartupCodeMain") { mangledName = "StartupCodeMain"; } else { mangledName = compilation.NameMangler.GetMangledMethodName(methodCodeNodeNeedingCode.Method).ToString(); } ilImporter = new ILImporter(compilation, method, methodIL, mangledName, methodCodeNodeNeedingCode is WebAssemblyUnboxingThunkNode); CompilerTypeSystemContext typeSystemContext = compilation.TypeSystemContext; //MethodDebugInformation debugInfo = compilation.GetDebugInfo(methodIL); /* if (!compilation.Options.HasOption(CppCodegenConfigProvider.NoLineNumbersString))*/ { //IEnumerable<ILSequencePoint> sequencePoints = debugInfo.GetSequencePoints(); /*if (sequencePoints != null) * ilImporter.SetSequencePoints(sequencePoints);*/ } //IEnumerable<ILLocalVariable> localVariables = debugInfo.GetLocalVariables(); /*if (localVariables != null) * ilImporter.SetLocalVariables(localVariables);*/ IEnumerable <string> parameters = GetParameterNamesForMethod(method); /*if (parameters != null) * ilImporter.SetParameterNames(parameters);*/ ilImporter.Import(); ilImporter.CreateEHData(methodCodeNodeNeedingCode); methodCodeNodeNeedingCode.CompilationCompleted = true; } catch (Exception e) { compilation.Logger.Writer.WriteLine(e.Message + " (" + method + ")"); methodCodeNodeNeedingCode.CompilationCompleted = true; // methodCodeNodeNeedingCode.SetDependencies(ilImporter.GetDependencies()); //throw new NotImplementedException(); //methodCodeNodeNeedingCode.SetCode(sb.ToString(), Array.Empty<Object>()); } // Uncomment the block below to get specific method failures when LLVM fails for cryptic reasons #if false LLVMBool result = LLVM.VerifyFunction(ilImporter._llvmFunction, LLVMVerifierFailureAction.LLVMPrintMessageAction); if (result.Value != 0) { Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine($"Error compliling {method.OwningType}.{method}"); Console.ResetColor(); } #endif // false // Ensure dependencies show up regardless of exceptions to avoid breaking LLVM methodCodeNodeNeedingCode.SetDependencies(ilImporter.GetDependencies()); }
public static void CompileMethod(WebAssemblyCodegenCompilation compilation, WebAssemblyMethodCodeNode methodCodeNodeNeedingCode) { MethodDesc method = methodCodeNodeNeedingCode.Method; if (compilation.Logger.IsVerbose) { string methodName = method.ToString(); compilation.Logger.Writer.WriteLine("Compiling " + methodName); } if (method.HasCustomAttribute("System.Runtime", "RuntimeImportAttribute")) { methodCodeNodeNeedingCode.CompilationCompleted = true; //throw new NotImplementedException(); //CompileExternMethod(methodCodeNodeNeedingCode, ((EcmaMethod)method).GetRuntimeImportName()); //return; } if (method.IsRawPInvoke()) { //CompileExternMethod(methodCodeNodeNeedingCode, method.GetPInvokeMethodMetadata().Name ?? method.Name); //return; } var methodIL = compilation.GetMethodIL(method); if (methodIL == null) { return; } ILImporter ilImporter = null; try { string mangledName; // TODO: We should use the startup node to generate StartupCodeMain and avoid special casing here if (methodCodeNodeNeedingCode.Method.Signature.IsStatic && methodCodeNodeNeedingCode.Method.Name == "Main") { mangledName = "Main"; } else { mangledName = compilation.NameMangler.GetMangledMethodName(methodCodeNodeNeedingCode.Method).ToString(); } ilImporter = new ILImporter(compilation, method, methodIL, mangledName); CompilerTypeSystemContext typeSystemContext = compilation.TypeSystemContext; //MethodDebugInformation debugInfo = compilation.GetDebugInfo(methodIL); /* if (!compilation.Options.HasOption(CppCodegenConfigProvider.NoLineNumbersString))*/ { //IEnumerable<ILSequencePoint> sequencePoints = debugInfo.GetSequencePoints(); /*if (sequencePoints != null) * ilImporter.SetSequencePoints(sequencePoints);*/ } //IEnumerable<ILLocalVariable> localVariables = debugInfo.GetLocalVariables(); /*if (localVariables != null) * ilImporter.SetLocalVariables(localVariables);*/ IEnumerable <string> parameters = GetParameterNamesForMethod(method); /*if (parameters != null) * ilImporter.SetParameterNames(parameters);*/ ilImporter.Import(); methodCodeNodeNeedingCode.CompilationCompleted = true; } catch (Exception e) { compilation.Logger.Writer.WriteLine(e.Message + " (" + method + ")"); methodCodeNodeNeedingCode.CompilationCompleted = true; // methodCodeNodeNeedingCode.SetDependencies(ilImporter.GetDependencies()); //throw new NotImplementedException(); //methodCodeNodeNeedingCode.SetCode(sb.ToString(), Array.Empty<Object>()); } // Ensure dependencies show up regardless of exceptions to avoid breaking LLVM methodCodeNodeNeedingCode.SetDependencies(ilImporter.GetDependencies()); }
public static void CompileMethod(WebAssemblyCodegenCompilation compilation, WebAssemblyMethodCodeNode methodCodeNodeNeedingCode) { MethodDesc method = methodCodeNodeNeedingCode.Method; compilation.Logger.Writer.WriteLine("Compiling " + method.ToString()); if (method.HasCustomAttribute("System.Runtime", "RuntimeImportAttribute")) { throw new NotImplementedException(); //CompileExternMethod(methodCodeNodeNeedingCode, ((EcmaMethod)method).GetRuntimeImportName()); //return; } if (method.IsRawPInvoke()) { //CompileExternMethod(methodCodeNodeNeedingCode, method.GetPInvokeMethodMetadata().Name ?? method.Name); //return; } var methodIL = compilation.GetMethodIL(method); if (methodIL == null) { return; } ILImporter ilImporter = null; try { ilImporter = new ILImporter(compilation, method, methodIL, methodCodeNodeNeedingCode.GetMangledName(compilation.NameMangler)); CompilerTypeSystemContext typeSystemContext = compilation.TypeSystemContext; //MethodDebugInformation debugInfo = compilation.GetDebugInfo(methodIL); /* if (!compilation.Options.HasOption(CppCodegenConfigProvider.NoLineNumbersString))*/ { //IEnumerable<ILSequencePoint> sequencePoints = debugInfo.GetSequencePoints(); /*if (sequencePoints != null) * ilImporter.SetSequencePoints(sequencePoints);*/ } //IEnumerable<ILLocalVariable> localVariables = debugInfo.GetLocalVariables(); /*if (localVariables != null) * ilImporter.SetLocalVariables(localVariables);*/ IEnumerable <string> parameters = GetParameterNamesForMethod(method); /*if (parameters != null) * ilImporter.SetParameterNames(parameters);*/ ilImporter.Import(); methodCodeNodeNeedingCode.CompilationCompleted = true; methodCodeNodeNeedingCode.SetDependencies(ilImporter.GetDependencies()); } catch (Exception e) { compilation.Logger.Writer.WriteLine(e.Message + " (" + method + ")"); methodCodeNodeNeedingCode.CompilationCompleted = true; // methodCodeNodeNeedingCode.SetDependencies(ilImporter.GetDependencies()); //throw new NotImplementedException(); //methodCodeNodeNeedingCode.SetCode(sb.ToString(), Array.Empty<Object>()); } }