前几天,对 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和扩展[ 1 ]。__ptr64__sptr__uptr
引用 LLVM 讨论:
数字270-272或多或少是任意的;我选择它们是因为它们靠近 256-258,这是当前现有的地址空间。
如果你查看X86.hLLVM 的源代码,可以看到这个数字被用作标识符,并且是随意选择的,但不是出于技术原因。
| 归档时间: |
|
| 查看次数: |
403 次 |
| 最近记录: |