public override LocalVariableDefinition[] GetLocals() { LocalVariableDefinition[] locals = _methodIL.GetLocals(); LocalVariableDefinition[] clone = null; for (int i = 0; i < locals.Length; i++) { TypeDesc uninst = locals[i].Type; TypeDesc inst = uninst.InstantiateSignature(_typeInstantiation, _methodInstantiation); if (uninst != inst) { if (clone == null) { clone = new LocalVariableDefinition[locals.Length]; for (int j = 0; j < clone.Length; j++) { clone[j] = locals[j]; } } clone[i] = new LocalVariableDefinition(inst, locals[i].IsPinned); } } return((clone == null) ? locals : clone); }
public ILImporter(WebAssemblyCodegenCompilation compilation, MethodDesc method, MethodIL methodIL, string mangledName) { Module = compilation.Module; _compilation = compilation; _method = method; _methodIL = methodIL; _ilBytes = methodIL.GetILBytes(); _locals = methodIL.GetLocals(); var ilExceptionRegions = methodIL.GetExceptionRegions(); _exceptionRegions = new ExceptionRegion[ilExceptionRegions.Length]; for (int i = 0; i < ilExceptionRegions.Length; i++) { _exceptionRegions[i] = new ExceptionRegion() { ILRegion = ilExceptionRegions[i] }; } _llvmFunction = GetOrCreateLLVMFunction(mangledName); _builder = LLVM.CreateBuilder(); }
public ILImporter(Compilation compilation, CppWriter writer, MethodDesc method, MethodIL methodIL) { _compilation = compilation; _nodeFactory = _compilation.NodeFactory; _writer = writer; _method = method; _methodSignature = method.Signature; _typeSystemContext = method.Context; if (!_methodSignature.IsStatic) _thisType = method.OwningType; _methodIL = methodIL; _ilBytes = _methodIL.GetILBytes(); _locals = _methodIL.GetLocals(); var ilExceptionRegions = _methodIL.GetExceptionRegions(); _exceptionRegions = new ExceptionRegion[ilExceptionRegions.Length]; for (int i = 0; i < ilExceptionRegions.Length; i++) { _exceptionRegions[i] = new ExceptionRegion() { ILRegion = ilExceptionRegions[i] }; } }
private MethodIL Get_CORINFO_METHOD_INFO(MethodDesc method, MethodIL methodIL, out CORINFO_METHOD_INFO methodInfo) { // MethodIL can be provided externally for the case of a method whose IL was replaced because we couldn't compile it. if (methodIL == null) methodIL = _compilation.GetMethodIL(method); if (methodIL == null) { methodInfo = default(CORINFO_METHOD_INFO); return null; } methodInfo.ftn = ObjectToHandle(method); methodInfo.scope = (CORINFO_MODULE_STRUCT_*)ObjectToHandle(methodIL); var ilCode = methodIL.GetILBytes(); methodInfo.ILCode = (byte*)GetPin(ilCode); methodInfo.ILCodeSize = (uint)ilCode.Length; methodInfo.maxStack = (uint)methodIL.MaxStack; methodInfo.EHcount = (uint)methodIL.GetExceptionRegions().Length; methodInfo.options = methodIL.IsInitLocals ? CorInfoOptions.CORINFO_OPT_INIT_LOCALS : (CorInfoOptions)0; methodInfo.regionKind = CorInfoRegionKind.CORINFO_REGION_NONE; Get_CORINFO_SIG_INFO(method, out methodInfo.args); Get_CORINFO_SIG_INFO(methodIL.GetLocals(), out methodInfo.locals); return methodIL; }
private void SetDebugInformation(MethodCodeNode methodCodeNodeNeedingCode, MethodIL methodIL) { try { MethodDebugInformation debugInfo = _compilation.GetDebugInfo(methodIL); // TODO: NoLineNumbers //if (!_compilation.Options.NoLineNumbers) { IEnumerable<ILSequencePoint> ilSequencePoints = debugInfo.GetSequencePoints(); if (ilSequencePoints != null) { SetSequencePoints(ilSequencePoints); } } IEnumerable<ILLocalVariable> localVariables = debugInfo.GetLocalVariables(); if (localVariables != null) { SetLocalVariables(localVariables); } IEnumerable<string> parameters = debugInfo.GetParameterNames(); if (parameters != null) { SetParameterNames(parameters); } ArrayBuilder<uint> variableToTypeIndex = new ArrayBuilder<uint>(); var signature = MethodBeingCompiled.Signature; if (!signature.IsStatic) { TypeDesc type = MethodBeingCompiled.OwningType; variableToTypeIndex.Add(GetVariableTypeIndex(type)); } for (int i = 0; i < signature.Length; ++i) { TypeDesc type = signature[i]; variableToTypeIndex.Add(GetVariableTypeIndex(type)); } var locals = methodIL.GetLocals(); for (int i = 0; i < locals.Length; ++i) { TypeDesc type = locals[i].Type; variableToTypeIndex.Add(GetVariableTypeIndex(type)); } _variableToTypeIndex = variableToTypeIndex.ToArray(); } catch (Exception e) { // Debug info not successfully loaded. Log.WriteLine(e.Message + " (" + methodCodeNodeNeedingCode.ToString() + ")"); } }