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 Clang 编译器2.1.2无法识别 DW_CFA_val_expression CFI 指令

Guru**** 2568565 points


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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/1181229/dw_cfa_val_expression-cfi-instruction-not-recognized-by-ti-clang-compiler-2-1-2

您好!

我尝试在 汇编文件中使用 DW_CFA_val_expression CFI 指令、链接器 发出以下警告:

警告#99922:无法识别的调用帧指令0x16;无法读取此段的其余部分(.debug_FRAME + 0x115)

其他 CFI 指令不会引起任何警告(例如 DW_CFA_def_CFA_expression)。

GCC 编译器不会对此指令有任何问题、调用栈会正确解压。 我还在  LLVM Clang (llvm.org)编译器源代码中搜索了 DW_CFA_val 表达式、似乎  支持 DW_CFA_val 表达式。 如果有人有权访问 TI 的 Clang 编译器源代码、您能否验证此指令是否受支持?

谢谢!

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

    与 DWARF 调试信息相关的汇编器指令未记录。  它们不供客户直接使用。  也就是说、我将看到我可以找到的内容。

    谢谢、此致、

    乔治

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="4373 " URL"~/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/1181229/dw_cfa_val_expression-cfi-instruction-not-recognized-by-ti-clang-compiler-2-1-2/4449340 #4449340"]我将看到我可以找到的内容。

    tiarmclang 从不发出 dw_CFA_val_expression、链接器没有用于处理它的代码。

    谢谢、此致、

    乔治

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

    尊敬的乔治:

    感谢你的答复。

    我知道 tiarmclang 编译器不会发出 dw_CFA_val_expression、因为对于通过 C 代码生成的汇编器而言、这是不必要的。 正是我在汇编器源代码中使用此指令(以及 DW_CFA_def_CFA_expression、其中的 tirarmclang 没有抱怨)、以允许解析 异常/中断 调用栈。 在这种情况下、当中断的任务被交换出去时、所有寄存器被保存在 RTOS 结构中。

    DW_CFA_* 指令编码为汇编器文件中的字节流,例如:

    .CFI_Escape 0x16 // DW_CFA_val_expression */、14、5、\
    0x0C /* DW_OP_CONST4u */、0xF9、0xFF、0xFF、0xFF、0xFF

    上面的序列告诉 unwinder、对于当前的调用堆栈框、LR 寄存器(14)值是一个常数0xFFFFFFF9。

    另一个示例:

    .CFI_Escape 0x16 /* DW_CFA_val_expression *、10 //* R10 */、4、\
    0x7D /* DW_OP_Breg13 */、24、\
    0x06 /* DW_OP_DEEef */、\
    0x06 /* DW_OP_DEEef */

    上述序列告诉解压器 R10值可在以下位置找到:

    **(uint32_t *)(SP + 24)

    SP 是栈指针(表达式中的 reg13)。

    .FI_Escape 允许创建复杂表达式、以在当前堆栈框中重新创建寄存器的值。 除了.CFI_Escape 之外、我还使用其他指令、例如:.CFI_def_CFA 或.CFI_OFFSET。

    澄清:.FCI_*是 GNU 汇编器指令(以及 LLVM Clang 的汇编器指令),而 DW_CFA_*是 DWARF 3.0规范的一部分,我认为 TI Clang 工具链完全支持该规范。

    问题是为什么 tiarmclang 对于 dw_CFA_def_CFA_expression 是可以的、但对于 dw_CFA_val_expression 是可以的、例如、此表达式不会引起任何警告:

    .FI_Escape 0x0F /* DW_CFA_def_CFA_expression *、3、\
    0x7d /* DW_OP_Breg13 */、0、\
    0x06 /* DW_OP_DEEef */

    谢谢、此致、

    Sylwester

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

    遗憾的是、链接器不支持将 DW_CFA_val_expression (0x16)用作.CFI_escape 指令的输入。  链接器仅经过测试、以支持编译器发出的内容。  

    谢谢、此致、

    乔治