Open64课程-编译过程

此文是Fred Chow在德拉华大学所讲open64课程讲义的翻译,转载请注明出处 http://lingcc.com
若需要此讲义的原版,请email我

Fred Chow 原版讲义见最后一页

—————————————————

1.优化控制哲学

  • 低优化级别–更短优化时间,更安全优化,更精确的计算,较缓慢的代码产生速度
  • 高优化级别–较长优化时间,更激进优化,精确性让步于高性能,更快的代码生成
  • 通过大量选项较好的控制优化–PathOpt2(?)提供了很多帮助

2,优化标志与涉及的阶段

  • -O0(-g下默认)—前端和代码生成器,关闭所有优化
  • -O1–前端和代码生成器,仅作本地优化
  • -O2(默认)—增加WOPT和其余的CG优化
  • -O3 —增加LNO
  • -ipa(能在任何优化级别进行)–增加IPA
  • -Ofast—和-O3 -ipa -OPT:Ofast -fno-math-errno -ffast-math效果相同
  • -OPT:Ofast是-OPT:ro=2:Olime=0:div_split=ON:alias=typed

3,选项组

  • 选项通过编译器不同阶段或者通过特征分组
  • 通用语法–   -GROUPNAME:opt[=val]{:opt=[val]}
  • 一些GNU类型的选项直接映射过来 -march -ffast-math -ffloat-store -fno-inline
  • 组名称: -LIST: 用户列出(?)    -OPT: 优化   -TARG:目标机器 -TENV:目标环境  -INLINE后端内联  -IPA:过程间分析  -LANG: 语言特征 -CG:代码生成  -WOPT:全局范围优化 -LNO:循环嵌套优化

4,编译器驱动器的角色

  • 在open64/driver中实现
  • 处理所有的命令行中的选项
  • 调用所有的编译阶段–预处理,前端,内联器,后端(be,lno,wopt,cg),汇编器,连接器
  • 保持和GNU选项的兼容

5,编译器驱动器

  • open64/driver/OPTIONS  具体选项表,能将一个选项对应到另一个选项
  • 单个运行,多个软链接
  • arg[0]字符串用于识别语言
  • 查询编译相关的环境变量
  • 在-march=auto时查询主机处理器类型(默认)
  • 查询compiler.defaults文件来得到系统相关选项

6,C/C++前端历史

  • 2000年开源时使用GNU2.95前端–直接从GNU内部语法树转换成WHIRL,在Open64中嵌入相互独立的C和C++前端
  • 2004年升级到GNU3.3.1
  • 206年类似于虚拟机,定义.spin文件格式—-GNU编译器不再作为Open64的一部分维护,简化升级到每个GNU发行版本的工作,C和C++前段中冗余代码消除
  • 2007年3月移植GNU4.0.2前端
  • 2007年10月移植GNU4.2.0前端
  • 考虑了会增加的未来GNU语言(?)

7,用GNU编译器作为前端

  • 使用为X86-64配置的GNU编译器
  • 过去的方式:  C语言前端open64/kgccfe      C++前端open64/kg++fe       调用嵌入在GNU代码中WHIRL生成代码       c++需要将整个编译结果转换为汇编语言来结束数据转换(?)        c和c++前端中有冗余代码
  • 新的方式:gspin树节点–GNU语法树建模工具:   在libspin库中功能实现,   gspin树节点可以提取到.spin文件中   识别GNU语法树中阻止gcc编译的点(?)  gspin树节点由gcc/tree.c所产生的GNU语法数生成    open64/wgen 将 gspin语法树节点(.spin文件)翻译成WHIRL节点(.B文件) wgen中操作的形式在kgccfe/kg++fe之后进行建模(?)

8,Gspin树节点

  • 目的:将GNU树中的所有信息编码到.spin文件中
  • 8-字节大小的gspin节点作为构建程序块的基本单元:在libspin/gspin-tree.h文件中定义  表示GNU语法树节点中的一个信息域   相邻的gspin簇表示一个GNU语法树节点   重新表示机制定义在libspin/gspin-tel.h文件
  • libspin管理gspin节点的布局
  • gspin节点的 I/O通过mmap()实现
  • ASCII抽取琦–为防止无限递归每个节点仅被处理一次

9,gspin节点例子

GNU的PLUS树节点有14个域,gspin根节点来编码PLUS,再加上13个表示剩余域的gspin节点

tree_code = PLUS
tree-code_class = BINARY
tree_type
tree_chain = NULL
flags
arity = 13
file name
line no
operand 0
operand 1
unused
unused
unused
unused

10,FORTRAN前端

相关文章:

This entry was posted in open64, 编译技术, 编译理论实践和应用 and tagged , , , , , , , , , , , , , , , . Bookmark the permalink.

8 Responses to Open64课程-编译过程

  1. Pingback: Open64课程-结语 « 编译点滴

  2. Pingback: Open64 课程–全局标量优化(WOPT I) part II « 编译点滴

  3. Pingback: Open64 课程–全局标量优化(WOPT II) « 编译点滴

  4. binyan says:

    你好,为什么看不到下一页

    • erlv says:

      @binyan, 抱歉,原来的主题没有调用wordpress中的分页链接:)
      换了个新主题,现在有下一页了:)

  5. Pingback: 编译点滴

  6. Pingback: 编译点滴 » Open64课程–OpenMp和自动并行化

  7. Pingback: 《编译点滴》半年记 « 编译点滴

发表评论

电子邮件地址不会被公开。 必填项已用 * 标注

*

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>