来仔细看看GCC 4.5.0

发布: 2010-04-20 15:14

距离GCC 4.4的发布一年之久,GNU终于发布GCC 4.5了。新版本带来了很多新特性,包括使用MPC库在编译时完成复杂的算术计算,C++0x支持增强,使用部分Graphite完成自动并行化,支持新的ARM处理器,Intel Atom优化和调优支持,以及AMD Orochi优化支持等。今年稍晚发布的Fedora 14,Ubuntu 10.10,OpenSUSE 11.3,都将有GCC4.5,估计Gentoo马上就会有支持了,磨拳擦掌准备试用喽:)详细支持如下:


总体说明:



  • 编译GCC需要MPC库

  • 故纸堆里的旧系统和很久没有更新和测试的系统在GCC4.5中被标记为待放弃,包括IRIX, Solaris 7, Tru64 UNIX V5.1.

  • GCC4.4中标记为待放弃的支持被放弃

  • 移除Itanium 1变种支持,但Itanium2编译的程序能在Itanium1上正确执行

  • GCC生成的调试信息包括了更多DWARF 3的特性,甚至包含了DWARF4的一些特性.GDB7.0之前的版本将无法使用这些特性.所以调试GCC4.5编译的程序需要使用GDB7.0及以上版本.也可以使用选项 -gdwarf-s -gstrict-dwarf来禁止生成DWARF4信息,或者-gdwarf-2 -gstrict-dwarf让GCC严格执行DWARF2标准.

  • X86上,浮点运算在GCC4.5上使用严格C99语法编译时,可能会运行变慢。这是为了和标准一致,可以通过选项-fexcess-precision=fast来避免严格的标准限制。

  • noinline属性不再能阻止整个函数拷贝。但可以通过新的属性noclone做到。



改进:



  • -save-temps可以增加参数,该功能让用户可以在并行编译的时候得到编译器的中间文件,但不会在不同的文件夹中使用相同的文件名从而干扰比起。

  • 调试信息目标文件也都被放在了同个文件夹下,而不是当前工作目录,这样用户可以在并行编译的时候得到调试信息。

  • 集成了MPC库,这样可以让GCC在编译时更精确的评估复杂的算术运算。GCC也可以通过它,对于常数作参数的数学运算类内建函数调用,直接在编译时使用相等的返回值来代替之。包括下列内建函数:cacos, cacosh, casin, casinh, catan, catanh, ccos, ccosh, cexp, clog, cpow, csin, csinh, csqrt, ctan和ctanh。

  • 新的链接时优化器(-flto),打开此选项后,GCC会针对每个输入文件,产生bytecode的表示形式,并将其写入每个目标文件的特定ELF区內。链接时,从这些ELF区內读取函数体,并将其实体化为转换单元。这样就可以使得过程间优化能在不同的文件间进行(甚至不同语言间),进而可能提升性能。使用此功能需要在编译时和链接时都增加-flto选项。如果不需要程序输出任何符号,可以联合-fwhopr和-fwhole-program来让过程间优化器执行更加激进的优化。

  • 增强自动并行化,现在支持外层循环的并行化。

  • 自动并行化能作为Graphite的一部分来打开。在选项-ftree-parallelize-loops=的基础上增加-floop-parallelize-all能打开基于Graphite的优化。(注:Graphite是GCC中使用多面体模型做循环优化的部分)

  • 重写基于严格指针的优化架构,会提高生成代码的效率。基于严格指针的优化在打开-fno-strict-aliasing后可用。

  • 增加关于函数传参的新优化。试图改变函数原型,避免无用传递,仅传递结构体中特定部分,并将引用传参改为值传参。-O2,-Os及以上级别默认开启此优化。

  • 优化异常控制代码。


新语言支持和特定语言改进



  • 所有语言:-fshow-colum选项默认打开,错误信息现在有列信息。

  • C类语言:若#include的文件未找到,编译器会立即退出;增加一个新内建函数__builtin_unreachable();增加-Wlogical-op选项,对可能存在的逻辑错误,报警告;嵌入式汇编增加goto特性,允许汇编中的语句直接跳到C中的标号处;C++0x原始strings(raw string)支持;deprecatd树形现在可以增加可选字符串参数,如__attribute__((deprecated(“text string”))),这样,deprecation警告会和字符串一同打印。

  • 其他针对各个语言的详细细节请参考官方release。


其他改进:



  • 插件支持:可以不通过改变编译器代码来扩展编译器功能。-fplugin=file.so能指定GCC载入动态链接文件file.so,并将其作为编译器的一部分执行。更多的细节请参考相关文档。

  • 安装文件夹稍有变动。


参考:


http://gcc.gnu.org/gcc-4.5/changes.html



PS:GCC 4.5.0最大的更新是性能提升,对于高性能的benchmark,普遍性能提升在5%-10%. GCC4.5.0中真正实现了过程间优化。过程间优化能明显的提升性能并明显降低生成的代码大小。另外,GCC4.5.0也使用多面体模型改进了循环优化架构.使得GCC日后可以加入更多高级循环优化,并且能深入调优。




原文: http://qtchina.tk/?q=node/426

Powered by zexport