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;
|
||||
}
|
||||
|
||||
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)
|
||||
{
|
||||
uint32_t i;
|
||||
|
@ -287,6 +308,28 @@ static LLVMTypeRef LookupCustomType(char *name)
|
|||
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(
|
||||
LLVMTypeRef structType,
|
||||
char *name,
|
||||
|
@ -389,27 +432,6 @@ static LLVMValueRef CompileExpression(
|
|||
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(
|
||||
Node *numberExpression
|
||||
) {
|
||||
|
@ -588,15 +610,7 @@ static void CompileFunctionVariableDeclaration(LLVMBuilderRef builder, Node *var
|
|||
char *ptrName = strdup(variableName);
|
||||
strcat(ptrName, "_ptr");
|
||||
|
||||
if (IsPrimitiveType(variableDeclaration->children[0]))
|
||||
{
|
||||
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);
|
||||
}
|
||||
variable = LLVMBuildAlloca(builder, ResolveType(variableDeclaration->children[0]), ptrName);
|
||||
|
||||
free(ptrName);
|
||||
|
||||
|
@ -751,7 +765,7 @@ static void CompileStruct(LLVMModuleRef module, LLVMContextRef context, Node *no
|
|||
switch (currentDeclarationNode->syntaxKind)
|
||||
{
|
||||
case Declaration: /* this is badly named */
|
||||
types[fieldCount] = WraithTypeToLLVMType(currentDeclarationNode->children[0]->children[0]->primitiveType);
|
||||
types[fieldCount] = ResolveType(currentDeclarationNode->children[0]);
|
||||
fieldDeclarations[fieldCount] = currentDeclarationNode;
|
||||
fieldCount += 1;
|
||||
break;
|
||||
|
|
Loading…
Reference in New Issue