about summary refs log tree commit diff
path: root/compiler
diff options
context:
space:
mode:
authorOli Scherer <git-spam-no-reply9815368754983@oli-obk.de>2023-03-16 14:53:57 +0000
committerOli Scherer <git-spam-no-reply9815368754983@oli-obk.de>2023-03-16 14:53:57 +0000
commit6fe982283d70a9c6ab621093716ef616ce26e0b3 (patch)
treeeced1dcae0eb50f6cfe65280a152de260cc6db42 /compiler
parent18e305dfca6dfef07478378cb9a673fdba6ac3b3 (diff)
downloadrust-6fe982283d70a9c6ab621093716ef616ce26e0b3.tar.gz
rust-6fe982283d70a9c6ab621093716ef616ce26e0b3.zip
Remove `DefId` from `CrateItem` in favor of a lookup table
Diffstat (limited to 'compiler')
-rw-r--r--compiler/rustc_smir/src/rustc_internal/mod.rs19
-rw-r--r--compiler/rustc_smir/src/rustc_smir/mod.rs9
-rw-r--r--compiler/rustc_smir/src/stable_mir/mod.rs4
3 files changed, 24 insertions, 8 deletions
diff --git a/compiler/rustc_smir/src/rustc_internal/mod.rs b/compiler/rustc_smir/src/rustc_internal/mod.rs
index 3eaff9c051f..5998c8b6500 100644
--- a/compiler/rustc_smir/src/rustc_internal/mod.rs
+++ b/compiler/rustc_smir/src/rustc_internal/mod.rs
@@ -3,11 +3,28 @@
 //! For that, we define APIs that will temporarily be public to 3P that exposes rustc internal APIs
 //! until stable MIR is complete.
 
+use std::sync::RwLock;
+
 use crate::stable_mir;
 pub use rustc_span::def_id::{CrateNum, DefId};
 
+static DEF_ID_MAP: RwLock<Vec<DefId>> = RwLock::new(Vec::new());
+
 pub fn item_def_id(item: &stable_mir::CrateItem) -> DefId {
-    item.0
+    DEF_ID_MAP.read().unwrap()[item.0]
+}
+
+pub fn crate_item(did: DefId) -> stable_mir::CrateItem {
+    // FIXME: this becomes inefficient when we have too many ids
+    let mut map = DEF_ID_MAP.write().unwrap();
+    for (i, &d) in map.iter().enumerate() {
+        if d == did {
+            return stable_mir::CrateItem(i);
+        }
+    }
+    let id = map.len();
+    map.push(did);
+    stable_mir::CrateItem(id)
 }
 
 pub fn crate_num(item: &stable_mir::Crate) -> CrateNum {
diff --git a/compiler/rustc_smir/src/rustc_smir/mod.rs b/compiler/rustc_smir/src/rustc_smir/mod.rs
index d956f0ac802..c17dab6dce0 100644
--- a/compiler/rustc_smir/src/rustc_smir/mod.rs
+++ b/compiler/rustc_smir/src/rustc_smir/mod.rs
@@ -7,7 +7,10 @@
 //!
 //! For now, we are developing everything inside `rustc`, thus, we keep this module private.
 
-use crate::stable_mir::{self};
+use crate::{
+    rustc_internal::crate_item,
+    stable_mir::{self},
+};
 use rustc_middle::ty::{tls::with, TyCtxt};
 use rustc_span::def_id::{CrateNum, LOCAL_CRATE};
 use tracing::debug;
@@ -34,9 +37,7 @@ pub fn find_crate(name: &str) -> Option<stable_mir::Crate> {
 
 /// Retrieve all items of the local crate that have a MIR associated with them.
 pub fn all_local_items() -> stable_mir::CrateItems {
-    with(|tcx| {
-        tcx.mir_keys(()).iter().map(|item| stable_mir::CrateItem(item.to_def_id())).collect()
-    })
+    with(|tcx| tcx.mir_keys(()).iter().map(|item| crate_item(item.to_def_id())).collect())
 }
 
 /// Build a stable mir crate from a given crate number.
diff --git a/compiler/rustc_smir/src/stable_mir/mod.rs b/compiler/rustc_smir/src/stable_mir/mod.rs
index cbf52e691fb..6b3ab620e2d 100644
--- a/compiler/rustc_smir/src/stable_mir/mod.rs
+++ b/compiler/rustc_smir/src/stable_mir/mod.rs
@@ -11,8 +11,6 @@
 //! There shouldn't be any direct references to internal compiler constructs in this module.
 //! If you need an internal construct, consider using `rustc_internal` or `rustc_smir`.
 
-use crate::rustc_internal;
-
 /// Use String for now but we should replace it.
 pub type Symbol = String;
 
@@ -37,7 +35,7 @@ pub struct Crate {
 /// For now, it only stores the item DefId. Use functions inside `rustc_internal` module to
 /// use this item.
 #[derive(Clone, PartialEq, Eq, Debug)]
-pub struct CrateItem(pub(crate) rustc_internal::DefId);
+pub struct CrateItem(pub(crate) DefId);
 
 /// Access to the local crate.
 pub fn local_crate() -> Crate {