Auto merge of #92012 - llogiq:repr-c-def-id, r=michaelwoerister
Make `DefId` `repr(C)`, optimize big-endian field order r? `@michaelwoerister`
This commit is contained in:
commit
e4b1d58414
1 changed files with 8 additions and 1 deletions
|
@ -221,10 +221,17 @@ impl<D: Decoder> Decodable<D> for DefIndex {
|
||||||
#[derive(Clone, PartialEq, Eq, PartialOrd, Ord, Copy)]
|
#[derive(Clone, PartialEq, Eq, PartialOrd, Ord, Copy)]
|
||||||
// On below-64 bit systems we can simply use the derived `Hash` impl
|
// On below-64 bit systems we can simply use the derived `Hash` impl
|
||||||
#[cfg_attr(not(target_pointer_width = "64"), derive(Hash))]
|
#[cfg_attr(not(target_pointer_width = "64"), derive(Hash))]
|
||||||
// Note that the order is essential here, see below why
|
#[repr(C)]
|
||||||
|
// We guarantee field order. Note that the order is essential here, see below why.
|
||||||
pub struct DefId {
|
pub struct DefId {
|
||||||
|
// cfg-ing the order of fields so that the `DefIndex` which is high entropy always ends up in
|
||||||
|
// the lower bits no matter the endianness. This allows the compiler to turn that `Hash` impl
|
||||||
|
// into a direct call to 'u64::hash(_)`.
|
||||||
|
#[cfg(not(all(target_pointer_width = "64", target_endian = "big")))]
|
||||||
pub index: DefIndex,
|
pub index: DefIndex,
|
||||||
pub krate: CrateNum,
|
pub krate: CrateNum,
|
||||||
|
#[cfg(all(target_pointer_width = "64", target_endian = "big"))]
|
||||||
|
pub index: DefIndex,
|
||||||
}
|
}
|
||||||
|
|
||||||
// On 64-bit systems, we can hash the whole `DefId` as one `u64` instead of two `u32`s. This
|
// On 64-bit systems, we can hash the whole `DefId` as one `u64` instead of two `u32`s. This
|
||||||
|
|
Loading…
Add table
Reference in a new issue