@@ -568,124 +568,203 @@ impl FromStr for SplitDwarfKind {
568568    } 
569569} 
570570
571- #[ derive( Clone ,  Copy ,  PartialEq ,  Eq ,  Hash ,  Debug ,  PartialOrd ,  Ord ,  HashStable_Generic ) ]  
572- #[ derive( Encodable ,  Decodable ) ]  
573- pub  enum  OutputType  { 
574-     /// This is the optimized bitcode, which could be either pre-LTO or non-LTO bitcode, 
575-      /// depending on the specific request type. 
576-      Bitcode , 
577-     /// This is the summary or index data part of the ThinLTO bitcode. 
578-      ThinLinkBitcode , 
579-     Assembly , 
580-     LlvmAssembly , 
581-     Mir , 
582-     Metadata , 
583-     Object , 
584-     Exe , 
585-     DepInfo , 
586- } 
571+ macro_rules!  define_output_types { 
572+     ( 
573+         $( 
574+             $Variant: ident => { 
575+                 shorthand:  $shorthand: expr, 
576+                 extension:  $extension: expr, 
577+                 description:  $description: expr, 
578+                 default_filename:  $default_filename: expr, 
579+                 is_text:  $is_text: expr, 
580+                 compatible_with_cgus_and_single_output:  $compatible: expr
581+             } 
582+         ) ,*  $( , ) ?
583+     )  => { 
584+         #[ derive( Clone ,  Copy ,  PartialEq ,  Eq ,  Hash ,  Debug ,  PartialOrd ,  Ord ,  HashStable_Generic ) ] 
585+         #[ derive( Encodable ,  Decodable ) ] 
586+         pub  enum  OutputType  { 
587+             $( 
588+                 $Variant, 
589+             ) * 
590+         } 
587591
588- impl  StableOrd  for  OutputType  { 
589-     const  CAN_USE_UNSTABLE_SORT :  bool  = true ; 
590592
591-     // Trivial C-Style enums have a stable sort order across compilation sessions. 
592-     const  THIS_IMPLEMENTATION_HAS_BEEN_TRIPLE_CHECKED :  ( )  = ( ) ; 
593- } 
593+         impl  StableOrd  for  OutputType  { 
594+             const  CAN_USE_UNSTABLE_SORT :  bool  = true ; 
594595
595- impl < HCX :  HashStableContext >  ToStableHashKey < HCX >  for  OutputType  { 
596-     type  KeyType  = Self ; 
596+             // Trivial C-Style enums have a stable sort order across compilation sessions. 
597+             const  THIS_IMPLEMENTATION_HAS_BEEN_TRIPLE_CHECKED :  ( )  = ( ) ; 
598+         } 
597599
598-     fn  to_stable_hash_key ( & self ,  _:  & HCX )  -> Self :: KeyType  { 
599-         * self 
600-     } 
601- } 
600+         impl <HCX :  HashStableContext > ToStableHashKey <HCX > for  OutputType  { 
601+             type  KeyType  = Self ; 
602602
603- impl  OutputType  { 
604-     fn  is_compatible_with_codegen_units_and_single_output_file ( & self )  -> bool  { 
605-         match  * self  { 
606-             OutputType :: Exe  | OutputType :: DepInfo  | OutputType :: Metadata  => true , 
607-             OutputType :: Bitcode 
608-             | OutputType :: ThinLinkBitcode 
609-             | OutputType :: Assembly 
610-             | OutputType :: LlvmAssembly 
611-             | OutputType :: Mir 
612-             | OutputType :: Object  => false , 
603+             fn  to_stable_hash_key( & self ,  _:  & HCX )  -> Self :: KeyType  { 
604+                 * self 
605+             } 
613606        } 
614-     } 
615607
616-     pub  fn  shorthand ( & self )  -> & ' static  str  { 
617-         match  * self  { 
618-             OutputType :: Bitcode  => "llvm-bc" , 
619-             OutputType :: ThinLinkBitcode  => "thin-link-bitcode" , 
620-             OutputType :: Assembly  => "asm" , 
621-             OutputType :: LlvmAssembly  => "llvm-ir" , 
622-             OutputType :: Mir  => "mir" , 
623-             OutputType :: Object  => "obj" , 
624-             OutputType :: Metadata  => "metadata" , 
625-             OutputType :: Exe  => "link" , 
626-             OutputType :: DepInfo  => "dep-info" , 
627-         } 
628-     } 
629- 
630-     fn  from_shorthand ( shorthand :  & str )  -> Option < Self >  { 
631-         Some ( match  shorthand { 
632-             "asm"  => OutputType :: Assembly , 
633-             "llvm-ir"  => OutputType :: LlvmAssembly , 
634-             "mir"  => OutputType :: Mir , 
635-             "llvm-bc"  => OutputType :: Bitcode , 
636-             "thin-link-bitcode"  => OutputType :: ThinLinkBitcode , 
637-             "obj"  => OutputType :: Object , 
638-             "metadata"  => OutputType :: Metadata , 
639-             "link"  => OutputType :: Exe , 
640-             "dep-info"  => OutputType :: DepInfo , 
641-             _ => return  None , 
642-         } ) 
643-     } 
644608
645-     fn  shorthands_display ( )  -> String  { 
646-         format ! ( 
647-             "`{}`, `{}`, `{}`, `{}`, `{}`, `{}`, `{}`, `{}`, `{}`" , 
648-             OutputType :: Bitcode . shorthand( ) , 
649-             OutputType :: ThinLinkBitcode . shorthand( ) , 
650-             OutputType :: Assembly . shorthand( ) , 
651-             OutputType :: LlvmAssembly . shorthand( ) , 
652-             OutputType :: Mir . shorthand( ) , 
653-             OutputType :: Object . shorthand( ) , 
654-             OutputType :: Metadata . shorthand( ) , 
655-             OutputType :: Exe . shorthand( ) , 
656-             OutputType :: DepInfo . shorthand( ) , 
657-         ) 
658-     } 
609+         impl  OutputType  { 
610+             pub  fn  iter_all( )  -> impl  Iterator <Item  = OutputType > { 
611+                 static  ALL_VARIANTS :  & [ OutputType ]  = & [ 
612+                     $( 
613+                         OutputType :: $Variant, 
614+                     ) * 
615+                 ] ; 
616+                 ALL_VARIANTS . iter( ) . copied( ) 
617+             } 
618+ 
619+             fn  is_compatible_with_codegen_units_and_single_output_file( & self )  -> bool  { 
620+                 match  * self  { 
621+                     $( 
622+                         OutputType :: $Variant => $compatible, 
623+                     ) * 
624+                 } 
625+             } 
626+ 
627+             pub  fn  shorthand( & self )  -> & ' static  str  { 
628+                 match  * self  { 
629+                     $( 
630+                         OutputType :: $Variant => $shorthand, 
631+                     ) * 
632+                 } 
633+             } 
634+ 
635+             fn  from_shorthand( shorthand:  & str )  -> Option <Self > { 
636+                 match  shorthand { 
637+                     $( 
638+                         s if  s == $shorthand => Some ( OutputType :: $Variant) , 
639+                     ) * 
640+                     _ => None , 
641+                 } 
642+             } 
643+ 
644+             fn  shorthands_display( )  -> String  { 
645+                 let  shorthands = vec![ 
646+                     $( 
647+                         format!( "`{}`" ,  $shorthand) , 
648+                     ) * 
649+                 ] ; 
650+                 shorthands. join( ", " ) 
651+             } 
652+ 
653+             pub  fn  extension( & self )  -> & ' static  str  { 
654+                 match  * self  { 
655+                     $( 
656+                         OutputType :: $Variant => $extension, 
657+                     ) * 
658+                 } 
659+             } 
660+ 
661+             pub  fn  is_text_output( & self )  -> bool  { 
662+                 match  * self  { 
663+                     $( 
664+                         OutputType :: $Variant => $is_text, 
665+                     ) * 
666+                 } 
667+             } 
668+ 
669+             pub  fn  description( & self )  -> & ' static  str  { 
670+                 match  * self  { 
671+                     $( 
672+                         OutputType :: $Variant => $description, 
673+                     ) * 
674+                 } 
675+             } 
676+ 
677+             pub  fn  default_filename( & self )  -> & ' static  str  { 
678+                 match  * self  { 
679+                     $( 
680+                         OutputType :: $Variant => $default_filename, 
681+                     ) * 
682+                 } 
683+             } 
659684
660-     pub  fn  extension ( & self )  -> & ' static  str  { 
661-         match  * self  { 
662-             OutputType :: Bitcode  => "bc" , 
663-             OutputType :: ThinLinkBitcode  => "indexing.o" , 
664-             OutputType :: Assembly  => "s" , 
665-             OutputType :: LlvmAssembly  => "ll" , 
666-             OutputType :: Mir  => "mir" , 
667-             OutputType :: Object  => "o" , 
668-             OutputType :: Metadata  => "rmeta" , 
669-             OutputType :: DepInfo  => "d" , 
670-             OutputType :: Exe  => "" , 
671-         } 
672-     } 
673685
674-     pub  fn  is_text_output ( & self )  -> bool  { 
675-         match  * self  { 
676-             OutputType :: Assembly 
677-             | OutputType :: LlvmAssembly 
678-             | OutputType :: Mir 
679-             | OutputType :: DepInfo  => true , 
680-             OutputType :: Bitcode 
681-             | OutputType :: ThinLinkBitcode 
682-             | OutputType :: Object 
683-             | OutputType :: Metadata 
684-             | OutputType :: Exe  => false , 
685686        } 
686687    } 
687688} 
688689
690+ define_output_types !  { 
691+     // This is the optimized bitcode, which could be either pre-LTO or non-LTO bitcode, 
692+     // depending on the specific request type. 
693+     Bitcode  => { 
694+         shorthand:  "llvm-bc" , 
695+         extension:  "bc" , 
696+         description:  "Generates a binary file containing the LLVM bitcode" , 
697+         default_filename:  "CRATE_NAME.bc" , 
698+         is_text:  false , 
699+         compatible_with_cgus_and_single_output:  false 
700+     } , 
701+     // This is the summary or index data part of the ThinLTO bitcode. 
702+     ThinLinkBitcode  => { 
703+         shorthand:  "thin-link-bitcode" , 
704+         extension:  "indexing.o" , 
705+         description:  "Generates the ThinLTO summary as bitcode" , 
706+         default_filename:  "CRATE_NAME.indexing.o" , 
707+         is_text:  false , 
708+         compatible_with_cgus_and_single_output:  false 
709+     } , 
710+     Assembly  => { 
711+         shorthand:  "asm" , 
712+         extension:  "s" , 
713+         description:  "Generates a file with the crate's assembly code" , 
714+         default_filename:  "CRATE_NAME.s" , 
715+         is_text:  true , 
716+         compatible_with_cgus_and_single_output:  false 
717+     } , 
718+     LlvmAssembly  => { 
719+         shorthand:  "llvm-ir" , 
720+         extension:  "ll" , 
721+         description:  "Generates a file containing LLVM IR" , 
722+         default_filename:  "CRATE_NAME.ll" , 
723+         is_text:  true , 
724+         compatible_with_cgus_and_single_output:  false 
725+     } , 
726+     Mir  => { 
727+         shorthand:  "mir" , 
728+         extension:  "mir" , 
729+         description:  "Generates a file containing rustc's mid-level intermediate representation" , 
730+         default_filename:  "CRATE_NAME.mir" , 
731+         is_text:  true , 
732+         compatible_with_cgus_and_single_output:  false 
733+     } , 
734+     Object  => { 
735+         shorthand:  "obj" , 
736+         extension:  "o" , 
737+         description:  "Generates a native object file" , 
738+         default_filename:  "CRATE_NAME.o" , 
739+         is_text:  false , 
740+         compatible_with_cgus_and_single_output:  false 
741+     } , 
742+     Metadata  => { 
743+         shorthand:  "metadata" , 
744+         extension:  "rmeta" , 
745+         description:  "Generates a file containing metadata about the crate" , 
746+         default_filename:  "libCRATE_NAME.rmeta" , 
747+         is_text:  false , 
748+         compatible_with_cgus_and_single_output:  true 
749+     } , 
750+     Exe  => { 
751+         shorthand:  "link" , 
752+         extension:  "" , 
753+         description:  "Generates the crates specified by --crate-type. This is the default if --emit is not specified" , 
754+         default_filename:  "(platform and crate-type dependent)" , 
755+         is_text:  false , 
756+         compatible_with_cgus_and_single_output:  true 
757+     } , 
758+     DepInfo  => { 
759+         shorthand:  "dep-info" , 
760+         extension:  "d" , 
761+         description:  "Generates a file with Makefile syntax that indicates all the source files that were loaded to generate the crate" , 
762+         default_filename:  "CRATE_NAME.d" , 
763+         is_text:  true , 
764+         compatible_with_cgus_and_single_output:  true 
765+     } , 
766+ } 
767+ 
689768/// The type of diagnostics output to generate. 
690769#[ derive( Clone ,  Copy ,  Debug ,  PartialEq ,  Eq ,  Default ) ]  
691770pub  enum  ErrorOutputType  { 
@@ -1570,6 +1649,16 @@ static PRINT_HELP: LazyLock<String> = LazyLock::new(|| {
15701649    ) 
15711650} ) ; 
15721651
1652+ static  EMIT_HELP :  LazyLock < String >  = LazyLock :: new ( || { 
1653+     let  mut  result = String :: from ( "Each TYPE has a following default FILENAME:\n " ) ; 
1654+ 
1655+     for  output in  OutputType :: iter_all ( )  { 
1656+         result. push_str ( & format ! ( "*  {} - {}\n " ,  output. shorthand( ) ,  output. default_filename( ) ) ) ; 
1657+     } 
1658+ 
1659+     result
1660+ } ) ; 
1661+ 
15731662/// Returns all rustc command line options, including metadata for 
15741663/// each option, such as whether the option is stable. 
15751664pub  fn  rustc_optgroups ( )  -> Vec < RustcOptGroup >  { 
@@ -1616,14 +1705,7 @@ pub fn rustc_optgroups() -> Vec<RustcOptGroup> {
16161705        make_crate_type_option( ) , 
16171706        opt( Stable ,  Opt ,  "" ,  "crate-name" ,  "Specify the name of the crate being built" ,  "NAME" ) , 
16181707        opt( Stable ,  Opt ,  "" ,  "edition" ,  & EDITION_STRING ,  EDITION_NAME_LIST ) , 
1619-         opt( 
1620-             Stable , 
1621-             Multi , 
1622-             "" , 
1623-             "emit" , 
1624-             "Comma separated list of types of output for the compiler to emit" , 
1625-             "[asm|llvm-bc|llvm-ir|obj|metadata|link|dep-info|mir]" , 
1626-         ) , 
1708+         opt( Stable ,  Multi ,  "" ,  "emit" ,  & EMIT_HELP ,  "TYPE[=FILENAME]" ) , 
16271709        opt( Stable ,  Multi ,  "" ,  "print" ,  & PRINT_HELP ,  "INFO[=FILE]" ) , 
16281710        opt( Stable ,  FlagMulti ,  "g" ,  "" ,  "Equivalent to -C debuginfo=2" ,  "" ) , 
16291711        opt( Stable ,  FlagMulti ,  "O" ,  "" ,  "Equivalent to -C opt-level=3" ,  "" ) , 
0 commit comments