GCC源码分析(四)——优化

一、前言

本篇只介绍一下框架,就不具体介绍每个步骤了。


二、Pass框架

上一篇已经讲了gcc的中间语言的表现形式。gcc 对中间语言的每一步处理叫做一个pass。从一个函数的GENERIC树刚被转换为GIMPLE之后,接下来的工作就由一连串的pass来完成。这些pass环环相扣,最终完成整个程序的优化工作,为目标代码生成做最后的准备。

GCC的pass结构定义在gcc/tree-pass.h头文件中:


/* Optimization pass type.  */
enum opt_pass_type // 四种pass类型对应的枚举
{
  GIMPLE_PASS,
  RTL_PASS,
  SIMPLE_IPA_PASS,
  IPA_PASS
};

/* Describe one pass; this is the common part shared across different pass
   types.  */
struct opt_pass // pass的基本结构
{
  /* Optimization pass type.  */
  enum opt_pass_type type;

  /* Terse name of the pass used as a fragment of the dump file
     name.  If the name starts with a star, no dump happens. */
  const char *name; // pass名字

  /* If non-null, this pass and all sub-passes are executed only if
     the function returns true.  */
  bool (*gate) (void); // 是否应该执行此pass?

  /* This is the code to run.  If null, then there should be sub-passes
     otherwise this pass does nothing.  The return value contains
     TODOs to execute in addition to those in TODO_flags_finish.   */
  unsigned int (*execute) (void); // 执行此pass!

  /* A list of sub-passes to run, dependent on gate predicate.  */
  struct opt_pass *sub; // 子pass。如果此pass被关闭,子pass也被一起关闭。

  /* Next in the list of passes to run, independent of gate predicate.  */
  struct opt_pass *next; // 后面的pass。

  /* Static pass number, used as a fragment of the dump file name.  */
  int static_pass_number; // 一个唯一的pass号

  /* The timevar id associated with this pass.  */
  /* ??? Ideally would be dynamically assigned.  */
  timevar_id_t tv_id; // 一个唯一的ID。

  /* Sets of properties input and output from this pass.  */
  unsigned int properties_required; // 这些是要被检查的property
  unsigned int properties_provided;
  unsigned int properties_destroyed;

  /* Flags indicating common sets things to do before and after.  */
  unsigned int todo_flags_start;  // 这些是在执行此pass之前/之后的附加动作
  unsigned int todo_flags_finish;
};</
  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
LLVM是Apple官方支持的编译器,而该编译器的前端是Clang,这两个工具都被集成到了Xcode里面。 在很长一段时间里,Apple一直使用GCC作为官方的编译器。GCC作为开源世界的编译器标准一直做得不错,但Apple对编译工具提出了更高的要求。 仗着自己在开源社区的地位,GCC 开发者对Apple的Objective-C语言新增的很多特性不予理睬,甚至当Apple想做的很多功能需要用模块化的方式来调用 GCC时,GCC却一直不给做。一般的公司遇到这种情况,可能都有些受不了,何况是乔布斯领导的Apple呢? 与GCC的不和让Apple一直在寻找一个高效的、模块化的、协议更放松的开源的编译器替代品。最终,Apple相中了Chris Lattner的LLVM。 现在依然就职于Apple的Chris Lattner可是一位大神,他于2000年毕业于俄勒冈州波特兰大学计算机科学专业,同年前往UIUC(伊利诺伊大学厄巴纳香槟分校),攻读计算机科学硕士和博士学位。在UIUC期间,他的GPA是4.0(满分),并不断地研究探索关于编译器的未知领域,发表了多篇论文。在硕士毕业论文中,他提出了一套完整的在编译时、链接时、运行时甚至是在闲置时优化程序的编译思想,奠定了LLVM的基础。 LLVM在Chris Lattner念博士时更加的成熟。首先,LLVM使用GCC作为前端来对用户程序进行语义分析产生 IF(Intermidiate Format),然后,LLVM使用分析结果完成代码优化和生成。这项研究让Chris Lattner在2005年毕业的时候,成为了小有名气的编译器专家。他也因此早早地被Apple相中,成为其编译器项目的骨干。 进入Apple之后,Chris Lattner首先在OpenGL小组做代码优化,把LLVM运行时的编译架在OpenGL栈上,这样OpenGL栈能够产出更高效率的图形代码。这个强大的OpenGL实现被用在了后来发布的Mac OS X 10.5上。同时,LLVM 的链接优化被直接加入到Apple的代码链接器上。 一个好的工具,必须要有用武之地。几年之后,LLVM的机会就来了。Mac OS X 10.6 Snow Leopard的新功能,完全得益于LLVM的技术,而这一个版本,也是将LLVM推向真正成熟的重大机遇。 “一个篱笆三个桩,一个好汉三个帮”,LLVM能够实现很多华丽的功能,要归功于LLVM自身的新前端——Clang。 GCC系统庞大而笨重,因此,Apple决定从零开始写C、C++、Objective-C语言的前端Clang,以求完全替代掉GCC。 Clang于2007年开始开发,C编译器最早完成,在2009年的时候,Objective-C编译器已经完全可以用于生产环境,而在一年之后,Clang基本实现了对C++编译的支持。 Clang一个重要的特性是编译快速、占内存少,而代码质量还比GCC来得高。得益于本身健壮的架构和Apple的大力支持,Clang越来越全能,支持的项目越来越多,如Mac OS X 10.6时代的Xcode和Interface Builder等,皆由Clang编译。Clang的加入也代表着LLVM真正走向成熟。 此外,Clang有一个重要的衍生项目是静态分析工具,能够通过自动分析程序的逻辑,在编译时就找出程序可能的bug,这个功能叫做ARC。ARC的实现让当时的广大开发者们大为惊愕。 除了LLVM核心和Clang以外,LLVM还包括一些重要的子项目,比如一个原生支持调试多线程程序的调试器LLDB和一个C++的标准库libstdc++。不光是Apple,很多的项目和编程语言都从LLVM中取得了关键性的技术。 当然,上面都是扯淡,其实这个模块就是把clang的全部api、常量和数据类型声明出来了,还有写上了中文注释,但是这个东西并不常用,只能用于专业从事C/C++相关开发的才有用,比如上面提到的 静态分析,又或者我封装它的目的,根据头文件自动声明为易语言 的API、常量、数据类型。当然这个功能我没有完成,只写了一半,因为离职的原因,代码在公司电脑上,忘记带走了,然后前段时间公司给把电脑重装了,代码也没了。所以我也就把模块发上来了。 注意!!我没有上传clang.dll,这个几十M大,自己安装个llvm,到安装目录下 D:\Program Files\LLVM\bin\libclang.dll (这个是我的路径)复制到源码下就可以玩了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值