restructure build process
							parent
							
								
									272c809c69
								
							
						
					
					
						commit
						49183bf1d3
					
				| 
						 | 
					@ -40,10 +40,14 @@ add_executable(
 | 
				
			||||||
	lib/dropt/dropt_handlers.c
 | 
						lib/dropt/dropt_handlers.c
 | 
				
			||||||
	# Source
 | 
						# Source
 | 
				
			||||||
	src/ast.h
 | 
						src/ast.h
 | 
				
			||||||
 | 
						src/compiler.h
 | 
				
			||||||
 | 
						src/parser.h
 | 
				
			||||||
	src/stack.h
 | 
						src/stack.h
 | 
				
			||||||
    src/ast.c
 | 
					    src/ast.c
 | 
				
			||||||
    src/stack.c
 | 
					 | 
				
			||||||
	src/compiler.c
 | 
						src/compiler.c
 | 
				
			||||||
 | 
						src/parser.c
 | 
				
			||||||
 | 
					    src/stack.c
 | 
				
			||||||
 | 
						src/main.c
 | 
				
			||||||
	# Generated code
 | 
						# Generated code
 | 
				
			||||||
    ${BISON_Parser_OUTPUTS}
 | 
					    ${BISON_Parser_OUTPUTS}
 | 
				
			||||||
    ${FLEX_Scanner_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/ast.h"
 | 
				
			||||||
#include "../src/stack.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);
 | 
					    fprintf (stderr, "%s\n", s);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -15,8 +15,6 @@ void yyerror(FILE *fp, Stack *stack, char *s)
 | 
				
			||||||
extern char *yytext;
 | 
					extern char *yytext;
 | 
				
			||||||
extern int yylex (void);
 | 
					extern int yylex (void);
 | 
				
			||||||
extern FILE *yyin;
 | 
					extern FILE *yyin;
 | 
				
			||||||
 | 
					 | 
				
			||||||
extern Node *rootNode;
 | 
					 | 
				
			||||||
%}
 | 
					%}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
%define api.value.type {struct Node*}
 | 
					%define api.value.type {struct Node*}
 | 
				
			||||||
| 
						 | 
					@ -62,7 +60,7 @@ extern Node *rootNode;
 | 
				
			||||||
%token COMMENT
 | 
					%token COMMENT
 | 
				
			||||||
%token NEWLINE
 | 
					%token NEWLINE
 | 
				
			||||||
 | 
					
 | 
				
			||||||
%parse-param { FILE* fp } { Stack *stack }
 | 
					%parse-param { FILE* fp } { Stack *stack } { Node **pRootNode }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
%define parse.error verbose
 | 
					%define parse.error verbose
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -82,7 +80,7 @@ Program                 : TopLevelDeclarations
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                            PopStackFrame(stack);
 | 
					                            PopStackFrame(stack);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                            rootNode = declarationSequence;
 | 
					                            *pRootNode = declarationSequence;
 | 
				
			||||||
                        }
 | 
					                        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
BaseType                : VOID
 | 
					BaseType                : VOID
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -13,14 +13,7 @@
 | 
				
			||||||
#include <llvm-c/TargetMachine.h>
 | 
					#include <llvm-c/TargetMachine.h>
 | 
				
			||||||
#include <llvm-c/Target.h>
 | 
					#include <llvm-c/Target.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "y.tab.h"
 | 
					 | 
				
			||||||
#include "ast.h"
 | 
					#include "ast.h"
 | 
				
			||||||
#include "stack.h"
 | 
					 | 
				
			||||||
#include "../lib/dropt/dropt.h"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
extern FILE *yyin;
 | 
					 | 
				
			||||||
Stack *stack;
 | 
					 | 
				
			||||||
Node *rootNode;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef struct LocalVariable
 | 
					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();
 | 
					    scope = CreateScope();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    structTypeDeclarations = NULL;
 | 
					    structTypeDeclarations = NULL;
 | 
				
			||||||
    structTypeDeclarationCount = 0;
 | 
					    structTypeDeclarationCount = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    stack = CreateStack();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    FILE *fp = fopen(inputFilename, "r");
 | 
					 | 
				
			||||||
    yyin = fp;
 | 
					 | 
				
			||||||
    yyparse(fp, stack);
 | 
					 | 
				
			||||||
    fclose(fp);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    PrintTree(rootNode, 0);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    LLVMModuleRef module = LLVMModuleCreateWithName("my_module");
 | 
					    LLVMModuleRef module = LLVMModuleCreateWithName("my_module");
 | 
				
			||||||
    LLVMContextRef context = LLVMGetGlobalContext();
 | 
					    LLVMContextRef context = LLVMGetGlobalContext();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    Compile(module, context, rootNode);
 | 
					    Compile(module, context, node);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /* add main call */
 | 
					    /* add main call */
 | 
				
			||||||
    LLVMBuilderRef builder = LLVMCreateBuilder();
 | 
					    LLVMBuilderRef builder = LLVMCreateBuilder();
 | 
				
			||||||
| 
						 | 
					@ -886,11 +870,6 @@ static int Build(char *inputFilename, uint32_t optimizationLevel)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    LLVMPassManagerRef passManager = LLVMCreatePassManager();
 | 
					    LLVMPassManagerRef passManager = LLVMCreatePassManager();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // LLVMAddInstructionCombiningPass(passManager);
 | 
					 | 
				
			||||||
    // LLVMAddCFGSimplificationPass(passManager);
 | 
					 | 
				
			||||||
    // LLVMAddReassociatePass(passManager);
 | 
					 | 
				
			||||||
    // LLVMAddPromoteMemoryToRegisterPass(passManager);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    LLVMPassManagerBuilderRef passManagerBuilder = LLVMPassManagerBuilderCreate();
 | 
					    LLVMPassManagerBuilderRef passManagerBuilder = LLVMPassManagerBuilderCreate();
 | 
				
			||||||
    LLVMPassManagerBuilderSetOptLevel(passManagerBuilder, optimizationLevel);
 | 
					    LLVMPassManagerBuilderSetOptLevel(passManagerBuilder, optimizationLevel);
 | 
				
			||||||
    LLVMPassManagerBuilderPopulateModulePassManager(passManagerBuilder, passManager);
 | 
					    LLVMPassManagerBuilderPopulateModulePassManager(passManagerBuilder, passManager);
 | 
				
			||||||
| 
						 | 
					@ -931,61 +910,3 @@ static int Build(char *inputFilename, uint32_t optimizationLevel)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return EXIT_SUCCESS;
 | 
					    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