器件型号: AM62A7-Q1
在启用异常和高优化级别的情况下、使用 TI C7000 编译器对 C7504 DSP 内核进行编译时、我们遇到了一个问题、我们认为代码生成或优化不正确。 我们有一个最少的重现示例、希望能识别问题并安排 TI 的解决方案或权变措施。 我们可以按需发送示例。
该示例包含一个存储在`std::Unique_ptr`中的小 C++对象。 指针的作用域为函数 (`exception_mishandle_example`)、该函数调用另一个可选择性抛出异常的函数 (`eme_inner`)。 生成/优化的代码在引发异常时会错误地清除指针及其分配的对象。
我们研究了反汇编示例、并确定了我们认为存在问题的行为。 在我们创建的场景中、编译器似乎会将指针/对象的内容从栈移动到寄存器(如果足够小)。 编译器绝不会将对象放回到堆栈中。 如果对象最初位于栈上、程序可能会缓冲该存储器的内容、由于数据安全地保存在寄存器中、因此这被视为安全行为。 但是、如果引发异常、则无法在指定的异常处理程序中正确恢复/引用保留的寄存器。 根据 C++异常处理 ABI、需要调用展开时超出范围的任何对象的析构函数。 我们已经见证了编译器生成的异常处理代码错误地调用这些析构函数、方法是:(1) 假设对象的内容在栈上仍然有效、尝试加载采用了块编号的地址、失败、或 (2) 从不相关的寄存器恢复内容并且失败。 如果没有引发异常、则使用保留寄存器的上下文正确调用析构函数。
我们可以提供的 CCS 工程表现出行为 (2)。 我们无法在一个小示例中重现行为 (1)、但我们认为问题是相关的。 它们之间的共性似乎是将对象数据移动到寄存器中、并在异常处理程序中错误地引用该数据。
注意:我们没有直接附加.zip 文件,因为论坛不允许它。