restructure build process
							parent
							
								
									272c809c69
								
							
						
					
					
						commit
						49183bf1d3
					
				|  | @ -40,10 +40,14 @@ add_executable( | |||
| 	lib/dropt/dropt_handlers.c | ||||
| 	# Source | ||||
| 	src/ast.h | ||||
| 	src/compiler.h | ||||
| 	src/parser.h | ||||
| 	src/stack.h | ||||
|     src/ast.c | ||||
|     src/stack.c | ||||
| 	src/compiler.c | ||||
| 	src/parser.c | ||||
|     src/stack.c | ||||
| 	src/main.c | ||||
| 	# Generated code | ||||
|     ${BISON_Parser_OUTPUTS} | ||||
|     ${FLEX_Scanner_OUTPUTS} | ||||
|  |  | |||
|  | @ -0,0 +1,41 @@ | |||
| struct YourStruct | ||||
| { | ||||
|     yourInt: int; | ||||
| } | ||||
| 
 | ||||
| struct MyStruct | ||||
| { | ||||
|     myInt: int; | ||||
|     myBool: bool; | ||||
|     yourStructReference: Reference<YourStruct>; | ||||
|     yourStruct: YourStruct; | ||||
| 
 | ||||
|     Increment(): void | ||||
|     { | ||||
|         myInt = myInt + 1; | ||||
|     } | ||||
| 
 | ||||
|     static MyFunction(input: int): int | ||||
|     { | ||||
|         return input * 2; | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| struct Program | ||||
| { | ||||
|     static Main(): int | ||||
|     { | ||||
|         myStruct: MyStruct; | ||||
|         myReference: Reference<MyStruct>; | ||||
|         myInt: int; | ||||
| 
 | ||||
|         myReference = alloc MyStruct; | ||||
| 
 | ||||
|         myInt = MyStruct.MyFunction(2); | ||||
| 
 | ||||
|         myStruct.myInt = myInt; | ||||
|         myStruct.Increment(); | ||||
| 
 | ||||
|         return myStruct.myInt; | ||||
|     } | ||||
| } | ||||
|  | @ -7,7 +7,7 @@ | |||
| #include "../src/ast.h" | ||||
| #include "../src/stack.h" | ||||
| 
 | ||||
| void yyerror(FILE *fp, Stack *stack, char *s) | ||||
| void yyerror(FILE *fp, Stack *stack, Node **pRootNode, char *s) | ||||
| { | ||||
|     fprintf (stderr, "%s\n", s); | ||||
| } | ||||
|  | @ -15,8 +15,6 @@ void yyerror(FILE *fp, Stack *stack, char *s) | |||
| extern char *yytext; | ||||
| extern int yylex (void); | ||||
| extern FILE *yyin; | ||||
| 
 | ||||
| extern Node *rootNode; | ||||
| %} | ||||
| 
 | ||||
| %define api.value.type {struct Node*} | ||||
|  | @ -62,7 +60,7 @@ extern Node *rootNode; | |||
| %token COMMENT | ||||
| %token NEWLINE | ||||
| 
 | ||||
| %parse-param { FILE* fp } { Stack *stack } | ||||
| %parse-param { FILE* fp } { Stack *stack } { Node **pRootNode } | ||||
| 
 | ||||
| %define parse.error verbose | ||||
| 
 | ||||
|  | @ -82,7 +80,7 @@ Program                 : TopLevelDeclarations | |||
| 
 | ||||
|                             PopStackFrame(stack); | ||||
| 
 | ||||
|                             rootNode = declarationSequence; | ||||
|                             *pRootNode = declarationSequence; | ||||
|                         } | ||||
| 
 | ||||
| BaseType                : VOID | ||||
|  |  | |||
|  | @ -13,14 +13,7 @@ | |||
| #include <llvm-c/TargetMachine.h> | ||||
| #include <llvm-c/Target.h> | ||||
| 
 | ||||
| #include "y.tab.h" | ||||
| #include "ast.h" | ||||
| #include "stack.h" | ||||
| #include "../lib/dropt/dropt.h" | ||||
| 
 | ||||
| extern FILE *yyin; | ||||
| Stack *stack; | ||||
| Node *rootNode; | ||||
| 
 | ||||
| typedef struct LocalVariable | ||||
| { | ||||
|  | @ -820,26 +813,17 @@ static void Compile(LLVMModuleRef module, LLVMContextRef context, Node *node) | |||
|     } | ||||
| } | ||||
| 
 | ||||
| static int Build(char *inputFilename, uint32_t optimizationLevel) | ||||
| int Build(Node *node, uint32_t optimizationLevel) | ||||
| { | ||||
|     scope = CreateScope(); | ||||
| 
 | ||||
|     structTypeDeclarations = NULL; | ||||
|     structTypeDeclarationCount = 0; | ||||
| 
 | ||||
|     stack = CreateStack(); | ||||
| 
 | ||||
|     FILE *fp = fopen(inputFilename, "r"); | ||||
|     yyin = fp; | ||||
|     yyparse(fp, stack); | ||||
|     fclose(fp); | ||||
| 
 | ||||
|     PrintTree(rootNode, 0); | ||||
| 
 | ||||
|     LLVMModuleRef module = LLVMModuleCreateWithName("my_module"); | ||||
|     LLVMContextRef context = LLVMGetGlobalContext(); | ||||
| 
 | ||||
|     Compile(module, context, rootNode); | ||||
|     Compile(module, context, node); | ||||
| 
 | ||||
|     /* add main call */ | ||||
|     LLVMBuilderRef builder = LLVMCreateBuilder(); | ||||
|  | @ -886,11 +870,6 @@ static int Build(char *inputFilename, uint32_t optimizationLevel) | |||
| 
 | ||||
|     LLVMPassManagerRef passManager = LLVMCreatePassManager(); | ||||
| 
 | ||||
|     // LLVMAddInstructionCombiningPass(passManager);
 | ||||
|     // LLVMAddCFGSimplificationPass(passManager);
 | ||||
|     // LLVMAddReassociatePass(passManager);
 | ||||
|     // LLVMAddPromoteMemoryToRegisterPass(passManager);
 | ||||
| 
 | ||||
|     LLVMPassManagerBuilderRef passManagerBuilder = LLVMPassManagerBuilderCreate(); | ||||
|     LLVMPassManagerBuilderSetOptLevel(passManagerBuilder, optimizationLevel); | ||||
|     LLVMPassManagerBuilderPopulateModulePassManager(passManagerBuilder, passManager); | ||||
|  | @ -931,61 +910,3 @@ static int Build(char *inputFilename, uint32_t optimizationLevel) | |||
| 
 | ||||
|     return EXIT_SUCCESS; | ||||
| } | ||||
| 
 | ||||
| int main(int argc, char *argv[]) | ||||
| { | ||||
|     dropt_bool showHelp; | ||||
|     uint32_t optimizationLevel = 0; | ||||
|     char *inputFilename; | ||||
|     extern int yydebug; | ||||
|     int exitCode = EXIT_SUCCESS; | ||||
| 
 | ||||
|     dropt_option options[] = { | ||||
|         { 'h', "help", "Shows help.", NULL, dropt_handle_bool, &showHelp, dropt_attr_halt }, | ||||
|         { 'O', "optimize", "Sets optimization level of the output IR. Must be a value between 0 and 3.", "number", dropt_handle_uint, &optimizationLevel }, | ||||
|         { 0 } /* Required sentinel value. */ | ||||
|     }; | ||||
| 
 | ||||
|     dropt_context *droptContext = dropt_new_context(options); | ||||
| 
 | ||||
|     if (droptContext == NULL) | ||||
|     { | ||||
|         exitCode = EXIT_FAILURE; | ||||
|     } | ||||
|     else if (argc == 0) | ||||
|     { | ||||
|         printf("Must supply an input file."); | ||||
|         exitCode = EXIT_FAILURE; | ||||
|     } | ||||
|     else | ||||
|     { | ||||
|         char** rest = dropt_parse(droptContext, -1, &argv[1]); | ||||
|         if (dropt_get_error(droptContext) != dropt_error_none) | ||||
|         { | ||||
|             fprintf(stderr, "wraith: %s\n", dropt_get_error_message(droptContext)); | ||||
|             exitCode = EXIT_FAILURE; | ||||
|         } | ||||
|         else if (showHelp) | ||||
|         { | ||||
|             printf("Usage: wraith [options] [--] [input_file]\n\n" | ||||
|                    "Options:\n"); | ||||
|             dropt_print_help(stdout, droptContext, NULL); | ||||
|         } | ||||
|         else | ||||
|         { | ||||
|             yydebug = 1; /* FIXME: make this an option */ | ||||
|             inputFilename = *rest; | ||||
|             if (inputFilename == NULL) | ||||
|             { | ||||
|                 fprintf(stderr, "ERROR: Must provide an input file.\n"); | ||||
|                 exitCode = EXIT_FAILURE; | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|                 exitCode = Build(inputFilename, optimizationLevel); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     return exitCode; | ||||
| } | ||||
|  |  | |||
|  | @ -0,0 +1,8 @@ | |||
| #ifndef WRAITH_COMPILER_H | ||||
| #define WRAITH_COMPILER_H | ||||
| 
 | ||||
| #include "ast.h" | ||||
| 
 | ||||
| int Build(Node *node, uint32_t optimizationLevel); | ||||
| 
 | ||||
| #endif /* WRAITH_COMPILER_H */ | ||||
|  | @ -0,0 +1,74 @@ | |||
| #include <stdlib.h> | ||||
| #include "../lib/dropt/dropt.h" | ||||
| 
 | ||||
| #include "parser.h" | ||||
| #include "compiler.h" | ||||
| 
 | ||||
| int main(int argc, char *argv[]) | ||||
| { | ||||
|     dropt_bool showHelp = 0; | ||||
|     dropt_bool parseVerbose = 0; | ||||
|     uint32_t optimizationLevel = 0; | ||||
|     char *inputFilename; | ||||
|     int exitCode = EXIT_SUCCESS; | ||||
| 
 | ||||
|     dropt_option options[] = { | ||||
|         { 'h', "help", "Shows help.", NULL, dropt_handle_bool, &showHelp, dropt_attr_halt }, | ||||
|         { 'v', "parse-verbose", "Shows verbose parser output.", NULL, dropt_handle_bool, &parseVerbose }, | ||||
|         { 'O', "optimize", "Sets optimization level of the output IR. Must be a value between 0 and 3.", "number", dropt_handle_uint, &optimizationLevel }, | ||||
|         { 0 } /* Required sentinel value. */ | ||||
|     }; | ||||
| 
 | ||||
|     dropt_context *droptContext = dropt_new_context(options); | ||||
| 
 | ||||
|     if (droptContext == NULL) | ||||
|     { | ||||
|         exitCode = EXIT_FAILURE; | ||||
|     } | ||||
|     else if (argc == 0) | ||||
|     { | ||||
|         printf("Must supply an input file."); | ||||
|         exitCode = EXIT_FAILURE; | ||||
|     } | ||||
|     else | ||||
|     { | ||||
|         char** rest = dropt_parse(droptContext, -1, &argv[1]); | ||||
|         if (dropt_get_error(droptContext) != dropt_error_none) | ||||
|         { | ||||
|             fprintf(stderr, "wraith: %s\n", dropt_get_error_message(droptContext)); | ||||
|             exitCode = EXIT_FAILURE; | ||||
|         } | ||||
|         else if (showHelp) | ||||
|         { | ||||
|             printf("Usage: wraith [options] [--] [input_file]\n\n" | ||||
|                    "Options:\n"); | ||||
|             dropt_print_help(stdout, droptContext, NULL); | ||||
|         } | ||||
|         else | ||||
|         { | ||||
|             /* TODO: free AST after compilation */ | ||||
|             inputFilename = *rest; | ||||
| 
 | ||||
|             if (inputFilename == NULL) | ||||
|             { | ||||
|                 fprintf(stderr, "ERROR: Must provide an input file.\n"); | ||||
|                 exitCode = EXIT_FAILURE; | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|                 Node *rootNode; | ||||
|                 if (Parse(inputFilename, &rootNode, parseVerbose) != 0) | ||||
|                 { | ||||
|                     fprintf(stderr, "Parser error.\n"); | ||||
|                     exitCode = EXIT_FAILURE; | ||||
|                 } | ||||
|                 else | ||||
|                 { | ||||
|                     exitCode = Build(rootNode, optimizationLevel); | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     return exitCode; | ||||
| } | ||||
|  | @ -0,0 +1,41 @@ | |||
| #include <stdio.h> | ||||
| 
 | ||||
| #include "y.tab.h" | ||||
| #include "ast.h" | ||||
| #include "stack.h" | ||||
| 
 | ||||
| extern FILE *yyin; | ||||
| extern int yydebug; | ||||
| 
 | ||||
| int Parse(char *inputFilename, Node **pRootNode, uint8_t parseVerbose) | ||||
| { | ||||
|     int result; | ||||
|     Stack *stack = CreateStack(); | ||||
|     yydebug = parseVerbose; | ||||
| 
 | ||||
|     FILE *fp = fopen(inputFilename, "r"); | ||||
|     yyin = fp; | ||||
|     result = yyparse(fp, stack, pRootNode); | ||||
|     fclose(fp); | ||||
| 
 | ||||
|     /* TODO: free stack */ | ||||
|     /* TODO: free AST on error */ | ||||
| 
 | ||||
|     if (result == 0) | ||||
|     { | ||||
|         if (parseVerbose) | ||||
|         { | ||||
|             PrintTree(*pRootNode, 0); | ||||
|         } | ||||
|     } | ||||
|     else if (result == 1) | ||||
|     { | ||||
|         fprintf(stderr, "Syntax error.\n"); | ||||
|     } | ||||
|     else if (result == 2) | ||||
|     { | ||||
|         fprintf(stderr, "Out of memory.\n"); | ||||
|     } | ||||
| 
 | ||||
|     return result; | ||||
| } | ||||
|  | @ -0,0 +1,8 @@ | |||
| #ifndef WRAITH_PARSER_H | ||||
| #define WRAITH_PARSER_H | ||||
| 
 | ||||
| #include "ast.h" | ||||
| 
 | ||||
| int Parse(char *inputFilename, Node **pNode, uint8_t parseVerbose); | ||||
| 
 | ||||
| #endif /* WRAITH_PARSER_H */ | ||||
		Loading…
	
		Reference in New Issue