BuildStore() public method

public BuildStore ( Value src, Value dest ) : Value
src Value
dest Value
return Value
Ejemplo n.º 1
0
 public void CreateArgAllocas(Function function, IRBuilder builder)
 {
     for(int i = 0; i < function.ArgCount; ++i)
     {
         Value alloca = builder.BuildEntryBlockAlloca(function, TypeRef.CreateDouble(), this.Args[i]);
         builder.BuildStore(function.GetParameter((uint)i), alloca);
         CodeGenManager.NamedValues[this.Args[i]] = alloca;
     }
 }
Ejemplo n.º 2
0
        public override Value CodeGen(IRBuilder builder)
        {
            // Output this as:
            //   var = alloca double
            //   ...
            //   start = startexpr
            //   store start -> var
            //   goto loop
            // loop: 
            //   ...
            //   bodyexpr
            //   ...
            // loopend:
            //   step = stepexpr
            //   endcond = endexpr
            //
            //   curvar = load var
            //   nextvar = curvar + step
            //   store nextvar -> var
            //   br endcond, loop, endloop
            // outloop:

            BasicBlock startBlock = builder.GetInsertPoint();
            Function func = startBlock.GetParent();

            Value alloca = builder.BuildEntryBlockAlloca(func, TypeRef.CreateDouble(), this.VarName);

            Value startV = this.Start.CodeGen(builder);
            if(startV.IsNull) return startV;

            builder.BuildStore(startV, alloca);

            BasicBlock loopBB = func.AppendBasicBlock("loop");
            builder.BuildBr(loopBB);
            builder.SetInsertPoint(loopBB);

            /* Within the loop, the variable is defined equal to the PHI node. If it
            * shadows an existing variable, we have to restore it, so save it
            * now. */
            Value oldVal = Value.Null;
            CodeGenManager.NamedValues.TryGetValue(this.VarName, out oldVal);
            CodeGenManager.NamedValues[this.VarName] = alloca;

            /* Emit the body of the loop.  This, like any other expr, can change the
            * current BB.  Note that we ignore the value computed by the body, but
            * don't allow an error */
            Body.CodeGen(builder);

            // Emit the step value;
            Value stepV = Value.Null;

            if(this.Step != null)
                stepV = this.Step.CodeGen(builder);
            else
                stepV = Value.CreateConstDouble(1);

            // Compute the end condition
            Value endCond = this.End.CodeGen(builder);
            endCond = builder.BuildFCmp(endCond, LLVMRealPredicate.RealONE, Value.CreateConstDouble(0), "loopcond");

            Value curvar = builder.BuildLoad(alloca, VarName);
            Value nextVar = builder.BuildFAdd(curvar, stepV, "nextvar");
            builder.BuildStore(nextVar, alloca);

            BasicBlock loopEndBB = builder.GetInsertPoint();
            BasicBlock afterBB = func.AppendBasicBlock("afterloop");
            builder.BuildCondBr(endCond, loopBB, afterBB);
            builder.SetInsertPoint(afterBB);

            if(!oldVal.IsNull)
                CodeGenManager.NamedValues[this.VarName] = oldVal;
            else
                CodeGenManager.NamedValues.Remove(this.VarName);

            return Value.CreateConstDouble(0);
        }