使用 COSMIC 编译器时如何禁用所有优化?
How to disable all optimization when using COSMIC compiler?
我在 STVD ide 中使用 COSMIC 编译器,即使使用 -no 关闭了优化(文档说“-no:不要使用优化器”)一些代码行被删除并且不能在它们上面放置断点,也不会在反汇编中找到它们。
我尝试设置 -oc(将删除的指令保留为注释),结果甚至没有将删除的行显示为注释。
bool foo(void)
{
uint8_t val;
if (globalvar > 5)
val = 0;
for (val = 0; val < 8; val++)
{
some code...
}
return true;
}
我知道在 for 循环之前将 val
设置为 0 似乎很愚蠢,但我们假设它出于某种原因是必要的。当我没有设置优化时,我希望它是 未 优化但安装 val = 0;
被删除而没有任何痕迹。
我不是在寻找解决方法,比如声明 val
volatile whitch 可以解决问题。我宁愿寻找一种方法来 防止优化 或至少 understand/know 在编译时对我的代码进行了哪些更改。
手册中并不清楚,但似乎-no 选项阻止了汇编级优化。在汇编优化之前运行的代码生成器阶段似乎有可能执行更高级别的优化,例如冗余代码删除。
来自手册:
-cp
disable the constant propagation optimization. By default,
when a variable is assigned with a constant, any subsequent access to that variable is replaced by the constant
itself until the variable is modified or a flow break is
encountered (function call, loop, label ...).
看来您必须明确禁用此持续传播功能。
这可能是不寻常的,但看起来这个编译器默认优化,并区分编译器优化和汇编器优化(在编译阶段执行),它们让你分别关闭每个单独的优化。
为了避免在代码中出现这种情况,而不是全局关闭它,您可以在这种情况下将 val
初始化为非零值:
int val = -1 ;
那么后面的零赋值就需要显式代码了。这比 volatile
的优势在于当您启用它们时它不会阻止优化。
我相信 C 语言规范允许这种行为。
您实际上是在连续的代码行中将相同的值写入同一变量一次或两次。编译器可以将该值分配给它认为合适的处理器寄存器或内存位置,并且知道 for 循环中初始分配后的值与执行 if 子句时分配的值相同。结果,语言规范允许编译器丢弃冗余代码。
强制编译器对变量进行所有读写访问的方法是使用volatile关键字。这就是它的用途。
我在 STVD ide 中使用 COSMIC 编译器,即使使用 -no 关闭了优化(文档说“-no:不要使用优化器”)一些代码行被删除并且不能在它们上面放置断点,也不会在反汇编中找到它们。
我尝试设置 -oc(将删除的指令保留为注释),结果甚至没有将删除的行显示为注释。
bool foo(void)
{
uint8_t val;
if (globalvar > 5)
val = 0;
for (val = 0; val < 8; val++)
{
some code...
}
return true;
}
我知道在 for 循环之前将 val
设置为 0 似乎很愚蠢,但我们假设它出于某种原因是必要的。当我没有设置优化时,我希望它是 未 优化但安装 val = 0;
被删除而没有任何痕迹。
我不是在寻找解决方法,比如声明 val
volatile whitch 可以解决问题。我宁愿寻找一种方法来 防止优化 或至少 understand/know 在编译时对我的代码进行了哪些更改。
手册中并不清楚,但似乎-no 选项阻止了汇编级优化。在汇编优化之前运行的代码生成器阶段似乎有可能执行更高级别的优化,例如冗余代码删除。
来自手册:
-cp
disable the constant propagation optimization. By default, when a variable is assigned with a constant, any subsequent access to that variable is replaced by the constant itself until the variable is modified or a flow break is encountered (function call, loop, label ...).
看来您必须明确禁用此持续传播功能。
这可能是不寻常的,但看起来这个编译器默认优化,并区分编译器优化和汇编器优化(在编译阶段执行),它们让你分别关闭每个单独的优化。
为了避免在代码中出现这种情况,而不是全局关闭它,您可以在这种情况下将 val
初始化为非零值:
int val = -1 ;
那么后面的零赋值就需要显式代码了。这比 volatile
的优势在于当您启用它们时它不会阻止优化。
我相信 C 语言规范允许这种行为。
您实际上是在连续的代码行中将相同的值写入同一变量一次或两次。编译器可以将该值分配给它认为合适的处理器寄存器或内存位置,并且知道 for 循环中初始分配后的值与执行 if 子句时分配的值相同。结果,语言规范允许编译器丢弃冗余代码。
强制编译器对变量进行所有读写访问的方法是使用volatile关键字。这就是它的用途。