【问题标题】:"Error: attempt to move .org backwards" using Xtensa XCC, GCC works fine“错误:尝试向后移动 .org”使用 Xtensa XCC,GCC 工作正常
【发布时间】:2020-11-13 11:02:54
【问题描述】:

这是一个最小的可重现示例:

/*
 * Example for Xtensa xt-xcc compiler "error: attempt to move .org backwards".
 */

struct k_dict
{
    char *m_name_dict;
    char *p_name_dict;
    union
    {
        float f_value;
        int i_value;
        char* s_value;
    };
};

struct k_mode
{
    const char*  m_name;
          int    p_number;
    const struct k_dict *p;
    const struct k_dict pars[];
};

struct k_dict P1[] =
{
    {.m_name_dict="M1", .p_name_dict="P1", .s_value="string"},
    {.m_name_dict="M2", .p_name_dict="P2", .i_value=5       },
    {.m_name_dict="M3", .p_name_dict="P3", .f_value=48.0    }
};

struct k_mode mode_default =
{
    .m_name   = "default",
    .p_number = 1,
    .p        = P1,
    .pars =
    {
        {.m_name_dict = "m", .p_name_dict="p", .s_value="s"}
    }
};


int main( int argc, char **argv )
{
    return 0;
}

使用 Tensilica Xtensa xt-xcc 编译器编译会出现汇编错误:

"xt-xcc" -c -g -O0 -std=c11 -fmessage-length=0 -DPROC_hifi3_tv_car_5 -DCONFIG_hifi3_tv_car_5 --xtensa-system=hifi3_tv_car_5/config --xtensa-core=hifi3_tv_car_5 --xtensa-params= "\"HelloWorld/main.c\"" -o "\"HelloWorld/bin/hifi3_tv_car_5/Debug/main.o\"" 
/Temp/cc0s#6c7c.a32040: Assembler messages:
/Temp/cc0s#6c7c.a32040:39: Error: attempt to move .org backwards
xt-xcc ERROR: XtensaTools/bin/xt-as.exe returned non-zero status 1   

这是从哪里来的?

注意:GCC 工作正常。

【问题讨论】:

  • xt-as 是 GAS 的构建(来自 GNU Binutils)作为交叉汇编器,还是 Xtensa 自己的汇编器?
  • 正如手册所说:“它是为 Xtensa 架构配置的 GNU 汇编器。”。
  • 另外:“与旧的汇编程序不同,xt-as 旨在在源文件的一次传递中汇编源程序。这对.org 指令有微妙的影响。”
  • 一般来说,GAS 一直是一次性的汇编程序;我认为他们正在比较早期的非 GAS 组装器(如果没有其他用于 Xtensa 的 ISA,则用于其他 ISA)。您没有链接有关 xcc / xt-as 工具链的任何内容,因此我仍然不知道您引用的是哪个手册,因为我从未使用过此 ISA。但无论如何,现在我们知道这是正常的 GAS。我忘记了 GAS 通常是否允许使用.org 向后搜索,我只记得 NASM。我不知道为什么 C 编译器首先会发出多个 .org 指令。
  • 许多编译器系统使用中间文件,包括临时汇编源文件。通常您可以提供保留这些临时文件的选项,请试试这个。然后查看中间程序集源以进一步调查。

标签: c assembly gnu-assembler xtensa


【解决方案1】:

问题来自为mode_default的初始化生成的代码:

        .data
        .org 0x0
        .align  16
        .global mode_default
        .type   mode_default, @object
        .size   mode_default, 12
mode_default:   # 0x0
        .long   .L_g_7
        # offset 4
        .long   1
        .long   P1 +0
        .long   .L_g_8
        .long   .L_g_9
        .long   .L_g_10
        # end of initialization for mode_default
        .org 0x10

它看起来像是编译器中的一个错误。有趣的是,我发现xt-xccxt-xcc -clang 都存在同样的问题。

【讨论】:

  • 谢谢。我没有使用xt-xcc -clang,而是直接使用xt-clang
  • xt-xcc -clangxt-clang不一样:一是使用基于Open64的老xcc后端,二是基于clang + LLVM新开发的。
【解决方案2】:

xt-xcc 似乎不支持 C11,即使添加 -std=c11 标志时编译器没有报告警告。

来自 Xtensa 手册:“只能使用 Clang 前端的 -std=c11 选项启用对 C11 标准的支持。(...) 从 RG-2017.7 版本开始,XCC 包括一个替代方案编译器前端基于来自 LLVM 项目的 Clang 版本 3.4。在未来的版本中,Clang 前端将取代 GCC。使用 -clang 编译器选项选择 Clang 前端。"

使用 Clang 可以很好地编译上述代码。

【讨论】:

    猜你喜欢
    • 2020-02-20
    • 2017-09-17
    • 2014-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多