gpt4 book ai didi

c++ - GCC 可以打印出中间结果吗?

转载 作者:IT王子 更新时间:2023-10-29 00:31:38 25 4
gpt4 key购买 nike

检查下面的代码:

#include <avr/io.h>

const uint16_t baudrate = 9600;

void setupUART( void ) {
uint16_t ubrr = ( ( F_CPU / ( 16 * (float) baudrate ) ) - 1 + .5 );
UBRRH = ubrr >> 8;
UBRRL = ubrr & 0xff;
}

int main( void ) {
setupUART();
}

这是用于编译代码的命令:

avr-gcc -g -DF_CPU=4000000       -Wall -Os -Werror -Wextra -mmcu=attiny2313 -Wa,-ahlmns=project.lst -c -o project.o project.cpp

ubrr 被编译器计算为 25,到目前为止一切正常。但是,为了检查编译器的计算结果,我查看了反汇编列表。

000000ae <setupUART()>:
ae: 12 b8 out UBRRH, r1 ; 0x02
b0: 89 e1 ldi r24, 0x19 ; 25
b2: 89 b9 out UBRRL, r24 ; 0x09
b4: 08 95 ret

是否有可能让 avr-gcc 打印出中间结果在编译时(或从 .o 文件中提取信息),所以当我编译code 它打印一行 (uint16_t) ubbr = 25 或类似的?这样我就可以对计算和设置进行快速完整性检查。

最佳答案

GCC 有命令行选项要求它在编译的任何阶段后转储其中间表示。 “树”转储采用伪 C 语法并包含您想要的信息。对于您尝试执行的操作,-fdump-tree-original-fdump-tree-optimized 转储发生在优化管道中的有用点。我手边没有 AVR 编译器,所以我将您的测试用例修改为独立的,并且可以使用我已有的编译器进行编译:

typedef unsigned short uint16_t;
const int F_CPU = 4000000;
const uint16_t baudrate = 9600;
extern uint16_t UBRRH, UBRRL;

void
setupUART(void)
{
uint16_t ubrr = ((F_CPU / (16 * (float) baudrate)) - 1 + .5);
UBRRH = ubrr >> 8;
UBRRL = ubrr & 0xff;
}

然后

$ gcc -O2 -S -fdump-tree-original -fdump-tree-optimized test.c
$ cat test.c.003t.original
;; Function setupUART (null)
;; enabled by -tree-original


{
uint16_t ubrr = 25;

uint16_t ubrr = 25;
UBRRH = (uint16_t) ((short unsigned int) ubrr >> 8);
UBRRL = ubrr & 255;
}

$ cat test.c.149t.optimized
;; Function setupUART (setupUART, funcdef_no=0, decl_uid=1728, cgraph_uid=0)

setupUART ()
{
<bb 2>:
UBRRH = 0;
UBRRL = 25;
return;
}

您可以看到常量表达式折叠完成得如此之早,以至于它已经发生在“原始”转储(这是您可以拥有的最早的可理解转储)中,并且优化进一步将移位和掩码操作折叠到写入 UBRRH 和 UBRRL 的语句。

文件名中的数字(003t 和 149t)可能对您有所不同。如果您想查看所有“树”转储,请使用-fdump-tree-all。还有“RTL”转储,它们看起来一点也不像 C,可能对您没有用。不过,如果您好奇的话,-fdump-rtl-all 会打开它们。总共有大约 100 个树和 60 个 RTL 转储,因此最好在临时目录中执行此操作。

(Psssst:每次你在括号内放置空格时,上帝都会杀死一只小猫。)

关于c++ - GCC 可以打印出中间结果吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16009357/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com