This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TMS570LC4357:TI ARM CGT 编译器错误- 20.2个版本中的函数栈大小

Guru**** 608295 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1213433/tms570lc4357-ti-arm-cgt-compiler-bug---function-stack-sizes-in-20-2-versions

器件型号:TMS570LC4357

从 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);

}

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢您将此问题通知我们并提供了一个简短的测试案例。  我可以重现相同的行为。

    唯一的编译器标志集是"-O0"。

    注意 -O0 等效于较长的形式 -- opt_level=0 。  在使用版本20.2.7.LTS 时、前提是您更改为 -- opt_level=1 ,则堆栈大小问题消失。  这是切实可行的解决方案吗?

    谢谢。此致、

    -George.

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    感谢您的快速响应。

    它确实使问题消失了、但这不是一个错误吗?

    这是否不应该在不同的编译器版本中保持一致?

    是否有意地更改以分配比  所需的确切最大值更多的堆栈?

    是否在某个地方记录了这一点?

    这让我陷入了一种无法自拔的境地  

    -不要更新编译器,因此我不能有新版本的错误修复和改进

    或  

    -请更新编译器并更改可能 导致不必要或未知后果的项目级别设置

    Br、

    亚当·科罗斯

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我认为、与其直接解决您的问题、不如让您对发生的情况有所了解。

    从您首个帖子中的源代码开始。  使用版本18.1.0.LTS 和构建它 -- opt_level=0 。  同时添加选项 -- src_interlist 。  此选项告诉编译器保留自动生成的汇编文件、并向其添加注释、以便于理解。  它与源文件同名、但文件扩展名更改为 .asm 。  以下是需要重点介绍的几行汇编语言。

    ; The following local variables in dummyFunctionWithSwitchInside() will be grouped together
    ; to share stack space among distinct scoping blocks.  References
    ; in the source interlisting will look like "O$1.s3_1.u4_2.s4_3.l4_4" or "&$O$O1+0".
    ;
    ;    --offset--    --reference--		 --variable--
    ;
    ;         0	  O$1.s3_1.u4_2.s4_3.l4_4        struct $$fake0 dummyInstance  [file.c:54]
    ;         0	  O$1.s3_1.u4_2.s4_5.l4_6        struct $$fake0 dummyInstance  [file.c:47]
    ;         0	  O$1.s3_1.u4_2.s4_7.l4_8        struct $$fake0 dummyInstance  [file.c:40]
    ;         0	  O$1.s3_1.u4_2.s4_9.l4_10       struct $$fake0 dummyInstance  [file.c:33]
    ;         0	  O$1.s3_1.u4_2.s4_11.l4_12      struct $$fake0 dummyInstance  [file.c:26]
    ;         0	  O$1.s3_1.u4_2.s4_13.l4_14      struct $$fake0 dummyInstance  [file.c:19]
       
        <skip a few lines>
        
    ;*****************************************************************************
    ;* FUNCTION NAME: dummyFunctionWithSwitchInside                              *
    ;*                                                                           *
    ;*   Regs Modified     : A1,V9,SP,LR,SR                                      *
    ;*   Regs Used         : A1,V9,SP,LR,SR                                      *
    ;*   Local Frame Size  : 0 Args + 400 Auto + 4 Save = 404 byte               *
    ;*****************************************************************************
    dummyFunctionWithSwitchInside:
        

    第一组行是注释、用于描述编译器执行的优化。  最后的影响是、所有这些 愚蠢的举动 结构体变量在栈上占据相同的位置。  在此论坛主题中、我们将该优化局部变量分组称为该主题。  开始处的块注释  dummyFunctionWithSwitchInside 确认使用的堆栈总量(标题为  本地帧大小 )为404字节。

    执行相同的操作、但使用版本20.2.7.LTS。  关于 局部变量分组的注释不存在。  下面是在函数开始的注释...

    ;*****************************************************************************
    ;* FUNCTION NAME: dummyFunctionWithSwitchInside                              *
    ;*                                                                           *
    ;*   Regs Modified     : A1,V9,SP,LR,SR                                      *
    ;*   Regs Used         : A1,V9,SP,LR,SR                                      *
    ;*   Local Frame Size  : 0 Args + 2400 Auto + 4 Save = 2404 byte             *
    ;*****************************************************************************
    dummyFunctionWithSwitchInside:

    请注意、它使用2404字节的堆栈。  时间 -- opt_level=1 则会进行局部变量分组。

    为什么会发生改变?  我不知道具体原因。  要确定这一点、需要花费大量的工作。  我可以给你一个大概发生了什么的总体印象。  局部变量分组等优化通常是许多小决策共同协作的结果。  可以、编译器有一部分专门用于此优化。  我确信版本20.2.7.LTS 低于 -- opt_level=0 尝试此功能。  某项较早的决定可能会以某种方式导致条件变得不安全、从而使优化被判定为不安全。  可能是一些错误修复导致先前的决策发生了变化。

    在理想情况下、不会发生这种情况。  我们确实会运行测试、尝试检测两个版本之间性能或大小的降低情况。  但无法检测到所有情况。

    我意识到这并不是完全令人满意的。  但它有什么帮助吗?

    谢谢。此致、

    -George.

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    谢谢、这确实画了一幅更清晰的图片。

     

    我们会将设置更改为"-O1"并更新编译器版本。 它似乎不会对我们的代码产生负面影响、并且函数堆栈大小与18.1.x 版本中保持不变或几乎相同。 (有些情况在两个方向上存在差异、主要是8字节、这似乎可以接受。)

     

    您是否会在发行说明中将此记录为免责声明/问题/缺陷?

     

    Br、

    亚当·科罗斯

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我提交了 EXT_EP-11105条目。  我们欢迎您通过这个链接来了解这一点。

    谢谢。此致、

    -George.