From d579ca925ca50b4ebf720dcfd465e7c6a5f28c01 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Grodzi=C5=84ski?= Date: Thu, 19 Jun 2025 17:43:16 +0900 Subject: [PATCH] Calling extern functions --- src/ModuleBuilder.cpp | 24 ++++++++++++++++++++++++ src/ModuleBuilder.h | 1 + 2 files changed, 25 insertions(+) diff --git a/src/ModuleBuilder.cpp b/src/ModuleBuilder.cpp index 29670cf..07527a1 100644 --- a/src/ModuleBuilder.cpp +++ b/src/ModuleBuilder.cpp @@ -34,6 +34,9 @@ void ModuleBuilder::buildStatement(shared_ptr statement) { case StatementKind::RETURN: buildReturn(dynamic_pointer_cast(statement)); break; + case StatementKind::META_EXTERN_FUNCTION: + buildMetaExternFunction(dynamic_pointer_cast(statement)); + break; case StatementKind::EXPRESSION: buildExpression(dynamic_pointer_cast(statement)); return; @@ -100,6 +103,27 @@ void ModuleBuilder::buildReturn(shared_ptr statement) { } } +void ModuleBuilder::buildMetaExternFunction(shared_ptr statement) { + // get argument types + vector types; + for (pair &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 statement) { valueForExpression(statement->getExpression()); } diff --git a/src/ModuleBuilder.h b/src/ModuleBuilder.h index ef993be..bfc8303 100644 --- a/src/ModuleBuilder.h +++ b/src/ModuleBuilder.h @@ -37,6 +37,7 @@ private: void buildVarDeclaration(shared_ptr statement); void buildBlock(shared_ptr statement); void buildReturn(shared_ptr statement); + void buildMetaExternFunction(shared_ptr statement); void buildExpression(shared_ptr statement); llvm::Value *valueForExpression(shared_ptr expression);