Modified something

main
Odeinjul 12 months ago
parent ed25175a5f
commit d9ce28b743
No known key found for this signature in database
GPG Key ID: E384228B2B38FFBB

@ -141,7 +141,7 @@ void IRBuilder::visit(SyntaxTree::Assembly &node) {
// You need to fill them // You need to fill them
// TODO // FINISH
void IRBuilder::visit(SyntaxTree::InitVal &node) { void IRBuilder::visit(SyntaxTree::InitVal &node) {
node.expr->accept(*this); node.expr->accept(*this);
} }
@ -219,7 +219,6 @@ void IRBuilder::visit(SyntaxTree::FuncParam &node) {
// TODO // TODO
void IRBuilder::visit(SyntaxTree::VarDef &node) { void IRBuilder::visit(SyntaxTree::VarDef &node) {
// TODO high dim array (not now)
int arrayLength; int arrayLength;
Ptr<Value> initVal; Ptr<Value> initVal;
if (node.is_constant) { if (node.is_constant) {
@ -350,12 +349,20 @@ void IRBuilder::visit(SyntaxTree::VarDef &node) {
} }
// TODO // FINISH
void IRBuilder::visit(SyntaxTree::LVal &node) { void IRBuilder::visit(SyntaxTree::LVal &node) {
auto ident = scope.find(node.name, false); auto ident = scope.find(node.name, false);
if (!node.array_index.empty()) { if (!node.array_index.empty()) {
//TODO node.array_index[0]->accept(*this);
auto constIndex = dynamic_pointer_cast<ConstantInt>(tmpInst);
auto globalIdent = dynamic_pointer_cast<GlobalVariable>(ident);
if(globalIdent != nullptr && globalIdent->is_const() && constIndex == nullptr) {
auto arrayInit = dynamic_pointer_cast<ConstantArray>(globalIdent->get_init());
tmpInst = arrayInit->get_element_value(constIndex->get_value());
} else {
tmpInst = builder->create_gep(ident, {CONST_INT(0), tmpInst});
}
} }
else { else {
if (ident->get_type()->is_pointer_type() && ident->get_type()->get_pointer_element_type()->is_array_type()) { if (ident->get_type()->is_pointer_type() && ident->get_type()->get_pointer_element_type()->is_array_type()) {
@ -364,7 +371,7 @@ void IRBuilder::visit(SyntaxTree::LVal &node) {
tmpInst = ident; tmpInst = ident;
} }
} }
isAddr = true; return ;
} }
// FINISH // FINISH
@ -413,8 +420,6 @@ void IRBuilder::visit(SyntaxTree::BlockStmt &node) {
scope.enter(); scope.enter();
for (const auto &stmt : node.body) { for (const auto &stmt : node.body) {
stmt->accept(*this); stmt->accept(*this);
if (builder->get_insert_block()->get_terminator() != nullptr)
break;
} }
scope.exit(); scope.exit();
return ; return ;

Loading…
Cancel
Save