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.

[参考译文] AM62A7-Q1:C700 编译器错误报告

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1586480/am62a7-q1-c700-compiler-bug-report

器件型号: AM62A7-Q1

在启用异常和高优化级别的情况下、使用 TI C7000 编译器对 C7504 DSP 内核进行编译时、我们遇到了一个问题、我们认为代码生成或优化不正确。 我们有一个最少的重现示例、希望能识别问题并安排 TI 的解决方案或权变措施。 我们可以按需发送示例。

该示例包含一个存储在`std::Unique_ptr`中的小 C++对象。 指针的作用域为函数 (`exception_mishandle_example`)、该函数调用另一个可选择性抛出异常的函数 (`eme_inner`)。 生成/优化的代码在引发异常时会错误地清除指针及其分配的对象。

我们研究了反汇编示例、并确定了我们认为存在问题的行为。  在我们创建的场景中、编译器似乎会将指针/对象的内容从栈移动到寄存器(如果足够小)。  编译器绝不会将对象放回到堆栈中。  如果对象最初位于栈上、程序可能会缓冲该存储器的内容、由于数据安全地保存在寄存器中、因此这被视为安全行为。  但是、如果引发异常、则无法在指定的异常处理程序中正确恢复/引用保留的寄存器。  根据 C++异常处理 ABI、需要调用展开时超出范围的任何对象的析构函数。  我们已经见证了编译器生成的异常处理代码错误地调用这些析构函数、方法是:(1) 假设对象的内容在栈上仍然有效、尝试加载采用了块编号的地址、失败、或 (2) 从不相关的寄存器恢复内容并且失败。  如果没有引发异常、则使用保留寄存器的上下文正确调用析构函数。

我们可以提供的 CCS 工程表现出行为 (2)。 我们无法在一个小示例中重现行为 (1)、但我们认为问题是相关的。 它们之间的共性似乎是将对象数据移动到寄存器中、并在异常处理程序中错误地引用该数据。

注意:我们没有直接附加.zip 文件,因为论坛不允许它。

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

    虽然我不确定、但听起来所有问题行为都发生在单个函数中。  对于包含该函数的源文件、 请按照 如何提交编译器测试用例一文中的说明进行操作。  如果不是很明显,请提供函数的名称和这个对象的名称...

    编译器似乎将指针/对象的内容从栈移动到寄存器(如果栈足够小)。  编译器永远不会将对象放回到堆栈中。

    谢谢。此致、

    -乔治

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

    感谢您通过私人消息发送测试案例。  我能够重现同样的行为。  我提交 EXT_EP-13038 对此进行调查。  欢迎点击这个链接。  此时、标题和描述含糊不清。  一旦确定问题的特征、就会改变、使其更加精确。

    谢谢。此致、

    -乔治

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

    是否有任何关于调查此问题的更新? 自 Jira 问题打开以来未看到任何活动。

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

    对美国假期的延误表示歉意。  该条目将在下周内进行审查和取消定位、团队应该有更多时间对其进行调查。