]> git.lizzy.rs Git - rust.git/commitdiff
Add case for count_code_region() extern lang_item
authorRich Kadel <richkadel@google.com>
Fri, 5 Jun 2020 16:14:45 +0000 (09:14 -0700)
committerRich Kadel <richkadel@google.com>
Mon, 15 Jun 2020 23:50:10 +0000 (16:50 -0700)
As suggested in PR feedback:

https://github.com/rust-lang/rust/pull/73011#discussion_r435728923

This allows count_code_region() to be handled like a normal intrinsic so
the InstanceDef::InjectedCode variant is no longer needed.

13 files changed:
src/libcore/intrinsics.rs
src/librustc_codegen_ssa/mir/block.rs
src/librustc_middle/mir/mono.rs
src/librustc_middle/ty/instance.rs
src/librustc_middle/ty/mod.rs
src/librustc_middle/ty/structural_impls.rs
src/librustc_mir/interpret/terminator.rs
src/librustc_mir/monomorphize/collector.rs
src/librustc_mir/monomorphize/partitioning.rs
src/librustc_mir/shim.rs
src/librustc_passes/weak_lang_items.rs
src/librustc_ty/instance.rs
src/librustc_typeck/check/intrinsic.rs

index 06a432a26961ef56200eeb76b1faaab498538943..7ce5814d39a025a823c351eb8fe549843767e0c8 100644 (file)
     ///
     /// Perma-unstable: do not use.
     pub fn miri_start_panic(payload: *mut u8) -> !;
-}
 
-/// Defines the `count_code_region` intrinsic as a `LangItem`. `LangItem`s require a function body
-/// to register its DefId with the LangItem entry. The function body is never actually called (and
-/// is therefore implemented as an aborting stub) because it is replaced with the LLVM intrinsic
-/// `llvm.instrprof.increment` by
-/// `rustc_codegen_llvm::intrinsic::IntrinsicCallMethods::codegen_intrinsic_call()`.
-#[cfg(not(bootstrap))]
-#[cfg_attr(not(bootstrap), lang = "count_code_region")]
-fn count_code_region(_index: u32) {
-    // remove `unsafe` (and safety comment) on bootstrap bump
-    #[cfg_attr(not(bootstrap), allow(unused_unsafe))]
-    // SAFETY: the `abort` intrinsic has no requirements to be called.
-    unsafe {
-        abort()
-    }
+    /// Internal placeholder for injecting code coverage counters when the "instrument-coverage"
+    /// option is enabled. The placeholder is replaced with `llvm.instrprof.increment` during code
+    /// generation.
+    #[cfg(not(bootstrap))]
+    #[cfg_attr(not(bootstrap), lang = "count_code_region")]
+    pub fn count_code_region(_index: u32);
 }
 
 // Some functions are defined here because they accidentally got made
index d7db65715499313ace29a448c689676bd3dd72e0..665ef770909879ef0ddaebfbfea6ccbee9b8d625 100644 (file)
@@ -566,10 +566,7 @@ fn codegen_call_terminator(
 
         // Handle intrinsics old codegen wants Expr's for, ourselves.
         let intrinsic = match def {
-            Some(ty::InstanceDef::Intrinsic(def_id))
-            | Some(ty::InstanceDef::InjectedCode(def_id)) => {
-                Some(bx.tcx().item_name(def_id).as_str())
-            }
+            Some(ty::InstanceDef::Intrinsic(def_id)) => Some(bx.tcx().item_name(def_id).as_str()),
             _ => None,
         };
         let intrinsic = intrinsic.as_ref().map(|s| &s[..]);
index b2c00849d9f8384a9493b7954c945b6527828769..c889dbc0a449848603e6c7901b209fb374376982 100644 (file)
@@ -352,7 +352,6 @@ fn item_sort_key<'tcx>(tcx: TyCtxt<'tcx>, item: MonoItem<'tcx>) -> ItemSortKey {
                             InstanceDef::VtableShim(..)
                             | InstanceDef::ReifyShim(..)
                             | InstanceDef::Intrinsic(..)
-                            | InstanceDef::InjectedCode(..)
                             | InstanceDef::FnPtrShim(..)
                             | InstanceDef::Virtual(..)
                             | InstanceDef::ClosureOnceShim { .. }
index 4f88e64c5039a86dcc124e97ac51034967703f09..1ce079821a22e52665609836777f986e2654a681 100644 (file)
@@ -21,10 +21,6 @@ pub enum InstanceDef<'tcx> {
     Item(DefId),
     Intrinsic(DefId),
 
-    /// Injected call to a placeholder function that is replaced with
-    /// For example: `core::intrinsic::count_code_region()` for code coverage.
-    InjectedCode(DefId),
-
     /// `<T as Trait>::method` where `method` receives unsizeable `self: Self`.
     VtableShim(DefId),
 
@@ -153,7 +149,6 @@ pub fn def_id(&self) -> DefId {
             | InstanceDef::FnPtrShim(def_id, _)
             | InstanceDef::Virtual(def_id, _)
             | InstanceDef::Intrinsic(def_id)
-            | InstanceDef::InjectedCode(def_id)
             | InstanceDef::ClosureOnceShim { call_once: def_id }
             | InstanceDef::DropGlue(def_id, _)
             | InstanceDef::CloneShim(def_id, _) => def_id,
@@ -241,7 +236,6 @@ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
             InstanceDef::VtableShim(_) => write!(f, " - shim(vtable)"),
             InstanceDef::ReifyShim(_) => write!(f, " - shim(reify)"),
             InstanceDef::Intrinsic(_) => write!(f, " - intrinsic"),
-            InstanceDef::InjectedCode(_) => write!(f, " - injected-code"),
             InstanceDef::Virtual(_, num) => write!(f, " - virtual#{}", num),
             InstanceDef::FnPtrShim(_, ty) => write!(f, " - shim({:?})", ty),
             InstanceDef::ClosureOnceShim { .. } => write!(f, " - shim"),
@@ -421,7 +415,6 @@ pub fn substs_for_mir_body(&self) -> Option<SubstsRef<'tcx>> {
             | InstanceDef::FnPtrShim(..)
             | InstanceDef::Item(_)
             | InstanceDef::Intrinsic(..)
-            | InstanceDef::InjectedCode(..)
             | InstanceDef::ReifyShim(..)
             | InstanceDef::Virtual(..)
             | InstanceDef::VtableShim(..) => Some(self.substs),
index 9b1e717731e826d172321eb3b9196ed7bb8b03aa..93ef73171993c0522fd161cda065e54c821fdf7d 100644 (file)
@@ -2717,7 +2717,6 @@ pub fn instance_mir(self, instance: ty::InstanceDef<'tcx>) -> &'tcx Body<'tcx> {
             ty::InstanceDef::VtableShim(..)
             | ty::InstanceDef::ReifyShim(..)
             | ty::InstanceDef::Intrinsic(..)
-            | ty::InstanceDef::InjectedCode(..)
             | ty::InstanceDef::FnPtrShim(..)
             | ty::InstanceDef::Virtual(..)
             | ty::InstanceDef::ClosureOnceShim { .. }
index b6cbd2082a5184f3b181f9f98e70cf7695bbd60b..f6f5dfd651612dbbc5e3376558218a2191f31bc9 100644 (file)
@@ -674,7 +674,6 @@ fn lift_to_tcx(&self, tcx: TyCtxt<'tcx>) -> Option<Self::Lifted> {
             ty::InstanceDef::VtableShim(def_id) => Some(ty::InstanceDef::VtableShim(def_id)),
             ty::InstanceDef::ReifyShim(def_id) => Some(ty::InstanceDef::ReifyShim(def_id)),
             ty::InstanceDef::Intrinsic(def_id) => Some(ty::InstanceDef::Intrinsic(def_id)),
-            ty::InstanceDef::InjectedCode(def_id) => Some(ty::InstanceDef::Intrinsic(def_id)),
             ty::InstanceDef::FnPtrShim(def_id, ref ty) => {
                 Some(ty::InstanceDef::FnPtrShim(def_id, tcx.lift(ty)?))
             }
@@ -847,7 +846,6 @@ fn super_fold_with<F: TypeFolder<'tcx>>(&self, folder: &mut F) -> Self {
                 VtableShim(did) => VtableShim(did.fold_with(folder)),
                 ReifyShim(did) => ReifyShim(did.fold_with(folder)),
                 Intrinsic(did) => Intrinsic(did.fold_with(folder)),
-                InjectedCode(did) => InjectedCode(did.fold_with(folder)),
                 FnPtrShim(did, ty) => FnPtrShim(did.fold_with(folder), ty.fold_with(folder)),
                 Virtual(did, i) => Virtual(did.fold_with(folder), i),
                 ClosureOnceShim { call_once } => {
@@ -863,12 +861,9 @@ fn super_visit_with<V: TypeVisitor<'tcx>>(&self, visitor: &mut V) -> bool {
         use crate::ty::InstanceDef::*;
         self.substs.visit_with(visitor)
             || match self.def {
-                Item(did)
-                | VtableShim(did)
-                | ReifyShim(did)
-                | Intrinsic(did)
-                | InjectedCode(did)
-                | Virtual(did, _) => did.visit_with(visitor),
+                Item(did) | VtableShim(did) | ReifyShim(did) | Intrinsic(did) | Virtual(did, _) => {
+                    did.visit_with(visitor)
+                }
                 FnPtrShim(did, ty) | CloneShim(did, ty) => {
                     did.visit_with(visitor) || ty.visit_with(visitor)
                 }
index 82fa471b54d73b684c12537d631e6baf598a23f0..cd7621ea9752b4ebc51a0d40394b060bb7a74346 100644 (file)
@@ -257,9 +257,6 @@ fn eval_fn_call(
                 assert!(caller_abi == Abi::RustIntrinsic || caller_abi == Abi::PlatformIntrinsic);
                 M::call_intrinsic(self, instance, args, ret, unwind)
             }
-            ty::InstanceDef::InjectedCode(..) => {
-                M::call_intrinsic(self, instance, args, ret, unwind)
-            }
             ty::InstanceDef::VtableShim(..)
             | ty::InstanceDef::ReifyShim(..)
             | ty::InstanceDef::ClosureOnceShim { .. }
index 24c4226bb4e9426d74638afddd01eec3ddc37c6f..994d1e69f2e3e709cefadfa34f4205121b151bf7 100644 (file)
@@ -714,9 +714,7 @@ fn visit_instance_use<'tcx>(
     }
 
     match instance.def {
-        ty::InstanceDef::Virtual(..)
-        | ty::InstanceDef::Intrinsic(_)
-        | ty::InstanceDef::InjectedCode(_) => {
+        ty::InstanceDef::Virtual(..) | ty::InstanceDef::Intrinsic(_) => {
             if !is_direct_call {
                 bug!("{:?} being reified", instance);
             }
@@ -753,7 +751,6 @@ fn should_monomorphize_locally<'tcx>(tcx: TyCtxt<'tcx>, instance: &Instance<'tcx
         | ty::InstanceDef::FnPtrShim(..)
         | ty::InstanceDef::DropGlue(..)
         | ty::InstanceDef::Intrinsic(_)
-        | ty::InstanceDef::InjectedCode(_)
         | ty::InstanceDef::CloneShim(..) => return true,
     };
 
index 7c97b9d611e15b64865ea2aee08a51783ef2cd00..db1ea72c0a53101af30755e93ef5934c80d82947 100644 (file)
@@ -322,7 +322,6 @@ fn mono_item_visibility(
         | InstanceDef::FnPtrShim(..)
         | InstanceDef::Virtual(..)
         | InstanceDef::Intrinsic(..)
-        | InstanceDef::InjectedCode(..)
         | InstanceDef::ClosureOnceShim { .. }
         | InstanceDef::DropGlue(..)
         | InstanceDef::CloneShim(..) => return Visibility::Hidden,
@@ -718,7 +717,6 @@ fn characteristic_def_id_of_mono_item<'tcx>(
                 | ty::InstanceDef::FnPtrShim(..)
                 | ty::InstanceDef::ClosureOnceShim { .. }
                 | ty::InstanceDef::Intrinsic(..)
-                | ty::InstanceDef::InjectedCode(..)
                 | ty::InstanceDef::DropGlue(..)
                 | ty::InstanceDef::Virtual(..)
                 | ty::InstanceDef::CloneShim(..) => return None,
index b4477d9c86d4370c69977d7c6c955d4e75e8b6b0..f95fd9b9e90c562f51b31024f7795957268934f9 100644 (file)
@@ -109,9 +109,6 @@ fn make_shim<'tcx>(tcx: TyCtxt<'tcx>, instance: ty::InstanceDef<'tcx>) -> Body<'
         ty::InstanceDef::Intrinsic(_) => {
             bug!("creating shims from intrinsics ({:?}) is unsupported", instance)
         }
-        ty::InstanceDef::InjectedCode(_) => {
-            bug!("creating shims from injected code ({:?}) is unsupported", instance)
-        }
     };
     debug!("make_shim({:?}) = untransformed {:?}", instance, result);
 
index 96ec23692df512dc799b0c5d700b102f91f17d26..f2f07b5d4fb26fba2d7a8acf877d2136f734b2ff 100644 (file)
@@ -5,10 +5,12 @@
 use rustc_hir as hir;
 use rustc_hir::intravisit::{self, NestedVisitorMap, Visitor};
 use rustc_hir::lang_items;
+use rustc_hir::lang_items::ITEM_REFS;
 use rustc_hir::weak_lang_items::WEAK_ITEMS_REFS;
 use rustc_middle::middle::lang_items::whitelisted;
 use rustc_middle::ty::TyCtxt;
 use rustc_session::config::CrateType;
+use rustc_span::symbol::sym;
 use rustc_span::symbol::Symbol;
 use rustc_span::Span;
 
@@ -70,11 +72,21 @@ fn verify<'tcx>(tcx: TyCtxt<'tcx>, items: &lang_items::LanguageItems) {
 }
 
 impl<'a, 'tcx> Context<'a, 'tcx> {
-    fn register(&mut self, name: Symbol, span: Span) {
+    fn register(&mut self, name: Symbol, span: Span, hir_id: hir::HirId) {
         if let Some(&item) = WEAK_ITEMS_REFS.get(&name) {
             if self.items.require(item).is_err() {
                 self.items.missing.push(item);
             }
+        } else if name == sym::count_code_region {
+            // `core::intrinsics::code_count_region()` is (currently) the only `extern` lang item
+            // that is never actually linked. It is not a `weak_lang_item` that can be registered
+            // when used, and should be registered here instead.
+            if let Some((item_index, _)) = ITEM_REFS.get(&*name.as_str()).cloned() {
+                if self.items.items[item_index].is_none() {
+                    let item_def_id = self.tcx.hir().local_def_id(hir_id).to_def_id();
+                    self.items.items[item_index] = Some(item_def_id);
+                }
+            }
         } else {
             struct_span_err!(self.tcx.sess, span, E0264, "unknown external lang item: `{}`", name)
                 .emit();
@@ -91,7 +103,7 @@ fn nested_visit_map(&mut self) -> NestedVisitorMap<Self::Map> {
 
     fn visit_foreign_item(&mut self, i: &hir::ForeignItem<'_>) {
         if let Some((lang_item, _)) = hir::lang_items::extract(&i.attrs) {
-            self.register(lang_item, i.span);
+            self.register(lang_item, i.span, i.hir_id);
         }
         intravisit::walk_foreign_item(self, i)
     }
index d4ceeff324450fa1b35897cfb22ba62a90e8b790..0acf7691681374387d2d5118b7ee2f2eeee3c8b0 100644 (file)
@@ -35,10 +35,6 @@ fn resolve_instance<'tcx>(
                 debug!(" => intrinsic");
                 ty::InstanceDef::Intrinsic(def_id)
             }
-            ty::FnDef(def_id, _) if Some(def_id) == tcx.lang_items().count_code_region_fn() => {
-                debug!(" => injected placeholder function to be replaced");
-                ty::InstanceDef::InjectedCode(def_id)
-            }
             ty::FnDef(def_id, substs) if Some(def_id) == tcx.lang_items().drop_in_place_fn() => {
                 let ty = substs.type_at(0);
 
index bded2c695c9db50f8df0275e2d1f383d92296df1..3ec6973a17d567fb704eb158d5605ce28d682c00 100644 (file)
@@ -347,6 +347,8 @@ pub fn check_intrinsic_type(tcx: TyCtxt<'_>, it: &hir::ForeignItem<'_>) {
                 return;
             }
 
+            "count_code_region" => (0, vec![tcx.types.u32], tcx.mk_unit()),
+
             ref other => {
                 struct_span_err!(
                     tcx.sess,