ZHCUAQ1F july 2015 – april 2023
使用 --optimizer_interlist 和 --c_src_interlist 选项进行优化(--opt_level=n 或 -On 选项)编译时,可以控制交叉列出特性的输出。
当 --optimizer_interlist 选项与优化一起使用时,交叉列出功能不会 单独运行。相反,编译器会在代码中插入注释,指示编译器已如何重新排列和优化代码。这些注释在汇编语言文件中以 ;** 开头显示。除非也使用了 --c_src_interlist 选项,否则不会交叉列出C/C++ 源代码。
交叉列出功能会影响优化代码,因为其可能会阻止某些优化跨越 C/C++ 语句边界。优化使正常的源代码交叉列出变得不切实际,因为编译器会大幅度重新排列程序。因此,使用 --optimizer_interlist 选项时,编译器会编写重构的 C/C++ 语句。
当 --c_src_interlist 和 --optimizer_interlist 选项与优化一起使用时,编译器会插入其注释,并且交叉列出功能在汇编器之前运行,从而将原始 C/C++ 源代码合并到汇编文件中。
例如,假设下述C代码是使用优化 (--opt_level=2) 和 --optimizer_interlist 选项编译的:
int copy (char *str, const char *s, int n)
{
int i;
for (i = 0; i < n; i ++)
*str++ = *s++;
}
汇编文件包含与汇编代码交叉列出的编译器注释。
_main:
;** 5----------------------- printf("Hello, world\n");
;** 6----------------------- return 0;
STW .D2 B3,*SP--(12)
.line3
B .S1 _printf
NOP 2
MVKL .S1 SL1+0,A0
MVKH .S1 SL1+0,A0
|| MVKL .S2 RL0,B3
STW .D2 A0,*+SP(4)
|| MVKH .S2 RL0,B3
RL0: ; CALL OCCURS
.line4
ZERO .L1 A4
.line5
LDW .D2 *++SP(12),B3
NOP 4
B .S2 B3
NOP 5
; BRANCH OCCURS
如果添加--c_src_interlist 选项(使用--opt_level=2、--c_src_interlist 和 --optimizer_interlist 进行编译),则汇编文件会包含与汇编代码交叉列出的编译器注释和 C 源代码。
_main:
;** 5----------------------- printf("Hello, world\n");
;** 6----------------------- return 0;
STW .D2 B3,*SP--(12)
;------------------------------------------------------------------------------
; 5 | printf("Hello, world\n");
;------------------------------------------------------------------------------
B .S1 _printf
NOP 2
MVKL .S1 SL1+0,A0
MVKH .S1 SL1+0,A0
|| MVKL .S2 RL0,B3
STW .D2 A0,*+SP(4)
|| MVKH .S2 RL0,B3
RL0: ; CALL OCCURS
;------------------------------------------------------------------------------
; 6 | return 0;
;------------------------------------------------------------------------------
ZERO .L1 A4
LDW .D2 *++SP(12),B3
NOP 4
B .S2 B3
NOP 5
; BRANCH OCCURS