start to add passes

This commit is contained in:
ridethepig 2023-05-17 00:58:30 +08:00
parent a9a340f482
commit 34a5a8ff01
9 changed files with 92 additions and 19 deletions

5
include/llir.h Normal file
View File

@ -0,0 +1,5 @@
#pragma once
#include "llir_instruction.h"
#include "llir_module.h"
#include "llir_type.h"
#include "llir_value.h"

15
include/pass.h Normal file
View File

@ -0,0 +1,15 @@
#pragma once
#include "common.h"
#include "llir_module.h"
namespace antlrSysY {
class Pass {
public:
std::string pass_name;
Pass(const std::string &name) : pass_name(name) {}
virtual void run(const Module &module) = 0;
};
} // namespace antlrSysY

12
include/pass_build_cfg.h Normal file
View File

@ -0,0 +1,12 @@
#pragma once
#include "llir_module.h"
#include "passes.h"
namespace antlrSysY {
class PassBuildCFG : public Pass {
public:
PassBuildCFG() : Pass("build_cfg") {}
virtual void run(const Module &module) override;
};
} // namespace antlrSysY

4
include/passes.h Normal file
View File

@ -0,0 +1,4 @@
#pragma once
#include "pass.h"
#include "pass_build_cfg.h"

View File

@ -5,10 +5,13 @@
#include "antlrgen/SysyLexer.h"
#include "antlrgen/SysyParser.h"
#include "common.h"
#include "llir.h"
#include "passes.h"
#include "visitor.h"
#include <3rdparty/argparse.hpp>
#include <fstream>
#include <iostream>
#include <memory>
#include <string>
INITIALIZE_EASYLOGGINGPP
@ -75,12 +78,11 @@ int main(int argc, const char **argv) {
ANTLRInputStream input(ifs_source_file);
SysyLexer lexer(&input);
CommonTokenStream tokens(&lexer);
#if 0
tokens.fill();
for (auto token : tokens.getTokens()) {
std::cout << token->toString() << std::endl;
}
#endif
// tokens.fill();
// for (auto token : tokens.getTokens()) {
// std::cout << token->toString() << std::endl;
// }
SysyParser parser(&tokens);
parser.removeErrorListeners();
@ -97,8 +99,14 @@ int main(int argc, const char **argv) {
}
visitor.llir_gen(ofs_llir_file);
}
#if 0
std::cout << tree->toStringTree(&parser) << std::endl << std::endl;
#endif
std::vector<std::shared_ptr<Pass>> passes = {std::make_shared<PassBuildCFG>()};
for (auto pass : passes) {
pass->run(visitor.module);
}
// std::cout << tree->toStringTree(&parser) << std::endl << std::endl;
return 0;
}

35
src/pass_build_cfg.cpp Normal file
View File

@ -0,0 +1,35 @@
#include "3rdparty/easylogging++.h"
#include "common.h"
#include "llir.h"
#include "passes.h"
namespace antlrSysY {
static void connect(BasicBlockPtr_t pred, BasicBlockPtr_t succ) {
pred->successors.push_back(succ);
succ->predecessors.push_back(pred);
}
void PassBuildCFG::run(const Module &module) {
LOG(INFO) << "Run pass " << pass_name;
for (auto func : module.function_list) {
if (func->is_libfunc()) continue;
for (auto basicblock : func->bb_list) {
auto _inst_br = basicblock->inst_list.back();
if (!Value::is<InstBranch>(_inst_br)) continue;
auto inst_br = Value::as<InstBranch>(_inst_br);
if (inst_br->operand_list.size() == 1) {
connect(basicblock, Value::as<BasicBlock>(inst_br->operand_list[0]));
}
else if (inst_br->operand_list.size() == 3) {
connect(basicblock, Value::as<BasicBlock>(inst_br->operand_list[1]));
connect(basicblock, Value::as<BasicBlock>(inst_br->operand_list[2]));
}
else {
panic("br should have either 1 or 3 operands");
}
}
}
}
} // namespace antlrSysY

View File

@ -2,9 +2,7 @@
#include "3rdparty/easylogging++.h"
#include "SysyLexer.h"
#include "common.h"
#include "llir_instruction.h"
#include "llir_type.h"
#include "llir_value.h"
#include "llir.h"
#include <any>
#include <cassert>
#include <memory>
@ -895,8 +893,7 @@ std::any Visitor::visitFuncDef(SysyParser::FuncDefContext *ctx) {
if (func_obj->bb_list.back()->inst_list.size() == 0 && func_obj->bb_list.back()->name == "after_ret") {
func_obj->bb_list.pop_back();
}
if (func_obj->bb_list.back()->inst_list.size()==0
|| !Value::is<InstReturn>(func_obj->bb_list.back()->inst_list.back())){
if (func_obj->bb_list.back()->inst_list.size() == 0 || !Value::is<InstReturn>(func_obj->bb_list.back()->inst_list.back())) {
if (func_ret_type->type_tag == Type::TypeTag::VoidType) {
build_InstReturn(_state.current_bb);
}

View File

@ -1,6 +1,5 @@
#include "common.h"
#include "llir_type.h"
#include "llir_value.h"
#include "llir.h"
#include "visitor.h"
#include <cassert>
#include <memory>

View File

@ -1,8 +1,6 @@
#include "3rdparty/easylogging++.h"
#include "common.h"
#include "llir_instruction.h"
#include "llir_type.h"
#include "llir_value.h"
#include "llir.h"
#include "visitor.h"
#include <array>
#include <memory>