public static StaticSymbol Value(string uniqueName, Type type,
                                         object value)
        {
            List <MiddleCode> middleCodeList;

            if (value is List <MiddleCode> )
            {
                middleCodeList = (List <MiddleCode>)value;
            }
            else
            {
                middleCodeList = new List <MiddleCode>();

                if (value != null)
                {
                    middleCodeList.Add(new MiddleCode(MiddleOperator.Initializer,
                                                      type.Sort, value));
                }
                else
                {
                    middleCodeList.Add(new MiddleCode(MiddleOperator.InitializerZero,
                                                      type.Size()));
                }
            }

            List <AssemblyCode> assemblyCodeList = new List <AssemblyCode>();

            AssemblyCodeGenerator.GenerateAssembly(middleCodeList,
                                                   assemblyCodeList);

            if (Start.Linux)
            {
                List <string> textList = new List <string>();
                textList.Add("section .data");
                textList.Add("\n" + uniqueName + ":");
                ISet <string> externSet = new HashSet <string>();
                AssemblyCodeGenerator.LinuxTextList(assemblyCodeList, textList,
                                                    externSet);
                return(new StaticSymbolLinux(uniqueName, textList, externSet));
            }

            if (Start.Windows)
            {
                List <byte> byteList = new List <byte>();
                IDictionary <int, string> accessMap = new Dictionary <int, string>();
                AssemblyCodeGenerator.
                GenerateTargetWindows(assemblyCodeList, byteList,
                                      accessMap, null, null);
                return(new StaticSymbolWindows(uniqueName, byteList, accessMap));
            }

            return(null);
        }
예제 #2
0
        public static void GenerateCall(String name, Symbol returnSymbol, AssemblyCodeGenerator objectCodeGenerator)
        {
            List <AssemblyCode> initializerList = m_initializerMap[name];

            foreach (AssemblyCode objectCode in initializerList)
            {
                //objectCodeGenerator.AddAssemblyCode(objectCode);
            }

            objectCodeGenerator.AddAssemblyCode(AssemblyOperator.interrupt, 0x21);

            foreach (Pair <Register, Symbol> pair in m_outParameterList)
            {
                Register outRegister = pair.First;
                Symbol   outSymbol   = pair.Second;
                Track    outTrack    = new Track(outSymbol, outRegister);
                //objectCodeGenerator.m_trackSet.Add(outTrack);
                //objectCodeGenerator.StoreValueFromRegister(outTrack, outSymbol);

                /*AddAssemblyCode(AssemblyOperator.mov, Base(outSymbol),
                 *              Offset(outSymbol), outTrack);*/
            }

            m_outParameterList.Clear();

            if ((returnSymbol != null) && !returnSymbol.Type.IsVoid())
            {
                Object returnObject = m_returnMap[name];
                Track  returnTrack;

                if (returnObject is Register)
                {
                    returnTrack = new Track(returnSymbol, (Register)returnObject);
                }
                else
                {
                    returnTrack = new Track(returnSymbol);
                    objectCodeGenerator.AddAssemblyCode(AssemblyOperator.mov, returnTrack, (int)returnObject);
                }

                if (m_carryMap.ContainsKey(name))
                {
                    objectCodeGenerator.AddAssemblyCode(AssemblyOperator.jnc, null, objectCodeGenerator.m_assemblyCodeList.Count + 2);
                    objectCodeGenerator.AddAssemblyCode(AssemblyOperator.mov, returnTrack, m_carryMap[name]);
//          jumpCode = new ObjectCode(ObjectOperator.long_jmp, null, objectCodeGenerator.m_objectCodeList.Count + 3);
//          objectCodeGenerator.AddAssemblyCode(jumpCode);
                }

                objectCodeGenerator.m_trackMap.Add(returnSymbol, returnTrack);
                //objectCodeGenerator.m_trackSet.Add(returnTrack);
            }
        }
예제 #3
0
        void JustNoException()
        {
            var samples = Directory.GetFiles(SampleDirectory, "*.c0");

            Assert.NotEmpty(samples);

            foreach (var sampleFile in samples)
            {
                var sourceCode = File.ReadAllText(sampleFile);

                var ast = GetAst(sourceCode);

                var rootScope = new SymbolScope();

                var generator = new IntermediateCodeGenerator(rootScope);
                generator.CodeGenerationEnabled = true;
                generator.ReturnCheckEnabled    = true;

                generator.ProcessProgram(ast);

                // Scope are pushed and poped corrctly
                Assert.Equal(rootScope, generator.SymbolScope);


                // Generate assembly code
                var asm        = new AssemblyCodeGenerator(generator.GlobalBuilder);
                var codeLines  = asm.Generate();
                var outputName = sampleFile + ".s";
                File.WriteAllLines(outputName, codeLines);

                // Write machine code
                var exeData = asm.Executable.GetData();
                var exeName = sampleFile.Replace(".c0", ".o0");
                File.WriteAllBytes(exeName, exeData);
            }

            TestOutput.WriteLine($"{samples.Length} samples tested");
        }
예제 #4
0
        public static void GenerateParameter(String name, int index, Symbol argSymbol, AssemblyCodeGenerator objectCodeGenerator)
        {
            Assert.ErrorXXX(m_parameterMap.ContainsKey(name));
            List <Pair <Register, InOut> > parameterList = m_parameterMap[name];

            Assert.ErrorXXX(index < parameterList.Count);
            Pair <Register, InOut> pair = parameterList[index];
            Register register           = pair.First;
            InOut    inOut = pair.Second;

            if (inOut == InOut.In)
            {
                objectCodeGenerator.LoadValueToRegister(argSymbol, register);
            }
            else
            {
                m_outParameterList.Add(new Pair <Register, Symbol>(register, argSymbol));
            }
        }
예제 #5
0
 public static void GenerateInitializer(String name, AssemblyCodeGenerator objectCodeGenerator)
 {
     // Empty.
 }