我如何理解 Rust 编译器目标的数据布局字符串?

phi*_*611 4 rust

在 Rust 编译器内部,所有目标都有一个data_layout. 这根绳子看起来真的很可怕,让我做噩梦。它的例子是

e-m:x-p:32:32-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:32-n8:16:32-a:0:32-S32
Run Code Online (Sandbox Code Playgroud)

e-m:e-i64:64-f80:128-n8:16:32:64-S128
Run Code Online (Sandbox Code Playgroud)

这里发生了什么?

phi*_*611 9

这些数据布局字符串由LLVM定义,并在文档中进行了解释。您还可以尝试学习解析这些字符串的 Rust 编译器代码

让我们看这个例子:

e-m:e-i64:64-f80:128-n8:16:32:64-S128

  • e: 小端
  • m:e: ELF 损坏
  • i64:64:对小端 64 位整数的本机支持
  • f80:128:将80位浮点数存储在128位中
  • n8:16:32:64:处理器具有 8、16、32 和 64 位的本机寄存器
  • S128:堆栈的自然对齐(以位为单位)

p270:32:32-p271:32:32-p272:64:64这里解释了指的是什么:许多 Rust 编译器目标定义在数据布局中使用“p270:32:32-p271:32:32-p272:64:64” - 这是什么意思?