BuildCall() public method

public BuildCall ( Function func, IEnumerable args, string varName = tmpvarname ) : Value
func Function
args IEnumerable
varName string
return Value
Ejemplo n.º 1
0
        public override Value CodeGen(IRBuilder builder)
        {
            Value l = this.LHS.CodeGen(builder);
            Value r = this.RHS.CodeGen(builder);
            if(l.IsNull || r.IsNull) return Value.Null;

            switch(this.Op)
            {
                case '+':
                    return builder.BuildFAdd(l, r);
                case '-':
                    return builder.BuildFSub(l, r);
                case '*':
                    return builder.BuildFMul(l, r);
                case '<':
                    // Convert bool 0/1 to double 0.0 or 1.0
                    return builder.BuildFCmpAndPromote(l, LLVMRealPredicate.RealULT, 
                                                       r, TypeRef.CreateDouble());
            }

            // If it wasn't a builtin binary operator, it must be a user defined one. Emit
            // a call to it.
            Function f = CodeGenManager.Module.GetFunction("binary" + this.Op);
            Debug.Assert(f != null);

            Value[] ops = new Value[] { l, r };
            return builder.BuildCall(f, ops, "binop");
        }
Ejemplo n.º 2
0
        public override Value CodeGen(IRBuilder builder)
        {
            // Look up the name in the global module table.
            Function func = CodeGenManager.Module.GetFunction(this.Callee);
            if(func == null)
            {
                CodeGenManager.ErrorOutput.WriteLine("Unknown function referenced.");
                return Value.Null;
            }

            // If argument mismatch error.
            if(func.ArgCount != Args.Count)
            {
                CodeGenManager.ErrorOutput.WriteLine("Incorrect # arguments passed.");
                return Value.Null;
            }

            List<Value> args = new List<Value>();
            foreach(var arg in this.Args)
            {
                Value val = arg.CodeGen(builder);
                if(val.IsNull)
                    return Value.Null;

                args.Add(val);
            }

            return builder.BuildCall(func, args.ToArray());
        }
Ejemplo n.º 3
0
        public override Value CodeGen(IRBuilder builder)
        {
            Value operandV = this.Operand.CodeGen(builder);
            if(operandV.IsNull) return operandV;

            Function f = CodeGenManager.Module.GetFunction("unary" + this.Op);
            Debug.Assert(f != null);

            Value[] ops = new Value[] { operandV };
            return builder.BuildCall(f, ops, "unop");
        }