Calling extern functions
This commit is contained in:
@@ -34,6 +34,9 @@ void ModuleBuilder::buildStatement(shared_ptr<Statement> statement) {
|
|||||||
case StatementKind::RETURN:
|
case StatementKind::RETURN:
|
||||||
buildReturn(dynamic_pointer_cast<StatementReturn>(statement));
|
buildReturn(dynamic_pointer_cast<StatementReturn>(statement));
|
||||||
break;
|
break;
|
||||||
|
case StatementKind::META_EXTERN_FUNCTION:
|
||||||
|
buildMetaExternFunction(dynamic_pointer_cast<StatementMetaExternFunction>(statement));
|
||||||
|
break;
|
||||||
case StatementKind::EXPRESSION:
|
case StatementKind::EXPRESSION:
|
||||||
buildExpression(dynamic_pointer_cast<StatementExpression>(statement));
|
buildExpression(dynamic_pointer_cast<StatementExpression>(statement));
|
||||||
return;
|
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) {
|
void ModuleBuilder::buildExpression(shared_ptr<StatementExpression> statement) {
|
||||||
valueForExpression(statement->getExpression());
|
valueForExpression(statement->getExpression());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -37,6 +37,7 @@ private:
|
|||||||
void buildVarDeclaration(shared_ptr<StatementVarDeclaration> statement);
|
void buildVarDeclaration(shared_ptr<StatementVarDeclaration> statement);
|
||||||
void buildBlock(shared_ptr<StatementBlock> statement);
|
void buildBlock(shared_ptr<StatementBlock> statement);
|
||||||
void buildReturn(shared_ptr<StatementReturn> statement);
|
void buildReturn(shared_ptr<StatementReturn> statement);
|
||||||
|
void buildMetaExternFunction(shared_ptr<StatementMetaExternFunction> statement);
|
||||||
void buildExpression(shared_ptr<StatementExpression> statement);
|
void buildExpression(shared_ptr<StatementExpression> statement);
|
||||||
|
|
||||||
llvm::Value *valueForExpression(shared_ptr<Expression> expression);
|
llvm::Value *valueForExpression(shared_ptr<Expression> expression);
|
||||||
|
|||||||
Reference in New Issue
Block a user