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.

[参考译文] 编译器/ARM-CGT:有关 ARM 编译器已知问题的信息

Guru**** 2524550 points


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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/814000/compiler-arm-cgt-information-about-known-issues-with-arm-compiler

器件型号:ARM-CGT

工具/软件:TI C/C++编译器

我们希望了解有关 TI ARM 优化 C/C++编译器 v18.1.4.LTS 的以下已知问题的更多信息。

供参考、我们将在编译器中使用以下参数:

"c:/ti/ccsv8/tools/compiler/ti-cgt-arm_18.1.4.LTS/bin/armcl -mv7R5 --code_state=32 --float_support=VFPv3D16 --define=_TMS570LC43x_ -g -c99 --diag_warning=225 --diag_wrap=off --display_error_number --enum_type=packed --abi=eabi_prelisting_proc-comp_with_listing"。  (加上几个--include_paths、--defines 和--preproc_dependency。)

(请注意、我们在 CCS 中指定了"off"的优化级别、我认为它通过指定-g 参数而不指定--opt_level 参数来实现。)

CodeGen-4304 "未对齐访问(在某些处理器变体上、并非在所有处理器变体上)时出现运行时故障":

我看到这件事附带了一个测试用例、但没有进一步的分析。  这似乎不是用户做了一些错误、导致了未对齐访问的情况、而是编译器或库出现了某种问题。  哪些情况会触发此问题?

SDSCM00051484 "编译器不尊重 C99指定初始化程序中的部分覆盖":

我们在代码中使用 C99指定的初始化程序。  此处容易受到哪种类型的指定初始化使用的影响?

SDSCM00047077 "最终目的短接时、错误地将双常量减少为浮点":

此范围有多大?  当"最终目标"是 char 时、是否也会发生这种情况?  int / long 或 long long 目标是否安全?  在"瞄准"较短或有时只是浮动时、是否总是将双常量减少到浮点?  优化是否会影响这一点?  编译器是否有任何其他情况将双精度运算减少到单精度运算(C 标准要求的正常操作除外)?

此外,我们希望看到这一问题得到解决。  我们理解、就可能对执行代码产生的影响而言、将严重性标记为较小是合理的、但对于我们来说、跟踪和分析可能易受此问题影响的代码是一个重要问题、这是一个过程方面的问题。

SDSCM00050131 "将非常量初始化程序视为静态作用域变量的本地结构":

我很感激18.1.0.LTS 中将其固定、但我们将设备编译为18.1.4.LTS。  此问题是否因是否启用了优化而产生影响?

我的解释是、禁用优化后、以下两个问题不是问题。  您可以确认吗?

  • CodeGen-5527  "本地结构初始化被错误地优化离开"
  • CodeGen-5032  "在阵列上循环、之前重复使用标量温度随机播放阵列、可能会产生不正确的结果"

-thx

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

    [引用 user="1138"]我们在 CCS 中指定了"off"的优化级别、我认为它通过指定-g 参数而不指定--opt_level 参数来实现。

    没错。

    [引用 user="1138]'我的解释是,禁用优化后,以下两个问题不是问题。  您可以确认吗?

    这种解释是正确的。   

    至于其他问题,我已请其他专家发表意见。

    谢谢、此致、

    乔治

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

    您好、George、

    感谢您的跟进!

    除了其余待决问题外,我还有一个问题:

    CodeGen-1445 "编译器插入不必要的寄存器副本":

    我假设这种不必要的寄存器副本不会导致任何负面的功能问题;它实际上只会影响性能。  (也就是说、它不会从易失性存储器或其他类似存储器创建任何额外的读取;它实际上只是一个从一个核心 ARM CPU 寄存器到另一个完全不需要执行的副本。)  您可以确认吗?

    -thx

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

    [引用用户="1138"]

    CodeGen-4304 "未对齐访问(在某些处理器变体上、并非在所有处理器变体上)时出现运行时故障":

    我看到这件事附带了一个测试用例、但没有进一步的分析。  这似乎不是用户做了一些错误、导致了未对齐访问的情况、而是编译器或库出现了某种问题。  哪些情况会触发此问题?

    [/报价]

    这一个问题只作了部分分析。  没有关于原因的确切结论。

    [引用用户="1138"]

    SDSCM00051484 "编译器不尊重 C99指定初始化程序中的部分覆盖":

    我们在代码中使用 C99指定的初始化程序。  此处容易受到哪种类型的指定初始化使用的影响?

    [/报价]

    失败的代码以远非典型的方式使用指定的初始化程序。  我认为一个示例将有助于...

    typedef 结构{
    intk;
    intl;
    inta[2];
    }T;
    
    typedef 结构{
    inti;
    Tt;
    }S;
    
    T x ={.l = 43、.k = 42、.a[1]= 19、.a[0]= 18};
    
    S y;
    
    void
    f (void)
    {
    //此处出现问题*/
    S l ={1、.t = x、.t.l = 41、.t.a[1]= 17};
    
    y = l;
    } 

    请注意,如何初始化所有.t,然后是其他仅用于.t 部分的初始化程序。

    关于...

    [引用用户="1138]SDSCM00047077 "在最终目的地短时错误地将双常量减少为浮点":[/quot]

    我可以回答您的一些问题。  但还有其他问题我仍然无法回答。

    [报价用户="1138"] int / long 或 long long 目标是否安全?

    是的

    [引用 user="1138"]优化是否会影响这一点?

    [引用用户="1138"]

    SDSCM00050131 "将非常量初始化程序视为静态作用域变量的本地结构":

    我很感激18.1.0.LTS 中将其固定、但我们将设备编译为18.1.4.LTS。  此问题是否因是否启用了优化而产生影响?

    [/报价]

    否  此论坛主题 与此问题有关。

    谢谢、此致、

    乔治

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

    [引用用户="1138"]

    CodeGen-1445 "编译器插入不必要的寄存器副本":

    我假设这种不必要的寄存器副本不会导致任何负面的功能问题;它实际上只会影响性能。  (也就是说、它不会从易失性存储器或其他类似存储器创建任何额外的读取;它实际上只是一个从一个核心 ARM CPU 寄存器到另一个完全不需要执行的副本。)  您可以确认吗?

    [/报价]

    您的假设是正确的。

    谢谢、此致、

    乔治

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

    关于...

    [引用用户="George mock"]

    关于...

    1138.
    SDSCM00047077 "最终目的短接时、错误地将双常量减少为浮点":

    我可以回答您的一些问题。  但还有其他问题我仍然无法回答。

    [/报价]

    以下 是导致此问题归档的论坛主题。  此问题的发行说明最近更新为以下内容。

    当合法时、编译器会尝试将双精度常量优化为单精度常量。 在这种情况下、一个碰巧未舍入的双精度表达式被转换为一个进行舍入的浮点精度表达式、而这种差异很重要。 当转换包含双精度常量(在单精度中完全可以表示)和一些可能不完全表示源代码中十进制值的其他单精度值(隐式或显式)的双精度表达式时、可能会发生此错误 小于 int 的整数类型。

    考虑表达式0.4f * 1000.0;0.4在二进制浮点中不能完全表示、因此编译器用略小于0.4的值来表示它。 编译器假设、由于1000完全可以以单精度格式表示、因此它可以安全地将表达式更改为0.4f * 1000.f、但0.4f * 1000.0 < 0.4f * 1000.0f、这对该算法有所不同。

    谢谢、此致、

    乔治