"Error: attempt to move .org backwards" using Xtensa XCC, GCC works fine
"Error: attempt to move .org backwards" using Xtensa XCC, GCC works fine
这是一个最小的可重现示例:
/*
* 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-xcc
不支持 C11,即使在添加 -std=c11
标志时编译器也没有报告警告。
来自 Xtensa 手册:“只能通过 Clang 前端的 -std=c11
选项启用对 C11 标准的支持。(...) 从 RG-2017.7 开始版本中,XCC 包含一个基于 LLVM 项目的 Clang 3.4 版的替代编译器前端。在未来的版本中,Clang 前端将取代 GCC。Clang 前端通过使用 -clang
编译器选项来选择。"
使用 Clang,上面的代码可以正常编译。
问题来自为 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-xcc
和 xt-xcc -clang
.
都存在同样的问题
这是一个最小的可重现示例:
/*
* 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-xcc
不支持 C11,即使在添加 -std=c11
标志时编译器也没有报告警告。
来自 Xtensa 手册:“只能通过 Clang 前端的 -std=c11
选项启用对 C11 标准的支持。(...) 从 RG-2017.7 开始版本中,XCC 包含一个基于 LLVM 项目的 Clang 3.4 版的替代编译器前端。在未来的版本中,Clang 前端将取代 GCC。Clang 前端通过使用 -clang
编译器选项来选择。"
使用 Clang,上面的代码可以正常编译。
问题来自为 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-xcc
和 xt-xcc -clang
.