public BuildCall ( Function func, IEnumerable |
||
func | Function | |
args | IEnumerable |
|
varName | string | |
return |
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"); }
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()); }
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"); }