ZHCU820Y September 2004 – June 2021
使用 --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:
;* -----------------------------------------------------------------------*
SUB.W #2,SP
;** 5 ------------------------- printf((const unsigned char *)"Hello, world\n");
MOV.W #$C$SL1+0,0(SP) ; |5|
CALL #printf ; |5|
; |5|
;** 6 ------------------------- return 0;
MOV.W #0,r12 ; |6|
ADD.W #2,SP
RET
如果添加--c_src_interlist 选项(使用--opt_level=2、--c_src_interlist 和 --optimizer_interlist 进行编译),则汇编文件会包含与汇编代码交叉列出的编译器注释和 C 源代码。
main:
;* ----------------------------------------------------------------------------*
SUB.W #2,SP
;** 5 ------------------------- printf((const unsigned char *)"Hello, world\n");
;------------------------------------------------------------------------
; 5 | printf ("Hello, world\n");
;------------------------------------------------------------------------
MOV.W #$C$SL1+0,0(SP) ; |5|
CALL #printf ; |5|
; |5|
;** 6 ------------------------- return 0;
;------------------------------------------------------------------------
; 6 | return 0;
;------------------------------------------------------------------------
MOV.W #0,r12 ; |6|
ADD.W #2,SP
RET