Skip to main content

rustc_attr_ir/
encode_cross_crate.rs

1use crate::AttributeKind;
2
3#[derive(#[automatically_derived]
impl ::core::marker::StructuralPartialEq for EncodeCrossCrate { }
#[automatically_derived]
impl ::core::cmp::PartialEq for EncodeCrossCrate {
    #[inline]
    fn eq(&self, other: &Self) -> bool {
        ::core::intrinsics::discriminant_value(self) ==
            ::core::intrinsics::discriminant_value(other)
    }
}PartialEq)]
4pub enum EncodeCrossCrate {
5    Yes,
6    No,
7}
8
9impl AttributeKind {
10    /// Whether this attribute should be encoded in metadata files.
11    ///
12    /// If this is "Yes", then another crate can do `tcx.get_all_attrs(did)` for a did in this crate, and get the attribute.
13    /// When this is No, the attribute is filtered out while encoding and other crate won't be able to observe it.
14    /// This can be unexpectedly good for performance, so unless necessary for cross-crate compilation, prefer No.
15    pub fn encode_cross_crate(&self) -> EncodeCrossCrate {
16        use AttributeKind::*;
17        use EncodeCrossCrate::*;
18
19        match self {
20            // tidy-alphabetical-start
21            AllowInternalUnsafe(..) => Yes,
22            AllowInternalUnstable(..) => Yes,
23            AlwaysGca => Yes,
24            AutomaticallyDerived => Yes,
25            CfgAttrTrace(..) => Yes,
26            CfgTrace(..) => Yes,
27            CfiEncoding { .. } => Yes,
28            Cold => No,
29            CollapseDebugInfo(..) => Yes,
30            CompilerBuiltins => No,
31            ConstContinue(..) => No,
32            Coroutine => No,
33            Coverage(..) => No,
34            CrateName { .. } => No,
35            CrateType(_) => No,
36            CustomMir(_, _) => Yes,
37            DebuggerVisualizer(..) => No,
38            DefaultLibAllocator => No,
39            Deprecated { .. } => Yes,
40            DoNotRecommend => Yes,
41            Doc(_) => Yes,
42            DocComment { .. } => Yes,
43            EiiDeclaration(_) => Yes,
44            EiiImpl(..) => No,
45            ExportName { .. } => Yes,
46            ExportStable => No,
47            Feature(..) => No,
48            FfiConst => No,
49            FfiPure(..) => No,
50            Fundamental { .. } => Yes,
51            Ignore { .. } => No,
52            Inline(..) => No,
53            InstructionSet(..) => No,
54            InstrumentFn(..) => No,
55            Lang(..) => Yes,
56            Link(..) => No,
57            LinkName { .. } => Yes, // Needed for rustdoc
58            LinkOrdinal { .. } => No,
59            LinkSection { .. } => Yes, // Needed for rustdoc
60            Linkage(..) => No,
61            LintCheck(..) => No,
62            LoopMatch(..) => No,
63            MacroEscape => No,
64            MacroExport { .. } => Yes,
65            MacroUse { .. } => No,
66            Marker => No,
67            MayDangle(..) => No,
68            MoveSizeLimit { .. } => No,
69            MustNotSupend { .. } => Yes,
70            MustUse { .. } => Yes,
71            Naked(..) => No,
72            NeedsAllocator => No,
73            NeedsPanicRuntime => No,
74            NoBuiltins => Yes,
75            NoCore => No,
76            NoImplicitPrelude => No,
77            NoLink => No,
78            NoMain => No,
79            NoMangle(..) => Yes, // Needed for rustdoc
80            NoStd => No,
81            NonExhaustive(..) => Yes, // Needed for rustdoc
82            OnConst { .. } => Yes,
83            OnMove { .. } => Yes,
84            OnTypeError { .. } => Yes,
85            OnUnimplemented { .. } => Yes,
86            OnUnknown { .. } => Yes,
87            OnUnmatchedArgs { .. } => Yes,
88            Opaque => Yes,
89            Optimize(..) => No,
90            PanicRuntime => No,
91            PatchableFunctionEntry { .. } => Yes,
92            Path(..) => No,
93            PatternComplexityLimit { .. } => No,
94            PinV2(..) => Yes,
95            PreludeImport => No,
96            ProcMacro => No,
97            ProcMacroAttribute => No,
98            ProcMacroDerive { .. } => No,
99            ProfilerRuntime => No,
100            RecursionLimit { .. } => No,
101            ReexportTestHarnessMain(..) => No,
102            RegisterTool { .. } => No,
103            Repr { .. } => No,
104            RustcAbi { .. } => No,
105            RustcAlign { .. } => No,
106            RustcAllocator => No,
107            RustcAllocatorZeroed => No,
108            RustcAllocatorZeroedVariant { .. } => Yes,
109            RustcAllowConstFnUnstable(..) => No,
110            RustcAllowIncoherentImpl(..) => No,
111            RustcAllowLifetimeDependentSpecialization => No,
112            RustcAsPtr => Yes,
113            RustcAssertVariance { .. } => No,
114            RustcAutodiff(..) => Yes,
115            RustcBodyStability { .. } => No,
116            RustcBuiltinMacro { .. } => Yes,
117            RustcCanonicalSymbol => No,
118            RustcCaptureAnalysis => No,
119            RustcCguTestAttr { .. } => No,
120            RustcClean { .. } => No,
121            RustcCoherenceIsCore => No,
122            RustcCoinductive => No,
123            RustcComptime(..) => No, // Encoded directly in signature
124            RustcConfusables { .. } => Yes,
125            RustcConstStability { .. } => Yes,
126            RustcConstStableIndirect => No,
127            RustcConversionSuggestion => Yes,
128            RustcDeallocator => No,
129            RustcDelayedBugFromInsideQuery => No,
130            RustcDenyExplicitImpl => No,
131            RustcDeprecatedSafe2024 { .. } => Yes,
132            RustcDiagnosticItem(..) => Yes,
133            RustcDoNotConstCheck => Yes,
134            RustcDocPrimitive(..) => Yes,
135            RustcDummy => No,
136            RustcDumpClauses => No,
137            RustcDumpDefParents => No,
138            RustcDumpDefPath(..) => No,
139            RustcDumpGenerics => No,
140            RustcDumpHiddenTypeOfOpaques => No,
141            RustcDumpInferredOutlives => No,
142            RustcDumpItemBounds => No,
143            RustcDumpLayout(..) => No,
144            RustcDumpObjectLifetimeDefaults => No,
145            RustcDumpSymbolName(..) => Yes,
146            RustcDumpUserArgs => No,
147            RustcDumpVariances => No,
148            RustcDumpVariancesOfOpaques => No,
149            RustcDumpVtable(..) => No,
150            RustcDynIncompatibleTrait(..) => No,
151            RustcEffectiveVisibility => Yes,
152            RustcEiiForeignItem => No,
153            RustcEvaluateWhereClauses => Yes,
154            RustcHasIncoherentInherentImpls => Yes,
155            RustcIfThisChanged(..) => No,
156            RustcInheritOverflowChecks => No,
157            RustcInsignificantDtor => Yes,
158            RustcIntrinsic => Yes,
159            RustcIntrinsicConstStableIndirect => No,
160            RustcLegacyConstGenerics { .. } => Yes,
161            RustcLintOptDenyFieldAccess { .. } => Yes,
162            RustcLintOptTy => Yes,
163            RustcLintQueryInstability => Yes,
164            RustcLintUntrackedQueryInformation => Yes,
165            RustcMacroTransparency(..) => Yes,
166            RustcMain => No,
167            RustcMir(..) => Yes,
168            RustcMustImplementOneOf { .. } => No,
169            RustcMustMatchExhaustively(..) => Yes,
170            RustcNeverReturnsNullPtr => Yes,
171            RustcNoImplicitAutorefs => Yes,
172            RustcNoImplicitBounds => No,
173            RustcNoMirInline => Yes,
174            RustcNoWritable => Yes,
175            RustcNonConstTraitMethod => No, // should be reported via other queries like `constness`
176            RustcNonnullOptimizationGuaranteed => Yes,
177            RustcNounwind => No,
178            RustcObjcClass { .. } => No,
179            RustcObjcSelector { .. } => No,
180            RustcOffloadKernel => Yes,
181            RustcPanicsWhenZero => Yes,
182            RustcParenSugar => No,
183            RustcPassByValue => Yes,
184            RustcPassIndirectlyInNonRusticAbis(..) => No,
185            RustcPreserveUbChecks => No,
186            RustcProcMacroDecls => No,
187            RustcPubTransparent(..) => Yes,
188            RustcReallocator => No,
189            RustcRegions => No,
190            RustcScalableVector { .. } => Yes,
191            RustcShouldNotBeCalledOnConstItems => Yes,
192            RustcShowSpans(_) => No,
193            RustcSimdMonomorphizeLaneLimit(..) => Yes, // Affects layout computation, which needs to work cross-crate
194            RustcSkipDuringMethodDispatch { .. } => No,
195            RustcSpecializationTrait => No,
196            RustcStdInternalSymbol => No,
197            RustcStrictCoherence(..) => Yes,
198            RustcTestMarker(..) => No,
199            RustcThenThisWouldNeed(..) => No,
200            RustcTrivialFieldReads => Yes,
201            Sanitize { .. } => No,
202            ShouldPanic { .. } => No,
203            Splat(..) => Yes,
204            Stability { .. } => Yes,
205            TargetFeature { .. } => No,
206            TestRunner(..) => Yes,
207            ThreadLocal => No,
208            TrackCaller(..) => Yes,
209            TypeLengthLimit { .. } => No,
210            Unroll(..) => No,
211            UnstableFeatureBound(..) => No,
212            UnstableRemoved(..) => Yes,
213            Used { .. } => No,
214            WindowsSubsystem(..) => No,
215            // tidy-alphabetical-end
216        }
217    }
218
219    /// Whether this attribute is an extern indicator.
220    ///
221    /// Must stay in sync with [`CodegenFnAttrs::contains_extern_indicator`].
222    ///
223    /// [`CodegenFnAttrs::contains_extern_indicator`]: ../rustc_middle/middle/codegen_fn_attrs/struct.CodegenFnAttrs.html#method.contains_extern_indicator
224    pub fn is_extern_indicator(&self) -> bool {
225        use AttributeKind::*;
226
227        match self {
228            // tidy-alphabetical-start
229            AllowInternalUnsafe(..) => false,
230            AllowInternalUnstable(..) => false,
231            AlwaysGca => false,
232            AutomaticallyDerived => false,
233            CfgAttrTrace(..) => false,
234            CfgTrace(..) => false,
235            CfiEncoding { .. } => false,
236            Cold => false,
237            CollapseDebugInfo(..) => false,
238            CompilerBuiltins => false,
239            ConstContinue(..) => false,
240            Coroutine => false,
241            Coverage(..) => false,
242            CrateName { .. } => false,
243            CrateType(_) => false,
244            CustomMir(_, _) => false,
245            DebuggerVisualizer(..) => false,
246            DefaultLibAllocator => false,
247            Deprecated { .. } => false,
248            DoNotRecommend => false,
249            Doc(_) => false,
250            DocComment { .. } => false,
251            EiiDeclaration(_) => false,
252            EiiImpl(..) => true,
253            ExportName { .. } => true,
254            ExportStable => false,
255            Feature(..) => false,
256            FfiConst => false,
257            FfiPure(..) => false,
258            Fundamental { .. } => false,
259            Ignore { .. } => false,
260            Inline(..) => false,
261            InstructionSet(..) => false,
262            InstrumentFn(..) => false,
263            Lang(item) => item.link_name().is_some(),
264            Link(..) => false,
265            LinkName { .. } => false,
266            LinkOrdinal { .. } => false,
267            LinkSection { .. } => false,
268            Linkage(linkage, _) => match *linkage {
269                crate::Linkage::Internal => false,
270                crate::Linkage::AvailableExternally
271                | crate::Linkage::External
272                | crate::Linkage::ExternalWeak
273                | crate::Linkage::LinkOnceAny
274                | crate::Linkage::LinkOnceODR
275                | crate::Linkage::WeakAny
276                | crate::Linkage::WeakODR => true,
277            },
278            LintCheck(_) => false,
279            LoopMatch(..) => false,
280            MacroEscape => false,
281            MacroExport { .. } => false,
282            MacroUse { .. } => false,
283            Marker => false,
284            MayDangle(..) => false,
285            MoveSizeLimit { .. } => false,
286            MustNotSupend { .. } => false,
287            MustUse { .. } => false,
288            Naked(..) => false,
289            NeedsAllocator => false,
290            NeedsPanicRuntime => false,
291            NoBuiltins => false,
292            NoCore => false,
293            NoImplicitPrelude => false,
294            NoLink => false,
295            NoMain => false,
296            NoMangle(..) => true,
297            NoStd => false,
298            NonExhaustive(..) => false,
299            OnConst { .. } => false,
300            OnMove { .. } => false,
301            OnTypeError { .. } => false,
302            OnUnimplemented { .. } => false,
303            OnUnknown { .. } => false,
304            OnUnmatchedArgs { .. } => false,
305            Opaque => false,
306            Optimize(..) => false,
307            PanicRuntime => false,
308            PatchableFunctionEntry { .. } => false,
309            Path(..) => false,
310            PatternComplexityLimit { .. } => false,
311            PinV2(..) => false,
312            PreludeImport => false,
313            ProcMacro => false,
314            ProcMacroAttribute => false,
315            ProcMacroDerive { .. } => false,
316            ProfilerRuntime => false,
317            RecursionLimit { .. } => false,
318            ReexportTestHarnessMain(..) => false,
319            RegisterTool { .. } => false,
320            Repr { .. } => false,
321            RustcAbi { .. } => false,
322            RustcAlign { .. } => false,
323            RustcAllocator => false,
324            RustcAllocatorZeroed => false,
325            RustcAllocatorZeroedVariant { .. } => false,
326            RustcAllowConstFnUnstable(..) => false,
327            RustcAllowIncoherentImpl(..) => false,
328            RustcAllowLifetimeDependentSpecialization => false,
329            RustcAsPtr => false,
330            RustcAssertVariance { .. } => false,
331            RustcAutodiff(..) => false,
332            RustcBodyStability { .. } => false,
333            RustcBuiltinMacro { .. } => false,
334            RustcCanonicalSymbol => false,
335            RustcCaptureAnalysis => false,
336            RustcCguTestAttr { .. } => false,
337            RustcClean { .. } => false,
338            RustcCoherenceIsCore => false,
339            RustcCoinductive => false,
340            RustcComptime(..) => false,
341            RustcConfusables { .. } => false,
342            RustcConstStability { .. } => false,
343            RustcConstStableIndirect => false,
344            RustcConversionSuggestion => false,
345            RustcDeallocator => false,
346            RustcDelayedBugFromInsideQuery => false,
347            RustcDenyExplicitImpl => false,
348            RustcDeprecatedSafe2024 { .. } => false,
349            RustcDiagnosticItem(..) => false,
350            RustcDoNotConstCheck => false,
351            RustcDocPrimitive(..) => false,
352            RustcDummy => false,
353            RustcDumpClauses => false,
354            RustcDumpDefParents => false,
355            RustcDumpDefPath(..) => false,
356            RustcDumpGenerics => false,
357            RustcDumpHiddenTypeOfOpaques => false,
358            RustcDumpInferredOutlives => false,
359            RustcDumpItemBounds => false,
360            RustcDumpLayout(..) => false,
361            RustcDumpObjectLifetimeDefaults => false,
362            RustcDumpSymbolName(..) => false,
363            RustcDumpUserArgs => false,
364            RustcDumpVariances => false,
365            RustcDumpVariancesOfOpaques => false,
366            RustcDumpVtable(..) => false,
367            RustcDynIncompatibleTrait(..) => false,
368            RustcEffectiveVisibility => false,
369            RustcEiiForeignItem => true,
370            RustcEvaluateWhereClauses => false,
371            RustcHasIncoherentInherentImpls => false,
372            RustcIfThisChanged(..) => false,
373            RustcInheritOverflowChecks => false,
374            RustcInsignificantDtor => false,
375            RustcIntrinsic => false,
376            RustcIntrinsicConstStableIndirect => false,
377            RustcLegacyConstGenerics { .. } => false,
378            RustcLintOptDenyFieldAccess { .. } => false,
379            RustcLintOptTy => false,
380            RustcLintQueryInstability => false,
381            RustcLintUntrackedQueryInformation => false,
382            RustcMacroTransparency(..) => false,
383            RustcMain => false,
384            RustcMir(..) => false,
385            RustcMustImplementOneOf { .. } => false,
386            RustcMustMatchExhaustively(..) => false,
387            RustcNeverReturnsNullPtr => false,
388            RustcNoImplicitAutorefs => false,
389            RustcNoImplicitBounds => false,
390            RustcNoMirInline => false,
391            RustcNoWritable => false,
392            RustcNonConstTraitMethod => false,
393            RustcNonnullOptimizationGuaranteed => false,
394            RustcNounwind => false,
395            RustcObjcClass { .. } => false,
396            RustcObjcSelector { .. } => false,
397            RustcOffloadKernel => true,
398            RustcPanicsWhenZero => false,
399            RustcParenSugar => false,
400            RustcPassByValue => false,
401            RustcPassIndirectlyInNonRusticAbis(..) => false,
402            RustcPreserveUbChecks => false,
403            RustcProcMacroDecls => false,
404            RustcPubTransparent(..) => false,
405            RustcReallocator => false,
406            RustcRegions => false,
407            RustcScalableVector { .. } => false,
408            RustcShouldNotBeCalledOnConstItems => false,
409            RustcShowSpans(_) => false,
410            RustcSimdMonomorphizeLaneLimit(..) => false,
411            RustcSkipDuringMethodDispatch { .. } => false,
412            RustcSpecializationTrait => false,
413            RustcStdInternalSymbol => true,
414            RustcStrictCoherence(..) => false,
415            RustcTestMarker(..) => false,
416            RustcThenThisWouldNeed(..) => false,
417            RustcTrivialFieldReads => false,
418            Sanitize { .. } => false,
419            ShouldPanic { .. } => false,
420            Splat(..) => false,
421            Stability { .. } => false,
422            TargetFeature { .. } => false,
423            TestRunner(..) => false,
424            ThreadLocal => false,
425            TrackCaller(..) => false,
426            TypeLengthLimit { .. } => false,
427            Unroll(..) => false,
428            UnstableFeatureBound(..) => false,
429            UnstableRemoved(..) => false,
430            Used { .. } => false,
431            WindowsSubsystem(..) => false,
432            // tidy-alphabetical-end
433        }
434    }
435}