public TypeSpecifier VisitInvokeExpression(Expr.Invoke exp) { LLVMValueRef callfunc = LLVM.GetNamedFunction(_module, exp.Identifier.Source); if (callfunc.Pointer == IntPtr.Zero) { throw new Exception("Unknown function referenced"); } uint argc = (uint)exp.Arguments.Count; var argv = new LLVMValueRef[argc]; for (int i = 0; i < argc; i++) { if (exp.Arguments[i] is Expr.Variable var) { var name = var.Name.Source; var variable = _namedValues[name]; var argtype = variable.KtsType; if (argtype.Dimensions > 0) { LLVMValueRef[] indices = new LLVMValueRef[2]; indices[0] = LLVM.ConstInt(LLVM.Int64Type(), 0, _lFalse); indices[1] = LLVM.ConstInt(LLVM.Int64Type(), 0, _lFalse); var address = LLVM.BuildInBoundsGEP(_builder, variable.Value, indices, ""); argv[i] = address; if (variable.Binding != null) { HandleBinding(variable, true); } } else { Visit(exp.Arguments[i]); argv[i] = _valueStack.Pop(); } } else { TypeSpecifier type = Visit(exp.Arguments[i]); argv[i] = _valueStack.Pop(); } } _valueStack.Push(LLVM.BuildCall(_builder, callfunc, argv, "")); var funcSignature = _functions[exp.Identifier.Source]; return(funcSignature.ReturnType); }
public T VisitInvokeExpression(Expr.Invoke exp);