internal LLVMValueRef StartMethod(string pName, Syntax.MethodSyntax pNode) { var func = LLVM.GetNamedFunction(CurrentModule, pName); Debug.Assert(func.Pointer != IntPtr.Zero); Locals.AddScope(); AddDebugScope(pNode.Span); //Emit body var body = LLVM.AppendBasicBlock(func, pName + "body"); LLVM.PositionBuilderAtEnd(Builder, body); int start = 0; if (CurrentStruct != null) { start = 1; LLVMValueRef p = LLVM.GetParam(func, 0); LLVM.SetValueName(p, "self"); Locals.DefineVariableInScope("self", LocalDefinition.CreateParameter(p, CurrentStruct)); EmitDebugParameter("self", CurrentStruct, pNode.Span.Line, 0); } //Set parameter names and define in scope for (int i = 0; i < pNode.Parameters.Count; i++) { string name = pNode.Parameters[i].Value; LLVMValueRef parm = LLVM.GetParam(func, (uint)(i + start)); LLVM.SetValueName(parm, name); EmitDebugParameter(name, pNode.Parameters[i].Type, pNode.Span.Line, i + start); Debug.Assert(!Locals.IsVariableDefinedInScope(name), $"Parameter {name} already defined"); Locals.DefineVariableInScope(name, LocalDefinition.CreateParameter(parm, pNode.Parameters[i].Type)); } EmitFunctionDebugInfo(pNode, func); CurrentMethod = func; return(func); }