Skip to content

ComCompiler/nhwc_compiler

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

508 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

nhwc compiler

nhwc compiler 的目标是成为一个简化版的类llvm的编译器框架,用于生成 nhwc ir、riscv assembly。 这个项目专注于代码可读性,因此使用了大量贴合英语语法的宏和 graphviz 的可视化功能生成图样来更好的debug

The nhwc_compiler Project is under the Apache License v2.0

nhwc 是什么意思?

nhwc 的意思是 Never Happy When Coding ,出自动画「BanG Dream! It's Mygo!!!」中台词:"我从来没有觉得玩乐队开心过。"

进度

  • 基础设施
    • 符号表
      • 支持快速查找符号(使用平衡树套哈希表)
      • 支持对符号动态添加field信息
      • 定义简洁的宏来完成访问和插入节点操作
    • nhwc ir
      • 支持 phi-node
      • 支持简单的的 llvm ir 功能
      • 支持 对数组访问和修改命令
    • riscv instr
      • 支持常见的32位操作
    • Pass形式组织的框架
  • 编译总流程
    • code2ast_pass 由c语言代码构造ast树
      • antlr 自带的图结构转 petgraph 图结构
    • ast2st_pass 由 ast 树构造 scope tree 解析作用域
      • 支持 ast node 与 st node 互相映射
    • ast2et_debug_pass 这个 Pass 仅用于绘制 expression tree 图片,测试toolkit::gen_et
      • 支持数组相关 Operator
      • 支持对节点添加 def 或 use 信息
      • 支持简单的常量子树计算优化
      • 支持解析单个 statement
      • 支持直接解析整一个basic block
    • ast2cfg_pass 用于将 ast 树转化为 cfg (不带nhwc ir)
    • cfg2ncfg_pass 用于从 cfg(不带nhwc ir) 构造 ncfg(带nhwc ir 的cfg)
      • 符号作用域检查
      • 支持遍历作为 树的 et
      • 支持遍历作为 DAG的 et
    • ncfg2ssa_ncfg 将 ncfg(non-ssa) 转化为 ssa形式的ncfg
      • 插入 phi-node
      • 变量重命名
    • nhwc_collect_pass 将图中的 nhwc ir 收集为一个文本文件
    • simulator_debug_pass 用于执行ir,是一个ir解释器,
      • 支持运行main 函数
      • 支持插入断点并运行在.c 文件中以代码的形式添加
    • nhwc2riscv_pass 由nhwc ir 转化为 riscv
      • 完成nhwc ir 到riscv assembly 的简单对应
    • riscv2binary_pass 将riscv 汇编文件编译为二进制文件
  • 高级优化
    • 支持循环展开
    • 支持对表达式进行公共子表达式消除
    • 支持向量化
    • 支持常量传播

更多内容,敬请期待

Pass 形式组织的框架

fn main() {
    
    // 读取命令选项,诸如 -c 表示代码文件地址
    // 你也可以通过运行 cargo run -- --help 来查看所有可用选项
    let args = Args::parse();
    // args.c_file_path = PathBuf::from_str("./demos/demo1.c").unwrap();
    let mut pass_manager = PassManager::new(args);
    let code2ast_pass = Code2AstPass::new(true);
    let ast2cfg_pass = Ast2CfgPass::new(true);
    let ast2et_debug_pass = Ast2EtDebugPass::new(true);
    let cfg2ncfg_pass = Cfg2NcfgPass::new(true);
    let ast2st_pass = Ast2StPass::new(true);
    add_passes!(
        code2ast_pass
        then ast2et_debug_pass
        then ast2cfg_pass
        then ast2st_pass
        then cfg2ncfg_pass
        to pass_manager
    );
    timeit!({pass_manager.execute_passes()}, "all passed finish");
}

生成ast树的具体pass代码参见 code2ast_pass.rs,其他以此类推

impl Pass for Code2AstPass{
    // 运行这个pass 
    fn run(&mut self,ctx:&mut Context) {
        println!("pass Code2AstPass run");
        ctx.code = read_file_content(ctx.args.c_file_path.to_string_lossy().into_owned());
        parse_as_ast_tree(ctx);
        // 生成对应的png 
        if self.is_gen_png{
            let ast_tree = &mut ctx.ast_tree;
            generate_png_by_graph(&ast_tree,"ast_tree".to_string(),&[Config::EdgeNoLabel]);  
        }

    }
}

答辩ppt如下:

About

c compiler written by rust

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Contributors 3

  •  
  •  
  •  

Languages