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.

[参考译文] 编译器/C6000-CGT:CGT 7.3.23问题- CGT 8.3.4是否也受影响?

Guru**** 2538960 points


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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/882137/compiler-c6000-cgt-cgt-7-3-23-issue---is-cgt-8-3-4-affected-too

器件型号:C6000-CGT

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

您好!

在测试 CGT 8.3.4期间、我们发现、该特定代码开始成为我们内部问题的根本原因。 调查显示,问题稍微复杂一些。 我们的代码使用了不正确的值、但 CGT7编译器生成了额外的错误代码、该代码涵盖了此问题、并由 CGT 8.3.4揭示。 我们目前没有在此处发布任何本地复制、因此我们必须发布部分 ASM 受影响的代码:

  1. CGT 7 (错误代码-.const 数据被初始化;错误发生在编译+链接阶段、因为它位于".const"区域):

        .sect ".const"

        .align 8.     

        .elfsym   $P$T0$1、SYM_SIZE (16)

    $P$T0$1:

        .bits      13、8           ;$P$T0$1.emCores._u8[0]@ 0

        .space    15.

  2. CGT 8 (正确代码):

        .sect ".const:$P$T0$1"

        .align 8.     

        .elfsym   $P$T0$1、SYM_SIZE (16)

    $P$T0$1:

        .space 8.     

        .bits      0xd、32

                   ;$P$T0$1.emPriority @ 64

        0、     32位

出现问题的 C++架构如下所示(无法粘贴原始代码、因为它是我们公司的 IP):

//文件1 - C h 文件
#define size 64

typedef uint32_t intValueType;

typedef union maskType maskType;

union maskType
{
uint8_t _u8[size / 8];
uint16_t _U16[size / 16];
uint32_t _u32[size / 32];
uint64_t _t 64}
;uint64_t


//文件2 - C++ HPP 文件
命名空间名称空间1
{
命名空间名称空间2
{
struct SInternalStruct

maskType 值1;
intValueType 值2;
};
}
//

文件3 cpp
void Fun ()
{
maskType 掩码;
//计算掩码

::namespace1::::namespace2::SInternalStructconfig ={ mask,enumValueNonZero};

//此处为诊断添加的调试输出显示,config 中没有填充“enumValueNonZero”值,而是0。
//从系统的角度来看、0的值是所需的值(由 CGT7错误传递)、
//但从代码角度传递非零值(通过 CGT8正确传递),
// CGT8显示了错误,该错误与 CGT7相反,已正确初始化配置
。}

我们报告此问题、因为我们不知道、如果 CGT8中存在相同的问题、但这次没有意外出现。 如果 CGT8中也存在问题、请包含 RSA 内在函数的可能修复(我必须始终提醒它、因为它对我们来说非常重要)。

此致、

ZD

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

    这个问题对我来说并不熟悉。  第一步是重现7.x.x 版编译器的问题。  然后、我们可以研究版本8.x.x 编译器中是否存在相同的问题。  这样的操作通常对源代码和构建选项中的所有细节都非常敏感。  在这种情况下、唯一的出路是从您那里获得一个测试案例、以便我们重现该行为。  请使用文章 如何提交编译器测试用例 中的说明作为指南。  请记住、您可以直接将测试用例发送给我、而不是将其发布在此处。

    谢谢、此致、

    乔治

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

    我成功准备了简化的(无命名空间等)示例代码来重现此问题:

    #include 
    #include 
    
    define size 64
    
    typedef union mask_t mask_t;
    
    union mask_t
    {
    uint8_t _u8[size / 8];
    uint16_t _u16[size / 16];
    uint32_t _u32[size / 32];
    uint64_t _u64[size / 64];
    };
    
    typedef 枚举
    {
    enum_value_undef = 0xFF、
    enum_value_LL = 0、
    enum_value_L = 12、
    enum_value_N = 13、
    enum_value_h = 14、
    enum_value_HH = 15、
    }enum_value;
    
    typedef uint32_t value_t;
    
    静态内联 void mask_zero (mask_t* mask)
    {
    MASK->_u32[0]= 0;
    mask->_u32[1]= 0;
    }
    
    静态内联 void mask_set (int id、mask_t* mask)
    {
    if (id < 32)
    {
    mask->_u32[1]|=((uint32_t) 1 << id);
    }
    其他
    {
    mask->_u32[0]|=((uint32_t) 1 <<(id - 32));
    }
    }
    
    
    结构内部结构
    {
    MASK_t maskValue;
    value_t value;
    };
    
    
    int id()
    {
    返回1;
    }
    
    void doSmomething (SInternalStructparam)
    {
    if (param.value!= enum_value_N)
    {
    断言(0);
    }
    
    return;
    }
    
    void Fun ()
    {
    MASK_t MASK;
    掩码零(&mask);
    MASK_SET(id(),&MASK);
    
    SInternalStructconfig ={mask、enum_value_N};
    
    //此问题可能在运行时可见。
    
    doSomething(config);
    }
    
    int main()
    {
    趣味();
    }
    
    

    e2e.ti.com/.../initialization_5F00_issue_5F00_for_5F00_TI.zip

    CGT 7.3.23中受影响的器件:

       .sect   ".const"
       .align 8.    
       .elfsym   $P$T0$1、SYM_SIZE (16)
    $P$T0$1:
       .bits   13、8         ;$P$T0$1.maskValue._u8[0]@ 0
       .space   15.

    这里是 CGT 8.3.4的输出:

       .sect   ".const:$P$T0$1"
       .align 8.    
       .elfsym   $P$T0$1、SYM_SIZE (16)
    $P$T0$1:
       .space 8.    
       .bits      0xd、32
             ;$P$T0$1.Value @ 64
       0、      32位

    可能的解释是、由于 CGT7结构被错误地初始化为 UNION。 在这种特定情况下、我们在 CGT8中看不到它、但我们必须知道在其他特定情况下、CGT8中是否可以看到相同的问题(因此编译器中仍然存在该问题)。

    我希望这足以告诉我们更多有关问题的信息。

    此致、

    ZD

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

    此错误为 EXT_EP-8089。  错误地指出仅适用于 ARM、但错误和修复适用于所有 TI 目标。

    对于 C6000、该修复程序首先出现在8.2.0中

    当初始化包含联合体的结构时、可能会发生此错误、并且该结构的初始化程序为出现在联合体之后的某些结构成员指定一个值。

    您可以在7.4.24中通过交换 struct InternalStructt 成员的顺序来解决该问题。

    或者、您可以直接初始化 config.value 而无需使用初始化程序:

    内部结构配置;

    config.value = enum_value_N;

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

    感谢您提交测试案例。  此 论坛主题中首先报告了同样的问题。  尽管该线程针对 ARM 编译器报告了该问题、但我们也在 C6000编译器中修复了该问题。  首先在版本8.2.0中出现修复程序。

    谢谢、此致、

    乔治

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

    现在一切都很清楚、感谢您的回答。