start to add passes
This commit is contained in:
parent
a9a340f482
commit
34a5a8ff01
5
include/llir.h
Normal file
5
include/llir.h
Normal 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
15
include/pass.h
Normal 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
12
include/pass_build_cfg.h
Normal 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
4
include/passes.h
Normal file
@ -0,0 +1,4 @@
|
||||
#pragma once
|
||||
|
||||
#include "pass.h"
|
||||
#include "pass_build_cfg.h"
|
||||
26
src/main.cpp
26
src/main.cpp
@ -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
35
src/pass_build_cfg.cpp
Normal 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
|
||||
@ -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);
|
||||
}
|
||||
|
||||
@ -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>
|
||||
|
||||
@ -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>
|
||||
|
||||
Loading…
Reference in New Issue
Block a user