编译器开发入门指南

上传人:ji****n 文档编号:47094633 上传时间:2018-06-29 格式:PDF 页数:36 大小:212.38KB
返回 下载 相关 举报
编译器开发入门指南_第1页
第1页 / 共36页
编译器开发入门指南_第2页
第2页 / 共36页
编译器开发入门指南_第3页
第3页 / 共36页
编译器开发入门指南_第4页
第4页 / 共36页
编译器开发入门指南_第5页
第5页 / 共36页
点击查看更多>>
资源描述

《编译器开发入门指南》由会员分享,可在线阅读,更多相关《编译器开发入门指南(36页珍藏版)》请在金锄头文库上搜索。

1、编译器开发入门指南GNU ToolChain 为例通常的选择 -GNU ToolChain事实上的工业标准,绝大部分* N I X软件都 用GCC编译久经考验,代码质量还不错,bug少!完善的生态环境,binutils gdb glibc 以及众 多针对GCC开发的软件广泛的用户群,巨大的影响IBM AdaCore CodeSourcery RedHat Intel Google等有实力的厂商支持开发维护成本低,对中小型企业非常划算其他的选择 -LLVM非常先进的设计,非常清晰的结 构,非常好懂的代码!iOS 众多 app 检验质量很好OpenCL 新版 CUDA 等最新技术 都基于 LLVM

2、 去开发生态环境还不成熟对 GCC 兼容还不是 100%Apple NVIDIA AMD Xilinx 等有 实力的厂商自己开发维护得起移植就是抄抄改改明确自己处理器的需求找现有的相似的实现去改基本上就是 copy and modify结合 gccint 去抄边抄边看边学边改binutils 移植的要点符号表, tc-machine 后端, bfd ,基本上就 改这几个地方,没什么文档,自己看代码吧,不 难gas 就一个工作, text2binary ,牢记这个, 因为现在 gas 有很多地方好像要做正确性检 查,容易让人多想text2binary 最重要的就是 position ! bit

3、的 position bfd 部分修改bfd/archures.c中#define bfd_mach_mips_XXX的定义bfd/bfd-in2.h中#define bfd_mach_mips_XXX的定义bfd/cpu-mips.c中匿名enum增加I-mipsXXX 项,arch_info_struct数组增加对应描述bfd/elfxx-mips.c中_bfd_elf_mips_mach和mips_set_isa_flag 函数增加对应case选择分支,并在mips_mach_extensions数组 中增加你的描述项elf 部分修改binutils/readelf.c 中 get_ma

4、chine_flags 函 数增加一个对应的 case 描述选项include/elf/mips.h 中增加 #define E_MIPS_MACH_XXX 的定义反汇编支持opcodes/mips-dis.c 中增加对应开关选项即 可一个完整的 opcode 分 析“baddu“, “d,v,t“, 0x70000028, 0xfc0007ff, WR_d|RD_s|RD_t, 0, I1baddu 就是指令名字,汇编代码里面的助记符0x70000028 是假设 add 指令的操作数都是 0 的情况下整条指令的编码0xfc0007ff 是用来区分操作码的, mask 和 match 与出来的

5、结果就是操作码#define IOCT INSN_OCTEON 让我们找到了 #define INSN_OCTEON 0x00000800值得解释的是 membership 是一个 32 位的 bit 表示,每一位代表一种体系,而 INSN_CHIP_MASK 恰恰 mask 出来有效的位d v t 这些 args 是核心所在, #define OP_MASK_RD 0x1f 代表了 d 这个 arg 描述 的操作数占 5 位而 #define OP_SH_RD 11 则表示 d 这个 arg 描述的操作数是从 11 位开始的pinfo 域跟 args 的定义是一样的, pinfo 是对 操作

6、数的一个额外描述,可以用来检查操作数 是否合法也可以用做自己想要的意图pinfo 如果是 MACRO 的话,这个指令就会先 被 macro 函数展开成实际指令gas 后端支持代码machine_ip 处理一个指令,主要工作是通过 args 匹配操作数并 INSERT_OPRANDvalidate_mips_insn 从语法上检查指令是否合 法macro 通过 macro_build 来把宏指令分解指令表里面写的 args 和 pinfo 在这里被当做处 理操作数的依据binutils 的调试出错提示仅仅是一个提示,造成这个错误的往 往是你修改的 opcode 或者 tc-machine.c g

7、db -q $AS $ARGS虽然有人很不屑, print 确实是个简单直观有 效的手段binutils 的验证objdump -S 一条指令一条指令的查看二进制 是否正确,当然,有模拟器的话,就轻松多了gcc 移植要点gcc 就是 text2text ,很多地方就是字符串替 换,没有过多的含义gcc 的 port 其实是一个逆向的过程,从指令去 匹配 rtl ,而不是从 rtl 来匹配指令gccint 是目前最好的文档,可以看 gccint- zh ,理解代码是唯一的出路,文档太少了gcc 外围支持代码gcc/config/mips/driver-native.c 中添加-march=XXX

8、的开关代码gcc/config/mips/mips.h 中processor_type 添加PROCESSOR_XXX,同时定 义#define TARGET_XXX (mips_arch = PROCESSOR_XXX) 和#define TUNE_XXX (mips_tune = PROCESSOR_XXX)gcc/config/mips/mips.h 中还有N多宏,根据你的处理器的情况添加相应的开关gcc/config/mips/mips.c 中的mips_cpu_info_table 添加 “orion“, PROCESSOR_R4600, 3, 0 的描述项gcc/config/mi

9、ps/mips.c 中的mips_rtx_cost_data 添加对应的cost描述项mips.h 中几个重要的 宏 #define FIRST_PSEUDO_REGISTER 188 #define FIXED_REGISTERS #define CALL_USED_REGISTERS #define CALL_REALLY_USED_REGISTERS #define GP_REG_FIRST 0 #define GP_REG_LAST 31 #define GP_REG_NUM (GP_REG_LAST - GP_REG_FIRST + 1)enum reg_class#define R

10、EG_CLASS_NAMES#define REG_CLASS_CONTENTS#define REG_ALLOC_ORDER#define REGISTER_NAMES一个完整的 rtl 例子 (define_insn “add3“ (set (match_operand:VWHB 0 “register_operand“ “=f“) (plus:VWHB (match_operand:VWHB 1 “register_operand“ “f“) (match_operand:VWHB 2 “register_operand“ “f“) “TARGET_HARD_FLOAT ; The Lo

11、ongson instruction suffixes corresponding to the modes in the; VWHBDI iterator.(define_mode_attr V_suffix (V2SI “w“) (V4HI “h“) (V8QI “b“) (DI “d“) 这个显然是根据模式,来替换指令模板内容的gcc 的工作就是 text2text ,不要想太多gcc 的调试 gcc -save-temps 是个有用的参数,我们可以在无法正确编译代码的时 候,通过这个参数保留 i 和 s 文件以供查找线索 出错提示仅仅是提示,不要怀疑公共代码,去你修改的 md 里面找原

12、因, 有些东西 print 比 gdb 要方便,自己打印 log 出来吧 xgcc -# 是个好参数,让我们知道分别给 cc1 as collect2 的参数是 什么,就可以 gdb 对应的参数了 gcc -fdump-tree-all 是个输出所有中间 pass 处理的 IR 供我们找线索的 好参数 make 的时候指定 CFLAGS+=“-Wno-error“ 避免一些 Warning 当 Error 处理带来的不必要麻烦gcc 的验证gcc -S 是个人尽皆知的蠢办法,但是这足够有 效模拟器,模拟器是个好东西爱好者该怎么入门在 vendor 工作会有一些资源,做起来难度会 比较小,但是呢

13、,一般 vendor 只要求 port 即 可,想提高也很难专门做编译的 CodeSourcery PathScale 等 公司没有相当的实力又无法融入你真的想做这个么?你确定你想做,后面的内 容或许会对你有一丁点儿帮助GCC 社区的开发形式committee是每年summit上开黑会的,比较高 端,GCC的命运由他们来满足FSF对赞助商的有偿 赞助maintainer也是有level的,global的level比较高, middle的也很强悍,x86这种复杂BE的也有实力。没有 review权限和非主流Arch的port maintainer 相对就不 是很powerful剩下的人就在mai

14、llist里面发patch并且等待review accept 被commit,或者中间再让你改几次,要不就不 理你或者拒绝你的代码学习 gcc 的建议有个明确的目标,针对目标去边做边学,解决问 题的原理和方法很重要,而不是变化非常快的 gcc 代码,有了解决问题的方法之后再去查代码 实现找一个你感兴趣的模块,从目录名,文件名,函 数名,变量名上理解代码才是好办法,找不到的 可以 grep代码的流程用 gdb 跟踪几遍,用笔和纸画下来如何融入社区开发?订阅gcc和hellogcc的maillist,加入gcc和hellogcc的ircsvn最新的代码,make check发现并修正错误grep

15、FIXME或TODO,根据自己的意愿和能力去做很多pass实现的不够好,阅读对应paper去完善算法做插件,邢明杰的gcc-vcg-plugin是一个很好的例子如何去解 gcc 的 bug发现了编译错误, internal error ,或者编译 OK 运行出错,怎么定位 bug ?首先确定源代码没有问题,用其他编译器编译 运行都 OKinternal error 就根据信息去 gdb 吧,一般会 给出代码退出在哪个文件的多少行,根据这个 信息可以推测错误的原因编译 OK 运行出错或者性能骤降或 者其他诡异的问提如何定位 bug对比排除,O1 O2 O3 的排除,发现问题在O?通过下面命令确定

16、 O? 具体由多少 pass 组成touch empty.cgcc -O1 -S -fverbose-asm empty.ccat empty.s最后一个小参数一个小参数的指定,确定问题的具体 pass需要你来一起完善文档完善 gccint 或者参与 gccint-zh 的翻译gccint 是个 manual ,爱好者需要 tutorial 来 入门开发中的经验和 tips ,希望你写出来投稿给 HelloGcc ,或者在 ChinaUnix 的 CPU 与编 译器版发帖Link TimeTO 不是一种在 link time 的优化,而是在 link time 去进行一些优化, IPO 一般会设想在 High Level 实现,但是现在人们都是模

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 医学/心理学 > 基础医学

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号