Ejemplo n.º 1
0
        public virtual string ToLLVM(int depth)
        {
            string param      = "";
            int    funcNumber = depth;

            depth = 0;
            for (int i = 0; i < input.Count; i++)
            {
                param += input[i].returnTypes().ToLLVM() + ((!declareOnly) ? " " + MISC.RemoveCall(input[i].var.ToLLVM()) : "") + ((i < input.Count - 1) ? ", " : "");
            }
            if (infiniteParamsAfter >= 0)
            {
                param += ", ...";
            }
            LLVM.AddToCode(String.Format("; {0} {1}\n", getName, getArgsString));
            if (!declareOnly)
            {
                LLVM.AddToCode(String.Format("{0}define {1} @{2}({3}) #{4} ", MISC.tabsLLVM(depth), retType.ToLLVM(), getNameLLVM, param, funcNumber) + "{\n" /*+ MISC.tabsLLVM(depth) + "entry:\n"*/);//  + code + "}";
                // add used global variables
                List <ASTvariable> addVars = new List <ASTvariable>();
                //for (int i = 0; i < input.Count; i++)
                //    addVars.Add(input[i].var);
                // add param variables
                addVars.AddRange(ASTTree.GlobalVarsVars);
                foreach (ASTvariable vari in addVars)
                {
                    vari.reloadedTimes++;
                    LLVM.AddToCode(String.Format("{0}{1} = load {2}, {3} {4}\n", MISC.tabsLLVM(depth + 1), vari.ToLLVM(), vari.returnTypes().ToLLVM(), vari.returnTypes().TypeOfPointerToThis().ToLLVM(),
                                                 (vari.adress.typ == VAT.Global) ? "@" + MISC.RemoveCall(vari.ToLLVM()).Substring(1) : MISC.RemoveCall(vari.ToLLVM())));
                }
                LLVM.AddToCode(actions.ToLLVM(depth + 1));
                return(MISC.tabsLLVM(depth) + "}");
            }
            return(String.Format("{0}declare {1} @{2}({3}) #{4}", MISC.tabsLLVM(depth), retType.ToLLVM(), getNameLLVM, param, funcNumber));
        }
Ejemplo n.º 2
0
        public static string ToLLVMVariative(int depth, int GlobalOperatorNumber, string type, bool doBeforeWhile, Equal condition, CommandOrder actions, List <ASTvariable> iterateVars)
        {
            LLVM.AddToCode(";" + type + "\n");
            //
            if (!doBeforeWhile)
            {
                LLVM.AddToCode(String.Format("{0}br label %{2}cond{1}\n", MISC.tabsLLVM(depth), GlobalOperatorNumber, type));
                LLVM.AddToCode(String.Format("{0}{2}cond{1}:\n", MISC.tabsLLVM(depth - 1), GlobalOperatorNumber, type));
                // reload all variables in it
                foreach (ASTvariable vari in iterateVars)
                {
                    vari.reloadedTimes++;
                    LLVM.AddToCode(String.Format("{0}{1} = load {2}, {3} {4}\n", MISC.tabsLLVM(depth), vari.ToLLVM(), vari.returnTypes().ToLLVM(), vari.returnTypes().TypeOfPointerToThis().ToLLVM(), MISC.RemoveCall(vari.ToLLVM())));
                }
                string condLine = condition.getTrueEqual().ToLLVM(depth);
                LLVM.AddToCode(String.Format("{0}br i1 {3}, label %{2}action{1}, label %{2}cont{1}\n", MISC.tabsLLVM(depth), GlobalOperatorNumber, type, condLine));

                LLVM.AddToCode(String.Format("{0}{2}action{1}:\n", MISC.tabsLLVM(depth - 1), GlobalOperatorNumber, type));
                LLVM.AddToCode(actions.ToLLVM(depth));
                LLVM.AddToCode(String.Format("{0}br label %{2}cond{1}\n", MISC.tabsLLVM(depth), GlobalOperatorNumber, type));
                LLVM.AddToCode(String.Format("{0}{2}cont{1}:", MISC.tabsLLVM(depth - 1), GlobalOperatorNumber, type));
            }
            else
            {
                LLVM.AddToCode(String.Format("{0}br label %{2}action{1}\n", MISC.tabsLLVM(depth), GlobalOperatorNumber, type));
                LLVM.AddToCode(String.Format("{0}{2}action{1}:\n", MISC.tabsLLVM(depth - 1), GlobalOperatorNumber, type));
                LLVM.AddToCode(actions.ToLLVM(depth));

                LLVM.AddToCode(String.Format("{0}br label %{2}cond{1}\n", MISC.tabsLLVM(depth), GlobalOperatorNumber, type));
                LLVM.AddToCode(String.Format("{0}{2}cond{1}:\n", MISC.tabsLLVM(depth - 1), GlobalOperatorNumber, type));
                string condLine = condition.getTrueEqual().ToLLVM(depth);
                LLVM.AddToCode(String.Format("{0}br i1 {3}, label %{2}action{1}, label %{2}cont{1}\n", MISC.tabsLLVM(depth), GlobalOperatorNumber, type, condLine));

                LLVM.AddToCode(String.Format("{0}br label %{2}cond{1}\n", MISC.tabsLLVM(depth), GlobalOperatorNumber, type));
                LLVM.AddToCode(String.Format("{0}{2}cont{1}:", MISC.tabsLLVM(depth - 1), GlobalOperatorNumber, type));
            }
            return("");
        }