@@ -29,7 +29,7 @@ use serde::{Deserialize, Serialize};
2929/// This integer is incremented with every breaking change to the API,
3030/// and is returned along with the JSON blob as [`Crate::format_version`].
3131/// Consuming code should assert that this value matches the format version(s) that it supports.
32- pub const FORMAT_VERSION : u32 = 43 ;
32+ pub const FORMAT_VERSION : u32 = 44 ;
3333
3434/// The root of the emitted JSON blob.
3535///
@@ -51,11 +51,67 @@ pub struct Crate {
5151 pub paths : HashMap < Id , ItemSummary > ,
5252 /// Maps `crate_id` of items to a crate name and html_root_url if it exists.
5353 pub external_crates : HashMap < u32 , ExternalCrate > ,
54+ /// Information about the target for which this documentation was generated
55+ pub target : Target ,
5456 /// A single version number to be used in the future when making backwards incompatible changes
5557 /// to the JSON output.
5658 pub format_version : u32 ,
5759}
5860
61+ /// Information about a target
62+ #[ derive( Clone , Debug , PartialEq , Eq , Serialize , Deserialize ) ]
63+ pub struct Target {
64+ /// The target triple for which this documentation was generated
65+ pub triple : String ,
66+ /// A list of features valid for use in `#[target_feature]` attributes
67+ /// for the target where this rustdoc JSON was generated.
68+ pub target_features : Vec < TargetFeature > ,
69+ }
70+
71+ /// Information about a target feature.
72+ ///
73+ /// Rust target features are used to influence code generation, especially around selecting
74+ /// instructions which are not universally supported by the target architecture.
75+ ///
76+ /// Target features are commonly enabled by the [`#[target_feature]` attribute][1] to influence code
77+ /// generation for a particular function, and less commonly enabled by compiler options like
78+ /// `-Ctarget-feature` or `-Ctarget-cpu`. Targets themselves automatically enable certain target
79+ /// features by default, for example because the target's ABI specification requires saving specific
80+ /// registers which only exist in an architectural extension.
81+ ///
82+ /// Target features can imply other target features: for example, x86-64 `avx2` implies `avx`, and
83+ /// aarch64 `sve2` implies `sve`, since both of these architectural extensions depend on their
84+ /// predecessors.
85+ ///
86+ /// Target features can be probed at compile time by [`#[cfg(target_feature)]`][2] or `cfg!(…)`
87+ /// conditional compilation to determine whether a target feature is enabled in a particular
88+ /// context.
89+ ///
90+ /// [1]: https://doc.rust-lang.org/stable/reference/attributes/codegen.html#the-target_feature-attribute
91+ /// [2]: https://doc.rust-lang.org/reference/conditional-compilation.html#target_feature
92+ #[ derive( Clone , Debug , PartialEq , Eq , Serialize , Deserialize ) ]
93+ pub struct TargetFeature {
94+ /// The name of this target feature.
95+ pub name : String ,
96+ /// Other target features which are implied by this target feature, if any.
97+ pub implies_features : Vec < String > ,
98+ /// If this target feature is unstable, the name of the associated language feature gate.
99+ pub unstable_feature_gate : Option < String > ,
100+ /// Whether this feature is globally enabled for this compilation session.
101+ ///
102+ /// Target features can be globally enabled implicitly as a result of the target's definition.
103+ /// For example, x86-64 hardware floating point ABIs require saving x87 and SSE2 registers,
104+ /// which in turn requires globally enabling the `x87` and `sse2` target features so that the
105+ /// generated machine code conforms to the target's ABI.
106+ ///
107+ /// Target features can also be globally enabled explicitly as a result of compiler flags like
108+ /// [`-Ctarget-feature`][1] or [`-Ctarget-cpu`][2].
109+ ///
110+ /// [1]: https://doc.rust-lang.org/beta/rustc/codegen-options/index.html#target-feature
111+ /// [2]: https://doc.rust-lang.org/beta/rustc/codegen-options/index.html#target-cpu
112+ pub globally_enabled : bool ,
113+ }
114+
59115/// Metadata of a crate, either the same crate on which `rustdoc` was invoked, or its dependency.
60116#[ derive( Clone , Debug , PartialEq , Eq , Hash , Serialize , Deserialize ) ]
61117pub struct ExternalCrate {
0 commit comments