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.

[参考译文] CC1312R:仅声明 none void 弱函数时的 TI clang 编译器优化问题

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

https://e2e.ti.com/support/wireless-connectivity/sub-1-ghz-group/sub-1-ghz/f/sub-1-ghz-forum/1483041/cc1312r-ti-clang-compiler-optimization-issue-in-case-of-only-declared-none-void-weak-function

器件型号:CC1312R

工具与软件:

您好!

如果只有周声明(没有弱实现)、则在优化级别2时(可能会看到)"weak" none void 函数的优化时、TI clang 编译器生成的代码可能存在问题。 在 TI Clang v.2.1.3中找到、但它也可用于 v.3.2.2 (尚未使用 v.4进行检查)。

我正在发送一个示例来向您展示问题–使用优化0生成变量 r 的值为0 (如果是优化2、则变量 r 错误地设置为1)。

此致、

Dimitar

  e2e.ti.com/.../OptimizationIssue.zip

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

    尊敬的 Dimitar:

    您能告诉我您使用的是哪个版本的 CCS 吗?

    谢谢、

    Marie H.

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

    尊敬的 Marie:

    CCS  版本:12.81.00005。  

    此致

    Dimitar

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

    如果您在运行时检查弱调用...

    if (checkX)
        tmp |= checkX();
    else
        tmp = 0; /* or whatever is best */
    
    

    ...这是否使行为在-O0和-O2之间一致?

    谢谢。此致、

    -George.

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

    您好、George:

    是的、这会使-Q0和-Q2中的行为相同。

    我不是100%确定、但我认为、在优化仅声明的弱函数的情况下、函数调用被删除(用 NOP 重放)、但应处理 返回结果的生成代码部分不是如此、应保存返回结果的变量保留其上次使用 的值(而不是应从此非调用函数返回的结果)。

    此致、

    Dimitar  

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

    很抱歉、我花了一段时间才理解本例中的行为。  我认为最好从编译器生成的汇编代码层面对其进行解释。

    在编译期间、在链接之前、编译器会生成...

        bl    checkX

    在该假设后立即指示 R0 的结果 复选框 .   

    将其识别出来 复选框 没有定义、会改变它 BL 指令进入...

        nop
        nop

    这是唯一的变化。  注意优化级别如何不起作用。

    因此、当不检查弱函数是否未定义时、在任何优化级别都可能出现意外结果。 只有在您的特定情况下、才会发生这样的情况: -O0 得出预期结果、和 -O2 可得出不同的结果。

    谢谢。此致、

    -George.