充分利用 -qdatalocal
您可以看到一些说明如何使用 -qdatalocal 选项的示例。
在以下程序文件的源中, A1 和 A2 是全局变量:
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时,数据将由单个装入指令访问,因为 A1 和 A2 变量嵌入在 TOC 中。 如果未指定 -qdatalocal,那么 A1 和 A2 变量将通过两个装入指令进行访问。 在此示例中,可以使用 -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 中。
在指定局部变量时,必须使用乱码名称。 否则,您可能会收到错误信息。 
- 小心地将变量标记为本地变量。 如果指定不带任何自变量的
-qdatalocal,那么期望所有全局变量都是 TOC 直接放置的候选者,即使那些标记为外部的变量也是如此。 具有静态链接的变量没有相同的问题。 - 由于每个 TOC 结构对于模块或共享库都是唯一的,因此
-qdatalocal选项的实用程序仅限于该模块或共享库中的数据。 - 对于具有多个模块的程序,在多个 TOC 结构之间切换可能会稀释与此选项关联的 speedup。