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