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