gpt4 book ai didi

c - 防止编译器优化静态结构变量

转载 作者:行者123 更新时间:2023-12-05 04:26:00 26 4
gpt4 key购买 nike

在我们的项目中,我们使用 ticlang 编译器,即来自 TI 的 clang 风格。优化设置为级别 -Os

在代码中,我们有具有结构类型的变量,并且仅在 C 文件中使用,因此被定义为 static struct_type_xy variable;

编译器会执行一些优化,其中此类结构的成员不会按顺序保存在一个内存块中,而是会重新排序甚至拆分。

这意味着在调试时这些变量无法正常显示。当然,我可以将它们定义为 volatile,但这也会阻止优化对相同成员的多次访问,这是我不希望发生的。

因此我想阻止这种优化。

这种优化的名称是什么?如何在 clang 中禁用它?

我还没有 MCVE,但我可以提供一些详细信息:

typedef struct
{
Command_t Command; // this is an enum type
int Par_1; // System uses 32 bit integers.
int Par_2;
int Par_3;
int Par_4;
size_t Num_Tok;
} Cmd_t;

static Cmd_t Cmd;

map 文件包含:

                  20000540    00000004     Cmd.o (.bss.Cmd.1)
20000544 00000004 Cmd.o (.bss.Cmd.2)
20000548 00000004 Cmd.o (.bss.Cmd.5)
2000054c 00000004 HAL_*
...
2000057b 00000001 XY_*
2000057c 00000001 Cmd.o (.bss.Cmd.0)

Cmd 的部分在内存中被拆分,有些甚至被删除。 (我使用了一个 bulid 配置,其中没有使用缺少的 2 个成员,但所有配置的结构定义都是相同的)

如果我删除 static 这将更改为

                  200004c4    00000018     (.common:Cmd)

最佳答案

Clang 显然是在对静态结构进行标量化,将其分解为单独的成员,因为地址从未被获取或使用,并且不会逃脱编译单元。这让它可以优化掉未使用的成员。

LLVM 具有“聚合的标量替换”(sroa) 优化过程https://llvm.org/docs/Passes.html#sroa-scalar-replacement-of-aggregates(该文档中提到的 alloca 是 LLVM IR 指令,而不是 C alloca() 函数。此外,谷歌在我试图找到正确的搜索词时发现了 the LLVM source that implements this 的随机副本。)

clang -O3 -Rpass=sroa如果该传递支持 optimization reports,可能会为它优化的每个结构打印一条“备注” .

根据 Clang optimization levels , -sroa-O1 启用和更高。但是-sroa不是 clang 选项,也不是 clang -mllvm -sroa 的 LLVM 选项. In 2011 ,有人询问是否添加命令行选项以禁用任意优化传递;如果添加了任何功能,请 IDK。


clang -cc1 -mllvm -help-list-hidden确实显示了一些有趣的选项名称,例如 --stop-before=<pass-name>--start-after=<pass-name> ,还有一个 --sroa-strict-inbounds .

clang -mllvm --sroa-strict-inbounds -O1确实编译了,但我不知道它做了什么。

clang -mllvm --stop-before=sroa -O3 hello.c不能在我的系统上用 clang 13 工作。或者用 --stop-before=-sroa .我得到 error in backend: "sroa" pass is not registered.

所以我不知道如何实际禁用此优化过程,但几乎可以肯定这是负责的人。这是我所了解的。

它在 -O1 启用,因此使用较低的优化级别并启用通常暗示的其他优化标志是不可行的。 -O0是特殊的,并将所有内容标记为 optnone , 以确保代码生成是适当的文字,存储/重新加载 C 语句之间的所有内容。

关于c - 防止编译器优化静态结构变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73122733/

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