forked from cosmonaut/wraith-lang
starting a heap alloc system
parent
8e7cc00789
commit
ca1835f98d
11
ast.c
11
ast.c
|
@ -22,6 +22,7 @@ const char* SyntaxKindString(SyntaxKind syntaxKind)
|
|||
switch(syntaxKind)
|
||||
{
|
||||
case AccessExpression: return "AccessExpression";
|
||||
case AllocExpression: return "Alloc";
|
||||
case Assignment: return "Assignment";
|
||||
case BinaryExpression: return "BinaryExpression";
|
||||
case Comment: return "Comment";
|
||||
|
@ -365,6 +366,16 @@ Node* MakeAccessExpressionNode(
|
|||
return node;
|
||||
}
|
||||
|
||||
Node* MakeAllocNode(Node *typeNode)
|
||||
{
|
||||
Node* node = (Node*) malloc(sizeof(Node));
|
||||
node->syntaxKind = AllocExpression;
|
||||
node->childCount = 1;
|
||||
node->children = (Node**) malloc(sizeof(Node*));
|
||||
node->children[0] = typeNode;
|
||||
return node;
|
||||
}
|
||||
|
||||
static const char* PrimitiveTypeToString(PrimitiveType type)
|
||||
{
|
||||
switch (type)
|
||||
|
|
4
ast.h
4
ast.h
|
@ -6,6 +6,7 @@
|
|||
typedef enum
|
||||
{
|
||||
AccessExpression,
|
||||
AllocExpression,
|
||||
Assignment,
|
||||
BinaryExpression,
|
||||
Comment,
|
||||
|
@ -170,6 +171,9 @@ Node* MakeAccessExpressionNode(
|
|||
Node *accessee,
|
||||
Node *accessor
|
||||
);
|
||||
Node* MakeAllocNode(
|
||||
Node *typeNode
|
||||
);
|
||||
|
||||
void PrintTree(Node *node, uint32_t tabCount);
|
||||
|
||||
|
|
21
compiler.c
21
compiler.c
|
@ -544,6 +544,14 @@ static LLVMValueRef CompileAccessExpression(
|
|||
return LLVMBuildLoad(builder, access, accessor->value.string);
|
||||
}
|
||||
|
||||
static LLVMValueRef CompileAllocExpression(
|
||||
LLVMBuilderRef builder,
|
||||
Node *expression
|
||||
) {
|
||||
LLVMTypeRef type = ResolveType(expression->children[0]);
|
||||
return LLVMBuildMalloc(builder, type, "allocation");
|
||||
}
|
||||
|
||||
static LLVMValueRef CompileExpression(
|
||||
LLVMBuilderRef builder,
|
||||
Node *expression
|
||||
|
@ -553,6 +561,9 @@ static LLVMValueRef CompileExpression(
|
|||
case AccessExpression:
|
||||
return CompileAccessExpression(builder, expression);
|
||||
|
||||
case AllocExpression:
|
||||
return CompileAllocExpression(builder, expression);
|
||||
|
||||
case BinaryExpression:
|
||||
return CompileBinaryExpression(builder, expression);
|
||||
|
||||
|
@ -877,13 +888,13 @@ int main(int argc, char *argv[])
|
|||
|
||||
LLVMPassManagerRef passManager = LLVMCreatePassManager();
|
||||
|
||||
LLVMAddInstructionCombiningPass(passManager);
|
||||
LLVMAddCFGSimplificationPass(passManager);
|
||||
LLVMAddReassociatePass(passManager);
|
||||
LLVMAddPromoteMemoryToRegisterPass(passManager);
|
||||
//LLVMAddInstructionCombiningPass(passManager);
|
||||
//LLVMAddCFGSimplificationPass(passManager);
|
||||
//LLVMAddReassociatePass(passManager);
|
||||
//LLVMAddPromoteMemoryToRegisterPass(passManager);
|
||||
|
||||
LLVMPassManagerBuilderRef passManagerBuilder = LLVMPassManagerBuilderCreate();
|
||||
LLVMPassManagerBuilderSetOptLevel(passManagerBuilder, 3);
|
||||
LLVMPassManagerBuilderSetOptLevel(passManagerBuilder, 0);
|
||||
LLVMPassManagerBuilderPopulateModulePassManager(passManagerBuilder, passManager);
|
||||
|
||||
LLVMRunPassManager(passManager, module);
|
||||
|
|
|
@ -16,6 +16,7 @@
|
|||
"return" return RETURN;
|
||||
"static" return STATIC;
|
||||
"Reference" return REFERENCE;
|
||||
"alloc" return ALLOC;
|
||||
[0-9]+ return NUMBER;
|
||||
[a-zA-Z][a-zA-Z0-9]* return ID;
|
||||
\"[a-zA-Z][a-zA-Z0-9]*\" return STRING_LITERAL;
|
||||
|
|
7
wraith.y
7
wraith.y
|
@ -32,6 +32,7 @@ extern Node *rootNode;
|
|||
%token RETURN
|
||||
%token STATIC
|
||||
%token REFERENCE
|
||||
%token ALLOC
|
||||
%token NUMBER
|
||||
%token ID
|
||||
%token STRING_LITERAL
|
||||
|
@ -132,6 +133,11 @@ Identifier : ID
|
|||
$$ = MakeIdentifierNode(yytext);
|
||||
}
|
||||
|
||||
HeapAllocation : ALLOC Type
|
||||
{
|
||||
$$ = MakeAllocNode($2);
|
||||
}
|
||||
|
||||
AccessExpression : Identifier POINT AccessExpression
|
||||
{
|
||||
$$ = MakeAccessExpressionNode($1, $3);
|
||||
|
@ -178,6 +184,7 @@ BinaryExpression : Expression PLUS Expression
|
|||
Expression : PrimaryExpression
|
||||
| UnaryExpression
|
||||
| BinaryExpression
|
||||
| HeapAllocation
|
||||
;
|
||||
|
||||
VariableDeclaration : Identifier COLON Type
|
||||
|
|
Loading…
Reference in New Issue