工具/软件:Code Composer Studio
我们计划将 CCS 版本从 6.0.1.00040迁移 到 版本:10.1.1.00004。 因此、我们也将编译器更改为 ARM 编译器 TI v20.2.1.LTS。 我们想知道、此新编译器中是否存在任何未决问题(错误)、或者此版本是否存在勘误表? 如果是、您可以与我们分享评估结果吗?
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.
工具/软件:Code Composer Studio
我们计划将 CCS 版本从 6.0.1.00040迁移 到 版本:10.1.1.00004。 因此、我们也将编译器更改为 ARM 编译器 TI v20.2.1.LTS。 我们想知道、此新编译器中是否存在任何未决问题(错误)、或者此版本是否存在勘误表? 如果是、您可以与我们分享评估结果吗?
虽然作为 CCS 版本10.1.1的一部分安装了 ARM 编译器版本20.2.1.LTS、但该编译器的其他版本已经发布。 如文章 编译器版本号及其含义中所述、您应该考虑升级到最新的20.2.x.LTS 版本、目前为20.2.4.LTS。
[引用 user="Subash Sundaresan1"]此新编译器中是否存在任何未决问题(错误)或此版本是否存在任何勘误表?
谢谢、此致、
乔治
Subash、
我能够提取更多的数据。 这是您需要的吗? George 正在外出一周。
[引用 user="Subash Sundaresan1]1. 在 Thumb-2模式下,“应该接受“LDRD R8,[R1]”
汇编器应接受"LDRD R8、[R1]"并将其转换为规范形式"LDRD R8、R9、[R1]"。 它在 ARM 模式下执行此操作、但在 Thumb-2模式下无法执行此操作。
[引用 user="Subash Sundaresan1]2. "汇编器接受但在 v7 thumb 模式下跑偏 BLLT "[/quot]
对于 v7 thumb 模式、汇编器应接受 BLLT 指令、该指令由 LT 进行 BL 调节、并将其转换为"IT LT"、后跟"BL LT"。 但是、它接受该指令并将其转换为"BL"、这是错误的。
[引用 user="Subash Sundaresan1]3. armcl 未能标记在对象的声明和定义之间不一致地使用 alignas
这一个问题看起来像 C++特定问题:
armcl 未能在对象的声明和定义之间标记不一致的使用 alignas
armcl 编译器可正确诊断使用 alignas 属性时的不一致性、例如:
struct alignas (char) S;
struct S{};
但是、在以下情况下、armcl 在应该时不会生成错误:
模板 struct alignas (char) S;
模板 struct S{};
此致、
John
尊敬的 John:
非常感谢、非常感谢您的意见。
我们无法产生编译器缺陷列表中提到的以下问题、在我看来、它按预期工作。 (CCS:版本:10.1.1.00004,ARM 编译器版本: 20.2.4.LTS。)
| 代码 Gen-962 | 应在 Thumb1/UAL 模式下接受2操作数子 SP |
| 代码 Gen-927 | 应在 ARM 模式中接受2操作数加法 |
| 代码 Gen-753 | 使用 Thumb 2上的_curpc 内在函数时生成警告 |
| 代码 Gen-104 | 当.stack 段的 SECTION 指令中使用点表达式时、链接器会发出误导性警告。 |
| 代码 Gen-56 | .space 中的正向引用生成一个内部错误 |
无法理解以下问题、请详细说明一下、
| 代码 Gen-3951 | 绕过三个可构造对象的初始化时出现伪错误 |
| 代码 Gen-1499 | #pragma LOCATION 和 palign 不能协同工作 |
| 代码 Gen-1101 | 当 z 的虚部为无穷大时、cprojf (z)不等于无穷大+ i * copysign( 0.0、cimagf (z)) |
| 代码 Gen-1059 | 编译器不尊重 C99指定初始化程序中的部分覆盖 |
| 代码 Gen-1026 | 在标准头文件中禁用诊断1558 (–float_operations_allowed 诊断) |
| 代码 Gen-975 | 缺少半精度浮点转换函数 |
| 代码 Gen-974 | 缺少__aeabi_read_tp |
| CodeGen-972 | 缺少 AEABI_compatibility_mode 链接时常数 |
| 代码 Gen-890 | 为 ELF 汇编时、不应接受.label 汇编器指令。 |
| 代码 Gen-830 | _aeabi_dcmpun 返回1表示 INF 和-INF |
| 代码 Gen-662 | 如果分配给窄整数类型、则双精度常量表达式可能会被错误截断 |
| 代码 Gen-316 | ssat16内在函数允许文本在0-31范围内、但 SSAT16指令只接受1-16范围内的值 |
| 代码 Gen-315 | _satl 内在函数允许第3个参数为0、从而导致汇编器错误。 |
| 代码生成-237 | 链接器在 ARM 目标上为 EABI tag_vfp_archI 输出了错误的构建属性名称 |
| 代码生成235 | 部分链接目标文件中的段相对 ELF 符号值应保留该符号的段偏移量。 |
| 代码 Gen-63 | DWARF 不能正确表示存储在寄存器对中的变量 |
| 代码 Gen-30 | 如果未设置 TMP、PC 上的编译器将无法工作 |
下面是部分答复。
[引用 user="Subash Sundaresan1"]绕过三个可构造对象的初始化时出现 CodeGen-3951伪错误
对于说明中显示的 C++示例代码、编译器错误地发出诊断。 相反、不应出现诊断。
[引用 user="Subash Sundaresan1"]代码生成-1499 #pragma 位置和 palign 不能协同工作
此问题是针对 此论坛主题提出的。
[引用 user="Subash Sundaresan1"]当 z 的虚部为无穷大时,cprojf (z)不等于无穷大+ i * copysignal (0.0、cimagf (z))
C99标准向编译器 RTS 库添加了许多功能、包括对复数的支持。 这三个函数中的一个与复杂数字相关 、处理异常情况的方法不是很正确。 如果不使用复数、则可以忽略此数字。
[引用 user="Subash Sundaresan1"] CodeGen-1059编译器不尊重 C99指定初始化程序中的部分覆盖
请参阅 此论坛帖子。
CodeGen-1026在标准头文件中禁用诊断1558 (–float_operations_allowed 诊断)[/quot]
--float_operations_allowed 选项用于标识浮点运算、如果用户不希望它们加入程序、则会发出错误。 如果将 none 或32用作参数、则包含 math.h 的程序将生成诊断。 诊断的发布可能对任何人都不是很好、因为如果不执行浮点操作、用户实际上不应包含 math.h、但这是32位操作的问题。 如果用户只想使用32位浮点、则可以将 math.h 包含在内 我们应该抑制标准头文件中的诊断。
[引用 user="Subash Sundaresan1"] CodeGen-975缺少半精度浮点转换函数[/quot]
ARM EABI 兼容性需要半精度浮点转换函数、但我们不提供这些函数。 TI 不支持半精度浮点、但互连仍需要这些函数。 这些函数为:
_aeabi_d2h
_aeabi_d2h_alt
_aeabi_f2h
_aeabi_f2h_alt
_aeabi_h2f
_aeabi_h2f_alt
[引用 user="Subash Sundaresan1"]缺少 CodeGen-974 __aeabi_read_tp[/quot]
ARM EABI 兼容性需要函数__aeabi_read_tp,但我们不提供该函数。
[引用 user="Subash Sundaresan1"]代码生成-972缺少 AEABI 兼容性模式链接时常量[/quot]
RTS 缺少 AEBI_compatibility_mode 模式中所需的以下链接时常量:
_aeabi_hue_VAL
_aeabi_hue_VALF
_aeabi_hue_vall
_aeabi_infinity
_aeabi_NaN
_aeabi_lc_all
_aeabi_EDOM
_aeabi_ERANGE
_aeabi_EILSEQ
[引用 user="Subash Sundaresan1"]为 ELF 进行汇编时,不应接受.label 汇编器指令。
不应再接受.label 汇编器指令。 它在 ELF 目标格式中无效、有几种更好的方法可以处理段的加载地址。
[引用 user="Subash Sundaresan1"] CodeGen-830 __aeabi_dcmpun 返回1表示 INF 和-inf
这是 ARM EABI 所需的函数。 它与双精度数的无符号比较有关。 在某些情况下、它会返回错误的结果。 如果您不使用此函数、则忽略它。
[引用 user="Subash Sundaresan1"]如果指定为窄整数类型,则 CodeGen-662双常量表达式可能会被错误截断[/quot]
以响应 此论坛主题帖。
[引用 user="Subash Sundaresan1"]代码生成-316 _ssat16内在函数允许在0-31范围内的字面量,但 SSAT16指令只接受1-16范围内的值
编译器不会检查内在函数_sat16的第2个参数、以确保其在1-16范围内。 如果用户犯了此错误、编译器不会发出诊断、但汇编器会发出诊断。 这令人困惑。
[引用 user="Subash Sundaresan1"] Codege-315 _satl 内在函数允许第3个参数为0,从而导致汇编器错误。
编译器不会检查内在函数_sSATA 和_ssatl 的第3个参数、以确保其在1-16范围内。 如果用户犯了此错误、编译器不会发出诊断、但汇编器会发出诊断。 这令人困惑。
[引用 user="Subash Sundaresan1"]代码生成-237链接器在 ARM 目标上为 EABI tag_vfp_arch 输出错误的构建属性名称
我无法重现此问题。
[引用 user="Subash Sundaresan1"]部分链接目标文件中的 CodeGen-235段相对 ELF 符号值应包含符号的段偏移量。
这个与部分链接相关、部分链接是链接器很少使用的功能。 如果不使用局部链接、则忽略此链接。
[引用 user="Subash Sundaresan1"] CodeGen-63 DWARF 不能正确地表示存储在寄存器对中的变量
当变量分配给寄存器对时、相应的 DWARF 调试信息不能正确地表示该变量。 CCS 解决了这个问题。
[引用 user="Subash Sundaresan1"]如果没有 TMP 集,PC 上的 CodeGen-30编译器将无法正常工作[/quot]
最新版本的编译器(包括 TI ARM 编译器版本20.2.x.LTS)不会出现此问题。
谢谢、此致、
乔治
以下是对我未处理的问题的答复。
[引用 user="Subash Sundaresan1"] CodeGen-962应在 Thumb1/UAL 模式下接受2操作数子 SP
我无法再现这一个。
[引用 user="Subash Sundaresan1"]代码生成-927应在 ARM 模式下接受2操作数加法[/quot]
以下是有效的 ARM 汇编代码...
;任何不是标签或注释的行都必须以空格或制表符开头 将 R1、R0相加 添加 R1、R0
但是在 ARM 模式下构建时,汇编器错误地发出错误诊断...
% armcl -mv5e file.asm "file.asm"、错误! 在第2行:[E0005]操作数缺失 添加了 r1、r0 "file.asm"、错误! 在第3行:[E0005]操作数缺失 添加 R1、R0
[引用 user="Subash Sundaresan1"]使用 Thumb 2上的__curpc 内在函数时生成 CodeGen-753警告
在研究这个问题时、我遇到了另一个有关__curpc 内在函数的问题。 我提交 了 EXT_EP-10216 以进行调查。 欢迎您访问该链接。
Subash Sundaresan1 说:当.stack 段的 SECTION 指令中使用点表达式时,CodeGen-104链接器会发出误导性警告。[/quot]
链接器错误地发出此警告...
警告:创建默认大小为0x800的".stack"段;使用-stack 选项更改默认大小
(笑声) 当.stack 段是使用许多类似的语句创建的时...
symbol1 =.; . += 0x100; symbol2 =.; symbol3 =.; . += 0x100; symbol4 =.; /*等
创建了正确的.stack 段、因此不应发出警告。
Subash Sundaresan1 说:.space 中的 CodeGen-56正向引用会生成内部错误
此示例代码...
;任何不是标签或注释的行都必须以空格或制表符开头 .space 0+a b a .set 1.
(笑声) 在构建时导致内部错误...
% armcl file.asm 内部错误:armasm 遇到分段错误 处理.text 文件 file.asm 行3时
将第3行更改为.space A、汇编器会正确发出诊断...
% armcl file.asm "file.asm"、错误! 第3行:[E0004]绝对、定义良好的整数值 预期 .space A
谢谢、此致、
乔治
有三个问题以前的答复不明确。
[引用 user="Subash Sundaresan1"] CodeGen-962应在 Thumb1/UAL 模式下接受2操作数子 SP
这大约是两个不同但密切相关的问题。 第一个示例通过以下示例进行了演示...
;任何不是标签或注释的行都必须以空格或制表符开头 SUB SP、SP、#508
这是有效的指令、即使对于 Thumb1也是如此。 但是当为 Thumb1构建时...
% armcl -mv5e -code_state=16 file.asm "file.asm"、错误! 在第2行:[E0004]寄存器 Rd 不能是 HI 寄存器 SUB SP、SP、#508 "file.asm"、错误! 在第2行:[E0200]偏移超出范围、必须为8位 立即 SUB SP、SP、#508
不应出现错误诊断。
第二个问题... 当为 Thumb2构建相同的指令时...
% armcl -mv7m3 file.asm
(笑声) 汇编器应编码一个16位子指令。 相反、它对一个32位子指令进行编码。 这只是代码空间的一小部分浪费。
[引用 user="Subash Sundaresan1"]代码生成-237链接器在 ARM 目标上为 EABI tag_vfp_arch 输出错误的构建属性名称
这一问题不再出现。 它已关闭。
[引用 user="Subash Sundaresan1"]如果没有 TMP 集,PC 上的 CodeGen-30编译器将无法正常工作[/quot]
仅当您在 Windows 上构建并且未将环境变量 TMP 或 TEMP 设置为可创建和删除临时文件的目录时、此问题才会出现。 此时、许多 Windows 程序依赖于这些环境变量。 我们可能会将编译器文档更改为要求必须设置 TMP 或 TEMP。
谢谢、此致、
乔治
非常感谢您的回答!
我们也找不到以下问题的描述、如果也能得到以下问题的答案、那将会很好。
| 代码 Gen-5078 | 简单语法错误导致汇编器失败并出现内部错误 |
| 代码 Gen-4298 | 传递临时对象数组时发生内部错误 |
| 代码 Gen-4258 | 深嵌套的 λ 函数会将代码生成挂起 |
| 代码 Gen-4124 | 未能推迟访问控制检查 |
| 代码 Gen-4015 | 通过指针访问常量静态成员不是常量表达式。 |
| 代码 Gen-3999 | 未实现的核心问题1374:转换序列在基准绑定前对资格进行排名。 |
Subash Sundaresan1 说:CodeGen-5078简单语法错误导致汇编器因内部错误而失败
请参阅 此论坛主题。
Subash Sundaresan1 说:传递临时对象数组时发生 CodeGen-4298内部错误
我无法重现此行为。 我将就此再接再回大家。
[引用 user="Subash Sundaresan1"] CodeGen-4258深层嵌套 Lambda 函数会挂起 codegen
下面是一个嵌套 λ 的示例。
int timestwoplusthree =[](int x){return [](int y){return y * 2;}(x)+ 3;}(5);
为了检查稳健性、一些编译器测试故意将限制推至远远超过典型实践中发生的情况。 一项测试包含嵌套的 λ 64级深。 编译器在尝试编译时挂起。 挂起意味着编译器在几分钟内无法完成编译。 该时间结束后、自动测试系统会强制构建结束、并记录故障。
[引用 user="Subash Sundaresan1"]代码生成-4124未能推迟访问控制检查
以下 C++代码是正确的。
A 类{
typedef int i;//私人成员
朋友 i g (i);
模板 结构 Q;
模板 朋友结构 R;
受保护:
结构 B {};
};
模板 结构 A:Q {};
模板 结构 R {};
但是,编译器发出错误诊断...
% armcl file.cpp "file.CPP"、第9行:错误:键入"a::i"(在第2行声明)不可访问 "file.CPP"、第10行:错误:键入"a::i"(在第2行声明)不可访问
[引用 user="Subash Sundaresan1"]代码生成-4015通过指针访问常量静态成员不是常量表达式。
编译此示例...
结构 C{ const static int m; }; const int C::m = 4; C c; C * cp =&c; int main (void) { struct s02{ int x : cp->m;//错误,不是常量表达式 }; }
使用严格 ANSI 模式...
armcl --strict_ansi file.cpp "file.cpp",第2行:警告:存储类不是第一 个"file.cpp",第12行:错误:表达式必须具有常量值 "file.cpp",第12行:注意:变量"cp"(在第7行声明)的值不能用作常量
不应发出错误诊断。
[引用 user="Subash Sundaresan1"]代码生成-3999个未实现的核心问题1374:转换序列在引用绑定之前对限定条件进行排名。
术语核心问题1374是指 根据 C++标准提交的此条目。 该条目导致标准发生变化。 TI 编译器尚未实现此更改。
谢谢、此致、
乔治
Subash Sundaresan1 说:传递临时对象数组时发生 CodeGen-4298内部错误
对于此 C++代码...
#include
#include
结构 S{
int m;
S (int i=1):m (i){}
运算符 int(){返回 m;}
int 运算符+(const S&r){ return m+r.m;}
;
int f00 (S (&r)[3])
{
返回 r[0]+ r[1]+ r[2];
}
int main (void)
{
int x、g;
X = 100;
G = f00 ({97、2});
如果(g!= x)
printf ("获得了%d 而不是%d"、g、x);
返回(2);
}
在启用调试的情况下构建时、编译器失败并出现内部错误。
% armcl -g file.cpp >> file.cpp、第21行:内部错误:分解错误
谢谢、此致、
乔治
非常感谢 George 的意见。
CodeGen-890在为 ELF 进行汇编时、不应接受.label 汇编器指令。
-不应再接受.label 汇编器指令。 它在 ELF 目标格式中无效、有几种更好的方法可以处理段的加载地址。
但是、在加载地址示例的汇编器手册中、它们仅使用".label"指令。 可以为相同的指令建议任何等效指令。
Codege-235段部分链接目标文件中的相对 ELF 符号值应保留该符号的段偏移量。
在我们的项目中、我们有六个可执行文件来完成应用程序、未来我们计划链接所有二进制文件并生成单个映像。 它是否需要部分链接功能? 如果是、会产生什么影响?
CodeGen-5078简单语法错误导致汇编器失败并出现内部错误。
我无法重现上述错误、包括 ARM 和 Thumb-2模式。 我遇到以下错误、
"../source/dabort.asm、错误! 第50行:[E0004]第二个操作数必须是立即值或符号
MOVW R1、0x1234
尊敬的乔治:
非常感谢您的全面答复、尽管我还有几个问题:
CodeGen-5078简单语法错误导致汇编器失败并出现内部错误。
我无法重现此问题
以下代码:
MOVW R1、0x1234
ARM 和 Thumb-2模式下的误差都有注释、
说明资源路径位置类型
[E0004]第二个操作数必须是立即值或符号 dabort.asm /test/source 第50行 C/C++问题
CodeGen-890在为 ELF 进行汇编时、不应接受.label 汇编器指令。
根据您的回复、"不应再接受.label 汇编器指令。 它在 ELF 目标格式中无效、有几种更好的方法可以处理段的加载地址。 "
但是、在汇编器加载地址示例参考手册中、它们使用了".label"指令、您能否为加载地址操作建议适当的指令。
Codege-235段部分链接目标文件中的相对 ELF 符号值应保留该符号的段偏移量。
-您已回答"这个与部分链接相关、这是链接器很少使用的功能。 如果不使用部分链接、则忽略此链接。"
我们的项目当前具有多个可执行文件(二进制文件)、以便完成应用程序、但我们正在进行链接、以创建单个映像。 在这种情况下、局部链接会产生任何影响?
Subash Sundaresan1 说:CodeGen-5078简单语法错误导致汇编器因内部错误而失败
此条目是针对 此论坛主题帖提交的。
[引用 user="Subash Sundaresan1"]为 ELF 进行汇编时,不应接受.label 汇编器指令
没有直接更换。 一种方法是 在一个地址加载、从另一个地址运行。 另一种选择是 union 指令。 使用任一技术时、 无需.label 指令。
[引用 user="Subash Sundaresan1"]部分链接目标文件中的 CodeGen-235段相对 ELF 符号值应包含符号的段偏移量。
您计划如何将多个可执行文件组合在一起? 如果不使用链接器、则此条目不适用于您。
谢谢、此致、
乔治
从以下代码示例开始...
/* file.c */
long long fxn (long long argument1、long long argument2)
{
return argument1 + argument2;
}
构建它。 然后使用目标文件显示实用程序 armofd 和-g 选项将 DWARF 调试信息收集到文本文件 file_ofd.txt 中。
% armcl -mv7r4 file.c % armofd -g -o file_ofd.txt file.obj
检查 file_ofd.txt。 搜索名称 argument1和 argument2以查找...
000000c5 1. DW_TAG_formal_parameter (.text) 000000c6. DW_AT 位置 DW_OP_reg0 000000c8. DW_AT 名称 论点1. 000000d2. DW_AT 类型 .debug_info (5)+ 0x60 000000d6. dw_at_TI_symbol_name 参数1. 000000e0 1. DW_TAG_formal_parameter (.text) 000000e1 DW_AT 位置 DW_OP_reg2 000000e3. DW_AT 名称 论点2. 000000ed DW_AT 类型 .debug_info (5)+ 0x60 000000F1 dw_at_ti_symbol_name 参数2.
为了避免这篇文章太长、我不会描述所有细节。 忽略 DW_at_TI_symbol_name。 DW_at_type 条目意味着这些参数的类型为 long long。 DW_at_name 条目是来自 C 源代码的符号的名称。 DW_AT 位置字段是问题所在。 DW_OP_reg0表示函数参数位于 A1中。 它实际上位于寄存器对 A1、A2中。 对于另一个参数、它是相同的。 DW_OP_reg2表示它位于 A3中、但它位于 A3、A4对中。 DW_at_location 参数应该与...类似。
{DW_OP_PLUS DW_OP_SHL DW_OP_CONST1u 0x20 DW_OP_reg0 DW_OP_reg1}
这是(A1 << 32)+ A2的前缀表示法。
CCS 解决了这个问题。 当变量的类型大于寄存器时、假定下一个寄存器包含剩余的值。
谢谢、此致、
乔治