本章介绍了此 Oracle Solaris Studio 发行版中新增和更改的编译器功能。
下面列出了自上一发行版起 C、C++ 和 Fortran 编译器通用的重大更改。可在编译器手册页和用户指南中找到详细信息。
编译器支持 SPARC-V9 ISA 的 SPARC VIS3 版本。通过使用 -xarch=sparcvis3 选项进行编译,编译器可以使用 SPARC-V9 指令集中的指令,以及 UltraSPARC 扩展(包括 Visual Instruction Set (VIS) 版本 1.0)、UltraSPARC-III 扩展(包括 Visual Instruction Set (VIS) 版本 2.0、积和熔加运算指令和 Visual Instruction Set (VIS) 版本 3.0)。
-xvector 选项的缺省值已在基于 x86 的系统上更改为 -xvector=simd。缺省情况下,在基于 x86 的系统上使用流化处理扩展,这样在优化级别 3 以及更高级别上很有好处。可使用子选项 no%simd 禁用该选项。在基于 SPARC 的系统上,缺省值为 -xvector=%none。
现在提供了对 AMD SSE4a 指令集的支持。使用 -xarch=amdsse4a 选项进行编译。
手册页已使用 -xtarget 值的正确扩展 ultra3、ultra3i、ultra3cu、ultra4 和 ultra4plus 进行更新。
使用新增的 -traceback 选项,当出现严重错误时,可执行文件可以输出栈跟踪。此选项使可执行文件能够在退出之前捕获一组信号,并输出栈跟踪和核心转储。如果有多个线程生成了信号,仅为第一个线程生成栈跟踪。要使用追踪,请在将程序与 f95、cc 或 CC 链接时添加 -traceback 选项。为了方便起见,也可在编译时接受此选项,但是会将其忽略。使用 -traceback 选项和 -G 选项创建共享库将发生错误。有关 -traceback 选项的详细信息,请参见编译器手册页。
-mt 选项已更改为 -mt=yes 或 -mt=no。-mt=yes 选项可确保以适当的顺序链接库。有关详细信息,请参见编译器手册页。
为 C 和 C++ 添加了新的 pragma。有关详细信息,请参见编译器用户指南。
#warning 编译器指令(C 和 C++)在指令中发出文本作为警告,然后继续编译。
(C 和 C++)头文件 mbarrier.h 现在可用。该文件用于在 SPARC 和 x86 处理器上为多线程代码定义多个内存屏障内部函数。有关详细信息,请参见编译器用户指南。
-xprofile=tcov[: prof_dir] 选项接受可选的配置文件目录文件名参数。如果指定了配置文件目录文件名,编译的程序将生成可供 tcov(1) 或使用 -xprofile=use:prof_dir 的反馈编译使用的数据。有关详细信息,请参见编译器用户指南。
在此发行版中,由 -xMD 和 -xMMD 选项 (C/C++) 写入的相关文件覆盖了先前存在的文件。文件名派生自 -o filename(如果已指定)、具有 .d 后缀的输入源文件名或者由 -xMF 选项指定的文件名。使用 -xMD 或 -xMMD 选项指定了 -o filename 或 -xMF filename 时,仅接受一个源文件。使用此方式编译多个源文件将发生错误。
下面列出了 C 编译器版本 5.11 的此发行版中的新增功能和更改的功能。有关详细信息,请参见《Oracle Solaris Studio 12.2:C 用户指南》和 cc 手册页。
对 C 编译器的更改更正了包含复杂类型的 struct 在 64 位模式下的 SPARC 处理器上传送和返回的方式。以前,这些 struct 值有时会在错误的寄存器中传送和返回,导致创建的二进制文件与 gcc 编译器创建的二进制文件不兼容。由于此更改在 Solaris Studio C 编译器中实现时会影响现有 ABI 的元素,因此,如果应用程序中有任何源文件使用具有复杂字段的 struct,必须重新编译应用程序的整个源代码库,以避免出现错误答案。针对 32 位 SPARC 处理器、32 位或 64 位 x86 处理器的编译不受此更改的影响。
下面列出了 C++ 编译器版本 5.11 的此发行版中的新增功能和更改的功能。有关详细信息,请参见《Oracle Solaris Studio 12.2:C++ 用户指南》和 CC 手册页。
-g 选项带有 -O 或 -xO 选项但不带有 + 选项可产生内联。示例:
CC -g foo.cc 产生没有内联的可调试 a.out
CC -g -O foo.cc 产生有内联的可调试 a.out
CC -g0 foo.cc 产生有内联的可调试 a.out
下表列出了此 Fortran 编译器版本 8.5 的此发行版中的新增功能和更改的功能。有关详细信息,请参见《Oracle Solaris Studio 12.2:Fortran 用户指南》和 f95 手册页。
新增的 -xkeepframe[=[ %all,%none, name, no% name] 选项禁止对已命名函数进行与栈相关的优化。%all 禁止对所有代码进行与堆栈相关的优化。%none 允许对所有代码进行与堆栈相关的优化。缺省值为 -xkeepframe=%none。
为进行优化,IVDEP 指令要求编译器忽略某些或所有在循环中找到的对数组引用的循环迭代依赖关系。这使得编译器能够执行使用其他方式无法实现的各个循环优化。-xivdep 选项可用于禁用 IVDEP 指令或确定应如何解释指令。
下面列出了此发行版中由 C、C++ 和 Fortran 编译器实现的 OpenMP 3.0 共享内存 API 的新增功能和更改的功能。有关详细信息,请参见《Oracle Solaris Studio 12.2:OpenMP API 用户指南》。
在 dbx 调试程序中支持 OpenMP 调试。对 dbx 进行了以下改进:
新增用于显示有关 OpenMP 区域、任务和线程集的信息的命令。
print —s、thread —info、whatis 和 where 命令的扩展
新增 OpenMP 同步事件。
自动确定作用域扩展到了任务区域。此功能使程序员无需在并行区域或任务区域中明确确定变量的作用域。编译器通过分析代码和应用一些智能规则来确定变量作用域。
新增的 SUNW_MP_WAIT_POLICY 环境变量改进了 程在程序中的等待行为,使程序员能够很好地控制等待运行(闲置)、在屏障处等待或者在 taskwait 处等待的线程的行为。
向 SUNW_MP_WARN OpenMP 环境变量中添加了新功能:除了控制由 OpenMP 运行时库发布的警告消息外,SUNW_MP_WARN 设为 TRUE 时,运行时库还将输出所有环境变量的设置以供参考,包括用户明确设置的环境变量和由库缺省设置的环境变量。
由 SUNW_MP_PROCBIND 环境变量控制的行为已在 Oracle Solaris 平台上更改:将 SUNW_MP_PROCBIND 设为 TRUE 会将主线程绑定到绑定时正在其上运行的处理器。绑定的时刻是第一次遇到并行区域或第一次调用 OpenMP 运行时例程(如 omp_set_num_threads())的时刻。从线程以循环(共享)方式从主线程所绑定到的处理器开始绑定。
使用线程分析器工具可检测 OpenMP 程序中的数据争用和死锁现象。在此发行版中,线程分析器功能已经扩展,无需重新编译即可检测二进制文件中的数据争用现象。有关详细信息,请参阅《Oracle Solaris Studio 12.2:线程分析器用户指南》。