2012-02-14 40 views
2

想象我有一个计划(macrotest.c)一组宏象这样:编译超出预处理器阶段,但在装配前阶段

#include <stdio.h> 
#include <stdlib.h> 
#define n1 75 
#define n2 90 
#define mac(x,y) ((x > y) ? (12) : (15)) 

int main(){ 

    printf("%d",mac(n1,n2)); 
    exit(0); 
} 

当你编译到组件(EM64T),你会得到以下内容:

的gcc -o -S macrotest.asm macrotest.c

main: 
.LFB0: 
    .cfi_startproc 
    pushq %rbp 
    .cfi_def_cfa_offset 16 
    .cfi_offset 6, -16 
    movq %rsp, %rbp 
    .cfi_def_cfa_register 6 
    movl $.LC0, %eax 
    movl $15, %esi <------ This 
    movq %rax, %rdi 
    movl $0, %eax 
    call printf 
    movl $0, %edi 
    call exit 
    .cfi_endproc 

你可以看到它立即MAC(N1,N2)转换为15 但是,当您编译的预处理器阶段,它只是膨胀出宏:

的gcc -o -E macrotest.prp macrotest.c

int main(){ 

    printf("%d",((75 > 90) ? (12) : (15))); 
    exit(0); 
} 

有没有什么办法可以进一步细分代码而不进行汇编?

+3

我不认为你可以做得比这更深入,因为优化是在编译时应用的,所以15会来自首先解析表达式,然后进行适当的评估。 – 2012-02-14 03:02:51

+0

@JesusRamos当然,有一些工具可以做我要求的。 – sj755 2012-02-14 03:04:28

+0

那么编译器会做到这一点,但事情是,它不会真的产生这样的输出(在你的情况下,只是用15替换整个东西),因为其中一些东西是特定的,将需要代码重新排序,这可能会使代码不可读几乎。 – 2012-02-14 03:05:48

回答

3

尝试选项-fdump-tree-all,看看是否告诉你你需要什么?

这将转储编译器的内部表示。它不使用C代码(你不能拿它并编译它),但它看起来有点像C.如果你想更多地理解它,请阅读“单静态分配”(SSA)。

如果您想进一步考虑汇编程序,请添加-fdump-rtl-all。对于过程的后半部分,GCC从SSA格式(其中编译器试图优化程序)切换,并使用它所称的“寄存器传送语言”。这个阶段的目的是优化底层机器指令的使用。这更难理解。尝试阅读GCC内部手册。

+0

这工作完美,感谢您的帮助。 – sj755 2012-02-14 18:57:07