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); }
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); } }
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"); }
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)); } }
public static void GenerateInitializer(String name, AssemblyCodeGenerator objectCodeGenerator) { // Empty. }