forked from cosmonaut/wraith-lang
				
			basic nested type resolution
							parent
							
								
									b00cde2193
								
							
						
					
					
						commit
						8e7cc00789
					
				
							
								
								
									
										76
									
								
								compiler.c
								
								
								
								
							
							
						
						
									
										76
									
								
								compiler.c
								
								
								
								
							|  | @ -129,6 +129,27 @@ static void AddLocalVariable(Scope *scope, LLVMValueRef pointer, char *name) | ||||||
|     scopeFrame->localVariableCount += 1; |     scopeFrame->localVariableCount += 1; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | static LLVMTypeRef WraithTypeToLLVMType(PrimitiveType type) | ||||||
|  | { | ||||||
|  |     switch (type) | ||||||
|  |     { | ||||||
|  |         case Int: | ||||||
|  |             return LLVMInt64Type(); | ||||||
|  | 
 | ||||||
|  |         case UInt: | ||||||
|  |             return LLVMInt64Type(); | ||||||
|  | 
 | ||||||
|  |         case Bool: | ||||||
|  |             return LLVMInt1Type(); | ||||||
|  | 
 | ||||||
|  |         case Void: | ||||||
|  |             return LLVMVoidType(); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     fprintf(stderr, "Unrecognized type!"); | ||||||
|  |     return NULL; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| static LLVMTypeRef FindStructType(char *name) | static LLVMTypeRef FindStructType(char *name) | ||||||
| { | { | ||||||
|     uint32_t i; |     uint32_t i; | ||||||
|  | @ -287,6 +308,28 @@ static LLVMTypeRef LookupCustomType(char *name) | ||||||
|     return NULL; |     return NULL; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | static LLVMTypeRef ResolveType(Node* typeNode) | ||||||
|  | { | ||||||
|  |     if (IsPrimitiveType(typeNode)) | ||||||
|  |     { | ||||||
|  |         return WraithTypeToLLVMType(typeNode->children[0]->primitiveType); | ||||||
|  |     } | ||||||
|  |     else if (typeNode->children[0]->syntaxKind == CustomTypeNode) | ||||||
|  |     { | ||||||
|  |         char *typeName = typeNode->children[0]->value.string; | ||||||
|  |         return LookupCustomType(typeName); | ||||||
|  |     } | ||||||
|  |     else if (typeNode->children[0]->syntaxKind == ReferenceTypeNode) | ||||||
|  |     { | ||||||
|  |         return LLVMPointerType(ResolveType(typeNode->children[0]->children[0]), 0); | ||||||
|  |     } | ||||||
|  |     else | ||||||
|  |     { | ||||||
|  |         fprintf(stderr, "Unknown type node!\n"); | ||||||
|  |         return NULL; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
| static LLVMValueRef LookupFunctionByType( | static LLVMValueRef LookupFunctionByType( | ||||||
|     LLVMTypeRef structType, |     LLVMTypeRef structType, | ||||||
|     char *name, |     char *name, | ||||||
|  | @ -389,27 +432,6 @@ static LLVMValueRef CompileExpression( | ||||||
|     Node *binaryExpression |     Node *binaryExpression | ||||||
| ); | ); | ||||||
| 
 | 
 | ||||||
| static LLVMTypeRef WraithTypeToLLVMType(PrimitiveType type) |  | ||||||
| { |  | ||||||
|     switch (type) |  | ||||||
|     { |  | ||||||
|         case Int: |  | ||||||
|             return LLVMInt64Type(); |  | ||||||
| 
 |  | ||||||
|         case UInt: |  | ||||||
|             return LLVMInt64Type(); |  | ||||||
| 
 |  | ||||||
|         case Bool: |  | ||||||
|             return LLVMInt1Type(); |  | ||||||
| 
 |  | ||||||
|         case Void: |  | ||||||
|             return LLVMVoidType(); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     fprintf(stderr, "Unrecognized type!"); |  | ||||||
|     return NULL; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| static LLVMValueRef CompileNumber( | static LLVMValueRef CompileNumber( | ||||||
|     Node *numberExpression |     Node *numberExpression | ||||||
| ) { | ) { | ||||||
|  | @ -588,15 +610,7 @@ static void CompileFunctionVariableDeclaration(LLVMBuilderRef builder, Node *var | ||||||
|     char *ptrName = strdup(variableName); |     char *ptrName = strdup(variableName); | ||||||
|     strcat(ptrName, "_ptr"); |     strcat(ptrName, "_ptr"); | ||||||
| 
 | 
 | ||||||
|     if (IsPrimitiveType(variableDeclaration->children[0])) |     variable = LLVMBuildAlloca(builder, ResolveType(variableDeclaration->children[0]), ptrName); | ||||||
|     { |  | ||||||
|         variable = LLVMBuildAlloca(builder, WraithTypeToLLVMType(variableDeclaration->children[0]->children[0]->primitiveType), ptrName); |  | ||||||
|     } |  | ||||||
|     else |  | ||||||
|     { |  | ||||||
|         char *customTypeName = variableDeclaration->children[0]->children[0]->value.string; |  | ||||||
|         variable = LLVMBuildAlloca(builder, LookupCustomType(customTypeName), ptrName); |  | ||||||
|     } |  | ||||||
| 
 | 
 | ||||||
|     free(ptrName); |     free(ptrName); | ||||||
| 
 | 
 | ||||||
|  | @ -751,7 +765,7 @@ static void CompileStruct(LLVMModuleRef module, LLVMContextRef context, Node *no | ||||||
|         switch (currentDeclarationNode->syntaxKind) |         switch (currentDeclarationNode->syntaxKind) | ||||||
|         { |         { | ||||||
|             case Declaration: /* this is badly named */ |             case Declaration: /* this is badly named */ | ||||||
|                 types[fieldCount] = WraithTypeToLLVMType(currentDeclarationNode->children[0]->children[0]->primitiveType); |                 types[fieldCount] = ResolveType(currentDeclarationNode->children[0]); | ||||||
|                 fieldDeclarations[fieldCount] = currentDeclarationNode; |                 fieldDeclarations[fieldCount] = currentDeclarationNode; | ||||||
|                 fieldCount += 1; |                 fieldCount += 1; | ||||||
|                 break; |                 break; | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue