Skip to content

Commit 4295e7b

Browse files
Add section for debugging rustc type layouts (#720)
1 parent f53fc66 commit 4295e7b

File tree

1 file changed

+59
-0
lines changed

1 file changed

+59
-0
lines changed

src/compiler-debugging.md

+59
Original file line numberDiff line numberDiff line change
@@ -274,3 +274,62 @@ try`. This is helpful when you want to examine the resulting build of a PR
274274
without doing the build yourself.
275275
276276
[rtim]: https://github.com/kennytm/rustup-toolchain-install-master
277+
278+
## Debugging type layouts
279+
280+
The (permanently) unstable `#[rustc_layout]` attribute can be used to dump
281+
the [`Layout`] of the type it is attached to. For example:
282+
283+
```rust
284+
#![feature(rustc_attrs)]
285+
286+
#[rustc_layout(debug)]
287+
type T<'a> = &'a u32;
288+
```
289+
290+
Will emit the following:
291+
292+
```text
293+
error: layout_of(&'a u32) = Layout {
294+
fields: Primitive,
295+
variants: Single {
296+
index: 0,
297+
},
298+
abi: Scalar(
299+
Scalar {
300+
value: Pointer,
301+
valid_range: 1..=18446744073709551615,
302+
},
303+
),
304+
largest_niche: Some(
305+
Niche {
306+
offset: Size {
307+
raw: 0,
308+
},
309+
scalar: Scalar {
310+
value: Pointer,
311+
valid_range: 1..=18446744073709551615,
312+
},
313+
},
314+
),
315+
align: AbiAndPrefAlign {
316+
abi: Align {
317+
pow2: 3,
318+
},
319+
pref: Align {
320+
pow2: 3,
321+
},
322+
},
323+
size: Size {
324+
raw: 8,
325+
},
326+
}
327+
--> src/lib.rs:4:1
328+
|
329+
4 | type T<'a> = &'a u32;
330+
| ^^^^^^^^^^^^^^^^^^^^^
331+
332+
error: aborting due to previous error
333+
```
334+
335+
[`Layout`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_target/abi/struct.Layout.html

0 commit comments

Comments
 (0)