From 3b43d44f3531bbe97c2a57eb624fff56f0fde782 Mon Sep 17 00:00:00 2001 From: cosmonaut Date: Fri, 30 Apr 2021 00:50:35 -0700 Subject: [PATCH] add type specification to iterator variable --- euler001.w | 6 ++---- generators/wraith.y | 2 +- src/codegen.c | 46 +++++++++++++++++++++++++-------------------- 3 files changed, 29 insertions(+), 25 deletions(-) diff --git a/euler001.w b/euler001.w index 2c5c49e..a5f5158 100644 --- a/euler001.w +++ b/euler001.w @@ -2,11 +2,9 @@ struct Program { static Main(): int { - sum: int; + sum: int = 0; - sum = 0; - - for (i in [1..1000]) + for (i: int in [1..1000]) { if ((i % 3 == 0) || (i % 5 == 0)) { diff --git a/generators/wraith.y b/generators/wraith.y index fc3e0ab..84a1b65 100644 --- a/generators/wraith.y +++ b/generators/wraith.y @@ -256,7 +256,7 @@ Conditional : IfStatement $$ = MakeIfElseNode($1, $3); } -ForStatement : FOR LEFT_PAREN Identifier IN LEFT_BRACKET Number POINT POINT Number RIGHT_BRACKET RIGHT_PAREN LEFT_BRACE Statements RIGHT_BRACE +ForStatement : FOR LEFT_PAREN VariableDeclaration IN LEFT_BRACKET Number POINT POINT Number RIGHT_BRACKET RIGHT_PAREN LEFT_BRACE Statements RIGHT_BRACE { $$ = MakeForLoopNode($3, $6, $9, $13); } diff --git a/src/codegen.c b/src/codegen.c index 29f48c2..0608916 100644 --- a/src/codegen.c +++ b/src/codegen.c @@ -619,6 +619,23 @@ static LLVMBasicBlockRef CompileReturnVoid(LLVMBuilderRef builder, LLVMValueRef return LLVMGetLastBasicBlock(function); } +/* FIXME: path for reference types */ +static LLVMValueRef CompileFunctionVariableDeclaration(LLVMBuilderRef builder, LLVMValueRef function, Node *variableDeclaration) +{ + LLVMValueRef variable; + char *variableName = variableDeclaration->children[1]->value.string; + char *ptrName = strdup(variableName); + strcat(ptrName, "_ptr"); + + variable = LLVMBuildAlloca(builder, ResolveType(variableDeclaration->children[0]), ptrName); + + free(ptrName); + + AddLocalVariable(scope, variable, NULL, variableName); + + return variable; +} + static LLVMBasicBlockRef CompileAssignment(LLVMBuilderRef builder, LLVMValueRef function, Node *assignmentStatement) { LLVMValueRef result = CompileExpression(builder, assignmentStatement->children[1]); @@ -631,6 +648,10 @@ static LLVMBasicBlockRef CompileAssignment(LLVMBuilderRef builder, LLVMValueRef { identifier = FindVariablePointer(assignmentStatement->children[0]->value.string); } + else if (assignmentStatement->children[0]->syntaxKind == Declaration) + { + identifier = CompileFunctionVariableDeclaration(builder, function, assignmentStatement->children[0]); + } else { printf("Identifier not found!"); @@ -642,23 +663,6 @@ static LLVMBasicBlockRef CompileAssignment(LLVMBuilderRef builder, LLVMValueRef return LLVMGetLastBasicBlock(function); } -/* FIXME: path for reference types */ -static LLVMBasicBlockRef CompileFunctionVariableDeclaration(LLVMBuilderRef builder, LLVMValueRef function, Node *variableDeclaration) -{ - LLVMValueRef variable; - char *variableName = variableDeclaration->children[1]->value.string; - char *ptrName = strdup(variableName); - strcat(ptrName, "_ptr"); - - variable = LLVMBuildAlloca(builder, ResolveType(variableDeclaration->children[0]), ptrName); - - free(ptrName); - - AddLocalVariable(scope, variable, NULL, variableName); - - return LLVMGetLastBasicBlock(function); -} - static LLVMBasicBlockRef CompileIfStatement(LLVMBuilderRef builder, LLVMValueRef function, Node *ifStatement) { uint32_t i; @@ -729,7 +733,8 @@ static LLVMBasicBlockRef CompileForLoopStatement(LLVMBuilderRef builder, LLVMVal LLVMBasicBlockRef checkBlock = LLVMAppendBasicBlock(function, "loopCheck"); LLVMBasicBlockRef bodyBlock = LLVMAppendBasicBlock(function, "loopBody"); LLVMBasicBlockRef afterLoopBlock = LLVMAppendBasicBlock(function, "afterLoop"); - char *iteratorVariableName = forLoopStatement->children[0]->value.string; + char *iteratorVariableName = forLoopStatement->children[0]->children[1]->value.string; + LLVMTypeRef iteratorVariableType = ResolveType(forLoopStatement->children[0]->children[0]); PushScopeFrame(scope); @@ -739,7 +744,7 @@ static LLVMBasicBlockRef CompileForLoopStatement(LLVMBuilderRef builder, LLVMVal LLVMBuildBr(builder, checkBlock); LLVMPositionBuilderAtEnd(builder, checkBlock); - LLVMValueRef iteratorValue = LLVMBuildPhi(builder, LLVMInt64Type(), iteratorVariableName); + LLVMValueRef iteratorValue = LLVMBuildPhi(builder, iteratorVariableType, iteratorVariableName); AddLocalVariable(scope, NULL, iteratorValue, iteratorVariableName); LLVMPositionBuilderAtEnd(builder, bodyBlock); @@ -789,7 +794,8 @@ static LLVMBasicBlockRef CompileStatement(LLVMBuilderRef builder, LLVMValueRef f return CompileAssignment(builder, function, statement); case Declaration: - return CompileFunctionVariableDeclaration(builder, function, statement); + CompileFunctionVariableDeclaration(builder, function, statement); + return LLVMGetLastBasicBlock(function); case ForLoop: return CompileForLoopStatement(builder, function, statement);