几天前,对Rust编译器的数据布局字符串的基本理解,或者更具体地说,对底层LLVM的基本理解已经在Stack Overflow上得到了解决。不幸的是,有一点仍然不清楚。
许多Rust编译器目标在其数据布局字符串中包含p270:32:32-p271:32:32-p272:64:64
。例如i686-unknown-uefi
、x86_64-uwp_windows-msvc
、x86_64-unknown-uefi
、x86_64-unknown-linux_gnu
、x86_64-fuchsia
或86_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(的范围内。
我不明白。p270
到p272
有什么特别之处?其中";地址空间";他们指的是什么?
这些数据布局字符串已于2020-01-07提交给Rust。提交消息说">更新数据布局以包括新的X86地址空间";。经过更多的研究,我发现底层功能在2019年被合并到LLVM中。这些新地址空间是MSVC的__ptr32
、__ptr64
、__sptr
和__uptr
扩展[1]。
引用LLVM讨论:
数字270-272或多或少是任意的;我选择它们是因为它们接近256-258,这是当前现有的地址空间。
如果您查看LLVM源代码中的X86.h
,可以看到这个数字被用作标识符,并且是随意选择的,但不是出于技术原因。