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            UncheckedTypeAlias => Yes,
211            Unroll(..) => No,
212            UnstableFeatureBound(..) => No,
213            UnstableRemoved(..) => Yes,
214            Used { .. } => No,
215            WindowsSubsystem(..) => No,
216            // tidy-alphabetical-end
217        }
218    }
219
220    /// Whether this attribute is an extern indicator.
221    ///
222    /// Must stay in sync with [`CodegenFnAttrs::contains_extern_indicator`].
223    ///
224    /// [`CodegenFnAttrs::contains_extern_indicator`]: ../rustc_middle/middle/codegen_fn_attrs/struct.CodegenFnAttrs.html#method.contains_extern_indicator
225    pub fn is_extern_indicator(&self) -> bool {
226        use AttributeKind::*;
227
228        match self {
229            // tidy-alphabetical-start
230            AllowInternalUnsafe(..) => false,
231            AllowInternalUnstable(..) => false,
232            AlwaysGca => false,
233            AutomaticallyDerived => false,
234            CfgAttrTrace(..) => false,
235            CfgTrace(..) => false,
236            CfiEncoding { .. } => false,
237            Cold => false,
238            CollapseDebugInfo(..) => false,
239            CompilerBuiltins => false,
240            ConstContinue(..) => false,
241            Coroutine => false,
242            Coverage(..) => false,
243            CrateName { .. } => false,
244            CrateType(_) => false,
245            CustomMir(_, _) => false,
246            DebuggerVisualizer(..) => false,
247            DefaultLibAllocator => false,
248            Deprecated { .. } => false,
249            DoNotRecommend => false,
250            Doc(_) => false,
251            DocComment { .. } => false,
252            EiiDeclaration(_) => false,
253            EiiImpl(..) => true,
254            ExportName { .. } => true,
255            ExportStable => false,
256            Feature(..) => false,
257            FfiConst => false,
258            FfiPure(..) => false,
259            Fundamental { .. } => false,
260            Ignore { .. } => false,
261            Inline(..) => false,
262            InstructionSet(..) => false,
263            InstrumentFn(..) => false,
264            Lang(item) => item.link_name().is_some(),
265            Link(..) => false,
266            LinkName { .. } => false,
267            LinkOrdinal { .. } => false,
268            LinkSection { .. } => false,
269            Linkage(linkage, _) => match *linkage {
270                crate::Linkage::Internal => false,
271                crate::Linkage::AvailableExternally
272                | crate::Linkage::External
273                | crate::Linkage::ExternalWeak
274                | crate::Linkage::LinkOnceAny
275                | crate::Linkage::LinkOnceODR
276                | crate::Linkage::WeakAny
277                | crate::Linkage::WeakODR => true,
278            },
279            LintCheck(_) => false,
280            LoopMatch(..) => false,
281            MacroEscape => false,
282            MacroExport { .. } => false,
283            MacroUse { .. } => false,
284            Marker => false,
285            MayDangle(..) => false,
286            MoveSizeLimit { .. } => false,
287            MustNotSupend { .. } => false,
288            MustUse { .. } => false,
289            Naked(..) => false,
290            NeedsAllocator => false,
291            NeedsPanicRuntime => false,
292            NoBuiltins => false,
293            NoCore => false,
294            NoImplicitPrelude => false,
295            NoLink => false,
296            NoMain => false,
297            NoMangle(..) => true,
298            NoStd => false,
299            NonExhaustive(..) => false,
300            OnConst { .. } => false,
301            OnMove { .. } => false,
302            OnTypeError { .. } => false,
303            OnUnimplemented { .. } => false,
304            OnUnknown { .. } => false,
305            OnUnmatchedArgs { .. } => false,
306            Opaque => false,
307            Optimize(..) => false,
308            PanicRuntime => false,
309            PatchableFunctionEntry { .. } => false,
310            Path(..) => false,
311            PatternComplexityLimit { .. } => false,
312            PinV2(..) => false,
313            PreludeImport => false,
314            ProcMacro => false,
315            ProcMacroAttribute => false,
316            ProcMacroDerive { .. } => false,
317            ProfilerRuntime => false,
318            RecursionLimit { .. } => false,
319            ReexportTestHarnessMain(..) => false,
320            RegisterTool { .. } => false,
321            Repr { .. } => false,
322            RustcAbi { .. } => false,
323            RustcAlign { .. } => false,
324            RustcAllocator => false,
325            RustcAllocatorZeroed => false,
326            RustcAllocatorZeroedVariant { .. } => false,
327            RustcAllowConstFnUnstable(..) => false,
328            RustcAllowIncoherentImpl(..) => false,
329            RustcAllowLifetimeDependentSpecialization => false,
330            RustcAsPtr => false,
331            RustcAssertVariance { .. } => false,
332            RustcAutodiff(..) => false,
333            RustcBodyStability { .. } => false,
334            RustcBuiltinMacro { .. } => false,
335            RustcCanonicalSymbol => false,
336            RustcCaptureAnalysis => false,
337            RustcCguTestAttr { .. } => false,
338            RustcClean { .. } => false,
339            RustcCoherenceIsCore => false,
340            RustcCoinductive => false,
341            RustcComptime(..) => false,
342            RustcConfusables { .. } => false,
343            RustcConstStability { .. } => false,
344            RustcConstStableIndirect => false,
345            RustcConversionSuggestion => false,
346            RustcDeallocator => false,
347            RustcDelayedBugFromInsideQuery => false,
348            RustcDenyExplicitImpl => false,
349            RustcDeprecatedSafe2024 { .. } => false,
350            RustcDiagnosticItem(..) => false,
351            RustcDoNotConstCheck => false,
352            RustcDocPrimitive(..) => false,
353            RustcDummy => false,
354            RustcDumpClauses => false,
355            RustcDumpDefParents => false,
356            RustcDumpDefPath(..) => false,
357            RustcDumpGenerics => false,
358            RustcDumpHiddenTypeOfOpaques => false,
359            RustcDumpInferredOutlives => false,
360            RustcDumpItemBounds => false,
361            RustcDumpLayout(..) => false,
362            RustcDumpObjectLifetimeDefaults => false,
363            RustcDumpSymbolName(..) => false,
364            RustcDumpUserArgs => false,
365            RustcDumpVariances => false,
366            RustcDumpVariancesOfOpaques => false,
367            RustcDumpVtable(..) => false,
368            RustcDynIncompatibleTrait(..) => false,
369            RustcEffectiveVisibility => false,
370            RustcEiiForeignItem => true,
371            RustcEvaluateWhereClauses => false,
372            RustcHasIncoherentInherentImpls => false,
373            RustcIfThisChanged(..) => false,
374            RustcInheritOverflowChecks => false,
375            RustcInsignificantDtor => false,
376            RustcIntrinsic => false,
377            RustcIntrinsicConstStableIndirect => false,
378            RustcLegacyConstGenerics { .. } => false,
379            RustcLintOptDenyFieldAccess { .. } => false,
380            RustcLintOptTy => false,
381            RustcLintQueryInstability => false,
382            RustcLintUntrackedQueryInformation => false,
383            RustcMacroTransparency(..) => false,
384            RustcMain => false,
385            RustcMir(..) => false,
386            RustcMustImplementOneOf { .. } => false,
387            RustcMustMatchExhaustively(..) => false,
388            RustcNeverReturnsNullPtr => false,
389            RustcNoImplicitAutorefs => false,
390            RustcNoImplicitBounds => false,
391            RustcNoMirInline => false,
392            RustcNoWritable => false,
393            RustcNonConstTraitMethod => false,
394            RustcNonnullOptimizationGuaranteed => false,
395            RustcNounwind => false,
396            RustcObjcClass { .. } => false,
397            RustcObjcSelector { .. } => false,
398            RustcOffloadKernel => true,
399            RustcPanicsWhenZero => false,
400            RustcParenSugar => false,
401            RustcPassByValue => false,
402            RustcPassIndirectlyInNonRusticAbis(..) => false,
403            RustcPreserveUbChecks => false,
404            RustcProcMacroDecls => false,
405            RustcPubTransparent(..) => false,
406            RustcReallocator => false,
407            RustcRegions => false,
408            RustcScalableVector { .. } => false,
409            RustcShouldNotBeCalledOnConstItems => false,
410            RustcShowSpans(_) => false,
411            RustcSimdMonomorphizeLaneLimit(..) => false,
412            RustcSkipDuringMethodDispatch { .. } => false,
413            RustcSpecializationTrait => false,
414            RustcStdInternalSymbol => true,
415            RustcStrictCoherence(..) => false,
416            RustcTestMarker(..) => false,
417            RustcThenThisWouldNeed(..) => false,
418            RustcTrivialFieldReads => false,
419            Sanitize { .. } => false,
420            ShouldPanic { .. } => false,
421            Splat(..) => false,
422            Stability { .. } => false,
423            TargetFeature { .. } => false,
424            TestRunner(..) => false,
425            ThreadLocal => false,
426            TrackCaller(..) => false,
427            TypeLengthLimit { .. } => false,
428            UncheckedTypeAlias => false,
429            Unroll(..) => false,
430            UnstableFeatureBound(..) => false,
431            UnstableRemoved(..) => false,
432            Used { .. } => false,
433            WindowsSubsystem(..) => false,
434            // tidy-alphabetical-end
435        }
436    }
437}