Calling extern functions

This commit is contained in:
Rafał Grodziński
2025-06-19 17:43:16 +09:00
parent b85f552ae2
commit d579ca925c
2 changed files with 25 additions and 0 deletions

View File

@@ -34,6 +34,9 @@ void ModuleBuilder::buildStatement(shared_ptr<Statement> statement) {
case StatementKind::RETURN:
buildReturn(dynamic_pointer_cast<StatementReturn>(statement));
break;
case StatementKind::META_EXTERN_FUNCTION:
buildMetaExternFunction(dynamic_pointer_cast<StatementMetaExternFunction>(statement));
break;
case StatementKind::EXPRESSION:
buildExpression(dynamic_pointer_cast<StatementExpression>(statement));
return;
@@ -100,6 +103,27 @@ void ModuleBuilder::buildReturn(shared_ptr<StatementReturn> statement) {
}
}
void ModuleBuilder::buildMetaExternFunction(shared_ptr<StatementMetaExternFunction> statement) {
// get argument types
vector<llvm::Type *> types;
for (pair<string, ValueType> &arg : statement->getArguments()) {
types.push_back(typeForValueType(arg.second));
}
// build function declaration
llvm::FunctionType *funType = llvm::FunctionType::get(typeForValueType(statement->getReturnValueType()), types, false);
llvm::Function *fun = llvm::Function::Create(funType, llvm::GlobalValue::ExternalLinkage, statement->getName(), module.get());
funMap[statement->getName()] = fun;
// build arguments
int i=0;
for (auto &arg : fun->args()) {
string name = statement->getArguments()[i].first;
arg.setName(name);
i++;
}
}
void ModuleBuilder::buildExpression(shared_ptr<StatementExpression> statement) {
valueForExpression(statement->getExpression());
}

View File

@@ -37,6 +37,7 @@ private:
void buildVarDeclaration(shared_ptr<StatementVarDeclaration> statement);
void buildBlock(shared_ptr<StatementBlock> statement);
void buildReturn(shared_ptr<StatementReturn> statement);
void buildMetaExternFunction(shared_ptr<StatementMetaExternFunction> statement);
void buildExpression(shared_ptr<StatementExpression> statement);
llvm::Value *valueForExpression(shared_ptr<Expression> expression);