Sun Studio 12:C 用户指南

B.2.135 -xregs=r[, r…]

为生成的代码指定寄存器用法。

r 是一个逗号分隔列表,它包含以下项中的一项或多项:[no%]appl、[no%]float、[no%]frameptr

示例:-xregs=appl,no%float

表 B–36 -xregs 标志

值 

含义 

[no%]appl

(SPARC) [不] 允许编译器将应用程序寄存器用作临时寄存器来生成代码。应用程序寄存器是: 

g2、g3、g4(在 32 位平台上) 

g2、g3(在 64 位平台上) 

强烈建议使用 -xregs=no%appl 编译所有系统软件和库。系统软件(包括共享库)必须为应用程序保留这些寄存器值。这些值的使用将由编译系统控制,而且在整个应用程序中必须保持一致。

在 SPARC ABI 中,这些寄存器表示为应用程序寄存器。由于需要较少装入和存储指令,因此使用这些寄存器可提高性能。但是,这样使用可能与某些用汇编代码编写的旧库程序冲突。

[no%]float

(SPARC) [不] 允许编译器通过将浮点寄存器用作整数值的临时寄存器来生成代码。使用浮点值可能会用到与该选项无关的这些寄存器。如果希望您的代码没有任何对浮点寄存器的引用,需要使用 -xregs=no%float 并确保您的代码不会以任何方式使用浮点类型。

[no%]frameptr

(x86)[不] 允许编译器将帧指针寄存器(IA32 上的 %ebp、AMD64 上的 %rbp )用作未分配的被调用方保存寄存器。

如果将此寄存器用作被调用方保存寄存器,则可提高程序运行时性能。但是,它也会降低检查和跟踪栈的某些工具的性能。这种栈检查功能对系统性能测量和调节至关重要。因此,使用这种优化可以提高本地系统性能,但会降低全局系统性能。 

  • 为事后分析而转储栈的工具(如性能分析器)将无法工作。

  • 调试器(例如 adbmdbdbx)将无法转储栈或直接弹出栈帧。

  • 最新的帧丢失帧指针之前,dtrace 性能分析实用程序将无法收集栈上的任何帧的信息。

  • Posix pthread_cancel 将无法尝试找到清除处理程序。

  • C++ 异常无法传播给 C 函数。

    丢失了帧指针的 C 函数调用在 C 函数中引发异常的 C++ 函数时,C++ 异常中会发生失败。函数接受函数指针(例如,qsort)或全局函数(例如 malloc)被干预时,通常会发生此类调用。

    上面列出的后两种后果可能会影响应用程序的正常操作。大多数应用程序代码不会遇到这些问题。但是,使用 -xO4 开发的库需要详细记录客户端使用限制的文档。

    注意:如果同时还指定 -xpg,编译器

    将忽略 -xregs=frameptr 并发出警告。

SPARC 缺省值为 -xregs=appl,float

x86 缺省值为 -xregs=no%frameptr-xregs=frameptr 包含在 -fast 的扩展中。

强烈推荐您用 -xregs=no%appl,float 编译那些用于与应用程序链接的共享库的代码。至少共享库应该显式说明它如何使用应用程序寄存器,以便与这些库链接的应用程序知道如何处理该问题。

例如,在某种全局意义上使用寄存器(例如,使用寄存器指向一些关键数据结构)的应用程序,需要确切地知道其代码未使用 -xregs=no%appl 编译的某个库如何使用应用程序寄存器,以便安全地与该库链接。