Linux on POWER 中的 GNU C/C 工具链(3)
2008-02-23 05:41:12来源:互联网 阅读 ()
完整的调试标记,请参阅 GCC 手册的 3.9 节。(请参阅 参考资料。)
优化选项
GCC 为 C/C 代码和所支持的其他语言提供了一个后台优化器。由于 Linux on POWER 是个性能很高的平台,因此对于研发人员来说,理解这个优化器的操作很重要。注意,并不是任何的优化程式都被周详记录,而是只有那些能够使用命令行选项调用的程式会有被记录。此处,介绍的这些选现并不是从他们性能的角度进行讨论的,而是从他们的移植和调试角度进行讨论的。完整的优化选项,请参考 GCC 手册的 3.10 节。(请参阅 参考资料。)
分组优化标记能够让编译器使用一个标记来选择一组优化选项。他们用来对代码的性能或大小进行不同级别的优化。-O 或 -O1 标记是第一个组优化标记,他包括包括了一些不用多少编译时间就能够实现的优化步骤。-O2 实现的是那些能够用来提高性能但却不会增加程式大小的优化;比较 -O3 和 -O2,针对性能进一步进行优化,而不管是否会影响程式的大小。-Os 是对程式的大小进行优化,即使会影响程式的性能也在所不惜。注意,并没有一个分组选项能够选择使用编译器中任何可用的性能优化选项。更有一个值得注意的事项是,对于 GCC 来说,-O 和 -O1 是完全相同的。但对于其他一些编译器来说,情况并非如此,这些编辑器包括 IBM XL C/C 编译器,该编辑器也能够在 Linux on POWER 上使用。
注意,有些选项对于编译器来说是明智的,因为他们会影响到研发的各个方面,例如调试。-fomit-frame-pointer 就是个这种选项,在任何的 -O 级别中都会启用这个选项,他会在无需的地方删除 frame 指针。这个选项能够提高性能,但是这个标记的规范却并不担保实现了优化。在 -fomit-frame-pointer 的例子中,这是因为 POWER 平台上的堆栈指针就是个 frame 指针,在使用 alloca() 机制在堆栈中动态分配内存时更是如此。在这些情况中,frame 指针必须保留,以便提供反向的跟踪。这是个启发式优化有害的例子,因此编译器会将其忽略。
POWER 架构中有一个分支计数寄存器,GCC 有一个利用这种特性的选项:-fbranch-count-reg。该特性利用了 POWER 架构能够对计数寄存器进行消耗和分支的能力,而不是采用消耗(和 0 作比较)和有条件的分支。在从 SPARC 往 Linux on POWER 上移植程式时,要确认启用了这个选项,因为 SPARC 并不支持这种特性。假如启用了 -O2,那么 -fbranch-count-reg 标记默认情况下是启用的。再次重申,在某些上下文中,编译器是不会应用这种优化的。在这种情况中,不包含函数调用的循环能够从这个选项中获益良多,但是在函数调用之前复制计数寄存器的内容所带来的负载可能会超过使用计数寄存器操作所带来的长处。
预处理选项
GNU 的预处理器是和编译器一起对源文档进行处理,他们将源程式中的文本转换成一些指令用来进行编译。GNU 预处理器是在 GCC 驱动器的控制之下自动进行操作的,GCC 驱动器中有几个选项能够用来引导预处理器的行为。
和 GCC 所驱动的其他工具链工具相同,预处理器能够使用 -Wp 选项向预处理器传递预定义的选项,或使用 -Xpreprocessor 选项向预处理器显式地传递外部指定的选项。Linux on POWER 没有 GCC 驱动器标记不能使用的预处理器选项。也就是说,我们没有什么理由去使用 -Xpreprocessor 标记,而不使用 -Wp 标记。
-undef 选项能够取消 GCC 或目标平台所特有的宏定义。在计划进行移植时,这很有用,因为他能够帮助确定移植的问题。
-M 选项通常也很有用,因为他能够用来显示源文档所需要的任何依赖关系。这种依赖关系乐意用来检查源代码和目标平台的可用性。
-I 选项用来包含要搜索的头文档所在的目录。假如一个依赖关系是使用 -I 选项直接指定的,并且这个包含的路径没有成功,那么需要确保系统中已安装了任何的更新包,并应用了任何的服务包。在较低版本的 Linux on POWER 上,安装程式有些问题,没有完全安装部分系统库和头文档。具体地说,Red Hat Enterprise Linux Version 3 上 64 位的标准和兼容库就存在这个问题。RHEL3 的任何问题在 RHEL3 Update 3 中已得以修正。
汇编程式选项
和预处理器类似,GNU 汇编程式也能够接受 GCC 能够识别和不能识别的一些选项:他们分别是 -Wa 和 -Xassembler 标记。
这两个选项在后文的“GNU 汇编程式”一节中会深入进行介绍。
链接器选项
链接器也能够使用类似于 -Wa 和 -Xassembler 的选项:-Wl 和 -Xlinker。然而,和汇编程式选项不同,GCC 驱动器能够接受一些直接对链接器行为产生影响的选项。
Linux on POWER 上有两种编译器:GCC 和 XL C/C for Linux on POWER。由于这两种编译器都使用了 GNU 工具链,因此他们生成的对象是完全兼容的。对象名的清单能够作为参数传递给 GCC 驱动器,这会告诉链接器在链接成可执行文档时包含这个对象文档。在将多个编译器产生的对象链接为可执行程式时,这个选项很有用。例如,能够考虑这样一个应用程式:他有很多进程组件,其中一些进程需要考虑可移植性的问题。那些对性能至关重要的代码能够使用 XL C/C 进行编译,以便获得更好的性能;其余的代码能够使用 GCC 进行编译。这种方法最大限度地利用了编译器的性能、GNU 工具链的灵活性连同能够将这两个编译器编译出来的对象链接成可执行程式的长处。
GCC 驱动器也能够接受一些参数,指定在链接时包含哪些库。-l 选项能够接受库的名称,能够直接使用,也能够作为遵守 POSIX 规范的一个单独参数。这个参数的排序规则很重要。库是按照指定的顺序进行搜索的。因此要确保其他库或对象所依赖的库要首先列出。
虽然从理论上来说,将 32 位对象和 64 位对象链接在一起是可行的,但是现在 GNU 工具链还没有实现这种功能。从架构上来说,存在一些原因能够解释为什么没有实现这种功能。在 POWER 平台上,将整个应用程式都编译成 64 位的并不会降低程式的性能。
代码生成选项
有些和机器平台无关的选项能够影响生成代码的方式,在 Linux on POWER 可能会有一些特别的影响。在将程式从 Linux on Intel 移植到 Linux on POWER 时,一个常见的变化就是对位置无关的代码的考虑。-fpic 选项用来生成和位置无关的代码,用来在 GCC 中使用共享库使用。在很多平台上,这个选项是必须指定的,但是在 POWER 架构上,这要取决于到底是使用 32 位模式还是采用 64 位模式来编译应用程式。在 64 位模式中,任何的对象都是和位置无关的;而在 32 位模式中,您必须指定 -fpic 选项。Makefile 和编译脚本在为 Linux on POWER 配置编译标记时,就应该考虑这个问题。
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
下一篇: GCC 4.0 的新特性
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash
