充分利用 -qdatalocal

您可以看到一些说明如何使用 -qdatalocal 选项的示例。

在以下程序文件的源中, A1A2 是全局变量:

int A1;
int A2;
int main(){
  A2=A1+1;
  return A2;
}

以下是在指定 -qlist 而不指定 -qdatalocal时创建的列表文件的摘录:

     | 000000                           PDEF     main
    4|                                  PROC
    5| 000000 lwz      80620004   1     L4A       gr3=.A1(gr2,0)
    5| 000004 lwz      80630000   1     L4A       gr3=A1(gr3,0)
    5| 000008 addi     38630001   1     AI        gr3=gr3,1
    5| 00000C lwz      80820008   1     L4A       gr4=.A2(gr2,0)
    5| 000010 stw      90640000   1     ST4A      A2(gr4,0)=gr3

以下是使用 -qdatalocal指定 -qlist 时创建的列表文件的摘录:

     | 000000                           PDEF     main
    4|                                  PROC
    5| 000000 lwz      80620004   1     L4A       gr3=A1(gr2,0)
    5| 000004 addi     38630001   1     AI        gr3=gr3,1
    5| 000008 stw      90620008   1     ST4A      A2(gr2,0)=gr3

当您指定 -qdatalocal时,数据将由单个装入指令访问,因为 A1A2 变量嵌入在 TOC 中。 如果未指定 -qdatalocal,那么 A1A2 变量将通过两个装入指令进行访问。 在此示例中,可以使用 -qdatalocal=A1:A2 单独指定局部变量。

您始终可以在 -qlist 创建的 .lst 文件中看到以 >>>>> OPTIONS SECTION <<<<< 开头的部分,以确认使用这些选项。 例如,您可以在指定选项时查看 DATALOCAL=<variables>DATALOCAL

备注信息:
  • AIX®上, TOC 条目是指针大小。 指定不带自变量的 -qdatalocal 时,对于大于指针大小的变量,将忽略该选项。 相反,小于指针大小的数据是字对齐的。 请参阅 objdump 摘录的以下示例,该摘录在将 char (r3) 标记为本地时显示。 字节与下一个数据之间的偏移量 (r4) 仍为 4 字节。 通过装入字节指令而不是常规装入来访问数据。 有关 TOC 如何存储数据的更多信息,请参阅处理目录(TOC)溢出
    10000380:       88 62 00 20     lbz     r3,32(r2)
    10000384:       80 82 00 24     l       r4,36(r2)
    r2 (base address of the TOC), r3 (char), r4 (int)
  • 如果指定不适合的变量作为 -qdatalocal的参数,那么将忽略 -qdatalocal 。 不适合的变量可以是超过指针大小字节的数据,也可以是不存在的变量。 当您为非 TOC 候选变量指定 -qdatalocal 时,该变量的缺省存储器将设置为 -qdataimported ,并且该变量不会存储在 TOC 中。
  • 仅限 C + + 开始 在指定局部变量时,必须使用乱码名称。 否则,您可能会收到错误信息。 仅限 C++ 结束
  • 小心地将变量标记为本地变量。 如果指定不带任何自变量的 -qdatalocal ,那么期望所有全局变量都是 TOC 直接放置的候选者,即使那些标记为外部的变量也是如此。 具有静态链接的变量没有相同的问题。
  • 由于每个 TOC 结构对于模块或共享库都是唯一的,因此 -qdatalocal 选项的实用程序仅限于该模块或共享库中的数据。
  • 对于具有多个模块的程序,在多个 TOC 结构之间切换可能会稀释与此选项关联的 speedup。