Hex Artifact Content
Not logged in

Artifact 1516130cbc53506b0b1a61c836e5adc91b6b6ba4:


0000: 75 73 65 20 63 72 61 74 65 3a 3a 68 69 72 3a 3a  use crate::hir::
0010: 64 65 66 5f 69 64 3a 3a 7b 44 65 66 49 64 2c 20  def_id::{DefId, 
0020: 43 72 61 74 65 4e 75 6d 2c 20 4c 4f 43 41 4c 5f  CrateNum, LOCAL_
0030: 43 52 41 54 45 7d 3b 0a 75 73 65 20 63 72 61 74  CRATE};.use crat
0040: 65 3a 3a 68 69 72 3a 3a 48 69 72 49 64 3b 0a 75  e::hir::HirId;.u
0050: 73 65 20 73 79 6e 74 61 78 3a 3a 73 79 6d 62 6f  se syntax::symbo
0060: 6c 3a 3a 53 79 6d 62 6f 6c 3b 0a 75 73 65 20 73  l::Symbol;.use s
0070: 79 6e 74 61 78 3a 3a 61 74 74 72 3a 3a 49 6e 6c  yntax::attr::Inl
0080: 69 6e 65 41 74 74 72 3b 0a 75 73 65 20 73 79 6e  ineAttr;.use syn
0090: 74 61 78 3a 3a 73 6f 75 72 63 65 5f 6d 61 70 3a  tax::source_map:
00a0: 3a 53 70 61 6e 3b 0a 75 73 65 20 63 72 61 74 65  :Span;.use crate
00b0: 3a 3a 74 79 3a 3a 7b 49 6e 73 74 61 6e 63 65 2c  ::ty::{Instance,
00c0: 20 49 6e 73 74 61 6e 63 65 44 65 66 2c 20 54 79   InstanceDef, Ty
00d0: 43 74 78 74 2c 20 53 79 6d 62 6f 6c 4e 61 6d 65  Ctxt, SymbolName
00e0: 2c 20 73 75 62 73 74 3a 3a 49 6e 74 65 72 6e 61  , subst::Interna
00f0: 6c 53 75 62 73 74 73 7d 3b 0a 75 73 65 20 63 72  lSubsts};.use cr
0100: 61 74 65 3a 3a 75 74 69 6c 3a 3a 6e 6f 64 65 6d  ate::util::nodem
0110: 61 70 3a 3a 46 78 48 61 73 68 4d 61 70 3b 0a 75  ap::FxHashMap;.u
0120: 73 65 20 63 72 61 74 65 3a 3a 74 79 3a 3a 70 72  se crate::ty::pr
0130: 69 6e 74 3a 3a 6f 62 73 6f 6c 65 74 65 3a 3a 44  int::obsolete::D
0140: 65 66 50 61 74 68 42 61 73 65 64 4e 61 6d 65 73  efPathBasedNames
0150: 3b 0a 75 73 65 20 63 72 61 74 65 3a 3a 64 65 70  ;.use crate::dep
0160: 5f 67 72 61 70 68 3a 3a 7b 57 6f 72 6b 50 72 6f  _graph::{WorkPro
0170: 64 75 63 74 49 64 2c 20 44 65 70 4e 6f 64 65 2c  ductId, DepNode,
0180: 20 57 6f 72 6b 50 72 6f 64 75 63 74 2c 20 44 65   WorkProduct, De
0190: 70 43 6f 6e 73 74 72 75 63 74 6f 72 7d 3b 0a 75  pConstructor};.u
01a0: 73 65 20 72 75 73 74 63 5f 64 61 74 61 5f 73 74  se rustc_data_st
01b0: 72 75 63 74 75 72 65 73 3a 3a 62 61 73 65 5f 6e  ructures::base_n
01c0: 3b 0a 75 73 65 20 72 75 73 74 63 5f 64 61 74 61  ;.use rustc_data
01d0: 5f 73 74 72 75 63 74 75 72 65 73 3a 3a 73 74 61  _structures::sta
01e0: 62 6c 65 5f 68 61 73 68 65 72 3a 3a 7b 48 61 73  ble_hasher::{Has
01f0: 68 53 74 61 62 6c 65 2c 20 53 74 61 62 6c 65 48  hStable, StableH
0200: 61 73 68 65 72 7d 3b 0a 75 73 65 20 63 72 61 74  asher};.use crat
0210: 65 3a 3a 69 63 68 3a 3a 7b 46 69 6e 67 65 72 70  e::ich::{Fingerp
0220: 72 69 6e 74 2c 20 53 74 61 62 6c 65 48 61 73 68  rint, StableHash
0230: 69 6e 67 43 6f 6e 74 65 78 74 2c 20 4e 6f 64 65  ingContext, Node
0240: 49 64 48 61 73 68 69 6e 67 4d 6f 64 65 7d 3b 0a  IdHashingMode};.
0250: 75 73 65 20 63 72 61 74 65 3a 3a 73 65 73 73 69  use crate::sessi
0260: 6f 6e 3a 3a 63 6f 6e 66 69 67 3a 3a 4f 70 74 4c  on::config::OptL
0270: 65 76 65 6c 3b 0a 75 73 65 20 73 74 64 3a 3a 66  evel;.use std::f
0280: 6d 74 3b 0a 75 73 65 20 73 74 64 3a 3a 68 61 73  mt;.use std::has
0290: 68 3a 3a 48 61 73 68 3b 0a 0a 2f 2f 2f 20 44 65  h::Hash;../// De
02a0: 73 63 72 69 62 65 73 20 68 6f 77 20 61 20 6d 6f  scribes how a mo
02b0: 6e 6f 6d 6f 72 70 68 69 7a 61 74 69 6f 6e 20 77  nomorphization w
02c0: 69 6c 6c 20 62 65 20 69 6e 73 74 61 6e 74 69 61  ill be instantia
02d0: 74 65 64 20 69 6e 20 6f 62 6a 65 63 74 20 66 69  ted in object fi
02e0: 6c 65 73 2e 0a 23 5b 64 65 72 69 76 65 28 50 61  les..#[derive(Pa
02f0: 72 74 69 61 6c 45 71 29 5d 0a 70 75 62 20 65 6e  rtialEq)].pub en
0300: 75 6d 20 49 6e 73 74 61 6e 74 69 61 74 69 6f 6e  um Instantiation
0310: 4d 6f 64 65 20 7b 0a 20 20 20 20 2f 2f 2f 20 54  Mode {.    /// T
0320: 68 65 72 65 20 77 69 6c 6c 20 62 65 20 65 78 61  here will be exa
0330: 63 74 6c 79 20 6f 6e 65 20 69 6e 73 74 61 6e 63  ctly one instanc
0340: 65 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 4d  e of the given M
0350: 6f 6e 6f 49 74 65 6d 2e 20 49 74 20 77 69 6c 6c  onoItem. It will
0360: 20 68 61 76 65 0a 20 20 20 20 2f 2f 2f 20 65 78   have.    /// ex
0370: 74 65 72 6e 61 6c 20 6c 69 6e 6b 61 67 65 20 73  ternal linkage s
0380: 6f 20 74 68 61 74 20 69 74 20 63 61 6e 20 62 65  o that it can be
0390: 20 6c 69 6e 6b 65 64 20 74 6f 20 66 72 6f 6d 20   linked to from 
03a0: 6f 74 68 65 72 20 63 6f 64 65 67 65 6e 20 75 6e  other codegen un
03b0: 69 74 73 2e 0a 20 20 20 20 47 6c 6f 62 61 6c 6c  its..    Globall
03c0: 79 53 68 61 72 65 64 20 7b 0a 20 20 20 20 20 20  yShared {.      
03d0: 20 20 2f 2f 2f 20 49 6e 20 73 6f 6d 65 20 63 6f    /// In some co
03e0: 6d 70 69 6c 61 74 69 6f 6e 20 73 63 65 6e 61 72  mpilation scenar
03f0: 69 6f 73 20 77 65 20 6d 61 79 20 64 65 63 69 64  ios we may decid
0400: 65 20 74 6f 20 74 61 6b 65 20 66 75 6e 63 74 69  e to take functi
0410: 6f 6e 73 20 74 68 61 74 0a 20 20 20 20 20 20 20  ons that.       
0420: 20 2f 2f 2f 20 61 72 65 20 74 79 70 69 63 61 6c   /// are typical
0430: 6c 79 20 60 4c 6f 63 61 6c 43 6f 70 79 60 20 61  ly `LocalCopy` a
0440: 6e 64 20 69 6e 73 74 65 61 64 20 6d 6f 76 65 20  nd instead move 
0450: 74 68 65 6d 20 74 6f 20 60 47 6c 6f 62 61 6c 6c  them to `Globall
0460: 79 53 68 61 72 65 64 60 0a 20 20 20 20 20 20 20  yShared`.       
0470: 20 2f 2f 2f 20 74 6f 20 61 76 6f 69 64 20 63 6f   /// to avoid co
0480: 64 65 67 65 6e 6e 69 6e 67 20 74 68 65 6d 20 61  degenning them a
0490: 20 62 75 6e 63 68 20 6f 66 20 74 69 6d 65 73 2e   bunch of times.
04a0: 20 49 6e 20 74 68 69 73 20 73 69 74 75 61 74 69   In this situati
04b0: 6f 6e 2c 0a 20 20 20 20 20 20 20 20 2f 2f 2f 20  on,.        /// 
04c0: 68 6f 77 65 76 65 72 2c 20 6f 75 72 20 6c 6f 63  however, our loc
04d0: 61 6c 20 63 6f 70 79 20 6d 61 79 20 63 6f 6e 66  al copy may conf
04e0: 6c 69 63 74 20 77 69 74 68 20 6f 74 68 65 72 20  lict with other 
04f0: 63 72 61 74 65 73 20 61 6c 73 6f 0a 20 20 20 20  crates also.    
0500: 20 20 20 20 2f 2f 2f 20 69 6e 6c 69 6e 69 6e 67      /// inlining
0510: 20 74 68 65 20 73 61 6d 65 20 66 75 6e 63 74 69   the same functi
0520: 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2f 2f 2f 0a  on..        ///.
0530: 20 20 20 20 20 20 20 20 2f 2f 2f 20 54 68 69 73          /// This
0540: 20 66 6c 61 67 20 69 6e 64 69 63 61 74 65 73 20   flag indicates 
0550: 74 68 61 74 20 74 68 69 73 20 73 69 74 75 61 74  that this situat
0560: 69 6f 6e 20 69 73 20 6f 63 63 75 72 72 69 6e 67  ion is occurring
0570: 2c 20 61 6e 64 20 69 6e 66 6f 72 6d 73 0a 20 20  , and informs.  
0580: 20 20 20 20 20 20 2f 2f 2f 20 73 79 6d 62 6f 6c        /// symbol
0590: 20 6e 61 6d 65 20 63 61 6c 63 75 6c 61 74 69 6f   name calculatio
05a0: 6e 20 74 68 61 74 20 73 6f 6d 65 20 65 78 74 72  n that some extr
05b0: 61 20 6d 61 6e 67 6c 69 6e 67 20 69 73 20 6e 65  a mangling is ne
05c0: 65 64 65 64 20 74 6f 0a 20 20 20 20 20 20 20 20  eded to.        
05d0: 2f 2f 2f 20 61 76 6f 69 64 20 63 6f 6e 66 6c 69  /// avoid confli
05e0: 63 74 73 2e 20 4e 6f 74 65 20 74 68 61 74 20 74  cts. Note that t
05f0: 68 69 73 20 6d 61 79 20 65 76 65 6e 74 75 61 6c  his may eventual
0600: 6c 79 20 67 6f 20 61 77 61 79 20 65 6e 74 69 72  ly go away entir
0610: 65 6c 79 20 69 66 0a 20 20 20 20 20 20 20 20 2f  ely if.        /
0620: 2f 2f 20 54 68 69 6e 4c 54 4f 20 65 6e 61 62 6c  // ThinLTO enabl
0630: 65 73 20 75 73 20 74 6f 20 2a 61 6c 77 61 79 73  es us to *always
0640: 2a 20 68 61 76 65 20 61 20 67 6c 6f 62 61 6c 6c  * have a globall
0650: 79 20 73 68 61 72 65 64 20 69 6e 73 74 61 6e 63  y shared instanc
0660: 65 20 6f 66 20 61 0a 20 20 20 20 20 20 20 20 2f  e of a.        /
0670: 2f 2f 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68  // function with
0680: 69 6e 20 6f 6e 65 20 63 72 61 74 65 27 73 20 63  in one crate's c
0690: 6f 6d 70 69 6c 61 74 69 6f 6e 2e 0a 20 20 20 20  ompilation..    
06a0: 20 20 20 20 6d 61 79 5f 63 6f 6e 66 6c 69 63 74      may_conflict
06b0: 3a 20 62 6f 6f 6c 2c 0a 20 20 20 20 7d 2c 0a 0a  : bool,.    },..
06c0: 20 20 20 20 2f 2f 2f 20 45 61 63 68 20 63 6f 64      /// Each cod
06d0: 65 67 65 6e 20 75 6e 69 74 20 63 6f 6e 74 61 69  egen unit contai
06e0: 6e 69 6e 67 20 61 20 72 65 66 65 72 65 6e 63 65  ning a reference
06f0: 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20 4d 6f   to the given Mo
0700: 6e 6f 49 74 65 6d 20 77 69 6c 6c 0a 20 20 20 20  noItem will.    
0710: 2f 2f 2f 20 68 61 76 65 20 69 74 73 20 6f 77 6e  /// have its own
0720: 20 70 72 69 76 61 74 65 20 63 6f 70 79 20 6f 66   private copy of
0730: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 28 77   the function (w
0740: 69 74 68 20 69 6e 74 65 72 6e 61 6c 20 6c 69 6e  ith internal lin
0750: 6b 61 67 65 29 2e 0a 20 20 20 20 4c 6f 63 61 6c  kage)..    Local
0760: 43 6f 70 79 2c 0a 7d 0a 0a 23 5b 64 65 72 69 76  Copy,.}..#[deriv
0770: 65 28 50 61 72 74 69 61 6c 45 71 2c 20 45 71 2c  e(PartialEq, Eq,
0780: 20 43 6c 6f 6e 65 2c 20 43 6f 70 79 2c 20 44 65   Clone, Copy, De
0790: 62 75 67 2c 20 48 61 73 68 29 5d 0a 70 75 62 20  bug, Hash)].pub 
07a0: 65 6e 75 6d 20 4d 6f 6e 6f 49 74 65 6d 3c 27 74  enum MonoItem<'t
07b0: 63 78 3e 20 7b 0a 20 20 20 20 46 6e 28 49 6e 73  cx> {.    Fn(Ins
07c0: 74 61 6e 63 65 3c 27 74 63 78 3e 29 2c 0a 20 20  tance<'tcx>),.  
07d0: 20 20 53 74 61 74 69 63 28 44 65 66 49 64 29 2c    Static(DefId),
07e0: 0a 20 20 20 20 47 6c 6f 62 61 6c 41 73 6d 28 48  .    GlobalAsm(H
07f0: 69 72 49 64 29 2c 0a 7d 0a 0a 69 6d 70 6c 3c 27  irId),.}..impl<'
0800: 74 63 78 3e 20 4d 6f 6e 6f 49 74 65 6d 3c 27 74  tcx> MonoItem<'t
0810: 63 78 3e 20 7b 0a 20 20 20 20 70 75 62 20 66 6e  cx> {.    pub fn
0820: 20 73 69 7a 65 5f 65 73 74 69 6d 61 74 65 28 26   size_estimate(&
0830: 73 65 6c 66 2c 20 74 63 78 3a 20 54 79 43 74 78  self, tcx: TyCtx
0840: 74 3c 27 74 63 78 3e 29 20 2d 3e 20 75 73 69 7a  t<'tcx>) -> usiz
0850: 65 20 7b 0a 20 20 20 20 20 20 20 20 6d 61 74 63  e {.        matc
0860: 68 20 2a 73 65 6c 66 20 7b 0a 20 20 20 20 20 20  h *self {.      
0870: 20 20 20 20 20 20 4d 6f 6e 6f 49 74 65 6d 3a 3a        MonoItem::
0880: 46 6e 28 69 6e 73 74 61 6e 63 65 29 20 3d 3e 20  Fn(instance) => 
0890: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
08a0: 20 20 2f 2f 20 45 73 74 69 6d 61 74 65 20 74 68    // Estimate th
08b0: 65 20 73 69 7a 65 20 6f 66 20 61 20 66 75 6e 63  e size of a func
08c0: 74 69 6f 6e 20 62 61 73 65 64 20 6f 6e 20 68 6f  tion based on ho
08d0: 77 20 6d 61 6e 79 20 73 74 61 74 65 6d 65 6e 74  w many statement
08e0: 73 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s.              
08f0: 20 20 2f 2f 20 69 74 20 63 6f 6e 74 61 69 6e 73    // it contains
0900: 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
0910: 20 20 74 63 78 2e 69 6e 73 74 61 6e 63 65 5f 64    tcx.instance_d
0920: 65 66 5f 73 69 7a 65 5f 65 73 74 69 6d 61 74 65  ef_size_estimate
0930: 28 69 6e 73 74 61 6e 63 65 2e 64 65 66 29 0a 20  (instance.def). 
0940: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
0950: 20 20 20 20 20 20 20 20 20 20 2f 2f 20 43 6f 6e            // Con
0960: 73 65 72 76 61 74 69 76 65 6c 79 20 65 73 74 69  servatively esti
0970: 6d 61 74 65 20 74 68 65 20 73 69 7a 65 20 6f 66  mate the size of
0980: 20 61 20 73 74 61 74 69 63 20 64 65 63 6c 61 72   a static declar
0990: 61 74 69 6f 6e 0a 20 20 20 20 20 20 20 20 20 20  ation.          
09a0: 20 20 2f 2f 20 6f 72 20 61 73 73 65 6d 62 6c 79    // or assembly
09b0: 20 74 6f 20 62 65 20 31 2e 0a 20 20 20 20 20 20   to be 1..      
09c0: 20 20 20 20 20 20 4d 6f 6e 6f 49 74 65 6d 3a 3a        MonoItem::
09d0: 53 74 61 74 69 63 28 5f 29 20 7c 0a 20 20 20 20  Static(_) |.    
09e0: 20 20 20 20 20 20 20 20 4d 6f 6e 6f 49 74 65 6d          MonoItem
09f0: 3a 3a 47 6c 6f 62 61 6c 41 73 6d 28 5f 29 20 3d  ::GlobalAsm(_) =
0a00: 3e 20 31 2c 0a 20 20 20 20 20 20 20 20 7d 0a 20  > 1,.        }. 
0a10: 20 20 20 7d 0a 0a 20 20 20 20 70 75 62 20 66 6e     }..    pub fn
0a20: 20 69 73 5f 67 65 6e 65 72 69 63 5f 66 6e 28 26   is_generic_fn(&
0a30: 73 65 6c 66 29 20 2d 3e 20 62 6f 6f 6c 20 7b 0a  self) -> bool {.
0a40: 20 20 20 20 20 20 20 20 6d 61 74 63 68 20 2a 73          match *s
0a50: 65 6c 66 20 7b 0a 20 20 20 20 20 20 20 20 20 20  elf {.          
0a60: 20 20 4d 6f 6e 6f 49 74 65 6d 3a 3a 46 6e 28 72    MonoItem::Fn(r
0a70: 65 66 20 69 6e 73 74 61 6e 63 65 29 20 3d 3e 20  ef instance) => 
0a80: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
0a90: 20 20 69 6e 73 74 61 6e 63 65 2e 73 75 62 73 74    instance.subst
0aa0: 73 2e 6e 6f 6e 5f 65 72 61 73 61 62 6c 65 5f 67  s.non_erasable_g
0ab0: 65 6e 65 72 69 63 73 28 29 2e 6e 65 78 74 28 29  enerics().next()
0ac0: 2e 69 73 5f 73 6f 6d 65 28 29 0a 20 20 20 20 20  .is_some().     
0ad0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
0ae0: 20 20 20 20 20 4d 6f 6e 6f 49 74 65 6d 3a 3a 53       MonoItem::S
0af0: 74 61 74 69 63 28 2e 2e 29 20 7c 0a 20 20 20 20  tatic(..) |.    
0b00: 20 20 20 20 20 20 20 20 4d 6f 6e 6f 49 74 65 6d          MonoItem
0b10: 3a 3a 47 6c 6f 62 61 6c 41 73 6d 28 2e 2e 29 20  ::GlobalAsm(..) 
0b20: 3d 3e 20 66 61 6c 73 65 2c 0a 20 20 20 20 20 20  => false,.      
0b30: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70    }.    }..    p
0b40: 75 62 20 66 6e 20 73 79 6d 62 6f 6c 5f 6e 61 6d  ub fn symbol_nam
0b50: 65 28 26 73 65 6c 66 2c 20 74 63 78 3a 20 54 79  e(&self, tcx: Ty
0b60: 43 74 78 74 3c 27 74 63 78 3e 29 20 2d 3e 20 53  Ctxt<'tcx>) -> S
0b70: 79 6d 62 6f 6c 4e 61 6d 65 20 7b 0a 20 20 20 20  ymbolName {.    
0b80: 20 20 20 20 6d 61 74 63 68 20 2a 73 65 6c 66 20      match *self 
0b90: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 4d 6f  {.            Mo
0ba0: 6e 6f 49 74 65 6d 3a 3a 46 6e 28 69 6e 73 74 61  noItem::Fn(insta
0bb0: 6e 63 65 29 20 3d 3e 20 74 63 78 2e 73 79 6d 62  nce) => tcx.symb
0bc0: 6f 6c 5f 6e 61 6d 65 28 69 6e 73 74 61 6e 63 65  ol_name(instance
0bd0: 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 4d  ),.            M
0be0: 6f 6e 6f 49 74 65 6d 3a 3a 53 74 61 74 69 63 28  onoItem::Static(
0bf0: 64 65 66 5f 69 64 29 20 3d 3e 20 7b 0a 20 20 20  def_id) => {.   
0c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 63 78               tcx
0c10: 2e 73 79 6d 62 6f 6c 5f 6e 61 6d 65 28 49 6e 73  .symbol_name(Ins
0c20: 74 61 6e 63 65 3a 3a 6d 6f 6e 6f 28 74 63 78 2c  tance::mono(tcx,
0c30: 20 64 65 66 5f 69 64 29 29 0a 20 20 20 20 20 20   def_id)).      
0c40: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
0c50: 20 20 20 20 4d 6f 6e 6f 49 74 65 6d 3a 3a 47 6c      MonoItem::Gl
0c60: 6f 62 61 6c 41 73 6d 28 68 69 72 5f 69 64 29 20  obalAsm(hir_id) 
0c70: 3d 3e 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  => {.           
0c80: 20 20 20 20 20 6c 65 74 20 64 65 66 5f 69 64 20       let def_id 
0c90: 3d 20 74 63 78 2e 68 69 72 28 29 2e 6c 6f 63 61  = tcx.hir().loca
0ca0: 6c 5f 64 65 66 5f 69 64 28 68 69 72 5f 69 64 29  l_def_id(hir_id)
0cb0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
0cc0: 20 20 53 79 6d 62 6f 6c 4e 61 6d 65 20 7b 0a 20    SymbolName {. 
0cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ce0: 20 20 20 6e 61 6d 65 3a 20 53 79 6d 62 6f 6c 3a     name: Symbol:
0cf0: 3a 69 6e 74 65 72 6e 28 26 66 6f 72 6d 61 74 21  :intern(&format!
0d00: 28 22 67 6c 6f 62 61 6c 5f 61 73 6d 5f 7b 3a 3f  ("global_asm_{:?
0d10: 7d 22 2c 20 64 65 66 5f 69 64 29 29 0a 20 20 20  }", def_id)).   
0d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
0d30: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
0d40: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
0d50: 20 20 70 75 62 20 66 6e 20 69 6e 73 74 61 6e 74    pub fn instant
0d60: 69 61 74 69 6f 6e 5f 6d 6f 64 65 28 26 73 65 6c  iation_mode(&sel
0d70: 66 2c 20 74 63 78 3a 20 54 79 43 74 78 74 3c 27  f, tcx: TyCtxt<'
0d80: 74 63 78 3e 29 20 2d 3e 20 49 6e 73 74 61 6e 74  tcx>) -> Instant
0d90: 69 61 74 69 6f 6e 4d 6f 64 65 20 7b 0a 20 20 20  iationMode {.   
0da0: 20 20 20 20 20 6c 65 74 20 69 6e 6c 69 6e 65 5f       let inline_
0db0: 69 6e 5f 61 6c 6c 5f 63 67 75 73 20 3d 0a 20 20  in_all_cgus =.  
0dc0: 20 20 20 20 20 20 20 20 20 20 74 63 78 2e 73 65            tcx.se
0dd0: 73 73 2e 6f 70 74 73 2e 64 65 62 75 67 67 69 6e  ss.opts.debuggin
0de0: 67 5f 6f 70 74 73 2e 69 6e 6c 69 6e 65 5f 69 6e  g_opts.inline_in
0df0: 5f 61 6c 6c 5f 63 67 75 73 2e 75 6e 77 72 61 70  _all_cgus.unwrap
0e00: 5f 6f 72 5f 65 6c 73 65 28 7c 7c 20 7b 0a 20 20  _or_else(|| {.  
0e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 63                tc
0e20: 78 2e 73 65 73 73 2e 6f 70 74 73 2e 6f 70 74 69  x.sess.opts.opti
0e30: 6d 69 7a 65 20 21 3d 20 4f 70 74 4c 65 76 65 6c  mize != OptLevel
0e40: 3a 3a 4e 6f 0a 20 20 20 20 20 20 20 20 20 20 20  ::No.           
0e50: 20 7d 29 20 26 26 20 21 74 63 78 2e 73 65 73 73   }) && !tcx.sess
0e60: 2e 6f 70 74 73 2e 63 67 2e 6c 69 6e 6b 5f 64 65  .opts.cg.link_de
0e70: 61 64 5f 63 6f 64 65 3b 0a 0a 20 20 20 20 20 20  ad_code;..      
0e80: 20 20 6d 61 74 63 68 20 2a 73 65 6c 66 20 7b 0a    match *self {.
0e90: 20 20 20 20 20 20 20 20 20 20 20 20 4d 6f 6e 6f              Mono
0ea0: 49 74 65 6d 3a 3a 46 6e 28 72 65 66 20 69 6e 73  Item::Fn(ref ins
0eb0: 74 61 6e 63 65 29 20 3d 3e 20 7b 0a 20 20 20 20  tance) => {.    
0ec0: 20 20 20 20 20 20 20 20 20 20 20 20 6c 65 74 20              let 
0ed0: 65 6e 74 72 79 5f 64 65 66 5f 69 64 20 3d 20 74  entry_def_id = t
0ee0: 63 78 2e 65 6e 74 72 79 5f 66 6e 28 4c 4f 43 41  cx.entry_fn(LOCA
0ef0: 4c 5f 43 52 41 54 45 29 2e 6d 61 70 28 7c 28 69  L_CRATE).map(|(i
0f00: 64 2c 20 5f 29 7c 20 69 64 29 3b 0a 20 20 20 20  d, _)| id);.    
0f10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 49              // I
0f20: 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  f this function 
0f30: 69 73 6e 27 74 20 69 6e 6c 69 6e 65 64 20 6f 72  isn't inlined or
0f40: 20 6f 74 68 65 72 77 69 73 65 20 68 61 73 20 65   otherwise has e
0f50: 78 70 6c 69 63 69 74 0a 20 20 20 20 20 20 20 20  xplicit.        
0f60: 20 20 20 20 20 20 20 20 2f 2f 20 6c 69 6e 6b 61          // linka
0f70: 67 65 2c 20 74 68 65 6e 20 77 65 27 6c 6c 20 62  ge, then we'll b
0f80: 65 20 63 72 65 61 74 69 6e 67 20 61 20 67 6c 6f  e creating a glo
0f90: 62 61 6c 6c 79 20 73 68 61 72 65 64 20 76 65 72  bally shared ver
0fa0: 73 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20 20 20  sion..          
0fb0: 20 20 20 20 20 20 69 66 20 73 65 6c 66 2e 65 78        if self.ex
0fc0: 70 6c 69 63 69 74 5f 6c 69 6e 6b 61 67 65 28 74  plicit_linkage(t
0fd0: 63 78 29 2e 69 73 5f 73 6f 6d 65 28 29 20 7c 7c  cx).is_some() ||
0fe0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
0ff0: 20 20 20 20 20 21 69 6e 73 74 61 6e 63 65 2e 64       !instance.d
1000: 65 66 2e 72 65 71 75 69 72 65 73 5f 6c 6f 63 61  ef.requires_loca
1010: 6c 28 74 63 78 29 20 7c 7c 0a 20 20 20 20 20 20  l(tcx) ||.      
1020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 6f                So
1030: 6d 65 28 69 6e 73 74 61 6e 63 65 2e 64 65 66 5f  me(instance.def_
1040: 69 64 28 29 29 20 3d 3d 20 65 6e 74 72 79 5f 64  id()) == entry_d
1050: 65 66 5f 69 64 0a 20 20 20 20 20 20 20 20 20 20  ef_id.          
1060: 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
1070: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
1080: 72 6e 20 49 6e 73 74 61 6e 74 69 61 74 69 6f 6e  rn Instantiation
1090: 4d 6f 64 65 3a 3a 47 6c 6f 62 61 6c 6c 79 53 68  Mode::GloballySh
10a0: 61 72 65 64 20 20 7b 20 6d 61 79 5f 63 6f 6e 66  ared  { may_conf
10b0: 6c 69 63 74 3a 20 66 61 6c 73 65 20 7d 0a 20 20  lict: false }.  
10c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
10d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
10e0: 20 2f 2f 20 41 74 20 74 68 69 73 20 70 6f 69 6e   // At this poin
10f0: 74 20 77 65 20 64 6f 6e 27 74 20 68 61 76 65 20  t we don't have 
1100: 65 78 70 6c 69 63 69 74 20 6c 69 6e 6b 61 67 65  explicit linkage
1110: 20 61 6e 64 20 77 65 27 72 65 20 61 6e 0a 20 20   and we're an.  
1120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f                //
1130: 20 69 6e 6c 69 6e 65 64 20 66 75 6e 63 74 69 6f   inlined functio
1140: 6e 2e 20 49 66 20 77 65 27 72 65 20 69 6e 6c 69  n. If we're inli
1150: 6e 69 6e 67 20 69 6e 74 6f 20 61 6c 6c 20 43 47  ning into all CG
1160: 55 73 20 74 68 65 6e 20 77 65 27 6c 6c 0a 20 20  Us then we'll.  
1170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f                //
1180: 20 62 65 20 63 72 65 61 74 69 6e 67 20 61 20 6c   be creating a l
1190: 6f 63 61 6c 20 63 6f 70 79 20 70 65 72 20 43 47  ocal copy per CG
11a0: 55 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  U.              
11b0: 20 20 69 66 20 69 6e 6c 69 6e 65 5f 69 6e 5f 61    if inline_in_a
11c0: 6c 6c 5f 63 67 75 73 20 7b 0a 20 20 20 20 20 20  ll_cgus {.      
11d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
11e0: 74 75 72 6e 20 49 6e 73 74 61 6e 74 69 61 74 69  turn Instantiati
11f0: 6f 6e 4d 6f 64 65 3a 3a 4c 6f 63 61 6c 43 6f 70  onMode::LocalCop
1200: 79 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y.              
1210: 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
1220: 20 20 20 20 20 2f 2f 20 46 69 6e 61 6c 6c 79 2c       // Finally,
1230: 20 69 66 20 74 68 69 73 20 69 73 20 60 23 5b 69   if this is `#[i
1240: 6e 6c 69 6e 65 28 61 6c 77 61 79 73 29 5d 60 20  nline(always)]` 
1250: 77 65 27 72 65 20 73 75 72 65 20 74 6f 20 72 65  we're sure to re
1260: 73 70 65 63 74 0a 20 20 20 20 20 20 20 20 20 20  spect.          
1270: 20 20 20 20 20 20 2f 2f 20 74 68 61 74 20 77 69        // that wi
1280: 74 68 20 61 6e 20 69 6e 6c 69 6e 65 20 63 6f 70  th an inline cop
1290: 79 20 70 65 72 20 43 47 55 2c 20 62 75 74 20 6f  y per CGU, but o
12a0: 74 68 65 72 77 69 73 65 20 77 65 27 6c 6c 20 62  therwise we'll b
12b0: 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e.              
12c0: 20 20 2f 2f 20 63 72 65 61 74 69 6e 67 20 6f 6e    // creating on
12d0: 65 20 63 6f 70 79 20 6f 66 20 74 68 69 73 20 60  e copy of this `
12e0: 23 5b 69 6e 6c 69 6e 65 5d 60 20 66 75 6e 63 74  #[inline]` funct
12f0: 69 6f 6e 20 77 68 69 63 68 20 6d 61 79 0a 20 20  ion which may.  
1300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f                //
1310: 20 63 6f 6e 66 6c 69 63 74 20 77 69 74 68 20 75   conflict with u
1320: 70 73 74 72 65 61 6d 20 63 72 61 74 65 73 20 61  pstream crates a
1330: 73 20 69 74 20 63 6f 75 6c 64 20 62 65 20 61 6e  s it could be an
1340: 20 65 78 70 6f 72 74 65 64 0a 20 20 20 20 20 20   exported.      
1350: 20 20 20 20 20 20 20 20 20 20 2f 2f 20 73 79 6d            // sym
1360: 62 6f 6c 2e 0a 20 20 20 20 20 20 20 20 20 20 20  bol..           
1370: 20 20 20 20 20 6d 61 74 63 68 20 74 63 78 2e 63       match tcx.c
1380: 6f 64 65 67 65 6e 5f 66 6e 5f 61 74 74 72 73 28  odegen_fn_attrs(
1390: 69 6e 73 74 61 6e 63 65 2e 64 65 66 5f 69 64 28  instance.def_id(
13a0: 29 29 2e 69 6e 6c 69 6e 65 20 7b 0a 20 20 20 20  )).inline {.    
13b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13c0: 49 6e 6c 69 6e 65 41 74 74 72 3a 3a 41 6c 77 61  InlineAttr::Alwa
13d0: 79 73 20 3d 3e 20 49 6e 73 74 61 6e 74 69 61 74  ys => Instantiat
13e0: 69 6f 6e 4d 6f 64 65 3a 3a 4c 6f 63 61 6c 43 6f  ionMode::LocalCo
13f0: 70 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  py,.            
1400: 20 20 20 20 20 20 20 20 5f 20 3d 3e 20 7b 0a 20          _ => {. 
1410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1420: 20 20 20 20 20 20 20 49 6e 73 74 61 6e 74 69 61         Instantia
1430: 74 69 6f 6e 4d 6f 64 65 3a 3a 47 6c 6f 62 61 6c  tionMode::Global
1440: 6c 79 53 68 61 72 65 64 20 20 7b 20 6d 61 79 5f  lyShared  { may_
1450: 63 6f 6e 66 6c 69 63 74 3a 20 74 72 75 65 20 7d  conflict: true }
1460: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1470: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1480: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1490: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
14a0: 20 20 20 4d 6f 6e 6f 49 74 65 6d 3a 3a 53 74 61     MonoItem::Sta
14b0: 74 69 63 28 2e 2e 29 20 7c 0a 20 20 20 20 20 20  tic(..) |.      
14c0: 20 20 20 20 20 20 4d 6f 6e 6f 49 74 65 6d 3a 3a        MonoItem::
14d0: 47 6c 6f 62 61 6c 41 73 6d 28 2e 2e 29 20 3d 3e  GlobalAsm(..) =>
14e0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
14f0: 20 20 20 49 6e 73 74 61 6e 74 69 61 74 69 6f 6e     Instantiation
1500: 4d 6f 64 65 3a 3a 47 6c 6f 62 61 6c 6c 79 53 68  Mode::GloballySh
1510: 61 72 65 64 20 7b 20 6d 61 79 5f 63 6f 6e 66 6c  ared { may_confl
1520: 69 63 74 3a 20 66 61 6c 73 65 20 7d 0a 20 20 20  ict: false }.   
1530: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1540: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
1550: 70 75 62 20 66 6e 20 65 78 70 6c 69 63 69 74 5f  pub fn explicit_
1560: 6c 69 6e 6b 61 67 65 28 26 73 65 6c 66 2c 20 74  linkage(&self, t
1570: 63 78 3a 20 54 79 43 74 78 74 3c 27 74 63 78 3e  cx: TyCtxt<'tcx>
1580: 29 20 2d 3e 20 4f 70 74 69 6f 6e 3c 4c 69 6e 6b  ) -> Option<Link
1590: 61 67 65 3e 20 7b 0a 20 20 20 20 20 20 20 20 6c  age> {.        l
15a0: 65 74 20 64 65 66 5f 69 64 20 3d 20 6d 61 74 63  et def_id = matc
15b0: 68 20 2a 73 65 6c 66 20 7b 0a 20 20 20 20 20 20  h *self {.      
15c0: 20 20 20 20 20 20 4d 6f 6e 6f 49 74 65 6d 3a 3a        MonoItem::
15d0: 46 6e 28 72 65 66 20 69 6e 73 74 61 6e 63 65 29  Fn(ref instance)
15e0: 20 3d 3e 20 69 6e 73 74 61 6e 63 65 2e 64 65 66   => instance.def
15f0: 5f 69 64 28 29 2c 0a 20 20 20 20 20 20 20 20 20  _id(),.         
1600: 20 20 20 4d 6f 6e 6f 49 74 65 6d 3a 3a 53 74 61     MonoItem::Sta
1610: 74 69 63 28 64 65 66 5f 69 64 29 20 3d 3e 20 64  tic(def_id) => d
1620: 65 66 5f 69 64 2c 0a 20 20 20 20 20 20 20 20 20  ef_id,.         
1630: 20 20 20 4d 6f 6e 6f 49 74 65 6d 3a 3a 47 6c 6f     MonoItem::Glo
1640: 62 61 6c 41 73 6d 28 2e 2e 29 20 3d 3e 20 72 65  balAsm(..) => re
1650: 74 75 72 6e 20 4e 6f 6e 65 2c 0a 20 20 20 20 20  turn None,.     
1660: 20 20 20 7d 3b 0a 0a 20 20 20 20 20 20 20 20 6c     };..        l
1670: 65 74 20 63 6f 64 65 67 65 6e 5f 66 6e 5f 61 74  et codegen_fn_at
1680: 74 72 73 20 3d 20 74 63 78 2e 63 6f 64 65 67 65  trs = tcx.codege
1690: 6e 5f 66 6e 5f 61 74 74 72 73 28 64 65 66 5f 69  n_fn_attrs(def_i
16a0: 64 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 64 65  d);.        code
16b0: 67 65 6e 5f 66 6e 5f 61 74 74 72 73 2e 6c 69 6e  gen_fn_attrs.lin
16c0: 6b 61 67 65 0a 20 20 20 20 7d 0a 0a 20 20 20 20  kage.    }..    
16d0: 2f 2f 2f 20 52 65 74 75 72 6e 73 20 60 74 72 75  /// Returns `tru
16e0: 65 60 20 69 66 20 74 68 69 73 20 69 6e 73 74 61  e` if this insta
16f0: 6e 63 65 20 69 73 20 69 6e 73 74 61 6e 74 69 61  nce is instantia
1700: 62 6c 65 20 2d 20 77 68 65 74 68 65 72 20 69 74  ble - whether it
1710: 20 68 61 73 20 6e 6f 20 75 6e 73 61 74 69 73 66   has no unsatisf
1720: 69 65 64 0a 20 20 20 20 2f 2f 2f 20 70 72 65 64  ied.    /// pred
1730: 69 63 61 74 65 73 2e 0a 20 20 20 20 2f 2f 2f 0a  icates..    ///.
1740: 20 20 20 20 2f 2f 2f 20 49 6e 20 6f 72 64 65 72      /// In order
1750: 20 74 6f 20 63 6f 64 65 67 65 6e 20 61 6e 20 69   to codegen an i
1760: 74 65 6d 2c 20 61 6c 6c 20 6f 66 20 69 74 73 20  tem, all of its 
1770: 70 72 65 64 69 63 61 74 65 73 20 6d 75 73 74 20  predicates must 
1780: 68 6f 6c 64 2c 20 62 65 63 61 75 73 65 0a 20 20  hold, because.  
1790: 20 20 2f 2f 2f 20 6f 74 68 65 72 77 69 73 65 20    /// otherwise 
17a0: 74 68 65 20 69 74 65 6d 20 64 6f 65 73 20 6e 6f  the item does no
17b0: 74 20 6d 61 6b 65 20 73 65 6e 73 65 2e 20 54 79  t make sense. Ty
17c0: 70 65 2d 63 68 65 63 6b 69 6e 67 20 65 6e 73 75  pe-checking ensu
17d0: 72 65 73 20 74 68 61 74 0a 20 20 20 20 2f 2f 2f  res that.    ///
17e0: 20 74 68 65 20 70 72 65 64 69 63 61 74 65 73 20   the predicates 
17f0: 6f 66 20 65 76 65 72 79 20 69 74 65 6d 20 74 68  of every item th
1800: 61 74 20 69 73 20 2a 75 73 65 64 20 62 79 2a 20  at is *used by* 
1810: 61 20 76 61 6c 69 64 20 69 74 65 6d 20 2a 64 6f  a valid item *do
1820: 2a 0a 20 20 20 20 2f 2f 2f 20 68 6f 6c 64 2c 20  *.    /// hold, 
1830: 73 6f 20 77 65 20 63 61 6e 20 72 65 6c 79 20 6f  so we can rely o
1840: 6e 20 74 68 61 74 2e 0a 20 20 20 20 2f 2f 2f 0a  n that..    ///.
1850: 20 20 20 20 2f 2f 2f 20 48 6f 77 65 76 65 72 2c      /// However,
1860: 20 77 65 20 63 6f 64 65 67 65 6e 20 63 6f 6c 6c   we codegen coll
1870: 65 63 74 6f 72 20 72 6f 6f 74 73 20 28 72 65 61  ector roots (rea
1880: 63 68 61 62 6c 65 20 69 74 65 6d 73 29 20 61 6e  chable items) an
1890: 64 20 66 75 6e 63 74 69 6f 6e 73 0a 20 20 20 20  d functions.    
18a0: 2f 2f 2f 20 69 6e 20 76 74 61 62 6c 65 73 20 77  /// in vtables w
18b0: 68 65 6e 20 74 68 65 79 20 61 72 65 20 73 65 65  hen they are see
18c0: 6e 2c 20 65 76 65 6e 20 69 66 20 74 68 65 79 20  n, even if they 
18d0: 61 72 65 20 6e 6f 74 20 75 73 65 64 2c 20 61 6e  are not used, an
18e0: 64 20 73 6f 20 74 68 65 79 0a 20 20 20 20 2f 2f  d so they.    //
18f0: 2f 20 6d 69 67 68 74 20 6e 6f 74 20 62 65 20 69  / might not be i
1900: 6e 73 74 61 6e 74 69 61 62 6c 65 2e 20 46 6f 72  nstantiable. For
1910: 20 65 78 61 6d 70 6c 65 2c 20 61 20 70 72 6f 67   example, a prog
1920: 72 61 6d 6d 65 72 20 63 61 6e 20 64 65 66 69 6e  rammer can defin
1930: 65 20 74 68 69 73 0a 20 20 20 20 2f 2f 2f 20 70  e this.    /// p
1940: 75 62 6c 69 63 20 66 75 6e 63 74 69 6f 6e 3a 0a  ublic function:.
1950: 20 20 20 20 2f 2f 2f 0a 20 20 20 20 2f 2f 2f 20      ///.    /// 
1960: 20 20 20 20 70 75 62 20 66 6e 20 66 6f 6f 3c 27      pub fn foo<'
1970: 61 3e 28 73 3a 20 26 27 61 20 6d 75 74 20 28 29  a>(s: &'a mut ()
1980: 29 20 77 68 65 72 65 20 26 27 61 20 6d 75 74 20  ) where &'a mut 
1990: 28 29 3a 20 43 6c 6f 6e 65 20 7b 0a 20 20 20 20  (): Clone {.    
19a0: 2f 2f 2f 20 20 20 20 20 20 20 20 20 3c 26 6d 75  ///         <&mu
19b0: 74 20 28 29 20 61 73 20 43 6c 6f 6e 65 3e 3a 3a  t () as Clone>::
19c0: 63 6c 6f 6e 65 28 26 73 29 3b 0a 20 20 20 20 2f  clone(&s);.    /
19d0: 2f 2f 20 20 20 20 20 7d 0a 20 20 20 20 2f 2f 2f  //     }.    ///
19e0: 0a 20 20 20 20 2f 2f 2f 20 54 68 61 74 20 66 75  .    /// That fu
19f0: 6e 63 74 69 6f 6e 20 63 61 6e 27 74 20 62 65 20  nction can't be 
1a00: 63 6f 64 65 67 65 6e 65 64 2c 20 62 65 63 61 75  codegened, becau
1a10: 73 65 20 74 68 65 20 6d 65 74 68 6f 64 20 60 3c  se the method `<
1a20: 26 6d 75 74 20 28 29 20 61 73 20 43 6c 6f 6e 65  &mut () as Clone
1a30: 3e 3a 3a 63 6c 6f 6e 65 60 0a 20 20 20 20 2f 2f  >::clone`.    //
1a40: 2f 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  / does not exist
1a50: 2e 20 4c 75 63 6b 69 6c 79 20 66 6f 72 20 75 73  . Luckily for us
1a60: 2c 20 74 68 61 74 20 66 75 6e 63 74 69 6f 6e 20  , that function 
1a70: 63 61 6e 27 74 20 65 76 65 72 20 62 65 20 75 73  can't ever be us
1a80: 65 64 2c 0a 20 20 20 20 2f 2f 2f 20 62 65 63 61  ed,.    /// beca
1a90: 75 73 65 20 74 68 61 74 20 77 6f 75 6c 64 20 72  use that would r
1aa0: 65 71 75 69 72 65 20 66 6f 72 20 60 26 27 61 20  equire for `&'a 
1ab0: 6d 75 74 20 28 29 3a 20 43 6c 6f 6e 65 60 20 74  mut (): Clone` t
1ac0: 6f 20 68 6f 6c 64 2c 20 73 6f 20 77 65 0a 20 20  o hold, so we.  
1ad0: 20 20 2f 2f 2f 20 63 61 6e 20 6a 75 73 74 20 6e    /// can just n
1ae0: 6f 74 20 65 6d 69 74 20 61 6e 79 20 63 6f 64 65  ot emit any code
1af0: 2c 20 6f 72 20 65 76 65 6e 20 61 20 6c 69 6e 6b  , or even a link
1b00: 65 72 20 72 65 66 65 72 65 6e 63 65 20 66 6f 72  er reference for
1b10: 20 69 74 2e 0a 20 20 20 20 2f 2f 2f 0a 20 20 20   it..    ///.   
1b20: 20 2f 2f 2f 20 53 69 6d 69 6c 61 72 6c 79 2c 20   /// Similarly, 
1b30: 69 66 20 61 20 76 74 61 62 6c 65 20 6d 65 74 68  if a vtable meth
1b40: 6f 64 20 68 61 73 20 73 75 63 68 20 61 20 73 69  od has such a si
1b50: 67 6e 61 74 75 72 65 2c 20 61 6e 64 20 74 68 65  gnature, and the
1b60: 72 65 66 6f 72 65 20 63 61 6e 27 74 0a 20 20 20  refore can't.   
1b70: 20 2f 2f 2f 20 62 65 20 75 73 65 64 2c 20 77 65   /// be used, we
1b80: 20 63 61 6e 20 6a 75 73 74 20 6e 6f 74 20 65 6d   can just not em
1b90: 69 74 20 69 74 20 61 6e 64 20 68 61 76 65 20 61  it it and have a
1ba0: 20 70 6c 61 63 65 68 6f 6c 64 65 72 20 28 61 20   placeholder (a 
1bb0: 6e 75 6c 6c 20 70 6f 69 6e 74 65 72 2c 0a 20 20  null pointer,.  
1bc0: 20 20 2f 2f 2f 20 77 68 69 63 68 20 77 69 6c 6c    /// which will
1bd0: 20 6e 65 76 65 72 20 62 65 20 61 63 63 65 73 73   never be access
1be0: 65 64 29 20 69 6e 20 69 74 73 20 70 6c 61 63 65  ed) in its place
1bf0: 2e 0a 20 20 20 20 70 75 62 20 66 6e 20 69 73 5f  ..    pub fn is_
1c00: 69 6e 73 74 61 6e 74 69 61 62 6c 65 28 26 73 65  instantiable(&se
1c10: 6c 66 2c 20 74 63 78 3a 20 54 79 43 74 78 74 3c  lf, tcx: TyCtxt<
1c20: 27 74 63 78 3e 29 20 2d 3e 20 62 6f 6f 6c 20 7b  'tcx>) -> bool {
1c30: 0a 20 20 20 20 20 20 20 20 64 65 62 75 67 21 28  .        debug!(
1c40: 22 69 73 5f 69 6e 73 74 61 6e 74 69 61 62 6c 65  "is_instantiable
1c50: 28 7b 3a 3f 7d 29 22 2c 20 73 65 6c 66 29 3b 0a  ({:?})", self);.
1c60: 20 20 20 20 20 20 20 20 6c 65 74 20 28 64 65 66          let (def
1c70: 5f 69 64 2c 20 73 75 62 73 74 73 29 20 3d 20 6d  _id, substs) = m
1c80: 61 74 63 68 20 2a 73 65 6c 66 20 7b 0a 20 20 20  atch *self {.   
1c90: 20 20 20 20 20 20 20 20 20 4d 6f 6e 6f 49 74 65           MonoIte
1ca0: 6d 3a 3a 46 6e 28 72 65 66 20 69 6e 73 74 61 6e  m::Fn(ref instan
1cb0: 63 65 29 20 3d 3e 20 28 69 6e 73 74 61 6e 63 65  ce) => (instance
1cc0: 2e 64 65 66 5f 69 64 28 29 2c 20 69 6e 73 74 61  .def_id(), insta
1cd0: 6e 63 65 2e 73 75 62 73 74 73 29 2c 0a 20 20 20  nce.substs),.   
1ce0: 20 20 20 20 20 20 20 20 20 4d 6f 6e 6f 49 74 65           MonoIte
1cf0: 6d 3a 3a 53 74 61 74 69 63 28 64 65 66 5f 69 64  m::Static(def_id
1d00: 29 20 3d 3e 20 28 64 65 66 5f 69 64 2c 20 49 6e  ) => (def_id, In
1d10: 74 65 72 6e 61 6c 53 75 62 73 74 73 3a 3a 65 6d  ternalSubsts::em
1d20: 70 74 79 28 29 29 2c 0a 20 20 20 20 20 20 20 20  pty()),.        
1d30: 20 20 20 20 2f 2f 20 67 6c 6f 62 61 6c 20 61 73      // global as
1d40: 6d 20 6e 65 76 65 72 20 68 61 73 20 70 72 65 64  m never has pred
1d50: 69 63 61 74 65 73 0a 20 20 20 20 20 20 20 20 20  icates.         
1d60: 20 20 20 4d 6f 6e 6f 49 74 65 6d 3a 3a 47 6c 6f     MonoItem::Glo
1d70: 62 61 6c 41 73 6d 28 2e 2e 29 20 3d 3e 20 72 65  balAsm(..) => re
1d80: 74 75 72 6e 20 74 72 75 65 0a 20 20 20 20 20 20  turn true.      
1d90: 20 20 7d 3b 0a 0a 20 20 20 20 20 20 20 20 74 63    };..        tc
1da0: 78 2e 73 75 62 73 74 69 74 75 74 65 5f 6e 6f 72  x.substitute_nor
1db0: 6d 61 6c 69 7a 65 5f 61 6e 64 5f 74 65 73 74 5f  malize_and_test_
1dc0: 70 72 65 64 69 63 61 74 65 73 28 28 64 65 66 5f  predicates((def_
1dd0: 69 64 2c 20 26 73 75 62 73 74 73 29 29 0a 20 20  id, &substs)).  
1de0: 20 20 7d 0a 0a 20 20 20 20 70 75 62 20 66 6e 20    }..    pub fn 
1df0: 74 6f 5f 73 74 72 69 6e 67 28 26 73 65 6c 66 2c  to_string(&self,
1e00: 20 74 63 78 3a 20 54 79 43 74 78 74 3c 27 74 63   tcx: TyCtxt<'tc
1e10: 78 3e 2c 20 64 65 62 75 67 3a 20 62 6f 6f 6c 29  x>, debug: bool)
1e20: 20 2d 3e 20 53 74 72 69 6e 67 20 7b 0a 20 20 20   -> String {.   
1e30: 20 20 20 20 20 72 65 74 75 72 6e 20 6d 61 74 63       return matc
1e40: 68 20 2a 73 65 6c 66 20 7b 0a 20 20 20 20 20 20  h *self {.      
1e50: 20 20 20 20 20 20 4d 6f 6e 6f 49 74 65 6d 3a 3a        MonoItem::
1e60: 46 6e 28 69 6e 73 74 61 6e 63 65 29 20 3d 3e 20  Fn(instance) => 
1e70: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
1e80: 20 20 74 6f 5f 73 74 72 69 6e 67 5f 69 6e 74 65    to_string_inte
1e90: 72 6e 61 6c 28 74 63 78 2c 20 22 66 6e 20 22 2c  rnal(tcx, "fn ",
1ea0: 20 69 6e 73 74 61 6e 63 65 2c 20 64 65 62 75 67   instance, debug
1eb0: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c  ).            },
1ec0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 4d 6f 6e  .            Mon
1ed0: 6f 49 74 65 6d 3a 3a 53 74 61 74 69 63 28 64 65  oItem::Static(de
1ee0: 66 5f 69 64 29 20 3d 3e 20 7b 0a 20 20 20 20 20  f_id) => {.     
1ef0: 20 20 20 20 20 20 20 20 20 20 20 6c 65 74 20 69             let i
1f00: 6e 73 74 61 6e 63 65 20 3d 20 49 6e 73 74 61 6e  nstance = Instan
1f10: 63 65 3a 3a 6e 65 77 28 64 65 66 5f 69 64 2c 20  ce::new(def_id, 
1f20: 74 63 78 2e 69 6e 74 65 72 6e 5f 73 75 62 73 74  tcx.intern_subst
1f30: 73 28 26 5b 5d 29 29 3b 0a 20 20 20 20 20 20 20  s(&[]));.       
1f40: 20 20 20 20 20 20 20 20 20 74 6f 5f 73 74 72 69           to_stri
1f50: 6e 67 5f 69 6e 74 65 72 6e 61 6c 28 74 63 78 2c  ng_internal(tcx,
1f60: 20 22 73 74 61 74 69 63 20 22 2c 20 69 6e 73 74   "static ", inst
1f70: 61 6e 63 65 2c 20 64 65 62 75 67 29 0a 20 20 20  ance, debug).   
1f80: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
1f90: 20 20 20 20 20 20 20 20 4d 6f 6e 6f 49 74 65 6d          MonoItem
1fa0: 3a 3a 47 6c 6f 62 61 6c 41 73 6d 28 2e 2e 29 20  ::GlobalAsm(..) 
1fb0: 3d 3e 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  => {.           
1fc0: 20 20 20 20 20 22 67 6c 6f 62 61 6c 5f 61 73 6d       "global_asm
1fd0: 22 2e 74 6f 5f 73 74 72 69 6e 67 28 29 0a 20 20  ".to_string().  
1fe0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1ff0: 20 20 20 20 7d 3b 0a 0a 20 20 20 20 20 20 20 20      };..        
2000: 66 6e 20 74 6f 5f 73 74 72 69 6e 67 5f 69 6e 74  fn to_string_int
2010: 65 72 6e 61 6c 3c 27 74 63 78 3e 28 0a 20 20 20  ernal<'tcx>(.   
2020: 20 20 20 20 20 20 20 20 20 74 63 78 3a 20 54 79           tcx: Ty
2030: 43 74 78 74 3c 27 74 63 78 3e 2c 0a 20 20 20 20  Ctxt<'tcx>,.    
2040: 20 20 20 20 20 20 20 20 70 72 65 66 69 78 3a 20          prefix: 
2050: 26 73 74 72 2c 0a 20 20 20 20 20 20 20 20 20 20  &str,.          
2060: 20 20 69 6e 73 74 61 6e 63 65 3a 20 49 6e 73 74    instance: Inst
2070: 61 6e 63 65 3c 27 74 63 78 3e 2c 0a 20 20 20 20  ance<'tcx>,.    
2080: 20 20 20 20 20 20 20 20 64 65 62 75 67 3a 20 62          debug: b
2090: 6f 6f 6c 2c 0a 20 20 20 20 20 20 20 20 29 20 2d  ool,.        ) -
20a0: 3e 20 53 74 72 69 6e 67 20 7b 0a 20 20 20 20 20  > String {.     
20b0: 20 20 20 20 20 20 20 6c 65 74 20 6d 75 74 20 72         let mut r
20c0: 65 73 75 6c 74 20 3d 20 53 74 72 69 6e 67 3a 3a  esult = String::
20d0: 77 69 74 68 5f 63 61 70 61 63 69 74 79 28 33 32  with_capacity(32
20e0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  );.            r
20f0: 65 73 75 6c 74 2e 70 75 73 68 5f 73 74 72 28 70  esult.push_str(p
2100: 72 65 66 69 78 29 3b 0a 20 20 20 20 20 20 20 20  refix);.        
2110: 20 20 20 20 6c 65 74 20 70 72 69 6e 74 65 72 20      let printer 
2120: 3d 20 44 65 66 50 61 74 68 42 61 73 65 64 4e 61  = DefPathBasedNa
2130: 6d 65 73 3a 3a 6e 65 77 28 74 63 78 2c 20 66 61  mes::new(tcx, fa
2140: 6c 73 65 2c 20 66 61 6c 73 65 29 3b 0a 20 20 20  lse, false);.   
2150: 20 20 20 20 20 20 20 20 20 70 72 69 6e 74 65 72           printer
2160: 2e 70 75 73 68 5f 69 6e 73 74 61 6e 63 65 5f 61  .push_instance_a
2170: 73 5f 73 74 72 69 6e 67 28 69 6e 73 74 61 6e 63  s_string(instanc
2180: 65 2c 20 26 6d 75 74 20 72 65 73 75 6c 74 2c 20  e, &mut result, 
2190: 64 65 62 75 67 29 3b 0a 20 20 20 20 20 20 20 20  debug);.        
21a0: 20 20 20 20 72 65 73 75 6c 74 0a 20 20 20 20 20      result.     
21b0: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
21c0: 70 75 62 20 66 6e 20 6c 6f 63 61 6c 5f 73 70 61  pub fn local_spa
21d0: 6e 28 26 73 65 6c 66 2c 20 74 63 78 3a 20 54 79  n(&self, tcx: Ty
21e0: 43 74 78 74 3c 27 74 63 78 3e 29 20 2d 3e 20 4f  Ctxt<'tcx>) -> O
21f0: 70 74 69 6f 6e 3c 53 70 61 6e 3e 20 7b 0a 20 20  ption<Span> {.  
2200: 20 20 20 20 20 20 6d 61 74 63 68 20 2a 73 65 6c        match *sel
2210: 66 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  f {.            
2220: 4d 6f 6e 6f 49 74 65 6d 3a 3a 46 6e 28 49 6e 73  MonoItem::Fn(Ins
2230: 74 61 6e 63 65 20 7b 20 64 65 66 2c 20 2e 2e 20  tance { def, .. 
2240: 7d 29 20 3d 3e 20 7b 0a 20 20 20 20 20 20 20 20  }) => {.        
2250: 20 20 20 20 20 20 20 20 74 63 78 2e 68 69 72 28          tcx.hir(
2260: 29 2e 61 73 5f 6c 6f 63 61 6c 5f 68 69 72 5f 69  ).as_local_hir_i
2270: 64 28 64 65 66 2e 64 65 66 5f 69 64 28 29 29 0a  d(def.def_id()).
2280: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
2290: 20 20 20 20 20 20 20 20 20 20 4d 6f 6e 6f 49 74            MonoIt
22a0: 65 6d 3a 3a 53 74 61 74 69 63 28 64 65 66 5f 69  em::Static(def_i
22b0: 64 29 20 3d 3e 20 7b 0a 20 20 20 20 20 20 20 20  d) => {.        
22c0: 20 20 20 20 20 20 20 20 74 63 78 2e 68 69 72 28          tcx.hir(
22d0: 29 2e 61 73 5f 6c 6f 63 61 6c 5f 68 69 72 5f 69  ).as_local_hir_i
22e0: 64 28 64 65 66 5f 69 64 29 0a 20 20 20 20 20 20  d(def_id).      
22f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2300: 20 20 20 20 4d 6f 6e 6f 49 74 65 6d 3a 3a 47 6c      MonoItem::Gl
2310: 6f 62 61 6c 41 73 6d 28 68 69 72 5f 69 64 29 20  obalAsm(hir_id) 
2320: 3d 3e 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  => {.           
2330: 20 20 20 20 20 53 6f 6d 65 28 68 69 72 5f 69 64       Some(hir_id
2340: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ).            }.
2350: 20 20 20 20 20 20 20 20 7d 2e 6d 61 70 28 7c 68          }.map(|h
2360: 69 72 5f 69 64 7c 20 74 63 78 2e 68 69 72 28 29  ir_id| tcx.hir()
2370: 2e 73 70 61 6e 28 68 69 72 5f 69 64 29 29 0a 20  .span(hir_id)). 
2380: 20 20 20 7d 0a 7d 0a 0a 69 6d 70 6c 3c 27 61 2c     }.}..impl<'a,
2390: 20 27 74 63 78 3e 20 48 61 73 68 53 74 61 62 6c   'tcx> HashStabl
23a0: 65 3c 53 74 61 62 6c 65 48 61 73 68 69 6e 67 43  e<StableHashingC
23b0: 6f 6e 74 65 78 74 3c 27 61 3e 3e 20 66 6f 72 20  ontext<'a>> for 
23c0: 4d 6f 6e 6f 49 74 65 6d 3c 27 74 63 78 3e 20 7b  MonoItem<'tcx> {
23d0: 0a 20 20 20 20 66 6e 20 68 61 73 68 5f 73 74 61  .    fn hash_sta
23e0: 62 6c 65 28 26 73 65 6c 66 2c 20 68 63 78 3a 20  ble(&self, hcx: 
23f0: 26 6d 75 74 20 53 74 61 62 6c 65 48 61 73 68 69  &mut StableHashi
2400: 6e 67 43 6f 6e 74 65 78 74 3c 27 61 3e 2c 20 68  ngContext<'a>, h
2410: 61 73 68 65 72 3a 20 26 6d 75 74 20 53 74 61 62  asher: &mut Stab
2420: 6c 65 48 61 73 68 65 72 29 20 7b 0a 20 20 20 20  leHasher) {.    
2430: 20 20 20 20 3a 3a 73 74 64 3a 3a 6d 65 6d 3a 3a      ::std::mem::
2440: 64 69 73 63 72 69 6d 69 6e 61 6e 74 28 73 65 6c  discriminant(sel
2450: 66 29 2e 68 61 73 68 5f 73 74 61 62 6c 65 28 68  f).hash_stable(h
2460: 63 78 2c 20 68 61 73 68 65 72 29 3b 0a 0a 20 20  cx, hasher);..  
2470: 20 20 20 20 20 20 6d 61 74 63 68 20 2a 73 65 6c        match *sel
2480: 66 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  f {.            
2490: 4d 6f 6e 6f 49 74 65 6d 3a 3a 46 6e 28 72 65 66  MonoItem::Fn(ref
24a0: 20 69 6e 73 74 61 6e 63 65 29 20 3d 3e 20 7b 0a   instance) => {.
24b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24c0: 69 6e 73 74 61 6e 63 65 2e 68 61 73 68 5f 73 74  instance.hash_st
24d0: 61 62 6c 65 28 68 63 78 2c 20 68 61 73 68 65 72  able(hcx, hasher
24e0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
24f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 4d 6f 6e  .            Mon
2500: 6f 49 74 65 6d 3a 3a 53 74 61 74 69 63 28 64 65  oItem::Static(de
2510: 66 5f 69 64 29 20 3d 3e 20 7b 0a 20 20 20 20 20  f_id) => {.     
2520: 20 20 20 20 20 20 20 20 20 20 20 64 65 66 5f 69             def_i
2530: 64 2e 68 61 73 68 5f 73 74 61 62 6c 65 28 68 63  d.hash_stable(hc
2540: 78 2c 20 68 61 73 68 65 72 29 3b 0a 20 20 20 20  x, hasher);.    
2550: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2560: 20 20 20 20 20 20 4d 6f 6e 6f 49 74 65 6d 3a 3a        MonoItem::
2570: 47 6c 6f 62 61 6c 41 73 6d 28 6e 6f 64 65 5f 69  GlobalAsm(node_i
2580: 64 29 20 3d 3e 20 7b 0a 20 20 20 20 20 20 20 20  d) => {.        
2590: 20 20 20 20 20 20 20 20 68 63 78 2e 77 69 74 68          hcx.with
25a0: 5f 6e 6f 64 65 5f 69 64 5f 68 61 73 68 69 6e 67  _node_id_hashing
25b0: 5f 6d 6f 64 65 28 4e 6f 64 65 49 64 48 61 73 68  _mode(NodeIdHash
25c0: 69 6e 67 4d 6f 64 65 3a 3a 48 61 73 68 44 65 66  ingMode::HashDef
25d0: 50 61 74 68 2c 20 7c 68 63 78 7c 20 7b 0a 20 20  Path, |hcx| {.  
25e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25f0: 20 20 6e 6f 64 65 5f 69 64 2e 68 61 73 68 5f 73    node_id.hash_s
2600: 74 61 62 6c 65 28 68 63 78 2c 20 68 61 73 68 65  table(hcx, hashe
2610: 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  r);.            
2620: 20 20 20 20 7d 29 0a 20 20 20 20 20 20 20 20 20      }).         
2630: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
2640: 20 20 20 7d 0a 7d 0a 0a 70 75 62 20 73 74 72 75     }.}..pub stru
2650: 63 74 20 43 6f 64 65 67 65 6e 55 6e 69 74 3c 27  ct CodegenUnit<'
2660: 74 63 78 3e 20 7b 0a 20 20 20 20 2f 2f 2f 20 41  tcx> {.    /// A
2670: 20 6e 61 6d 65 20 66 6f 72 20 74 68 69 73 20 43   name for this C
2680: 47 55 2e 20 49 6e 63 72 65 6d 65 6e 74 61 6c 20  GU. Incremental 
2690: 63 6f 6d 70 69 6c 61 74 69 6f 6e 20 72 65 71 75  compilation requ
26a0: 69 72 65 73 20 74 68 61 74 0a 20 20 20 20 2f 2f  ires that.    //
26b0: 2f 20 6e 61 6d 65 20 62 65 20 75 6e 69 71 75 65  / name be unique
26c0: 20 61 6d 6f 6e 67 73 74 20 2a 2a 61 6c 6c 2a 2a   amongst **all**
26d0: 20 63 72 61 74 65 73 2e 20 54 68 65 72 65 66 6f   crates. Therefo
26e0: 72 65 2c 20 69 74 20 73 68 6f 75 6c 64 0a 20 20  re, it should.  
26f0: 20 20 2f 2f 2f 20 63 6f 6e 74 61 69 6e 20 73 6f    /// contain so
2700: 6d 65 74 68 69 6e 67 20 75 6e 69 71 75 65 20 74  mething unique t
2710: 6f 20 74 68 69 73 20 63 72 61 74 65 20 28 65 2e  o this crate (e.
2720: 67 2e 2c 20 61 20 6d 6f 64 75 6c 65 20 70 61 74  g., a module pat
2730: 68 29 0a 20 20 20 20 2f 2f 2f 20 61 73 20 77 65  h).    /// as we
2740: 6c 6c 20 61 73 20 74 68 65 20 63 72 61 74 65 20  ll as the crate 
2750: 6e 61 6d 65 20 61 6e 64 20 64 69 73 61 6d 62 69  name and disambi
2760: 67 75 61 74 6f 72 2e 0a 20 20 20 20 6e 61 6d 65  guator..    name
2770: 3a 20 53 79 6d 62 6f 6c 2c 0a 20 20 20 20 69 74  : Symbol,.    it
2780: 65 6d 73 3a 20 46 78 48 61 73 68 4d 61 70 3c 4d  ems: FxHashMap<M
2790: 6f 6e 6f 49 74 65 6d 3c 27 74 63 78 3e 2c 20 28  onoItem<'tcx>, (
27a0: 4c 69 6e 6b 61 67 65 2c 20 56 69 73 69 62 69 6c  Linkage, Visibil
27b0: 69 74 79 29 3e 2c 0a 20 20 20 20 73 69 7a 65 5f  ity)>,.    size_
27c0: 65 73 74 69 6d 61 74 65 3a 20 4f 70 74 69 6f 6e  estimate: Option
27d0: 3c 75 73 69 7a 65 3e 2c 0a 7d 0a 0a 23 5b 64 65  <usize>,.}..#[de
27e0: 72 69 76 65 28 43 6f 70 79 2c 20 43 6c 6f 6e 65  rive(Copy, Clone
27f0: 2c 20 50 61 72 74 69 61 6c 45 71 2c 20 44 65 62  , PartialEq, Deb
2800: 75 67 2c 20 52 75 73 74 63 45 6e 63 6f 64 61 62  ug, RustcEncodab
2810: 6c 65 2c 20 52 75 73 74 63 44 65 63 6f 64 61 62  le, RustcDecodab
2820: 6c 65 2c 20 48 61 73 68 53 74 61 62 6c 65 29 5d  le, HashStable)]
2830: 0a 70 75 62 20 65 6e 75 6d 20 4c 69 6e 6b 61 67  .pub enum Linkag
2840: 65 20 7b 0a 20 20 20 20 45 78 74 65 72 6e 61 6c  e {.    External
2850: 2c 0a 20 20 20 20 41 76 61 69 6c 61 62 6c 65 45  ,.    AvailableE
2860: 78 74 65 72 6e 61 6c 6c 79 2c 0a 20 20 20 20 4c  xternally,.    L
2870: 69 6e 6b 4f 6e 63 65 41 6e 79 2c 0a 20 20 20 20  inkOnceAny,.    
2880: 4c 69 6e 6b 4f 6e 63 65 4f 44 52 2c 0a 20 20 20  LinkOnceODR,.   
2890: 20 57 65 61 6b 41 6e 79 2c 0a 20 20 20 20 57 65   WeakAny,.    We
28a0: 61 6b 4f 44 52 2c 0a 20 20 20 20 41 70 70 65 6e  akODR,.    Appen
28b0: 64 69 6e 67 2c 0a 20 20 20 20 49 6e 74 65 72 6e  ding,.    Intern
28c0: 61 6c 2c 0a 20 20 20 20 50 72 69 76 61 74 65 2c  al,.    Private,
28d0: 0a 20 20 20 20 45 78 74 65 72 6e 61 6c 57 65 61  .    ExternalWea
28e0: 6b 2c 0a 20 20 20 20 43 6f 6d 6d 6f 6e 2c 0a 7d  k,.    Common,.}
28f0: 0a 0a 23 5b 64 65 72 69 76 65 28 43 6f 70 79 2c  ..#[derive(Copy,
2900: 20 43 6c 6f 6e 65 2c 20 50 61 72 74 69 61 6c 45   Clone, PartialE
2910: 71 2c 20 44 65 62 75 67 2c 20 48 61 73 68 53 74  q, Debug, HashSt
2920: 61 62 6c 65 29 5d 0a 70 75 62 20 65 6e 75 6d 20  able)].pub enum 
2930: 56 69 73 69 62 69 6c 69 74 79 20 7b 0a 20 20 20  Visibility {.   
2940: 20 44 65 66 61 75 6c 74 2c 0a 20 20 20 20 48 69   Default,.    Hi
2950: 64 64 65 6e 2c 0a 20 20 20 20 50 72 6f 74 65 63  dden,.    Protec
2960: 74 65 64 2c 0a 7d 0a 0a 69 6d 70 6c 3c 27 74 63  ted,.}..impl<'tc
2970: 78 3e 20 43 6f 64 65 67 65 6e 55 6e 69 74 3c 27  x> CodegenUnit<'
2980: 74 63 78 3e 20 7b 0a 20 20 20 20 70 75 62 20 66  tcx> {.    pub f
2990: 6e 20 6e 65 77 28 6e 61 6d 65 3a 20 53 79 6d 62  n new(name: Symb
29a0: 6f 6c 29 20 2d 3e 20 43 6f 64 65 67 65 6e 55 6e  ol) -> CodegenUn
29b0: 69 74 3c 27 74 63 78 3e 20 7b 0a 20 20 20 20 20  it<'tcx> {.     
29c0: 20 20 20 43 6f 64 65 67 65 6e 55 6e 69 74 20 7b     CodegenUnit {
29d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 61 6d  .            nam
29e0: 65 3a 20 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20  e: name,.       
29f0: 20 20 20 20 20 69 74 65 6d 73 3a 20 44 65 66 61       items: Defa
2a00: 75 6c 74 3a 3a 64 65 66 61 75 6c 74 28 29 2c 0a  ult::default(),.
2a10: 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65              size
2a20: 5f 65 73 74 69 6d 61 74 65 3a 20 4e 6f 6e 65 2c  _estimate: None,
2a30: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  .        }.    }
2a40: 0a 0a 20 20 20 20 70 75 62 20 66 6e 20 6e 61 6d  ..    pub fn nam
2a50: 65 28 26 73 65 6c 66 29 20 2d 3e 20 53 79 6d 62  e(&self) -> Symb
2a60: 6f 6c 20 7b 0a 20 20 20 20 20 20 20 20 73 65 6c  ol {.        sel
2a70: 66 2e 6e 61 6d 65 0a 20 20 20 20 7d 0a 0a 20 20  f.name.    }..  
2a80: 20 20 70 75 62 20 66 6e 20 73 65 74 5f 6e 61 6d    pub fn set_nam
2a90: 65 28 26 6d 75 74 20 73 65 6c 66 2c 20 6e 61 6d  e(&mut self, nam
2aa0: 65 3a 20 53 79 6d 62 6f 6c 29 20 7b 0a 20 20 20  e: Symbol) {.   
2ab0: 20 20 20 20 20 73 65 6c 66 2e 6e 61 6d 65 20 3d       self.name =
2ac0: 20 6e 61 6d 65 3b 0a 20 20 20 20 7d 0a 0a 20 20   name;.    }..  
2ad0: 20 20 70 75 62 20 66 6e 20 69 74 65 6d 73 28 26    pub fn items(&
2ae0: 73 65 6c 66 29 20 2d 3e 20 26 46 78 48 61 73 68  self) -> &FxHash
2af0: 4d 61 70 3c 4d 6f 6e 6f 49 74 65 6d 3c 27 74 63  Map<MonoItem<'tc
2b00: 78 3e 2c 20 28 4c 69 6e 6b 61 67 65 2c 20 56 69  x>, (Linkage, Vi
2b10: 73 69 62 69 6c 69 74 79 29 3e 20 7b 0a 20 20 20  sibility)> {.   
2b20: 20 20 20 20 20 26 73 65 6c 66 2e 69 74 65 6d 73       &self.items
2b30: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 75 62 20  .    }..    pub 
2b40: 66 6e 20 69 74 65 6d 73 5f 6d 75 74 28 26 6d 75  fn items_mut(&mu
2b50: 74 20 73 65 6c 66 29 0a 20 20 20 20 20 20 20 20  t self).        
2b60: 2d 3e 20 26 6d 75 74 20 46 78 48 61 73 68 4d 61  -> &mut FxHashMa
2b70: 70 3c 4d 6f 6e 6f 49 74 65 6d 3c 27 74 63 78 3e  p<MonoItem<'tcx>
2b80: 2c 20 28 4c 69 6e 6b 61 67 65 2c 20 56 69 73 69  , (Linkage, Visi
2b90: 62 69 6c 69 74 79 29 3e 0a 20 20 20 20 7b 0a 20  bility)>.    {. 
2ba0: 20 20 20 20 20 20 20 26 6d 75 74 20 73 65 6c 66         &mut self
2bb0: 2e 69 74 65 6d 73 0a 20 20 20 20 7d 0a 0a 20 20  .items.    }..  
2bc0: 20 20 70 75 62 20 66 6e 20 6d 61 6e 67 6c 65 5f    pub fn mangle_
2bd0: 6e 61 6d 65 28 68 75 6d 61 6e 5f 72 65 61 64 61  name(human_reada
2be0: 62 6c 65 5f 6e 61 6d 65 3a 20 26 73 74 72 29 20  ble_name: &str) 
2bf0: 2d 3e 20 53 74 72 69 6e 67 20 7b 0a 20 20 20 20  -> String {.    
2c00: 20 20 20 20 2f 2f 20 57 65 20 67 65 6e 65 72 61      // We genera
2c10: 74 65 20 61 20 38 30 20 62 69 74 20 68 61 73 68  te a 80 bit hash
2c20: 20 66 72 6f 6d 20 74 68 65 20 6e 61 6d 65 2e 20   from the name. 
2c30: 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65 20 65  This should be e
2c40: 6e 6f 75 67 68 20 74 6f 0a 20 20 20 20 20 20 20  nough to.       
2c50: 20 2f 2f 20 61 76 6f 69 64 20 63 6f 6c 6c 69 73   // avoid collis
2c60: 69 6f 6e 73 20 61 6e 64 20 69 73 20 73 74 69 6c  ions and is stil
2c70: 6c 20 72 65 61 73 6f 6e 61 62 6c 79 20 73 68 6f  l reasonably sho
2c80: 72 74 20 66 6f 72 20 66 69 6c 65 6e 61 6d 65 73  rt for filenames
2c90: 2e 0a 20 20 20 20 20 20 20 20 6c 65 74 20 6d 75  ..        let mu
2ca0: 74 20 68 61 73 68 65 72 20 3d 20 53 74 61 62 6c  t hasher = Stabl
2cb0: 65 48 61 73 68 65 72 3a 3a 6e 65 77 28 29 3b 0a  eHasher::new();.
2cc0: 20 20 20 20 20 20 20 20 68 75 6d 61 6e 5f 72 65          human_re
2cd0: 61 64 61 62 6c 65 5f 6e 61 6d 65 2e 68 61 73 68  adable_name.hash
2ce0: 28 26 6d 75 74 20 68 61 73 68 65 72 29 3b 0a 20  (&mut hasher);. 
2cf0: 20 20 20 20 20 20 20 6c 65 74 20 68 61 73 68 3a         let hash:
2d00: 20 75 31 32 38 20 3d 20 68 61 73 68 65 72 2e 66   u128 = hasher.f
2d10: 69 6e 69 73 68 28 29 3b 0a 20 20 20 20 20 20 20  inish();.       
2d20: 20 6c 65 74 20 68 61 73 68 20 3d 20 68 61 73 68   let hash = hash
2d30: 20 26 20 28 28 31 75 31 32 38 20 3c 3c 20 38 30   & ((1u128 << 80
2d40: 29 20 2d 20 31 29 3b 0a 20 20 20 20 20 20 20 20  ) - 1);.        
2d50: 62 61 73 65 5f 6e 3a 3a 65 6e 63 6f 64 65 28 68  base_n::encode(h
2d60: 61 73 68 2c 20 62 61 73 65 5f 6e 3a 3a 43 41 53  ash, base_n::CAS
2d70: 45 5f 49 4e 53 45 4e 53 49 54 49 56 45 29 0a 20  E_INSENSITIVE). 
2d80: 20 20 20 7d 0a 0a 20 20 20 20 70 75 62 20 66 6e     }..    pub fn
2d90: 20 65 73 74 69 6d 61 74 65 5f 73 69 7a 65 28 26   estimate_size(&
2da0: 6d 75 74 20 73 65 6c 66 2c 20 74 63 78 3a 20 54  mut self, tcx: T
2db0: 79 43 74 78 74 3c 27 74 63 78 3e 29 20 7b 0a 20  yCtxt<'tcx>) {. 
2dc0: 20 20 20 20 20 20 20 2f 2f 20 45 73 74 69 6d 61         // Estima
2dd0: 74 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 61  te the size of a
2de0: 20 63 6f 64 65 67 65 6e 20 75 6e 69 74 20 61 73   codegen unit as
2df0: 20 28 61 70 70 72 6f 78 69 6d 61 74 65 6c 79 29   (approximately)
2e00: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 4d   the number of M
2e10: 49 52 0a 20 20 20 20 20 20 20 20 2f 2f 20 73 74  IR.        // st
2e20: 61 74 65 6d 65 6e 74 73 20 69 74 20 63 6f 72 72  atements it corr
2e30: 65 73 70 6f 6e 64 73 20 74 6f 2e 0a 20 20 20 20  esponds to..    
2e40: 20 20 20 20 73 65 6c 66 2e 73 69 7a 65 5f 65 73      self.size_es
2e50: 74 69 6d 61 74 65 20 3d 20 53 6f 6d 65 28 73 65  timate = Some(se
2e60: 6c 66 2e 69 74 65 6d 73 2e 6b 65 79 73 28 29 2e  lf.items.keys().
2e70: 6d 61 70 28 7c 6d 69 7c 20 6d 69 2e 73 69 7a 65  map(|mi| mi.size
2e80: 5f 65 73 74 69 6d 61 74 65 28 74 63 78 29 29 2e  _estimate(tcx)).
2e90: 73 75 6d 28 29 29 3b 0a 20 20 20 20 7d 0a 0a 20  sum());.    }.. 
2ea0: 20 20 20 70 75 62 20 66 6e 20 73 69 7a 65 5f 65     pub fn size_e
2eb0: 73 74 69 6d 61 74 65 28 26 73 65 6c 66 29 20 2d  stimate(&self) -
2ec0: 3e 20 75 73 69 7a 65 20 7b 0a 20 20 20 20 20 20  > usize {.      
2ed0: 20 20 2f 2f 20 53 68 6f 75 6c 64 20 6f 6e 6c 79    // Should only
2ee0: 20 62 65 20 63 61 6c 6c 65 64 20 69 66 20 60 65   be called if `e
2ef0: 73 74 69 6d 61 74 65 5f 73 69 7a 65 60 20 68 61  stimate_size` ha
2f00: 73 20 70 72 65 76 69 6f 75 73 6c 79 20 62 65 65  s previously bee
2f10: 6e 20 63 61 6c 6c 65 64 2e 0a 20 20 20 20 20 20  n called..      
2f20: 20 20 73 65 6c 66 2e 73 69 7a 65 5f 65 73 74 69    self.size_esti
2f30: 6d 61 74 65 2e 65 78 70 65 63 74 28 22 65 73 74  mate.expect("est
2f40: 69 6d 61 74 65 5f 73 69 7a 65 20 6d 75 73 74 20  imate_size must 
2f50: 62 65 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65  be called before
2f60: 20 67 65 74 74 69 6e 67 20 61 20 73 69 7a 65 5f   getting a size_
2f70: 65 73 74 69 6d 61 74 65 22 29 0a 20 20 20 20 7d  estimate").    }
2f80: 0a 0a 20 20 20 20 70 75 62 20 66 6e 20 6d 6f 64  ..    pub fn mod
2f90: 69 66 79 5f 73 69 7a 65 5f 65 73 74 69 6d 61 74  ify_size_estimat
2fa0: 65 28 26 6d 75 74 20 73 65 6c 66 2c 20 64 65 6c  e(&mut self, del
2fb0: 74 61 3a 20 75 73 69 7a 65 29 20 7b 0a 20 20 20  ta: usize) {.   
2fc0: 20 20 20 20 20 61 73 73 65 72 74 21 28 73 65 6c       assert!(sel
2fd0: 66 2e 73 69 7a 65 5f 65 73 74 69 6d 61 74 65 2e  f.size_estimate.
2fe0: 69 73 5f 73 6f 6d 65 28 29 29 3b 0a 20 20 20 20  is_some());.    
2ff0: 20 20 20 20 69 66 20 6c 65 74 20 53 6f 6d 65 28      if let Some(
3000: 73 69 7a 65 5f 65 73 74 69 6d 61 74 65 29 20 3d  size_estimate) =
3010: 20 73 65 6c 66 2e 73 69 7a 65 5f 65 73 74 69 6d   self.size_estim
3020: 61 74 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20  ate {.          
3030: 20 20 73 65 6c 66 2e 73 69 7a 65 5f 65 73 74 69    self.size_esti
3040: 6d 61 74 65 20 3d 20 53 6f 6d 65 28 73 69 7a 65  mate = Some(size
3050: 5f 65 73 74 69 6d 61 74 65 20 2b 20 64 65 6c 74  _estimate + delt
3060: 61 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  a);.        }.  
3070: 20 20 7d 0a 0a 20 20 20 20 70 75 62 20 66 6e 20    }..    pub fn 
3080: 63 6f 6e 74 61 69 6e 73 5f 69 74 65 6d 28 26 73  contains_item(&s
3090: 65 6c 66 2c 20 69 74 65 6d 3a 20 26 4d 6f 6e 6f  elf, item: &Mono
30a0: 49 74 65 6d 3c 27 74 63 78 3e 29 20 2d 3e 20 62  Item<'tcx>) -> b
30b0: 6f 6f 6c 20 7b 0a 20 20 20 20 20 20 20 20 73 65  ool {.        se
30c0: 6c 66 2e 69 74 65 6d 73 28 29 2e 63 6f 6e 74 61  lf.items().conta
30d0: 69 6e 73 5f 6b 65 79 28 69 74 65 6d 29 0a 20 20  ins_key(item).  
30e0: 20 20 7d 0a 0a 20 20 20 20 70 75 62 20 66 6e 20    }..    pub fn 
30f0: 77 6f 72 6b 5f 70 72 6f 64 75 63 74 5f 69 64 28  work_product_id(
3100: 26 73 65 6c 66 29 20 2d 3e 20 57 6f 72 6b 50 72  &self) -> WorkPr
3110: 6f 64 75 63 74 49 64 20 7b 0a 20 20 20 20 20 20  oductId {.      
3120: 20 20 57 6f 72 6b 50 72 6f 64 75 63 74 49 64 3a    WorkProductId:
3130: 3a 66 72 6f 6d 5f 63 67 75 5f 6e 61 6d 65 28 26  :from_cgu_name(&
3140: 73 65 6c 66 2e 6e 61 6d 65 28 29 2e 61 73 5f 73  self.name().as_s
3150: 74 72 28 29 29 0a 20 20 20 20 7d 0a 0a 20 20 20  tr()).    }..   
3160: 20 70 75 62 20 66 6e 20 77 6f 72 6b 5f 70 72 6f   pub fn work_pro
3170: 64 75 63 74 28 26 73 65 6c 66 2c 20 74 63 78 3a  duct(&self, tcx:
3180: 20 54 79 43 74 78 74 3c 27 5f 3e 29 20 2d 3e 20   TyCtxt<'_>) -> 
3190: 57 6f 72 6b 50 72 6f 64 75 63 74 20 7b 0a 20 20  WorkProduct {.  
31a0: 20 20 20 20 20 20 6c 65 74 20 77 6f 72 6b 5f 70        let work_p
31b0: 72 6f 64 75 63 74 5f 69 64 20 3d 20 73 65 6c 66  roduct_id = self
31c0: 2e 77 6f 72 6b 5f 70 72 6f 64 75 63 74 5f 69 64  .work_product_id
31d0: 28 29 3b 0a 20 20 20 20 20 20 20 20 74 63 78 2e  ();.        tcx.
31e0: 64 65 70 5f 67 72 61 70 68 0a 20 20 20 20 20 20  dep_graph.      
31f0: 20 20 20 20 20 2e 70 72 65 76 69 6f 75 73 5f 77       .previous_w
3200: 6f 72 6b 5f 70 72 6f 64 75 63 74 28 26 77 6f 72  ork_product(&wor
3210: 6b 5f 70 72 6f 64 75 63 74 5f 69 64 29 0a 20 20  k_product_id).  
3220: 20 20 20 20 20 20 20 20 20 2e 75 6e 77 72 61 70           .unwrap
3230: 5f 6f 72 5f 65 6c 73 65 28 7c 7c 20 7b 0a 20 20  _or_else(|| {.  
3240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 61                pa
3250: 6e 69 63 21 28 22 43 6f 75 6c 64 20 6e 6f 74 20  nic!("Could not 
3260: 66 69 6e 64 20 77 6f 72 6b 2d 70 72 6f 64 75 63  find work-produc
3270: 74 20 66 6f 72 20 43 47 55 20 60 7b 7d 60 22 2c  t for CGU `{}`",
3280: 20 73 65 6c 66 2e 6e 61 6d 65 28 29 29 0a 20 20   self.name()).  
3290: 20 20 20 20 20 20 20 20 20 20 7d 29 0a 20 20 20            }).   
32a0: 20 7d 0a 0a 20 20 20 20 70 75 62 20 66 6e 20 69   }..    pub fn i
32b0: 74 65 6d 73 5f 69 6e 5f 64 65 74 65 72 6d 69 6e  tems_in_determin
32c0: 69 73 74 69 63 5f 6f 72 64 65 72 28 0a 20 20 20  istic_order(.   
32d0: 20 20 20 20 20 26 73 65 6c 66 2c 0a 20 20 20 20       &self,.    
32e0: 20 20 20 20 74 63 78 3a 20 54 79 43 74 78 74 3c      tcx: TyCtxt<
32f0: 27 74 63 78 3e 2c 0a 20 20 20 20 29 20 2d 3e 20  'tcx>,.    ) -> 
3300: 56 65 63 3c 28 4d 6f 6e 6f 49 74 65 6d 3c 27 74  Vec<(MonoItem<'t
3310: 63 78 3e 2c 20 28 4c 69 6e 6b 61 67 65 2c 20 56  cx>, (Linkage, V
3320: 69 73 69 62 69 6c 69 74 79 29 29 3e 20 7b 0a 20  isibility))> {. 
3330: 20 20 20 20 20 20 20 2f 2f 20 54 68 65 20 63 6f         // The co
3340: 64 65 67 65 6e 20 74 65 73 74 73 20 72 65 6c 79  degen tests rely
3350: 20 6f 6e 20 69 74 65 6d 73 20 62 65 69 6e 67 20   on items being 
3360: 70 72 6f 63 65 73 73 20 69 6e 20 74 68 65 20 73  process in the s
3370: 61 6d 65 20 6f 72 64 65 72 20 61 73 0a 20 20 20  ame order as.   
3380: 20 20 20 20 20 2f 2f 20 74 68 65 79 20 61 70 70       // they app
3390: 65 61 72 20 69 6e 20 74 68 65 20 66 69 6c 65 2c  ear in the file,
33a0: 20 73 6f 20 66 6f 72 20 6c 6f 63 61 6c 20 69 74   so for local it
33b0: 65 6d 73 2c 20 77 65 20 73 6f 72 74 20 62 79 20  ems, we sort by 
33c0: 6e 6f 64 65 5f 69 64 20 66 69 72 73 74 0a 20 20  node_id first.  
33d0: 20 20 20 20 20 20 23 5b 64 65 72 69 76 65 28 50        #[derive(P
33e0: 61 72 74 69 61 6c 45 71 2c 20 45 71 2c 20 50 61  artialEq, Eq, Pa
33f0: 72 74 69 61 6c 4f 72 64 2c 20 4f 72 64 29 5d 0a  rtialOrd, Ord)].
3400: 20 20 20 20 20 20 20 20 70 75 62 20 73 74 72 75          pub stru
3410: 63 74 20 49 74 65 6d 53 6f 72 74 4b 65 79 28 4f  ct ItemSortKey(O
3420: 70 74 69 6f 6e 3c 48 69 72 49 64 3e 2c 20 53 79  ption<HirId>, Sy
3430: 6d 62 6f 6c 4e 61 6d 65 29 3b 0a 0a 20 20 20 20  mbolName);..    
3440: 20 20 20 20 66 6e 20 69 74 65 6d 5f 73 6f 72 74      fn item_sort
3450: 5f 6b 65 79 3c 27 74 63 78 3e 28 74 63 78 3a 20  _key<'tcx>(tcx: 
3460: 54 79 43 74 78 74 3c 27 74 63 78 3e 2c 20 69 74  TyCtxt<'tcx>, it
3470: 65 6d 3a 20 4d 6f 6e 6f 49 74 65 6d 3c 27 74 63  em: MonoItem<'tc
3480: 78 3e 29 20 2d 3e 20 49 74 65 6d 53 6f 72 74 4b  x>) -> ItemSortK
3490: 65 79 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ey {.           
34a0: 20 49 74 65 6d 53 6f 72 74 4b 65 79 28 6d 61 74   ItemSortKey(mat
34b0: 63 68 20 69 74 65 6d 20 7b 0a 20 20 20 20 20 20  ch item {.      
34c0: 20 20 20 20 20 20 20 20 20 20 4d 6f 6e 6f 49 74            MonoIt
34d0: 65 6d 3a 3a 46 6e 28 72 65 66 20 69 6e 73 74 61  em::Fn(ref insta
34e0: 6e 63 65 29 20 3d 3e 20 7b 0a 20 20 20 20 20 20  nce) => {.      
34f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 61                ma
3500: 74 63 68 20 69 6e 73 74 61 6e 63 65 2e 64 65 66  tch instance.def
3510: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
3520: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 57 65             // We
3530: 20 6f 6e 6c 79 20 77 61 6e 74 20 74 6f 20 74 61   only want to ta
3540: 6b 65 20 48 69 72 49 64 73 20 6f 66 20 75 73 65  ke HirIds of use
3550: 72 2d 64 65 66 69 6e 65 64 0a 20 20 20 20 20 20  r-defined.      
3560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3570: 20 20 2f 2f 20 69 6e 73 74 61 6e 63 65 73 20 69    // instances i
3580: 6e 74 6f 20 61 63 63 6f 75 6e 74 2e 20 54 68 65  nto account. The
3590: 20 6f 74 68 65 72 73 20 64 6f 6e 27 74 20 6d 61   others don't ma
35a0: 74 74 65 72 20 66 6f 72 0a 20 20 20 20 20 20 20  tter for.       
35b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35c0: 20 2f 2f 20 74 68 65 20 63 6f 64 65 67 65 6e 20   // the codegen 
35d0: 74 65 73 74 73 20 61 6e 64 20 63 61 6e 20 65 76  tests and can ev
35e0: 65 6e 20 6d 61 6b 65 20 69 74 65 6d 20 6f 72 64  en make item ord
35f0: 65 72 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  er.             
3600: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 75 6e             // un
3610: 73 74 61 62 6c 65 2e 0a 20 20 20 20 20 20 20 20  stable..        
3620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3630: 49 6e 73 74 61 6e 63 65 44 65 66 3a 3a 49 74 65  InstanceDef::Ite
3640: 6d 28 64 65 66 5f 69 64 29 20 3d 3e 20 7b 0a 20  m(def_id) => {. 
3650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3660: 20 20 20 20 20 20 20 20 20 20 20 74 63 78 2e 68             tcx.h
3670: 69 72 28 29 2e 61 73 5f 6c 6f 63 61 6c 5f 68 69  ir().as_local_hi
3680: 72 5f 69 64 28 64 65 66 5f 69 64 29 0a 20 20 20  r_id(def_id).   
3690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
36b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 49                 I
36c0: 6e 73 74 61 6e 63 65 44 65 66 3a 3a 56 74 61 62  nstanceDef::Vtab
36d0: 6c 65 53 68 69 6d 28 2e 2e 29 20 7c 0a 20 20 20  leShim(..) |.   
36e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36f0: 20 20 20 20 20 49 6e 73 74 61 6e 63 65 44 65 66       InstanceDef
3700: 3a 3a 52 65 69 66 79 53 68 69 6d 28 2e 2e 29 20  ::ReifyShim(..) 
3710: 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  |.              
3720: 20 20 20 20 20 20 20 20 20 20 49 6e 73 74 61 6e            Instan
3730: 63 65 44 65 66 3a 3a 49 6e 74 72 69 6e 73 69 63  ceDef::Intrinsic
3740: 28 2e 2e 29 20 7c 0a 20 20 20 20 20 20 20 20 20  (..) |.         
3750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 49                 I
3760: 6e 73 74 61 6e 63 65 44 65 66 3a 3a 46 6e 50 74  nstanceDef::FnPt
3770: 72 53 68 69 6d 28 2e 2e 29 20 7c 0a 20 20 20 20  rShim(..) |.    
3780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3790: 20 20 20 20 49 6e 73 74 61 6e 63 65 44 65 66 3a      InstanceDef:
37a0: 3a 56 69 72 74 75 61 6c 28 2e 2e 29 20 7c 0a 20  :Virtual(..) |. 
37b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37c0: 20 20 20 20 20 20 20 49 6e 73 74 61 6e 63 65 44         InstanceD
37d0: 65 66 3a 3a 43 6c 6f 73 75 72 65 4f 6e 63 65 53  ef::ClosureOnceS
37e0: 68 69 6d 20 7b 20 2e 2e 20 7d 20 7c 0a 20 20 20  him { .. } |.   
37f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3800: 20 20 20 20 20 49 6e 73 74 61 6e 63 65 44 65 66       InstanceDef
3810: 3a 3a 44 72 6f 70 47 6c 75 65 28 2e 2e 29 20 7c  ::DropGlue(..) |
3820: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3830: 20 20 20 20 20 20 20 20 20 49 6e 73 74 61 6e 63           Instanc
3840: 65 44 65 66 3a 3a 43 6c 6f 6e 65 53 68 69 6d 28  eDef::CloneShim(
3850: 2e 2e 29 20 3d 3e 20 7b 0a 20 20 20 20 20 20 20  ..) => {.       
3860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3870: 20 20 20 20 20 4e 6f 6e 65 0a 20 20 20 20 20 20       None.      
3880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3890: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
38a0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
38b0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
38c0: 20 20 20 20 20 20 20 20 20 20 20 20 4d 6f 6e 6f              Mono
38d0: 49 74 65 6d 3a 3a 53 74 61 74 69 63 28 64 65 66  Item::Static(def
38e0: 5f 69 64 29 20 3d 3e 20 7b 0a 20 20 20 20 20 20  _id) => {.      
38f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 63                tc
3900: 78 2e 68 69 72 28 29 2e 61 73 5f 6c 6f 63 61 6c  x.hir().as_local
3910: 5f 68 69 72 5f 69 64 28 64 65 66 5f 69 64 29 0a  _hir_id(def_id).
3920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3930: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
3940: 20 20 4d 6f 6e 6f 49 74 65 6d 3a 3a 47 6c 6f 62    MonoItem::Glob
3950: 61 6c 41 73 6d 28 68 69 72 5f 69 64 29 20 3d 3e  alAsm(hir_id) =>
3960: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
3970: 20 20 20 20 20 20 20 53 6f 6d 65 28 68 69 72 5f         Some(hir_
3980: 69 64 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  id).            
3990: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
39a0: 20 20 7d 2c 20 69 74 65 6d 2e 73 79 6d 62 6f 6c    }, item.symbol
39b0: 5f 6e 61 6d 65 28 74 63 78 29 29 0a 20 20 20 20  _name(tcx)).    
39c0: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 6c      }..        l
39d0: 65 74 20 6d 75 74 20 69 74 65 6d 73 3a 20 56 65  et mut items: Ve
39e0: 63 3c 5f 3e 20 3d 20 73 65 6c 66 2e 69 74 65 6d  c<_> = self.item
39f0: 73 28 29 2e 69 74 65 72 28 29 2e 6d 61 70 28 7c  s().iter().map(|
3a00: 28 26 69 2c 20 26 6c 29 7c 20 28 69 2c 20 6c 29  (&i, &l)| (i, l)
3a10: 29 2e 63 6f 6c 6c 65 63 74 28 29 3b 0a 20 20 20  ).collect();.   
3a20: 20 20 20 20 20 69 74 65 6d 73 2e 73 6f 72 74 5f       items.sort_
3a30: 62 79 5f 63 61 63 68 65 64 5f 6b 65 79 28 7c 26  by_cached_key(|&
3a40: 28 69 2c 20 5f 29 7c 20 69 74 65 6d 5f 73 6f 72  (i, _)| item_sor
3a50: 74 5f 6b 65 79 28 74 63 78 2c 20 69 29 29 3b 0a  t_key(tcx, i));.
3a60: 20 20 20 20 20 20 20 20 69 74 65 6d 73 0a 20 20          items.  
3a70: 20 20 7d 0a 0a 20 20 20 20 70 75 62 20 66 6e 20    }..    pub fn 
3a80: 63 6f 64 65 67 65 6e 5f 64 65 70 5f 6e 6f 64 65  codegen_dep_node
3a90: 28 26 73 65 6c 66 2c 20 74 63 78 3a 20 54 79 43  (&self, tcx: TyC
3aa0: 74 78 74 3c 27 74 63 78 3e 29 20 2d 3e 20 44 65  txt<'tcx>) -> De
3ab0: 70 4e 6f 64 65 20 7b 0a 20 20 20 20 20 20 20 20  pNode {.        
3ac0: 44 65 70 4e 6f 64 65 3a 3a 6e 65 77 28 74 63 78  DepNode::new(tcx
3ad0: 2c 20 44 65 70 43 6f 6e 73 74 72 75 63 74 6f 72  , DepConstructor
3ae0: 3a 3a 43 6f 6d 70 69 6c 65 43 6f 64 65 67 65 6e  ::CompileCodegen
3af0: 55 6e 69 74 28 73 65 6c 66 2e 6e 61 6d 65 28 29  Unit(self.name()
3b00: 2e 63 6c 6f 6e 65 28 29 29 29 0a 20 20 20 20 7d  .clone())).    }
3b10: 0a 7d 0a 0a 69 6d 70 6c 3c 27 61 2c 20 27 74 63  .}..impl<'a, 'tc
3b20: 78 3e 20 48 61 73 68 53 74 61 62 6c 65 3c 53 74  x> HashStable<St
3b30: 61 62 6c 65 48 61 73 68 69 6e 67 43 6f 6e 74 65  ableHashingConte
3b40: 78 74 3c 27 61 3e 3e 20 66 6f 72 20 43 6f 64 65  xt<'a>> for Code
3b50: 67 65 6e 55 6e 69 74 3c 27 74 63 78 3e 20 7b 0a  genUnit<'tcx> {.
3b60: 20 20 20 20 66 6e 20 68 61 73 68 5f 73 74 61 62      fn hash_stab
3b70: 6c 65 28 26 73 65 6c 66 2c 20 68 63 78 3a 20 26  le(&self, hcx: &
3b80: 6d 75 74 20 53 74 61 62 6c 65 48 61 73 68 69 6e  mut StableHashin
3b90: 67 43 6f 6e 74 65 78 74 3c 27 61 3e 2c 20 68 61  gContext<'a>, ha
3ba0: 73 68 65 72 3a 20 26 6d 75 74 20 53 74 61 62 6c  sher: &mut Stabl
3bb0: 65 48 61 73 68 65 72 29 20 7b 0a 20 20 20 20 20  eHasher) {.     
3bc0: 20 20 20 6c 65 74 20 43 6f 64 65 67 65 6e 55 6e     let CodegenUn
3bd0: 69 74 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  it {.           
3be0: 20 72 65 66 20 69 74 65 6d 73 2c 0a 20 20 20 20   ref items,.    
3bf0: 20 20 20 20 20 20 20 20 6e 61 6d 65 2c 0a 20 20          name,.  
3c00: 20 20 20 20 20 20 20 20 20 20 2f 2f 20 54 68 65            // The
3c10: 20 73 69 7a 65 20 65 73 74 69 6d 61 74 65 20 69   size estimate i
3c20: 73 20 6e 6f 74 20 72 65 6c 65 76 61 6e 74 20 74  s not relevant t
3c30: 6f 20 74 68 65 20 68 61 73 68 0a 20 20 20 20 20  o the hash.     
3c40: 20 20 20 20 20 20 20 73 69 7a 65 5f 65 73 74 69         size_esti
3c50: 6d 61 74 65 3a 20 5f 2c 0a 20 20 20 20 20 20 20  mate: _,.       
3c60: 20 7d 20 3d 20 2a 73 65 6c 66 3b 0a 0a 20 20 20   } = *self;..   
3c70: 20 20 20 20 20 6e 61 6d 65 2e 68 61 73 68 5f 73       name.hash_s
3c80: 74 61 62 6c 65 28 68 63 78 2c 20 68 61 73 68 65  table(hcx, hashe
3c90: 72 29 3b 0a 0a 20 20 20 20 20 20 20 20 6c 65 74  r);..        let
3ca0: 20 6d 75 74 20 69 74 65 6d 73 3a 20 56 65 63 3c   mut items: Vec<
3cb0: 28 46 69 6e 67 65 72 70 72 69 6e 74 2c 20 5f 29  (Fingerprint, _)
3cc0: 3e 20 3d 20 69 74 65 6d 73 2e 69 74 65 72 28 29  > = items.iter()
3cd0: 2e 6d 61 70 28 7c 28 6d 6f 6e 6f 5f 69 74 65 6d  .map(|(mono_item
3ce0: 2c 20 26 61 74 74 72 73 29 7c 20 7b 0a 20 20 20  , &attrs)| {.   
3cf0: 20 20 20 20 20 20 20 20 20 6c 65 74 20 6d 75 74           let mut
3d00: 20 68 61 73 68 65 72 20 3d 20 53 74 61 62 6c 65   hasher = Stable
3d10: 48 61 73 68 65 72 3a 3a 6e 65 77 28 29 3b 0a 20  Hasher::new();. 
3d20: 20 20 20 20 20 20 20 20 20 20 20 6d 6f 6e 6f 5f             mono_
3d30: 69 74 65 6d 2e 68 61 73 68 5f 73 74 61 62 6c 65  item.hash_stable
3d40: 28 68 63 78 2c 20 26 6d 75 74 20 68 61 73 68 65  (hcx, &mut hashe
3d50: 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  r);.            
3d60: 6c 65 74 20 6d 6f 6e 6f 5f 69 74 65 6d 5f 66 69  let mono_item_fi
3d70: 6e 67 65 72 70 72 69 6e 74 20 3d 20 68 61 73 68  ngerprint = hash
3d80: 65 72 2e 66 69 6e 69 73 68 28 29 3b 0a 20 20 20  er.finish();.   
3d90: 20 20 20 20 20 20 20 20 20 28 6d 6f 6e 6f 5f 69           (mono_i
3da0: 74 65 6d 5f 66 69 6e 67 65 72 70 72 69 6e 74 2c  tem_fingerprint,
3db0: 20 61 74 74 72 73 29 0a 20 20 20 20 20 20 20 20   attrs).        
3dc0: 7d 29 2e 63 6f 6c 6c 65 63 74 28 29 3b 0a 0a 20  }).collect();.. 
3dd0: 20 20 20 20 20 20 20 69 74 65 6d 73 2e 73 6f 72         items.sor
3de0: 74 5f 75 6e 73 74 61 62 6c 65 5f 62 79 5f 6b 65  t_unstable_by_ke
3df0: 79 28 7c 69 7c 20 69 2e 30 29 3b 0a 20 20 20 20  y(|i| i.0);.    
3e00: 20 20 20 20 69 74 65 6d 73 2e 68 61 73 68 5f 73      items.hash_s
3e10: 74 61 62 6c 65 28 68 63 78 2c 20 68 61 73 68 65  table(hcx, hashe
3e20: 72 29 3b 0a 20 20 20 20 7d 0a 7d 0a 0a 70 75 62  r);.    }.}..pub
3e30: 20 73 74 72 75 63 74 20 43 6f 64 65 67 65 6e 55   struct CodegenU
3e40: 6e 69 74 4e 61 6d 65 42 75 69 6c 64 65 72 3c 27  nitNameBuilder<'
3e50: 74 63 78 3e 20 7b 0a 20 20 20 20 74 63 78 3a 20  tcx> {.    tcx: 
3e60: 54 79 43 74 78 74 3c 27 74 63 78 3e 2c 0a 20 20  TyCtxt<'tcx>,.  
3e70: 20 20 63 61 63 68 65 3a 20 46 78 48 61 73 68 4d    cache: FxHashM
3e80: 61 70 3c 43 72 61 74 65 4e 75 6d 2c 20 53 74 72  ap<CrateNum, Str
3e90: 69 6e 67 3e 2c 0a 7d 0a 0a 69 6d 70 6c 20 43 6f  ing>,.}..impl Co
3ea0: 64 65 67 65 6e 55 6e 69 74 4e 61 6d 65 42 75 69  degenUnitNameBui
3eb0: 6c 64 65 72 3c 27 74 63 78 3e 20 7b 0a 20 20 20  lder<'tcx> {.   
3ec0: 20 70 75 62 20 66 6e 20 6e 65 77 28 74 63 78 3a   pub fn new(tcx:
3ed0: 20 54 79 43 74 78 74 3c 27 74 63 78 3e 29 20 2d   TyCtxt<'tcx>) -
3ee0: 3e 20 53 65 6c 66 20 7b 0a 20 20 20 20 20 20 20  > Self {.       
3ef0: 20 43 6f 64 65 67 65 6e 55 6e 69 74 4e 61 6d 65   CodegenUnitName
3f00: 42 75 69 6c 64 65 72 20 7b 0a 20 20 20 20 20 20  Builder {.      
3f10: 20 20 20 20 20 20 74 63 78 2c 0a 20 20 20 20 20        tcx,.     
3f20: 20 20 20 20 20 20 20 63 61 63 68 65 3a 20 44 65         cache: De
3f30: 66 61 75 6c 74 3a 3a 64 65 66 61 75 6c 74 28 29  fault::default()
3f40: 2c 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ,.        }.    
3f50: 7d 0a 0a 20 20 20 20 2f 2f 2f 20 43 47 55 20 6e  }..    /// CGU n
3f60: 61 6d 65 73 20 73 68 6f 75 6c 64 20 66 75 6c 66  ames should fulf
3f70: 69 6c 6c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ill the followin
3f80: 67 20 72 65 71 75 69 72 65 6d 65 6e 74 73 3a 0a  g requirements:.
3f90: 20 20 20 20 2f 2f 2f 20 2d 20 54 68 65 79 20 73      /// - They s
3fa0: 68 6f 75 6c 64 20 62 65 20 61 62 6c 65 20 74 6f  hould be able to
3fb0: 20 61 63 74 20 61 73 20 61 20 66 69 6c 65 20 6e   act as a file n
3fc0: 61 6d 65 20 6f 6e 20 61 6e 79 20 6b 69 6e 64 20  ame on any kind 
3fd0: 6f 66 20 66 69 6c 65 20 73 79 73 74 65 6d 0a 20  of file system. 
3fe0: 20 20 20 2f 2f 2f 20 2d 20 54 68 65 79 20 73 68     /// - They sh
3ff0: 6f 75 6c 64 20 6e 6f 74 20 63 6f 6c 6c 69 64 65  ould not collide
4000: 20 77 69 74 68 20 6f 74 68 65 72 20 43 47 55 20   with other CGU 
4010: 6e 61 6d 65 73 2c 20 65 76 65 6e 20 66 6f 72 20  names, even for 
4020: 64 69 66 66 65 72 65 6e 74 20 76 65 72 73 69 6f  different versio
4030: 6e 73 0a 20 20 20 20 2f 2f 2f 20 20 20 6f 66 20  ns.    ///   of 
4040: 74 68 65 20 73 61 6d 65 20 63 72 61 74 65 2e 0a  the same crate..
4050: 20 20 20 20 2f 2f 2f 0a 20 20 20 20 2f 2f 2f 20      ///.    /// 
4060: 43 6f 6e 73 65 71 75 65 6e 74 6c 79 2c 20 77 65  Consequently, we
4070: 20 64 6f 6e 27 74 20 75 73 65 20 73 70 65 63 69   don't use speci
4080: 61 6c 20 63 68 61 72 61 63 74 65 72 73 20 65 78  al characters ex
4090: 63 65 70 74 20 66 6f 72 20 27 2e 27 20 61 6e 64  cept for '.' and
40a0: 20 27 2d 27 20 61 6e 64 20 77 65 0a 20 20 20 20   '-' and we.    
40b0: 2f 2f 2f 20 70 72 65 66 69 78 20 65 61 63 68 20  /// prefix each 
40c0: 6e 61 6d 65 20 77 69 74 68 20 74 68 65 20 63 72  name with the cr
40d0: 61 74 65 2d 6e 61 6d 65 20 61 6e 64 20 63 72 61  ate-name and cra
40e0: 74 65 2d 64 69 73 61 6d 62 69 67 75 61 74 6f 72  te-disambiguator
40f0: 2e 0a 20 20 20 20 2f 2f 2f 0a 20 20 20 20 2f 2f  ..    ///.    //
4100: 2f 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  / This function 
4110: 77 69 6c 6c 20 62 75 69 6c 64 20 43 47 55 20 6e  will build CGU n
4120: 61 6d 65 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  ames of the form
4130: 3a 0a 20 20 20 20 2f 2f 2f 0a 20 20 20 20 2f 2f  :.    ///.    //
4140: 2f 20 60 60 60 0a 20 20 20 20 2f 2f 2f 20 3c 63  / ```.    /// <c
4150: 72 61 74 65 2d 6e 61 6d 65 3e 2e 3c 63 72 61 74  rate-name>.<crat
4160: 65 2d 64 69 73 61 6d 62 69 67 75 61 74 6f 72 3e  e-disambiguator>
4170: 5b 2d 69 6e 2d 3c 6c 6f 63 61 6c 2d 63 72 61 74  [-in-<local-crat
4180: 65 2d 69 64 3e 5d 28 2d 3c 63 6f 6d 70 6f 6e 65  e-id>](-<compone
4190: 6e 74 3e 29 2a 5b 2e 3c 73 70 65 63 69 61 6c 2d  nt>)*[.<special-
41a0: 73 75 66 66 69 78 3e 5d 0a 20 20 20 20 2f 2f 2f  suffix>].    ///
41b0: 20 3c 6c 6f 63 61 6c 2d 63 72 61 74 65 2d 69 64   <local-crate-id
41c0: 3e 20 3d 20 3c 6c 6f 63 61 6c 2d 63 72 61 74 65  > = <local-crate
41d0: 2d 6e 61 6d 65 3e 2e 3c 6c 6f 63 61 6c 2d 63 72  -name>.<local-cr
41e0: 61 74 65 2d 64 69 73 61 6d 62 69 67 75 61 74 6f  ate-disambiguato
41f0: 72 3e 0a 20 20 20 20 2f 2f 2f 20 60 60 60 0a 20  r>.    /// ```. 
4200: 20 20 20 2f 2f 2f 0a 20 20 20 20 2f 2f 2f 20 54     ///.    /// T
4210: 68 65 20 27 2e 27 20 62 65 66 6f 72 65 20 60 3c  he '.' before `<
4220: 73 70 65 63 69 61 6c 2d 73 75 66 66 69 78 3e 60  special-suffix>`
4230: 20 6d 61 6b 65 73 20 73 75 72 65 20 74 68 61 74   makes sure that
4240: 20 6e 61 6d 65 73 20 77 69 74 68 20 61 20 73 70   names with a sp
4250: 65 63 69 61 6c 0a 20 20 20 20 2f 2f 2f 20 73 75  ecial.    /// su
4260: 66 66 69 78 20 63 61 6e 20 6e 65 76 65 72 20 63  ffix can never c
4270: 6f 6c 6c 69 64 65 20 77 69 74 68 20 61 20 6e 61  ollide with a na
4280: 6d 65 20 62 75 69 6c 74 20 6f 75 74 20 6f 66 20  me built out of 
4290: 72 65 67 75 6c 61 72 20 52 75 73 74 0a 20 20 20  regular Rust.   
42a0: 20 2f 2f 2f 20 69 64 65 6e 74 69 66 69 65 72 73   /// identifiers
42b0: 20 28 65 2e 67 2e 2c 20 6d 6f 64 75 6c 65 20 70   (e.g., module p
42c0: 61 74 68 73 29 2e 0a 20 20 20 20 70 75 62 20 66  aths)..    pub f
42d0: 6e 20 62 75 69 6c 64 5f 63 67 75 5f 6e 61 6d 65  n build_cgu_name
42e0: 3c 49 2c 20 43 2c 20 53 3e 28 26 6d 75 74 20 73  <I, C, S>(&mut s
42f0: 65 6c 66 2c 0a 20 20 20 20 20 20 20 20 20 20 20  elf,.           
4300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4310: 20 20 20 20 20 20 20 20 63 6e 75 6d 3a 20 43 72          cnum: Cr
4320: 61 74 65 4e 75 6d 2c 0a 20 20 20 20 20 20 20 20  ateNum,.        
4330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4340: 20 20 20 20 20 20 20 20 20 20 20 63 6f 6d 70 6f             compo
4350: 6e 65 6e 74 73 3a 20 49 2c 0a 20 20 20 20 20 20  nents: I,.      
4360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4370: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 70 65               spe
4380: 63 69 61 6c 5f 73 75 66 66 69 78 3a 20 4f 70 74  cial_suffix: Opt
4390: 69 6f 6e 3c 53 3e 29 0a 20 20 20 20 20 20 20 20  ion<S>).        
43a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
43b0: 20 20 20 20 20 20 20 20 20 20 20 2d 3e 20 53 79             -> Sy
43c0: 6d 62 6f 6c 0a 20 20 20 20 20 20 20 20 77 68 65  mbol.        whe
43d0: 72 65 20 49 3a 20 49 6e 74 6f 49 74 65 72 61 74  re I: IntoIterat
43e0: 6f 72 3c 49 74 65 6d 3d 43 3e 2c 0a 20 20 20 20  or<Item=C>,.    
43f0: 20 20 20 20 20 20 20 20 20 20 43 3a 20 66 6d 74            C: fmt
4400: 3a 3a 44 69 73 70 6c 61 79 2c 0a 20 20 20 20 20  ::Display,.     
4410: 20 20 20 20 20 20 20 20 20 53 3a 20 66 6d 74 3a           S: fmt:
4420: 3a 44 69 73 70 6c 61 79 2c 0a 20 20 20 20 7b 0a  :Display,.    {.
4430: 20 20 20 20 20 20 20 20 6c 65 74 20 63 67 75 5f          let cgu_
4440: 6e 61 6d 65 20 3d 20 73 65 6c 66 2e 62 75 69 6c  name = self.buil
4450: 64 5f 63 67 75 5f 6e 61 6d 65 5f 6e 6f 5f 6d 61  d_cgu_name_no_ma
4460: 6e 67 6c 65 28 63 6e 75 6d 2c 0a 20 20 20 20 20  ngle(cnum,.     
4470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
44a0: 63 6f 6d 70 6f 6e 65 6e 74 73 2c 0a 20 20 20 20  components,.    
44b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
44c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
44d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
44e0: 20 73 70 65 63 69 61 6c 5f 73 75 66 66 69 78 29   special_suffix)
44f0: 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 20 73 65  ;..        if se
4500: 6c 66 2e 74 63 78 2e 73 65 73 73 2e 6f 70 74 73  lf.tcx.sess.opts
4510: 2e 64 65 62 75 67 67 69 6e 67 5f 6f 70 74 73 2e  .debugging_opts.
4520: 68 75 6d 61 6e 5f 72 65 61 64 61 62 6c 65 5f 63  human_readable_c
4530: 67 75 5f 6e 61 6d 65 73 20 7b 0a 20 20 20 20 20  gu_names {.     
4540: 20 20 20 20 20 20 20 63 67 75 5f 6e 61 6d 65 0a         cgu_name.
4550: 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
4560: 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c 65 74  .            let
4570: 20 63 67 75 5f 6e 61 6d 65 20 3d 20 26 63 67 75   cgu_name = &cgu
4580: 5f 6e 61 6d 65 2e 61 73 5f 73 74 72 28 29 3b 0a  _name.as_str();.
4590: 20 20 20 20 20 20 20 20 20 20 20 20 53 79 6d 62              Symb
45a0: 6f 6c 3a 3a 69 6e 74 65 72 6e 28 26 43 6f 64 65  ol::intern(&Code
45b0: 67 65 6e 55 6e 69 74 3a 3a 6d 61 6e 67 6c 65 5f  genUnit::mangle_
45c0: 6e 61 6d 65 28 63 67 75 5f 6e 61 6d 65 29 29 0a  name(cgu_name)).
45d0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a          }.    }.
45e0: 0a 20 20 20 20 2f 2f 2f 20 53 61 6d 65 20 61 73  .    /// Same as
45f0: 20 60 43 6f 64 65 67 65 6e 55 6e 69 74 3a 3a 62   `CodegenUnit::b
4600: 75 69 6c 64 5f 63 67 75 5f 6e 61 6d 65 28 29 60  uild_cgu_name()`
4610: 20 62 75 74 20 77 69 6c 6c 20 6e 65 76 65 72 20   but will never 
4620: 6d 61 6e 67 6c 65 20 74 68 65 0a 20 20 20 20 2f  mangle the.    /
4630: 2f 2f 20 72 65 73 75 6c 74 69 6e 67 20 6e 61 6d  // resulting nam
4640: 65 2e 0a 20 20 20 20 70 75 62 20 66 6e 20 62 75  e..    pub fn bu
4650: 69 6c 64 5f 63 67 75 5f 6e 61 6d 65 5f 6e 6f 5f  ild_cgu_name_no_
4660: 6d 61 6e 67 6c 65 3c 49 2c 20 43 2c 20 53 3e 28  mangle<I, C, S>(
4670: 26 6d 75 74 20 73 65 6c 66 2c 0a 20 20 20 20 20  &mut self,.     
4680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
46a0: 20 20 20 20 20 20 20 20 63 6e 75 6d 3a 20 43 72          cnum: Cr
46b0: 61 74 65 4e 75 6d 2c 0a 20 20 20 20 20 20 20 20  ateNum,.        
46c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
46d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
46e0: 20 20 20 20 20 63 6f 6d 70 6f 6e 65 6e 74 73 3a       components:
46f0: 20 49 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   I,.            
4700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4720: 20 73 70 65 63 69 61 6c 5f 73 75 66 66 69 78 3a   special_suffix:
4730: 20 4f 70 74 69 6f 6e 3c 53 3e 29 0a 20 20 20 20   Option<S>).    
4740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4760: 20 20 20 20 20 20 20 20 20 2d 3e 20 53 79 6d 62           -> Symb
4770: 6f 6c 0a 20 20 20 20 20 20 20 20 77 68 65 72 65  ol.        where
4780: 20 49 3a 20 49 6e 74 6f 49 74 65 72 61 74 6f 72   I: IntoIterator
4790: 3c 49 74 65 6d 3d 43 3e 2c 0a 20 20 20 20 20 20  <Item=C>,.      
47a0: 20 20 20 20 20 20 20 20 43 3a 20 66 6d 74 3a 3a          C: fmt::
47b0: 44 69 73 70 6c 61 79 2c 0a 20 20 20 20 20 20 20  Display,.       
47c0: 20 20 20 20 20 20 20 53 3a 20 66 6d 74 3a 3a 44         S: fmt::D
47d0: 69 73 70 6c 61 79 2c 0a 20 20 20 20 7b 0a 20 20  isplay,.    {.  
47e0: 20 20 20 20 20 20 75 73 65 20 73 74 64 3a 3a 66        use std::f
47f0: 6d 74 3a 3a 57 72 69 74 65 3b 0a 0a 20 20 20 20  mt::Write;..    
4800: 20 20 20 20 6c 65 74 20 6d 75 74 20 63 67 75 5f      let mut cgu_
4810: 6e 61 6d 65 20 3d 20 53 74 72 69 6e 67 3a 3a 77  name = String::w
4820: 69 74 68 5f 63 61 70 61 63 69 74 79 28 36 34 29  ith_capacity(64)
4830: 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2f 20 53 74  ;..        // St
4840: 61 72 74 20 6f 75 74 20 77 69 74 68 20 74 68 65  art out with the
4850: 20 63 72 61 74 65 20 6e 61 6d 65 20 61 6e 64 20   crate name and 
4860: 64 69 73 61 6d 62 69 67 75 61 74 6f 72 0a 20 20  disambiguator.  
4870: 20 20 20 20 20 20 6c 65 74 20 74 63 78 20 3d 20        let tcx = 
4880: 73 65 6c 66 2e 74 63 78 3b 0a 20 20 20 20 20 20  self.tcx;.      
4890: 20 20 6c 65 74 20 63 72 61 74 65 5f 70 72 65 66    let crate_pref
48a0: 69 78 20 3d 20 73 65 6c 66 2e 63 61 63 68 65 2e  ix = self.cache.
48b0: 65 6e 74 72 79 28 63 6e 75 6d 29 2e 6f 72 5f 69  entry(cnum).or_i
48c0: 6e 73 65 72 74 5f 77 69 74 68 28 7c 7c 20 7b 0a  nsert_with(|| {.
48d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 57              // W
48e0: 68 65 6e 65 76 65 72 20 74 68 65 20 63 6e 75 6d  henever the cnum
48f0: 20 69 73 20 6e 6f 74 20 4c 4f 43 41 4c 5f 43 52   is not LOCAL_CR
4900: 41 54 45 20 77 65 20 61 6c 73 6f 20 6d 69 78 20  ATE we also mix 
4910: 69 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20 20  in the.         
4920: 20 20 20 2f 2f 20 6c 6f 63 61 6c 20 63 72 61 74     // local crat
4930: 65 27 73 20 49 44 2e 20 4f 74 68 65 72 77 69 73  e's ID. Otherwis
4940: 65 20 74 68 65 72 65 20 63 61 6e 20 62 65 20 63  e there can be c
4950: 6f 6c 6c 69 73 69 6f 6e 73 20 62 65 74 77 65 65  ollisions betwee
4960: 6e 20 43 47 55 73 0a 20 20 20 20 20 20 20 20 20  n CGUs.         
4970: 20 20 20 2f 2f 20 69 6e 73 74 61 6e 74 69 61 74     // instantiat
4980: 69 6e 67 20 73 74 75 66 66 20 66 6f 72 20 75 70  ing stuff for up
4990: 73 74 72 65 61 6d 20 63 72 61 74 65 73 2e 0a 20  stream crates.. 
49a0: 20 20 20 20 20 20 20 20 20 20 20 6c 65 74 20 6c             let l
49b0: 6f 63 61 6c 5f 63 72 61 74 65 5f 69 64 20 3d 20  ocal_crate_id = 
49c0: 69 66 20 63 6e 75 6d 20 21 3d 20 4c 4f 43 41 4c  if cnum != LOCAL
49d0: 5f 43 52 41 54 45 20 7b 0a 20 20 20 20 20 20 20  _CRATE {.       
49e0: 20 20 20 20 20 20 20 20 20 6c 65 74 20 6c 6f 63           let loc
49f0: 61 6c 5f 63 72 61 74 65 5f 64 69 73 61 6d 62 69  al_crate_disambi
4a00: 67 75 61 74 6f 72 20 3d 0a 20 20 20 20 20 20 20  guator =.       
4a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72               for
4a20: 6d 61 74 21 28 22 7b 7d 22 2c 20 74 63 78 2e 63  mat!("{}", tcx.c
4a30: 72 61 74 65 5f 64 69 73 61 6d 62 69 67 75 61 74  rate_disambiguat
4a40: 6f 72 28 4c 4f 43 41 4c 5f 43 52 41 54 45 29 29  or(LOCAL_CRATE))
4a50: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
4a60: 20 20 66 6f 72 6d 61 74 21 28 22 2d 69 6e 2d 7b    format!("-in-{
4a70: 7d 2e 7b 7d 22 2c 0a 20 20 20 20 20 20 20 20 20  }.{}",.         
4a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
4a90: 63 78 2e 63 72 61 74 65 5f 6e 61 6d 65 28 4c 4f  cx.crate_name(LO
4aa0: 43 41 4c 5f 43 52 41 54 45 29 2c 0a 20 20 20 20  CAL_CRATE),.    
4ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ac0: 20 20 20 20 26 6c 6f 63 61 6c 5f 63 72 61 74 65      &local_crate
4ad0: 5f 64 69 73 61 6d 62 69 67 75 61 74 6f 72 5b 30  _disambiguator[0
4ae0: 20 2e 2e 20 38 5d 29 0a 20 20 20 20 20 20 20 20   .. 8]).        
4af0: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
4b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 53 74 72               Str
4b10: 69 6e 67 3a 3a 6e 65 77 28 29 0a 20 20 20 20 20  ing::new().     
4b20: 20 20 20 20 20 20 20 7d 3b 0a 0a 20 20 20 20 20         };..     
4b30: 20 20 20 20 20 20 20 6c 65 74 20 63 72 61 74 65         let crate
4b40: 5f 64 69 73 61 6d 62 69 67 75 61 74 6f 72 20 3d  _disambiguator =
4b50: 20 74 63 78 2e 63 72 61 74 65 5f 64 69 73 61 6d   tcx.crate_disam
4b60: 62 69 67 75 61 74 6f 72 28 63 6e 75 6d 29 2e 74  biguator(cnum).t
4b70: 6f 5f 73 74 72 69 6e 67 28 29 3b 0a 20 20 20 20  o_string();.    
4b80: 20 20 20 20 20 20 20 20 2f 2f 20 55 73 69 6e 67          // Using
4b90: 20 61 20 73 68 6f 72 74 65 6e 65 64 20 64 69 73   a shortened dis
4ba0: 61 6d 62 69 67 75 61 74 6f 72 20 6f 66 20 61 62  ambiguator of ab
4bb0: 6f 75 74 20 34 30 20 62 69 74 73 0a 20 20 20 20  out 40 bits.    
4bc0: 20 20 20 20 20 20 20 20 66 6f 72 6d 61 74 21 28          format!(
4bd0: 22 7b 7d 2e 7b 7d 7b 7d 22 2c 0a 20 20 20 20 20  "{}.{}{}",.     
4be0: 20 20 20 20 20 20 20 20 20 20 20 74 63 78 2e 63             tcx.c
4bf0: 72 61 74 65 5f 6e 61 6d 65 28 63 6e 75 6d 29 2c  rate_name(cnum),
4c00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
4c10: 20 26 63 72 61 74 65 5f 64 69 73 61 6d 62 69 67   &crate_disambig
4c20: 75 61 74 6f 72 5b 30 20 2e 2e 20 38 5d 2c 0a 20  uator[0 .. 8],. 
4c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c                 l
4c40: 6f 63 61 6c 5f 63 72 61 74 65 5f 69 64 29 0a 20  ocal_crate_id). 
4c50: 20 20 20 20 20 20 20 7d 29 3b 0a 0a 20 20 20 20         });..    
4c60: 20 20 20 20 77 72 69 74 65 21 28 63 67 75 5f 6e      write!(cgu_n
4c70: 61 6d 65 2c 20 22 7b 7d 22 2c 20 63 72 61 74 65  ame, "{}", crate
4c80: 5f 70 72 65 66 69 78 29 2e 75 6e 77 72 61 70 28  _prefix).unwrap(
4c90: 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2f 20 41  );..        // A
4ca0: 64 64 20 74 68 65 20 63 6f 6d 70 6f 6e 65 6e 74  dd the component
4cb0: 73 0a 20 20 20 20 20 20 20 20 66 6f 72 20 63 6f  s.        for co
4cc0: 6d 70 6f 6e 65 6e 74 20 69 6e 20 63 6f 6d 70 6f  mponent in compo
4cd0: 6e 65 6e 74 73 20 7b 0a 20 20 20 20 20 20 20 20  nents {.        
4ce0: 20 20 20 20 77 72 69 74 65 21 28 63 67 75 5f 6e      write!(cgu_n
4cf0: 61 6d 65 2c 20 22 2d 7b 7d 22 2c 20 63 6f 6d 70  ame, "-{}", comp
4d00: 6f 6e 65 6e 74 29 2e 75 6e 77 72 61 70 28 29 3b  onent).unwrap();
4d10: 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
4d20: 20 20 20 20 69 66 20 6c 65 74 20 53 6f 6d 65 28      if let Some(
4d30: 73 70 65 63 69 61 6c 5f 73 75 66 66 69 78 29 20  special_suffix) 
4d40: 3d 20 73 70 65 63 69 61 6c 5f 73 75 66 66 69 78  = special_suffix
4d50: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f   {.            /
4d60: 2f 20 57 65 20 61 64 64 20 61 20 64 6f 74 20 69  / We add a dot i
4d70: 6e 20 68 65 72 65 20 73 6f 20 69 74 20 63 61 6e  n here so it can
4d80: 6e 6f 74 20 63 6c 61 73 68 20 77 69 74 68 20 61  not clash with a
4d90: 6e 79 74 68 69 6e 67 20 69 6e 20 61 20 72 65 67  nything in a reg
4da0: 75 6c 61 72 0a 20 20 20 20 20 20 20 20 20 20 20  ular.           
4db0: 20 2f 2f 20 52 75 73 74 20 69 64 65 6e 74 69 66   // Rust identif
4dc0: 69 65 72 0a 20 20 20 20 20 20 20 20 20 20 20 20  ier.            
4dd0: 77 72 69 74 65 21 28 63 67 75 5f 6e 61 6d 65 2c  write!(cgu_name,
4de0: 20 22 2e 7b 7d 22 2c 20 73 70 65 63 69 61 6c 5f   ".{}", special_
4df0: 73 75 66 66 69 78 29 2e 75 6e 77 72 61 70 28 29  suffix).unwrap()
4e00: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
4e10: 20 20 20 20 20 53 79 6d 62 6f 6c 3a 3a 69 6e 74       Symbol::int
4e20: 65 72 6e 28 26 63 67 75 5f 6e 61 6d 65 5b 2e 2e  ern(&cgu_name[..
4e30: 5d 29 0a 20 20 20 20 7d 0a 7d 0a                 ]).    }.}.