许多 Rust 编译器的目标定义在数据布局中使用"p270:32:32-p271:32:32-p272:64:64" - 这意味着什么?



几天前,对Rust编译器的数据布局字符串的基本理解,或者更具体地说,对底层LLVM的基本理解已经在Stack Overflow上得到了解决。不幸的是,有一点仍然不清楚。

许多Rust编译器目标在其数据布局字符串中包含p270:32:32-p271:32:32-p272:64:64。例如i686-unknown-uefix86_64-uwp_windows-msvcx86_64-unknown-uefix86_64-unknown-linux_gnux86_64-fuchsia86_64-apple-darwin

(这些目标可以在这里找到https://github.com/rust-lang/rust/tree/1.52.1/compiler/rustc_target/src/spec.(

LLVM语言参考解释:

p[n]:<size>:<abi>:<pref>:<idx>这指定指针的大小及其地址空间n的错误对齐。第四个参数是用于地址计算的索引大小。如果未指定,则默认索引大小等于指针大小。所有尺寸都以位为单位。地址空间n是可选的,如果未指定,则表示默认地址空间0。n的值必须在[1,2^23(的范围内。

我不明白。p270p272有什么特别之处?其中";地址空间";他们指的是什么?

这些数据布局字符串已于2020-01-07提交给Rust。提交消息说">更新数据布局以包括新的X86地址空间";。经过更多的研究,我发现底层功能在2019年被合并到LLVM中。这些新地址空间是MSVC的__ptr32__ptr64__sptr__uptr扩展[1]。

引用LLVM讨论:

数字270-272或多或少是任意的;我选择它们是因为它们接近256-258,这是当前现有的地址空间。

如果您查看LLVM源代码中的X86.h,可以看到这个数字被用作标识符,并且是随意选择的,但不是出于技术原因。

最新更新