如何为gcc编写自己的代码生成器后端?

时间:2012-05-16 11:05:08

标签: c gcc compiler-construction

我创建了我自己的(非常简单的)字节代码语言,以及一个执行它的虚拟机。它工作正常,但现在我想使用gcc(或任何其他免费提供的编译器)从普通的c程序为这台机器生成字节代码。所以问题是,如何修改或扩展gcc以便它可以输出我自己的字节代码?请注意,我不想将我的字节代码编译为机器代码,我想将c代码“编译”为(我自己的)字节代码。

我意识到这是一个潜在的大问题,最好的答案可能是“去看看gcc源代码”。我只是需要一些帮助来解决这个问题。我认为必须有一些关于这个主题的文章或书籍可以描述向gcc添加自定义生成器的过程,但我没有通过谷歌搜索找到任何东西。

3 个答案:

答案 0 :(得分:25)

我正忙着将gcc移植到我们之前设计的8位处理器上。我对我们的机器来说是一项艰巨的任务,因为它是8位的,我们只有一个累加器,但如果你有更多的资源,它就变得容易了。这就是我们尝试使用gcc 4.9和使用cygwin来管理它的方式:

  1. 下载gcc 4.9来源
  2. 在第250行的config.sub周围添加您的体系结构名称,查找# Decode aliases for certain CPU-COMPANY combinations.在该列表中添加| my_processor \
  3. 在同一个文件中查找# Recognize the basic CPU types with company name.添加到列表中:| my_processor-* \
  4. 搜索文件gcc/config.gcc,在文件中查找案例$ {target}它在880行附近,按以下方式添加自己:

      ;;
    my_processor*-*-*)
      c_target_objs="my_processor-c.o"
      cxx_target_objs="my_processor-c.o"
      target_has_targetm_common=no
      tmake_file="${tmake_file} my_processor/t-my_processor"
      ;;
    
  5. 创建文件夹gcc-4.9.0\gcc\config\my_processor
  6. 从现有项目中复制文件并进行编辑,或从头开始创建自己的文件。在我们的项目中,我们复制了msp430项目中的所有文件并对其进行了全部编辑
  7. 您应该拥有以下文件(并非所有文件都是必填项):
    • my_processor.c
    • my_processor.h
    • my_processor.md
    • my_processor.opt
    • my_processor-c.c
    • my_processor.def
    • my_processor-protos.h
    • constraints.md
    • predicates.md
    • README.txt
    • t-my_processor
  8. 创建路径gcc-4.9.0/build/object
  9. 运行../../configure --target=my_processor --prefix=path for my compiler --enable-languages="c"
  10. 使
  11. make install
  12. 做了大量的研究和调试。
  13. 玩得开心。

答案 1 :(得分:9)

努力工作。

例如,我还使用自己的字节代码设计自己的“架构”,并希望使用GCC生成C / C ++代码。这就是我的方式:

  1. 首先,您应该阅读有关GCC manual移植的所有内容。
  2. 也不要忘记阅读GCC Internals
  3. 阅读有关编译器的许多内容。
  4. 另请参阅此question及其答案。
  5. Google了解更多信息。
  6. 问问自己是否真的准备好了。
  7. 一定要有一台非常好的咖啡机...你需要它。
  8. 开始将机器依赖文件添加到gcc。
  9. 以交叉主机 - 目标方式编译gcc。
  10. 使用十六进制编辑器检查代码结果。
  11. 做更多测试。
  12. 现在享受自己的架构:D
  13. 当你完成后,你可以只使用c或c ++而不使用os-dependet库(你的架构上目前没有运行的操作系统),你现在应该(如果需要的话)用你的交叉编译器编译许多其他的库来一个好的框架。

    PS:LLVMClang)更容易移植...也许你想从那里开始?

答案 2 :(得分:3)

它没有那么难。如果您的目标机器与另一台机器合理,请将其RTL(?)定义作为起点并进行修改,然后make compile test通过引导阶段;冲洗并重复直至其工作。您可能不必编写任何实际代码,只需编写机器定义模板。

相关问题