From 79339fe70ecd9a6e793836b9846c03fde1ef3a78 Mon Sep 17 00:00:00 2001 From: Markus Hauschild Date: Sat, 1 Jun 2013 16:53:27 +0200 Subject: [PATCH] Some FunctionDefinition stuff --- src/AST/CodeGenVisitor.cpp | 33 ++++++++++++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/src/AST/CodeGenVisitor.cpp b/src/AST/CodeGenVisitor.cpp index 0c466a8..a376226 100644 --- a/src/AST/CodeGenVisitor.cpp +++ b/src/AST/CodeGenVisitor.cpp @@ -88,7 +88,38 @@ void CodeGenVisitor::visit(FunctionCallExpression* e) { } void CodeGenVisitor::visit(FunctionDefinition* e) { - //std::vector types; + std::vector argTypes; + auto params = e->getParams()->getParameters(); + auto iter = params.begin(); + auto end = params.end(); + for (; iter != end; ++iter) { + Parameter& p = (*iter); + argTypes.push_back(typeToLLVMType(p.first)); + } + + llvm::FunctionType* ft = llvm::FunctionType::get(typeToLLVMType(e->getType()), argTypes, false); + llvm::Function *f = llvm::Function::Create(ft, llvm::Function::ExternalLinkage, e->getName(), module_); + + // If f conflicted, there was already something named 'Name'. If it has a body, + // don't allow redefinition or reextern. + if (f->getName() != e->getName()) { + f->eraseFromParent(); + f = module_->getFunction(e->getName()); + + // If f already has a body, reject this. + if (!f->empty()) { + throw "redefinition of function"; + } + + // If f took a different number of args, reject. + if (f->arg_size() != e->getParams()->getParameters().size()) { + throw "redefinition of function with different # of arguments"; + } + } + + // TODO set arg names + + value_ = f; } void CodeGenVisitor::visit(IfStatement* e) {