@@ -785,6 +785,43 @@ fn should_encode_stability(def_kind: DefKind) -> bool {
785
785
}
786
786
}
787
787
788
+ /// Whether we should encode MIR.
789
+ ///
790
+ /// Return a pair, resp. for CTFE and for LLVM.
791
+ fn should_encode_mir ( tcx : TyCtxt < ' _ > , def_id : LocalDefId ) -> ( bool , bool ) {
792
+ match tcx. def_kind ( def_id) {
793
+ // Constructors
794
+ DefKind :: Ctor ( _, _) => {
795
+ let mir_opt_base = tcx. sess . opts . output_types . should_codegen ( )
796
+ || tcx. sess . opts . debugging_opts . always_encode_mir ;
797
+ ( true , mir_opt_base)
798
+ }
799
+ // Constants
800
+ DefKind :: AnonConst | DefKind :: AssocConst | DefKind :: Static | DefKind :: Const => {
801
+ ( true , false )
802
+ }
803
+ // Closures and functions
804
+ DefKind :: Closure | DefKind :: AssocFn | DefKind :: Fn => {
805
+ let generics = tcx. generics_of ( def_id) ;
806
+ let needs_inline = ( generics. requires_monomorphization ( tcx)
807
+ || tcx. codegen_fn_attrs ( def_id) . requests_inline ( ) )
808
+ && tcx. sess . opts . output_types . should_codegen ( ) ;
809
+ // Only check the presence of the `const` modifier.
810
+ let is_const_fn = tcx. is_const_fn_raw ( def_id. to_def_id ( ) ) ;
811
+ let always_encode_mir = tcx. sess . opts . debugging_opts . always_encode_mir ;
812
+ ( is_const_fn, needs_inline || is_const_fn || always_encode_mir)
813
+ }
814
+ // Generators require optimized MIR to compute layout.
815
+ DefKind :: Generator => {
816
+ // Only check the presence of the `const` modifier.
817
+ let is_const_fn = tcx. is_const_fn_raw ( def_id. to_def_id ( ) ) ;
818
+ ( is_const_fn, true )
819
+ }
820
+ // The others don't have MIR.
821
+ _ => ( false , false ) ,
822
+ }
823
+ }
824
+
788
825
impl EncodeContext < ' a , ' tcx > {
789
826
fn encode_def_ids ( & mut self ) {
790
827
if self . is_proc_macro {
0 commit comments