从 TI CGT ARM 18.1.4切换到20.2.7时、我遇到了以下问题。 我假设这适用于所有18.1.x 版本和所有20.2.x 版本。
在切换到较新版本的编译器时、函数堆栈大小大幅增加。
我创建了一个示例代码、它重现了代码中的错误。
唯一的编译器标志集是"-O0"。
编译后、我使用 armofd.exe 分析了.obj 文件以查看函数堆栈大小、但我还比较了生成的汇编代码、以确保这不是 armofd.exe 中的错误、而是编译器本身中的错误。
在18.1x 版本中、"dmyFunctionWithSwitchInside"的堆栈大小为0x198、使用20.2.x 版本时、增加到0x968。 (堆栈大小几乎是堆栈大小的六倍、由于开关有六种情况、乘法器接近六。)
我认为这与在新版本中错误地计算函数的"最坏情况"堆栈大小相关、因为此版本的计算就好像可以穿透开关的每一种情况、即使每种情况都有中断。
示例代码:
typedef 结构
{
int dummary[100];
dummyStruct;
int dummyFunction (int * x、dummyStruct *值)
{
返回(* x);
}
静态空 dummyFunctionWithSwitchInside (int * x)
{
INT 开关输入;
开关(switchInput)
{
情形1:
{
dummyStruct dummyInstance;
dummyFunction (x、&dummyInstance);
中断;
}
情形2:
{
dummyStruct dummyInstance;
dummyFunction (x、&dummyInstance);
中断;
}
情形3:
{
dummyStruct dummyInstance;
dummyFunction (x、&dummyInstance);
中断;
}
情形4:
{
dummyStruct dummyInstance;
dummyFunction (x、&dummyInstance);
中断;
}
情形5:
{
dummyStruct dummyInstance;
dummyFunction (x、&dummyInstance);
中断;
}
情况6:
{
dummyStruct dummyInstance;
dummyFunction (x、&dummyInstance);
中断;
}
}
}
空 main ()
{
Int varAgainstOptimization;
dummyFunctionWithSwitchIndside (&varAgainstOptimization);
}