ready to add more functions

This commit is contained in:
2024-08-23 04:32:24 +00:00
parent 1f9e7acade
commit 3093997908
2 changed files with 33 additions and 7 deletions

View File

@ -1,6 +1,7 @@
#pragma once #pragma once
#include <memory> #include <memory>
#include <stdexcept> #include <stdexcept>
#include <unordered_map>
#include <unordered_set> #include <unordered_set>
#include "IR_basic.h" #include "IR_basic.h"
#include "ast/astnode_visitor.h" #include "ast/astnode_visitor.h"
@ -27,6 +28,7 @@ class IRBuilder : public ASTNodeVirturalVisitor {
std::unordered_map<std::string, size_t> const_str_dict; std::unordered_map<std::string, size_t> const_str_dict;
size_t const_arr_counter; size_t const_arr_counter;
std::unordered_set<std::string> already_set_constructor; std::unordered_set<std::string> already_set_constructor;
std::unordered_map<std::string, std::shared_ptr<BlockItem>> inline_builders;
public: public:
IRBuilder() { IRBuilder() {

View File

@ -130,6 +130,13 @@ void IRBuilder::ActuralVisit(DefinitionStatement_ASTNode *node) {
const_array_construct_call->result_full = init_var; const_array_construct_call->result_full = init_var;
const_array_construct_call->return_type = LLVMIRPTRType(); const_array_construct_call->return_type = LLVMIRPTRType();
const_array_construct_call->func_name_raw = var.second->IR_result_full.substr(1); const_array_construct_call->func_name_raw = var.second->IR_result_full.substr(1);
} else if (init_var[0] == '!') {
// inline builder
auto inline_builder = inline_builders[init_var.substr(1)];
init_var = std::dynamic_pointer_cast<RETAction>(inline_builder->exit_action)->value;
for (auto &act : inline_builder->actions) {
main_init_block->actions.push_back(act);
}
} }
auto act = std::make_shared<StoreAction>(); auto act = std::make_shared<StoreAction>();
main_init_block->actions.push_back(act); main_init_block->actions.push_back(act);
@ -155,6 +162,13 @@ void IRBuilder::ActuralVisit(DefinitionStatement_ASTNode *node) {
const_array_construct_call->result_full = init_var; const_array_construct_call->result_full = init_var;
const_array_construct_call->return_type = LLVMIRPTRType(); const_array_construct_call->return_type = LLVMIRPTRType();
const_array_construct_call->func_name_raw = var.second->IR_result_full.substr(1); const_array_construct_call->func_name_raw = var.second->IR_result_full.substr(1);
} else if (init_var[0] == '!') {
// inline builder
auto inline_builder = inline_builders[init_var.substr(1)];
init_var = std::dynamic_pointer_cast<RETAction>(inline_builder->exit_action)->value;
for (auto &act : inline_builder->actions) {
cur_block->actions.push_back(act);
}
} }
auto act = std::make_shared<StoreAction>(); auto act = std::make_shared<StoreAction>();
cur_block->actions.push_back(act); cur_block->actions.push_back(act);
@ -368,12 +382,12 @@ void IRBuilder::ActuralVisit(NewArrayExpr_ASTNode *node) {
return; return;
} }
std::string constructing_func_name = ".constarr." + std::to_string(const_arr_counter++); std::string constructing_func_name = ".constarr." + std::to_string(const_arr_counter++);
auto cons_func = std::make_shared<FunctionDefItem>(); // auto cons_func = std::make_shared<FunctionDefItem>();
prog->function_defs.push_back(cons_func); // prog->function_defs.push_back(cons_func);
cons_func->func_name_raw = constructing_func_name; // cons_func->func_name_raw = constructing_func_name;
cons_func->return_type = LLVMIRPTRType(); // cons_func->return_type = LLVMIRPTRType();
auto block = std::make_shared<BlockItem>(); auto block = std::make_shared<BlockItem>();
cons_func->basic_blocks.push_back(block); inline_builders[constructing_func_name] = block;
block->label_full = "label_constarr_" + std::to_string(const_arr_counter - 1); block->label_full = "label_constarr_" + std::to_string(const_arr_counter - 1);
block->exit_action = std::make_shared<RETAction>(); block->exit_action = std::make_shared<RETAction>();
std::dynamic_pointer_cast<RETAction>(block->exit_action)->type = LLVMIRPTRType(); std::dynamic_pointer_cast<RETAction>(block->exit_action)->type = LLVMIRPTRType();
@ -429,7 +443,7 @@ void IRBuilder::ActuralVisit(NewArrayExpr_ASTNode *node) {
ret->type = LLVMIRPTRType(); ret->type = LLVMIRPTRType();
ret->value = res; ret->value = res;
node->IR_result_full = "#" + constructing_func_name; node->IR_result_full = "!" + constructing_func_name; // inline builder
} }
void IRBuilder::ActuralVisit(NewConstructExpr_ASTNode *node) { void IRBuilder::ActuralVisit(NewConstructExpr_ASTNode *node) {
@ -536,9 +550,12 @@ void IRBuilder::ActuralVisit(AccessExpr_ASTNode *node) {
} }
} else { } else {
node->base->accept(this); node->base->accept(this);
std::string type_of_base = std::get<IdentifierType>(node->base->expr_type_info); std::string type_of_base;
if (std::holds_alternative<IdentifierType>(node->base->expr_type_info))
type_of_base = std::get<IdentifierType>(node->base->expr_type_info);
std::string base_ptr = node->base->IR_result_full; std::string base_ptr = node->base->IR_result_full;
std::string func_name = type_of_base + "." + node->member; std::string func_name = type_of_base + "." + node->member;
if (std::holds_alternative<ArrayType>(node->base->expr_type_info)) func_name = ".builtin.GetArrayLength";
std::vector<std::string> arg_val; std::vector<std::string> arg_val;
for (size_t i = 0; i < node->arguments.size(); i++) { for (size_t i = 0; i < node->arguments.size(); i++) {
node->arguments[i]->accept(this); node->arguments[i]->accept(this);
@ -890,6 +907,13 @@ void IRBuilder::ActuralVisit(AssignExpr_ASTNode *node) {
const_array_construct_call->result_full = src; const_array_construct_call->result_full = src;
const_array_construct_call->return_type = LLVMIRPTRType(); const_array_construct_call->return_type = LLVMIRPTRType();
const_array_construct_call->func_name_raw = node->src->IR_result_full.substr(1); const_array_construct_call->func_name_raw = node->src->IR_result_full.substr(1);
} else if (src[0] == '!') {
// inline builder
auto inline_builder = inline_builders[src.substr(1)];
src = std::dynamic_pointer_cast<RETAction>(inline_builder->exit_action)->value;
for (auto &act : inline_builder->actions) {
cur_block->actions.push_back(act);
}
} }
cur_block->actions.push_back(act); cur_block->actions.push_back(act);
act->value_full = src; act->value_full = src;