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.

[参考译文] CCS/TMS570LS3137:CCS10 ARM 编译器 TI v20.2.1.LTS

Guru**** 2589280 points


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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/968893/ccs-tms570ls3137-ccs10-arm-compiler-ti-v20-2-1-lts

器件型号:TMS570LS3137

工具/软件: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"]此新编译器中是否存在任何未决问题(错误)或此版本是否存在任何勘误表?

    此信息包含在 版本20.2.4.LTS 的发行说明中。

    谢谢、此致、

    乔治

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

    尊敬的 乔治:

    非常感谢您的回复。 目前正在分析尚未解决的问题、并已完成一半。  

    您能否详细说明以下问题、因为我们无法理解描述、

    1.在 Thumb-2模式下,“应该接受“LDRD R8,[R1]”  

    2."汇编器接受但在 v7 thumb 模式下跑偏 BLLT "

    3. armcl 未能在对象的声明和定义之间标记不一致的使用 alignas

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

    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 符号值应包含符号的段偏移量。

    您计划如何将多个可执行文件组合在一起?  如果不使用链接器、则此条目不适用于您。

    谢谢、此致、

    乔治

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

    非常感谢 George、

    您能否提供一个实时示例来详细说明以下问题、

    Subash Sundaresan1.
    CodeGen-63 DWARF 不能正确表示存储在寄存器对中的变量

    当变量分配给寄存器对时、相应的 DWARF 调试信息不能正确地表示该变量。  CCS 解决了这个问题。

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

    从以下代码示例开始...

    /* 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 解决了这个问题。  当变量的类型大于寄存器时、假定下一个寄存器包含剩余的值。

    谢谢、此致、

    乔治

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

    尊敬的 乔治:

    非常感谢您的输入、您的输入对我的分析非常有用!