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

Mat*_*erg 35 c compiler-construction gcc

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

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

小智 27

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

  1. 下载gcc 4.9源代码
  2. 将您的体系结构名称添加到config.sub第250行附近查找# 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"
      ;;
    
    Run Code Online (Sandbox Code Playgroud)
  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. 玩得开心.

  • 这个答案值得更多的赞成.出于好奇,您尝试移植gcc的架构是什么?你的成功有多好?您是否也使用了binutils,或者您是否使用了外部汇编程序?你怎么能测试发出的代码的完整正确行为?谢谢. (4认同)

pea*_*ing 10

这很辛苦.

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

  1. 首先,您应该阅读GCC 手册中有关移植的所有内容.
  2. 也不要忘了太读GCC Internals.
  3. 阅读有关编译器的许多内容.
  4. 另请看这个问题和答案.
  5. 谷歌了解更多信息.
  6. 问问自己是否真的准备好了.
  7. 一定要有一台非常好的咖啡机......你需要它.
  8. 开始将机器依赖文件添加到gcc.
  9. 以跨主机 - 目标方式编译gcc.
  10. 在Hex-Editor中检查代码结果.
  11. 做更多的测试.
  12. 现在享受您自己的架构:D

完成后你可以只使用c或c ++而不使用os-dependet库(你的架构上目前没有运行的操作系统),现在你应该(如果需要的话)用你的交叉编译器编译很多其他的库来建立一个好的框架.

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