Fixed crashes

This commit is contained in:
Rafał Grodziński
2025-08-01 12:36:42 +09:00
parent d3f45e7298
commit 9a04c0c49a
2 changed files with 20 additions and 4 deletions

View File

@@ -97,9 +97,15 @@ void ModuleBuilder::buildStatement(shared_ptr<Statement> statement) {
void ModuleBuilder::buildFunction(shared_ptr<StatementFunction> statement) { void ModuleBuilder::buildFunction(shared_ptr<StatementFunction> statement) {
// function types // function types
llvm::Type *returnType = typeForValueType(statement->getReturnValueType()); llvm::Type *returnType = typeForValueType(statement->getReturnValueType());
if (returnType == nullptr)
return;
vector<llvm::Type *> argTypes; vector<llvm::Type *> argTypes;
for (pair<string, shared_ptr<ValueType>> &arg : statement->getArguments()) for (pair<string, shared_ptr<ValueType>> &arg : statement->getArguments()) {
argTypes.push_back(typeForValueType(arg.second)); llvm::Type *argType = typeForValueType(arg.second);
if (argType == nullptr)
return;
argTypes.push_back(argType);
}
// build function declaration // build function declaration
llvm::FunctionType *funType = llvm::FunctionType::get(returnType, argTypes, false); llvm::FunctionType *funType = llvm::FunctionType::get(returnType, argTypes, false);
@@ -274,7 +280,10 @@ void ModuleBuilder::buildMetaExternFunction(shared_ptr<StatementMetaExternFuncti
} }
// build function declaration // build function declaration
llvm::FunctionType *funType = llvm::FunctionType::get(typeForValueType(statement->getReturnValueType()), types, false); llvm::Type *returnType = typeForValueType(statement->getReturnValueType());
if (returnType == nullptr)
return;
llvm::FunctionType *funType = llvm::FunctionType::get(returnType, types, false);
llvm::Function *fun = llvm::Function::Create(funType, llvm::GlobalValue::ExternalLinkage, statement->getName(), module.get()); llvm::Function *fun = llvm::Function::Create(funType, llvm::GlobalValue::ExternalLinkage, statement->getName(), module.get());
if (!setFun(statement->getName(), fun)) if (!setFun(statement->getName(), fun))
return; return;
@@ -663,6 +672,11 @@ llvm::InlineAsm *ModuleBuilder::getRawFun(string name) {
} }
llvm::Type *ModuleBuilder::typeForValueType(shared_ptr<ValueType> valueType, int count) { llvm::Type *ModuleBuilder::typeForValueType(shared_ptr<ValueType> valueType, int count) {
if (valueType == nullptr) {
markError(0, 0, "Missing type");
return nullptr;
}
switch (valueType->getKind()) { switch (valueType->getKind()) {
case ValueTypeKind::NONE: case ValueTypeKind::NONE:
return typeVoid; return typeVoid;
@@ -684,7 +698,6 @@ llvm::Type *ModuleBuilder::typeForValueType(shared_ptr<ValueType> valueType, int
if (valueType->getValueArg() > 0) if (valueType->getValueArg() > 0)
count = valueType->getValueArg(); count = valueType->getValueArg();
return llvm::ArrayType::get(typeForValueType(valueType->getSubType(), count), count); return llvm::ArrayType::get(typeForValueType(valueType->getSubType(), count), count);
return nullptr;
} }
} }
} }

View File

@@ -203,6 +203,9 @@ string Logger::toString(TokenKind tokenKind) {
} }
string Logger::toString(shared_ptr<ValueType> valueType) { string Logger::toString(shared_ptr<ValueType> valueType) {
if (valueType == nullptr)
return "{INVALID}";
switch (valueType->getKind()) { switch (valueType->getKind()) {
case ValueTypeKind::NONE: case ValueTypeKind::NONE:
return "NONE"; return "NONE";