@@ -2350,6 +2350,11 @@ impl<D: Decoder> Decodable<D> for EncodedMetadata {
23502350
23512351#[ instrument( level = "trace" , skip( tcx) ) ]
23522352pub fn encode_metadata ( tcx : TyCtxt < ' _ > , path : & Path , ref_path : Option < & Path > ) {
2353+ // Since encoding metadata is not in a query, and nothing is cached,
2354+ // there's no need to do dep-graph tracking for any of it.
2355+ tcx. dep_graph . assert_ignored ( ) ;
2356+
2357+ // Generate the metadata stub manually, as that is a small file compared to full metadata.
23532358 if let Some ( ref_path) = ref_path {
23542359 let _prof_timer = tcx. prof . verbose_generic_activity ( "generate_crate_metadata_stub" ) ;
23552360
@@ -2362,11 +2367,14 @@ pub fn encode_metadata(tcx: TyCtxt<'_>, path: &Path, ref_path: Option<&Path>) {
23622367 is_stub : true ,
23632368 } ) ;
23642369 header. position . get ( )
2365- } ) ;
2370+ } )
23662371 }
23672372
2373+ let _prof_timer = tcx. prof . verbose_generic_activity ( "generate_crate_metadata" ) ;
2374+
23682375 let dep_node = tcx. metadata_dep_node ( ) ;
23692376
2377+ // If the metadata dep-node is green, try to reuse the saved work product.
23702378 if tcx. dep_graph . is_fully_enabled ( )
23712379 && let work_product_id = WorkProductId :: from_cgu_name ( "metadata" )
23722380 && let Some ( work_product) = tcx. dep_graph . previous_work_product ( & work_product_id)
@@ -2383,19 +2391,15 @@ pub fn encode_metadata(tcx: TyCtxt<'_>, path: &Path, ref_path: Option<&Path>) {
23832391 return ;
23842392 } ;
23852393
2386- let _prof_timer = tcx. prof . verbose_generic_activity ( "generate_crate_metadata" ) ;
2387-
2388- // Since encoding metadata is not in a query, and nothing is cached,
2389- // there's no need to do dep-graph tracking for any of it.
2390- tcx. dep_graph . assert_ignored ( ) ;
2391-
23922394 if tcx. sess . threads ( ) != 1 {
23932395 // Prefetch some queries used by metadata encoding.
23942396 // This is not necessary for correctness, but is only done for performance reasons.
23952397 // It can be removed if it turns out to cause trouble or be detrimental to performance.
23962398 join ( || prefetch_mir ( tcx) , || tcx. exported_symbols ( LOCAL_CRATE ) ) ;
23972399 }
23982400
2401+ // Perform metadata encoding inside a task, so the dep-graph can check if any encoded
2402+ // information changes, and maybe reuse the work product.
23992403 tcx. dep_graph . with_task (
24002404 dep_node,
24012405 tcx,
@@ -2416,7 +2420,7 @@ pub fn encode_metadata(tcx: TyCtxt<'_>, path: &Path, ref_path: Option<&Path>) {
24162420 ) ;
24172421
24182422 root. position . get ( )
2419- } ) ;
2423+ } )
24202424 } ,
24212425 None ,
24222426 ) ;
0 commit comments