Skip to content
This repository was archived by the owner on May 28, 2025. It is now read-only.

Commit 0822c31

Browse files
beepster4096RalfJung
authored andcommitted
add namespace to resolve_path
1 parent 4d3e565 commit 0822c31

File tree

3 files changed

+29
-29
lines changed

3 files changed

+29
-29
lines changed

src/tools/miri/src/eval.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ use std::thread;
99
use log::info;
1010

1111
use rustc_data_structures::fx::FxHashSet;
12+
use rustc_hir::def::Namespace;
1213
use rustc_hir::def_id::DefId;
1314
use rustc_middle::ty::{
1415
self,
@@ -195,7 +196,7 @@ pub fn create_ecx<'mir, 'tcx: 'mir>(
195196
MiriMachine::late_init(&mut ecx, config)?;
196197

197198
// Make sure we have MIR. We check MIR for some stable monomorphic function in libcore.
198-
let sentinel = ecx.try_resolve_path(&["core", "ascii", "escape_default"]);
199+
let sentinel = ecx.try_resolve_path(&["core", "ascii", "escape_default"], Namespace::ValueNS);
199200
if !matches!(sentinel, Some(s) if tcx.is_mir_available(s.def.def_id())) {
200201
tcx.sess.fatal(
201202
"the current sysroot was built without `-Zalways-encode-mir`, or libcore seems missing. \

src/tools/miri/src/helpers.rs

Lines changed: 26 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,12 @@ pub mod convert;
22

33
use std::cmp;
44
use std::iter;
5-
use std::mem;
65
use std::num::NonZeroUsize;
76
use std::time::Duration;
87

98
use log::trace;
109

10+
use rustc_hir::def::{DefKind, Namespace};
1111
use rustc_hir::def_id::{DefId, CRATE_DEF_INDEX};
1212
use rustc_middle::mir;
1313
use rustc_middle::ty::{
@@ -74,48 +74,51 @@ const UNIX_IO_ERROR_TABLE: &[(&str, std::io::ErrorKind)] = {
7474
};
7575

7676
/// Gets an instance for a path.
77-
fn try_resolve_did<'tcx>(tcx: TyCtxt<'tcx>, path: &[&str]) -> Option<DefId> {
77+
fn try_resolve_did<'tcx>(tcx: TyCtxt<'tcx>, path: &[&str], namespace: Namespace) -> Option<DefId> {
7878
tcx.crates(()).iter().find(|&&krate| tcx.crate_name(krate).as_str() == path[0]).and_then(
7979
|krate| {
8080
let krate = DefId { krate: *krate, index: CRATE_DEF_INDEX };
8181
let mut items = tcx.module_children(krate);
82-
let mut path_it = path.iter().skip(1).peekable();
8382

84-
while let Some(segment) = path_it.next() {
85-
for item in mem::take(&mut items).iter() {
86-
if item.ident.name.as_str() == *segment {
87-
if path_it.peek().is_none() {
88-
return Some(item.res.def_id());
89-
}
83+
for &segment in &path[1..path.len() - 1] {
84+
let next_mod = items.iter().find(|item| {
85+
item.ident.name.as_str() == segment
86+
&& tcx.def_kind(item.res.def_id()) == DefKind::Mod
87+
})?;
9088

91-
items = tcx.module_children(item.res.def_id());
92-
break;
93-
}
94-
}
89+
items = tcx.module_children(next_mod.res.def_id());
9590
}
96-
None
91+
92+
let item_name = *path.last().unwrap();
93+
94+
let item = items.iter().find(|item| {
95+
item.ident.name.as_str() == item_name
96+
&& tcx.def_kind(item.res.def_id()).ns() == Some(namespace)
97+
})?;
98+
99+
Some(item.res.def_id())
97100
},
98101
)
99102
}
100103

101104
pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriInterpCxExt<'mir, 'tcx> {
102105
/// Gets an instance for a path; fails gracefully if the path does not exist.
103-
fn try_resolve_path(&self, path: &[&str]) -> Option<ty::Instance<'tcx>> {
104-
let did = try_resolve_did(self.eval_context_ref().tcx.tcx, path)?;
106+
fn try_resolve_path(&self, path: &[&str], namespace: Namespace) -> Option<ty::Instance<'tcx>> {
107+
let did = try_resolve_did(self.eval_context_ref().tcx.tcx, path, namespace)?;
105108
Some(ty::Instance::mono(self.eval_context_ref().tcx.tcx, did))
106109
}
107110

108111
/// Gets an instance for a path.
109-
fn resolve_path(&self, path: &[&str]) -> ty::Instance<'tcx> {
110-
self.try_resolve_path(path)
112+
fn resolve_path(&self, path: &[&str], namespace: Namespace) -> ty::Instance<'tcx> {
113+
self.try_resolve_path(path, namespace)
111114
.unwrap_or_else(|| panic!("failed to find required Rust item: {path:?}"))
112115
}
113116

114117
/// Evaluates the scalar at the specified path. Returns Some(val)
115118
/// if the path could be resolved, and None otherwise
116119
fn eval_path_scalar(&self, path: &[&str]) -> InterpResult<'tcx, Scalar<Provenance>> {
117120
let this = self.eval_context_ref();
118-
let instance = this.resolve_path(path);
121+
let instance = this.resolve_path(path, Namespace::ValueNS);
119122
let cid = GlobalId { instance, promoted: None };
120123
// We don't give a span -- this isn't actually used directly by the program anyway.
121124
let const_val = this.eval_global(cid, None)?;
@@ -147,15 +150,17 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriInterpCxExt<'mir, 'tcx> {
147150
/// Helper function to get the `TyAndLayout` of a `libc` type
148151
fn libc_ty_layout(&self, name: &str) -> InterpResult<'tcx, TyAndLayout<'tcx>> {
149152
let this = self.eval_context_ref();
150-
let ty = this.resolve_path(&["libc", name]).ty(*this.tcx, ty::ParamEnv::reveal_all());
153+
let ty = this
154+
.resolve_path(&["libc", name], Namespace::TypeNS)
155+
.ty(*this.tcx, ty::ParamEnv::reveal_all());
151156
this.layout_of(ty)
152157
}
153158

154159
/// Helper function to get the `TyAndLayout` of a `windows` type
155160
fn windows_ty_layout(&self, name: &str) -> InterpResult<'tcx, TyAndLayout<'tcx>> {
156161
let this = self.eval_context_ref();
157162
let ty = this
158-
.resolve_path(&["std", "sys", "windows", "c", name])
163+
.resolve_path(&["std", "sys", "windows", "c", name], Namespace::TypeNS)
159164
.ty(*this.tcx, ty::ParamEnv::reveal_all());
160165
this.layout_of(ty)
161166
}

src/tools/miri/src/shims/unix/fs.rs

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ use std::time::SystemTime;
1111
use log::trace;
1212

1313
use rustc_data_structures::fx::FxHashMap;
14-
use rustc_middle::ty::{self, layout::LayoutOf};
1514
use rustc_target::abi::{Align, Size};
1615

1716
use crate::shims::os_str::bytes_to_os_str;
@@ -1006,12 +1005,7 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriInterpCxExt<'mir, 'tcx> {
10061005
// as `isize`s instead of having the proper types. Thus, we have to recover the layout of
10071006
// `statxbuf_op` by using the `libc::statx` struct type.
10081007
let statxbuf = {
1009-
// FIXME: This long path is required because `libc::statx` is an struct and also a
1010-
// function and `resolve_path` is returning the latter.
1011-
let statx_ty = this
1012-
.resolve_path(&["libc", "unix", "linux_like", "linux", "gnu", "statx"])
1013-
.ty(*this.tcx, ty::ParamEnv::reveal_all());
1014-
let statx_layout = this.layout_of(statx_ty)?;
1008+
let statx_layout = this.libc_ty_layout("statx")?;
10151009
MPlaceTy::from_aligned_ptr(statxbuf_ptr, statx_layout)
10161010
};
10171011

0 commit comments

Comments
 (0)