示例#1
0
        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);
        }
示例#2
0
 public T VisitInvokeExpression(Expr.Invoke exp);