#include "global_scope.hpp" #include "ast.hpp" void global_definition::compile() { env_ptr new_env = env_ptr(new env_offset(0, nullptr)); for(auto it = params.rbegin(); it != params.rend(); it++) { new_env = env_ptr(new env_var(*it, new_env)); } body->compile(new_env, instructions); instructions.push_back(instruction_ptr(new instruction_update(params.size()))); instructions.push_back(instruction_ptr(new instruction_pop(params.size()))); } void global_definition::declare_llvm(llvm_context& ctx) { generated_function = ctx.create_custom_function(name, params.size()); } void global_definition::generate_llvm(llvm_context& ctx) { ctx.builder.SetInsertPoint(&generated_function->getEntryBlock()); for(auto& instruction : instructions) { instruction->gen_llvm(ctx, generated_function); } ctx.builder.CreateRetVoid(); } global_definition_ptr& global_scope::add_definition(std::string n, std::vector ps, ast_ptr b) { auto occurence_it = occurence_count.find(n); int occurence = 0; if(occurence_it != occurence_count.end()) { occurence = occurence_it->second + 1; } occurence_count[n] = occurence; std::string final_name = n; if (occurence != 0) { final_name += "_"; final_name += std::to_string(occurence); } definitions.push_back(global_definition_ptr( new global_definition(final_name, std::move(ps), std::move(b)))); return *definitions.rbegin(); }