ZHCADC4A September   2011  – March 2014

 

  1.   1
  2. 简介
    1. 1.1  ABI - C6000
    2. 1.2  范围
    3. 1.3  ABI 变体
    4. 1.4  工具链和互操作性
    5. 1.5 
    6. 1.6  目标文件的类型
    7. 1.7 
    8. 1.8  C6000 架构概述
    9. 1.9  参考文档
    10. 1.10 代码片段表示法
  3. 数据表示
    1. 2.1 基本类型
    2. 2.2 寄存器中的数据
    3. 2.3 存储器中的数据
    4. 2.4 复数类型
    5. 2.5 结构体和联合体
    6. 2.6 数组
    7. 2.7 位字段
      1. 2.7.1 易失性位字段
    8. 2.8 枚举类型
  4. 调用约定
    1. 3.1 调用和返回
      1. 3.1.1 返回地址计算
      2. 3.1.2 调用指令
      3. 3.1.3 返回指令
      4. 3.1.4 流水线约定
      5. 3.1.5 弱函数
    2. 3.2 寄存器惯例
    3. 3.3 实参传递
    4. 3.4 返回值
    5. 3.5 通过引用传递并返回的结构体和联合体
    6. 3.6 编译器辅助函数的约定
    7. 3.7 段间调用的暂存寄存器
    8. 3.8 设置 DP
  5. 数据分配和寻址
    1. 4.1 数据段和数据区段
    2. 4.2 静态数据的分配和寻址
      1. 4.2.1 静态数据的寻址方法
        1. 4.2.1.1 near DP 相对寻址
        2. 4.2.1.2 Far DP 相对寻址
        3. 4.2.1.3 绝对寻址
        4. 4.2.1.4 GOT 间接寻址
        5. 4.2.1.5 PC 相对寻址
      2. 4.2.2 静态数据的放置约定
        1. 4.2.2.1 放置的抽象约定
        2. 4.2.2.2 寻址的抽象约定
        3. 4.2.2.3 链接器要求
      3. 4.2.3 静态数据的初始化
    3. 4.3 自动变量
    4. 4.4 帧布局
      1. 4.4.1 栈对齐
      2. 4.4.2 寄存器保存顺序
        1. 4.4.2.1 大端字节序对交换
        2. 4.4.2.2 示例
      3. 4.4.3 DATA_MEM_BANK
      4. 4.4.4 C64x+ 特定的堆栈布局
        1. 4.4.4.1 _ _C6000_push_rts 布局
        2. 4.4.4.2 紧凑帧布局
    5. 4.5 堆分配对象
  6. 代码分配和寻址
    1. 5.1 计算代码标签的地址
      1. 5.1.1 代码的绝对寻址
      2. 5.1.2 PC 相对寻址
      3. 5.1.3 同一段内的 PC 相对寻址
      4. 5.1.4 短偏移 PC 相对寻址 (C64x)
      5. 5.1.5 基于 GOT 的代码寻址
    2. 5.2 分支
    3. 5.3 调用
      1. 5.3.1 直接 PC 相对调用
      2. 5.3.2 Far Call Trampoline
      3. 5.3.3 间接调用
    4. 5.4 寻址紧凑指令
  7. 动态链接的寻址模型
    1. 6.1 术语和概念
    2. 6.2 动态链接机制概述
    3. 6.3 DSO 和 DLL
    4. 6.4 抢占
    5. 6.5 PLT 条目
      1. 6.5.1 直接调用导入函数
      2. 6.5.2 通过绝对地址寻址的 PLT 条目
      3. 6.5.3 通过 GOT 寻址的 PLT 条目
    6. 6.6 全局偏移表
      1. 6.6.1 使用 Near DP 相对寻址的基于 GOT 的引用
      2. 6.6.2 使用 Far DP 相对寻址的基于 GOT 的引用
    7. 6.7 DSBT 模型
      1. 6.7.1 导出函数的进入/退出序列
      2. 6.7.2 避免在内部函数中使用 DP 负载
      3. 6.7.3 函数指针
      4. 6.7.4 中断
      5. 6.7.5 与非 DSBT 代码的兼容性
    8. 6.8 动态链接的性能影响
  8. 线程局部存储分配和寻址
    1. 7.1 关于多线程和线程局部存储
    2. 7.2 术语和概念
    3. 7.3 用户界面
    4. 7.4 ELF 目标文件表示
    5. 7.5 TLS 访问模型
      1. 7.5.1 C6x Linux TLS 模型
        1. 7.5.1.1 通用动态 TLS 访问模型
        2. 7.5.1.2 局部动态 TLS 访问模型
        3. 7.5.1.3 初始可执行文件 TLS 访问模型
          1. 7.5.1.3.1 线程指针
          2. 7.5.1.3.2 初始可执行文件 TLS 寻址
        4. 7.5.1.4 局部可执行文件 TLS 访问模型
      2. 7.5.2 静态可执行文件 TLS 模型
        1. 7.5.2.1 静态可执行文件寻址
        2. 7.5.2.2 静态可执行文件 TLS 运行时架构
        3. 7.5.2.3 静态可执行文件 TLS 分配
          1. 7.5.2.3.1 TLS 初始化映像分配
          2. 7.5.2.3.2 主线程的 TLS 分配
          3. 7.5.2.3.3 线程库的 TLS 区域分配
        4. 7.5.2.4 静态可执行文件 TLS 初始化
          1. 7.5.2.4.1 主线程的 TLS 初始化
          2. 7.5.2.4.2 线程库进行 TLS 初始化
        5. 7.5.2.5 线程指针
      3. 7.5.3 裸机动态链接 TLS 模型
        1. 7.5.3.1 用于裸机动态链接的默认 TLS 寻址
        2. 7.5.3.2 TLS 块创建
    6. 7.6 线程局部符号解析和弱引用
      1. 7.6.1 通用和局部动态 TLS 弱引用寻址
      2. 7.6.2 初始和局部可执行文件 TLS 弱引用寻址
      3. 7.6.3 静态可执行文件和裸机动态 TLS 模型弱引用
  9. 辅助函数 API
    1. 8.1 浮点行为
    2. 8.2 C 辅助函数 API
    3. 8.3 辅助函数的特殊寄存器约定
    4. 8.4 复数类型的辅助函数
    5. 8.5 C99 的浮点辅助函数
  10. 标准 C 库 API
    1. 9.1  保留符号
    2. 9.2  <assert.h> 实现
    3. 9.3  <complex.h> 实现
    4. 9.4  <ctype.h> 实现
    5. 9.5  <errno.h> 实现
    6. 9.6  <float.h> 实现
    7. 9.7  <inttypes.h> 实现
    8. 9.8  <iso646.h> 实现
    9. 9.9  <limits.h> 实现
    10. 9.10 <locale.h> 实现
    11. 9.11 <math.h> 实现
    12. 9.12 <setjmp.h> 实现
    13. 9.13 <signal.h> 实现
    14. 9.14 <stdarg.h> 实现
    15. 9.15 <stdbool.h> 实现
    16. 9.16 <stddef.h> 实现
    17. 9.17 <stdint.h> 实现
    18. 9.18 <stdio.h> 实现
    19. 9.19 <stdlib.h> 实现
    20. 9.20 <string.h> 实现
    21. 9.21 <tgmath.h> 实现
    22. 9.22 <time.h> 实现
    23. 9.23 <wchar.h> 实现
    24. 9.24 <wctype.h> 实现
  11. 10C++ ABI
    1. 10.1  限制 (GC++ABI 1.2)
    2. 10.2  导出模板 (GC++ABI 1.4.2)
    3. 10.3  数据布局(GC++ABI 第 2 章)
    4. 10.4  初始化保护变量 (GC++ABI 2.8)
    5. 10.5  构造函数返回值 (GC++ABI 3.1.5)
    6. 10.6  一次性构建 API (GC++ABI 3.3.2)
    7. 10.7  控制对象构造顺序 (GC++ ABI 3.3.4)
    8. 10.8  还原器 API (GC++ABI 3.4)
    9. 10.9  静态数据 (GC++ ABI 5.2.2)
    10. 10.10 虚拟表和键函数 (GC++ABI 5.2.3)
    11. 10.11 回溯表位置 (GC++ABI 5.3)
  12. 11异常处理
    1. 11.1  概述
    2. 11.2  PREL31 编码
    3. 11.3  异常索引表 (EXIDX)
      1. 11.3.1 指向行外 EXTAB 条目的指针
      2. 11.3.2 EXIDX_CANTUNWIND
      3. 11.3.3 内联 EXTAB 条目
    4. 11.4  异常处理指令表 (EXTAB)
      1. 11.4.1 EXTAB 通用模型
      2. 11.4.2 EXTAB 紧凑模型
      3. 11.4.3 个性化例程
    5. 11.5  回溯指令
      1. 11.5.1 通用序列
      2. 11.5.2 字节编码展开指令
      3. 11.5.3 24 位展开编码
    6. 11.6  描述符
      1. 11.6.1 类型标识符编码
      2. 11.6.2 作用域
      3. 11.6.3 Cleanup 描述符
      4. 11.6.4 catch 描述符
      5. 11.6.5 函数异常规范 (FESPEC) 描述符
    7. 11.7  特殊段
    8. 11.8  与非 C++ 代码交互
      1. 11.8.1 EXIDX 条目自动生成
      2. 11.8.2 手工编码的汇编函数
    9. 11.9  与系统功能交互
      1. 11.9.1 共享库
      2. 11.9.2 覆盖块
      3. 11.9.3 中断
    10. 11.10 TI 工具链中的汇编语言运算符
  13. 12DWARF
    1. 12.1 DWARF 寄存器名称
    2. 12.2 调用帧信息
    3. 12.3 供应商名称
    4. 12.4 供应商扩展
  14. 13ELF 目标文件(处理器补充)
    1. 13.1 注册供应商名称
    2. 13.2 ELF 标头
    3. 13.3
      1. 13.3.1 段索引
      2. 13.3.2 段类型
      3. 13.3.3 扩展段标头属性
      4. 13.3.4 子段
      5. 13.3.5 特殊段
      6. 13.3.6 段对齐
    4. 13.4 符号表
      1. 13.4.1 符号类型
      2. 13.4.2 通用块符号
      3. 13.4.3 符号名称
      4. 13.4.4 保留符号名称
      5. 13.4.5 映射符号
    5. 13.5 重定位
      1. 13.5.1 重定位类型
      2. 13.5.2 重定位操作
      3. 13.5.3 未解析的弱引用的重定位
  15. 14ELF 程序加载和动态链接(处理器补充)
    1. 14.1 程序标头
      1. 14.1.1 基址
      2. 14.1.2 段内容
      3. 14.1.3 绑定段和只读段
      4. 14.1.4 线程局部存储
    2. 14.2 程序加载
    3. 14.3 动态链接
      1. 14.3.1 程序解释器
      2. 14.3.2 动态段
      3. 14.3.3 共享对象依赖关系
      4. 14.3.4 全局偏移量表
      5. 14.3.5 过程链接表
      6. 14.3.6 抢占式
      7. 14.3.7 初始化和终止
    4. 14.4 裸机动态链接模型
      1. 14.4.1 文件类型
      2. 14.4.2 ELF 标识
      3. 14.4.3 可见性和绑定
      4. 14.4.4 数据寻址
      5. 14.4.5 代码寻址
      6. 14.4.6 动态信息
  16. 15Linux ABI
    1. 15.1  文件类型
    2. 15.2  ELF 标识
    3. 15.3  程序标头和段
    4. 15.4  数据寻址
      1. 15.4.1 数据区段基表 (DSBT)
      2. 15.4.2 全局偏移量表 (GOT)
    5. 15.5  代码寻址
    6. 15.6  延迟绑定
    7. 15.7  可见性
    8. 15.8  抢占式
    9. 15.9  “作为自有导入”占先
    10. 15.10 程序加载
    11. 15.11 动态信息
    12. 15.12 初始化和终止函数
    13. 15.13 Linux 模型摘要
  17. 16符号版本控制
    1. 16.1 ELF 符号版本控制概述
    2. 16.2 版本段标识
  18. 17构建属性
    1. 17.1 C6000 ABI 构建属性子段
    2. 17.2 C6000 构建属性标签
  19. 18复制表和变量初始化
    1. 18.1 复制表格式
    2. 18.2 压缩的数据格式
      1. 18.2.1 RLE
      2. 18.2.2 LZSS 格式
    3. 18.3 变量初始化
  20. 19扩展程序标头属性
    1. 19.1 编码
    2. 19.2 属性标签定义
    3. 19.3 扩展程序标头属性段格式
  21. 20修订历史记录

C6000 构建属性标签

Tag_ISA (=4), ULEB128

此标签指定可以执行文件中所编码指令的 C6000 ISA。定义的值如下:

0ISA 未指定
1C62x
2保留
3C67x
4C67x+
5保留
6C64x
7C64x+
8C6740
9Tesla
10C6600

此标签确定对象兼容性,如下所示。在这里,传递关系 A < B 表示 B 与 A 兼容;也就是说,B 可以执行为 A 或 B 生成的代码。组合属性时,应使用可以执行这两个属性的最大 ISA(本例中为 B)。

  • Tesla 与任何其他 ISA 修订版本均不兼容。
  • C62x < 除 Tesla 之外的所有 ISA
  • C67x < C67x+
  • C67x+ < C6740
  • C64x < C64x+
  • C64x+ < C6740
  • C6740 < C6600

下列有向图展示了 C6000 ISA 兼容性,其中有向边 A→B 表示兼容性关系 A < B。

GUID-E02D3FEF-7CFE-496E-956C-E64BF6C8D032-low.gif图 17-1 C6000 ISA 兼容性图

Tag_ABI_wchar_t, (=6), ULEB128

0未使用 wchar_t。
1wchar_t 的大小为 2 个字节。
2wchar_t 的大小为 4 个字节。

节 2.1 将 wchar_t 指定为 unsigned int。但是,在某些情况下,TI 工具链将 wchar_t 定义为 unsigned short。利用此标签,可以检测此违规导致的任何不兼容性。

Tag_ABI_stack_align_needed, (=8), ULEB128

0代码要求在函数边界处进行 8 字节栈对齐。
1代码要求在函数边界处进行 16 字节栈对齐。

Tag_ABI_stack_align_preserved, (=10), ULEB128

0代码要求在函数边界处进行 8 字节栈对齐。
1代码要求在函数边界处进行 16 字节栈对齐。

当前支持的所有 ISA 都使用 8 字节栈对齐。未来的 ISA 预计将采用 16 字节对齐。

需要 16 字节栈对齐的代码与仅保留 8 字节对齐的代码不兼容。合并标签时,结果应反映 TAG_ABI_stack_align_preserved 给出的最小对齐,以及 TAG_ABI_stack_align_needed 给出的最大对齐。

Tag_ABI_DSBT, (=12), ULEB128

0不使用 DSBT 寻址。
1使用 DSBT 寻址。

Tag_ABI_PID, (=14), ULEB128

0数据寻址与位置相关。
1数据寻址与位置无关;GOT 通过使用 near DP 寻址来访问。
2数据寻址与位置无关;GOT 通过使用 far DP 寻址来访问。

具有非零 Tag_ABI_PID 的目标文件不对数据使用绝对寻址。所有数据均使用 DP 相对 GOT 寻址,或者在只读常量的情况下使用 PC 相对寻址进行寻址。此类对象可以动态分配其 DP 相关数据段的位置,而不需要按照共享对象的要求进行重定位。

值 2 表示对象依赖于基于 far GOT 的寻址(请参阅 节 6.6)。也就是说,GOT 本身较远。

Tag_ABI_PIC, (=16), ULEB128

0寻址约定不适用于共享对象。
1寻址约定适用于共享对象。

Tag_ABI_PIC 指示该对象遵循共享对象所需的寻址约定,尤其是对导入变量的所有引用都通过 GOT 寻址。

链接共享库时,链接器应强制构成该库的所有对象上存在此标签。

名称 Tag_ABI_PIC 可能会产生误导。“位置独立性”一词可能意味着多个相关的属性,这些属性可能等于也可能不等于共享对象所需的属性。因此,此属性是根据后者集合定义的。

Tag_ABI_array_object_alignment, (=18), ULEB128

0数组变量在 8 字节边界上对齐。
1数组变量在 4 字节边界上对齐。
2数组变量在 16 字节边界上对齐。

Tag_ABI_array_object_align_expected,(=20), ULEB128

0代码假设数组变量采用 8 字节对齐。
1代码假设数组变量采用 4 字节对齐。
2代码假设数组变量采用 16 字节对齐。

前两个标签适用于具有外部可见性的数组变量,如 节 2.6中所述。为了实现兼容性,TAB_ABI_array_align_expected 标签表示的对齐值必须小于或等于 TAG_ABI_array_object_alignment 标签表示的对齐值。合并标签时,结果应反映 TAG_ABI_array_object_alignment 给出的最小对齐和 TAG_ABI_array_object_align_expected 给出的最大对齐。

Tag_ABI_compatibility, (=32), ULEB128, char[]

此标签使供应商能够安排超出 ABI 范围的特定兼容性约定。它有两个操作数、一个 ULEB128 标志和一个以 NULL 结尾的字符串。该字符串指定由安排供应商定义的额外 ABI 约定的名称。该标志根据约定描述对象的特征。在以下说明中,“ABI 兼容”一词表示符合此 ABI,并符合本文档中规定的条件,例如其他构建属性标签。标志值为:

0该对象没有特定于工具链的兼容性要求,因此与任何其他 ABI 兼容对象兼容。
1该对象与其他 ABI 兼容对象兼容,前提是该对象由符合命名约定的工具链(例如,如果约定指定了供应商,则是该供应商的工具链)进行处理。
N>1该对象与 ABI 不兼容,但可能与命名约定下的其他对象兼容。在这种情况下,约定对标志的解释作了定义。

请注意,该字符串标识额外的 ABI 约定,不一定是生成该文件的工具链。

如果省略了 ABI 兼容性标签,其含义与标志值为 0 的标签相同(无其他兼容性要求)。

Tag_ABI_conformance, (=67), char[]

此标签指定对象符合的 ABI 版本。标签值是以 NULL 结尾且包含 ABI 版本的字符串。此标准中指定的版本为“1.0”。小数点后面的数字仅供参考,不影响兼容性检查。

为了方便消费者识别 while 文件符合 ABI 的常见情况,此标签应该是 C6000 子段中第一个属性矢量的第一个属性。

表 17-1 总结了由 ABI 定义的构建属性标签。

表 17-1 C6000 ABI 构建属性标签
标签标签值形参类型兼容性规则
Tag_File1uint32
Tag_Section2uint32
Tag_Symbol3uint32
Tag_ISA4ULEB128请参阅前面的说明
Tag_ABI_wchar_t6ULEB128如果不为零,则必须完全匹配
Tag_ABI_stack_align_needed8ULEB128必须与 Tag_ABI_stack_align_preserved 兼容。

结合使用最大值。

Tag_ABI_stack_align_preserved10ULEB128必须与 Tag_ABI_stack_align_needed 兼容。

结合使用最小值。

Tag_ABI_DSBT12ULEB128准确
Tag_ABI_PID14ULEB128如果不同,则发出警告;结合使用最小值。
Tag_ABI_PIC16ULEB128构建共享库时如果不存在,则发出警告;结合使用最小值。
TAG_ABI_array_object_alignment18ULEB128必须至少与 TAG_ABI_array_object_align_expected 对齐。

结合使用最大对齐。

TAG_ABI_array_object_align_expected20ULEB128必须 <= TAG_ABI_array_object_alignment 中的对齐。

结合使用最小对齐。

Tag_ABI_compatibility32ULEB128 char[]请参阅文本说明。
Tag_ABI_conformance67char[]未指定