Exemple #1
0
 public ClepsMemberGeneratorParser(ClassManager classManager, CompileStatus status, LLVMContextRef context, LLVMModuleRef module, LLVMBuilderRef builder, ClepsLLVMTypeConvertor clepsLLVMTypeConvertor)
 {
     ClassManager = classManager;
     Status       = status;
     Context      = context;
     Module       = module;
     Builder      = builder;
     ClepsLLVMTypeConvertorInst = clepsLLVMTypeConvertor;
 }
Exemple #2
0
        public CompileStatus CompileFiles()
        {
            ClassManager  classManager = new ClassManager();
            CompileStatus status       = new CompileStatus(false /* exit on first error */);

            LLVMContextRef context = LLVM.ContextCreate();
            LLVMModuleRef  module  = LLVM.ModuleCreateWithNameInContext(OutputFileName, context);
            LLVMBuilderRef builder = LLVM.CreateBuilderInContext(context);

            try
            {
                //Byte code is generated in multiple passes so that all member variables and functions are stubbed out before they are referred to in function bodies
                //This allows functions on the top of a file to call functions on the bottom of a file as well

                Dictionary <string, LLVMTypeRef> classSkeletons;

                {
                    ClepsClassNamesGeneratorParser classSkeletonGenerator = new ClepsClassNamesGeneratorParser(classManager, status, context, module, builder, out classSkeletons);
                    ParseFilesWithGenerator(classSkeletonGenerator, status);
                }

                ClepsLLVMTypeConvertor clepsLLVMTypeConvertor = new ClepsLLVMTypeConvertor(classSkeletons, context);

                {
                    ClepsMemberGeneratorParser memberGenerator = new ClepsMemberGeneratorParser(classManager, status, context, module, builder, clepsLLVMTypeConvertor);
                    ParseFilesWithGenerator(memberGenerator, status);
                }

                {
                    ClepsFunctionBodyGeneratorParser functionBodyGenerator = new ClepsFunctionBodyGeneratorParser(classManager, status, context, module, builder, clepsLLVMTypeConvertor);
                    ParseFilesWithGenerator(functionBodyGenerator, status);
                }

                AddEntryPoint(classManager, status, context, module, builder);

                VerifyModule(module, status);
                PrintModuleToFile(module, status);
            }
            catch (CompilerErrorException)
            {
                //Supress compiler errors
            }
            finally
            {
                LLVM.DisposeBuilder(builder);
                LLVM.DisposeModule(module);
                LLVM.ContextDispose(context);
            }

            return(status);
        }