40

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

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

4

3 回答 3

32

我正忙着将 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,在文件中查找 case ${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. 进行安装
  12. 做大量的研究和调试。
  13. 玩得开心。
于 2014-06-19T14:46:30.870 回答
13

这是一项艰苦的工作。

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

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

完成后,您只能在没有 os-dependet 库的情况下使用 c 或 c++(您的架构上目前没有运行的操作系统),您现在应该(如果需要)使用交叉编译器编译许多其他库以获得良好的框架.

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

于 2012-05-17T12:40:06.943 回答
4

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

于 2012-05-17T05:23:14.867 回答