首页 > 解决方案 > “错误:尝试向后移动 .org”使用 Xtensa XCC,GCC 工作正常

问题描述

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

/*
 * 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 工作正常。

标签: cassemblygnu-assemblerxtensa

解决方案


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

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

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


推荐阅读