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.

[参考译文] TI-CGT:使用 TI-CGT-ARMLLVM 生成的无效汇编代码为 R5F 编译 C++

Guru**** 2399305 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1489617/ti-cgt-invalid-assembly-code-generated-using-ti-cgt-armllvm-to-compile-c-for-r5f

器件型号:TI-CGT

工具与软件:

尊敬的 TI 专家:

我在 Jacinto HIGH (J784S4)上的 MCU 内核上运行一些裸机测试代码时观察到一些奇怪的行为、但我得出的结论是编译器会从有效的 C++源代码生成无效汇编。

附加了同一 C++文件的两个版本、以及编译器设置和生成的汇编代码。  我已在编译器版本3.2.2 LTS 和4.0.0 LTS 上验证了相同的行为。

e2e.ti.com/.../reordering_5F00_bug_5F00_v1.txte2e.ti.com/.../reordering_5F00_bug_5F00_v2.txt 

编译器似乎正在尝试在 main 函数的末尾将一个最终的空无限循环与它前面的任何循环合并在一起(在第一种情况下、一个加载其他内核的循环、在第二种情况下、一个 print 语句)。

无论哪种方式、这都会导致非法行为。  在第一种情况下、最多20个内核的有界循环加载实际上是无限循环的-不生成边界检查、循环迭代到不存在的内核、导致为加载请求提供服务的 MCU1_0失败。

在第二种情况下、代码手动在函数末尾之后设置一个返回地址(MOV R14、PC 导致 PC+8在 LR (R14)中结束)、然后 nop 滑入一些随机代码(在本例中为标准库中的 atoi)、并最终损坏堆栈以至于崩溃。

您能否验证/告诉我是否会有编译器修复程序。

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

    我无法生成相同的汇编代码。  我缺少一些细节。  选择一个版本。  对于该 C++源文件、 请按照 如何提交编译器测试用例一文中的说明进行操作

    谢谢。此致、

    -George.

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

    以下是根据您的链接附带的编译器4.0.0 LTS 的预处理文件、以及命令行和反汇编(但它们大多与上述相同)。

    e2e.ti.com/.../5047.main.pp.txte2e.ti.com/.../main.disass.txte2e.ti.com/.../main.cmd.txt

    谢谢!

    ROSS

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

    感谢您提供测试用例。  我能够重现相同的行为。

    这与已知问题 EXT_EP-11936相同。  该问题的描述与您的代码不匹配。  但根本原因是相同的。  我们计划更新该问题、使其更加清晰、并显示它在更多情况下的应用情况、包括您的情况。

    好消息是、该软件已在当前可用的4.0.2.LTS 版本中修复。  您是否能够升级到版本4.0.2.LTS?

    谢谢。此致、

    -George.

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

    谢谢 George。

    我可以确认我的两个案例都生成了版本4.0.2的正确代码。  我们已经计算出我们也可以在循环中放置 nop、因此我们将执行此操作、直到推出新的编译器版本为止。

    ROSS