8

ucc编译器(汇编生成)

 3 years ago
source link: https://feixiaoxing.blog.csdn.net/article/details/118056523
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

ucc编译器(汇编生成)

费晓行 2021-06-19 17:40:39 32
分类专栏: ucc编译器

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】

    有了中间代码,后面生成汇编就好办了。需要支持什么cpu,就将中间代码生成对应的汇编代码就好了。这部分的工作不复杂,但是比较琐碎。

1、函数入口

void EmitTranslationUnit(AstTranslationUnit transUnit)

2、涉及到的文件

emit.c,主要是告诉我们怎么生成一个gcc认识的汇编文件

https://github.com/sheisc/ucc162.3/blob/a92719fff0ab7eb5b0c45768acedabb3cd70ca05/ucc/ucl/emit.c

x86.c,真正用来生成汇编指令

https://github.com/sheisc/ucc162.3/blob/a92719fff0ab7eb5b0c45768acedabb3cd70ca05/ucc/ucl/x86.c

3、emit.c分析

3.1 EmitTranslationUnit会调用各个接口,创建一个合适的s文件

    这个函数里面,Segement、Strings、FloatConstants、Globals、ImportFuncions这些都是为了创建汇编文件的格式基础,为后续的EmitFunctions做铺垫。在这些函数中调用的子函数,部分内容需要具体的cpu来实现,比如Segment这种函数。

3.2 emit.c和x86.c最重要的连接EmitFunction

4、x86.c分析

4.1 EmitFunction->EmitBBlock->EmitIRInst,这是最重要的翻译流程

4.2 opcode.h一对一翻译

4.3 最简单的翻译,Jump跳转

4.4 另外一个最简单的翻译,获取地址

4.5 中间语言和汇编语言之间的映射

4.6 tpl内容,比如x86linux.tpl

4.7 汇编语言的打印

目前主要是PutASMCode实现,

这个函数在x86linux.c & x86win32.c都进行了实现

这就看自己需要实现哪一种os下的汇编代码了

4.8 函数翻译过程中涉及到其他问题

Export,函数输出

LayoutFrame & EmitPrologue,堆栈处理

EmitEpilogue,堆栈复原

4.9 寄存器的处理

reg.c

https://github.com/sheisc/ucc162.3/blob/a92719fff0ab7eb5b0c45768acedabb3cd70ca05/ucc/ucl/reg.c

4.10 总结

     相对而言,后端移植涉及到很多文件,比如emit.c、x86.c、reg.c、x86win32.c、x86linux.c,还涉及到opinfo.h、x86linux.tpl、x86win32.tpl,作为阅读代码同学,要了解每一个文件的作用,至少需要知道里面的处理流程。评价自己是否真正理解了这个理解,就看自己是不是可以把ucc移植到另外一个cpu架构上了,这是最好的判别方法。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK