Skip to content

Commit 662821f

Browse files
committed
raw ptr deref no longer erases the tag
1 parent 880229d commit 662821f

File tree

2 files changed

+35
-35
lines changed

2 files changed

+35
-35
lines changed

src/fn_call.rs

Lines changed: 30 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -131,10 +131,10 @@ impl<'a, 'mir, 'tcx: 'mir + 'a> EvalContextExt<'tcx, 'mir> for super::MiriEvalCo
131131
}
132132

133133
"free" => {
134-
let ptr = self.read_scalar(args[0])?.not_undef()?.erase_tag(); // raw ptr operation, no tag
134+
let ptr = self.read_scalar(args[0])?.not_undef()?;
135135
if !ptr.is_null_ptr(self) {
136136
self.memory_mut().deallocate(
137-
ptr.to_ptr()?.with_default_tag(),
137+
ptr.to_ptr()?,
138138
None,
139139
MiriMemoryKind::C.into(),
140140
)?;
@@ -179,7 +179,7 @@ impl<'a, 'mir, 'tcx: 'mir + 'a> EvalContextExt<'tcx, 'mir> for super::MiriEvalCo
179179
self.write_scalar(Scalar::Ptr(ptr), dest)?;
180180
}
181181
"__rust_dealloc" => {
182-
let ptr = self.read_scalar(args[0])?.to_ptr()?.erase_tag(); // raw ptr operation, no tag
182+
let ptr = self.read_scalar(args[0])?.to_ptr()?;
183183
let old_size = self.read_scalar(args[1])?.to_usize(self)?;
184184
let align = self.read_scalar(args[2])?.to_usize(self)?;
185185
if old_size == 0 {
@@ -189,13 +189,13 @@ impl<'a, 'mir, 'tcx: 'mir + 'a> EvalContextExt<'tcx, 'mir> for super::MiriEvalCo
189189
return err!(HeapAllocNonPowerOfTwoAlignment(align));
190190
}
191191
self.memory_mut().deallocate(
192-
ptr.with_default_tag(),
192+
ptr,
193193
Some((Size::from_bytes(old_size), Align::from_bytes(align, align).unwrap())),
194194
MiriMemoryKind::Rust.into(),
195195
)?;
196196
}
197197
"__rust_realloc" => {
198-
let ptr = self.read_scalar(args[0])?.to_ptr()?.erase_tag(); // raw ptr operation, no tag
198+
let ptr = self.read_scalar(args[0])?.to_ptr()?;
199199
let old_size = self.read_scalar(args[1])?.to_usize(self)?;
200200
let align = self.read_scalar(args[2])?.to_usize(self)?;
201201
let new_size = self.read_scalar(args[3])?.to_usize(self)?;
@@ -206,7 +206,7 @@ impl<'a, 'mir, 'tcx: 'mir + 'a> EvalContextExt<'tcx, 'mir> for super::MiriEvalCo
206206
return err!(HeapAllocNonPowerOfTwoAlignment(align));
207207
}
208208
let new_ptr = self.memory_mut().reallocate(
209-
ptr.with_default_tag(),
209+
ptr,
210210
Size::from_bytes(old_size),
211211
Align::from_bytes(align, align).unwrap(),
212212
Size::from_bytes(new_size),
@@ -238,8 +238,8 @@ impl<'a, 'mir, 'tcx: 'mir + 'a> EvalContextExt<'tcx, 'mir> for super::MiriEvalCo
238238

239239
"dlsym" => {
240240
let _handle = self.read_scalar(args[0])?;
241-
let symbol = self.read_scalar(args[1])?.to_ptr()?.erase_tag();
242-
let symbol_name = self.memory().read_c_str(symbol.with_default_tag())?;
241+
let symbol = self.read_scalar(args[1])?.to_ptr()?;
242+
let symbol_name = self.memory().read_c_str(symbol)?;
243243
let err = format!("bad c unicode symbol: {:?}", symbol_name);
244244
let symbol_name = ::std::str::from_utf8(symbol_name).unwrap_or(&err);
245245
return err!(Unimplemented(format!(
@@ -292,13 +292,13 @@ impl<'a, 'mir, 'tcx: 'mir + 'a> EvalContextExt<'tcx, 'mir> for super::MiriEvalCo
292292
return err!(MachineError("the evaluated program panicked".to_string())),
293293

294294
"memcmp" => {
295-
let left = self.read_scalar(args[0])?.not_undef()?.erase_tag(); // raw ptr operation
296-
let right = self.read_scalar(args[1])?.not_undef()?.erase_tag(); // raw ptr operation
295+
let left = self.read_scalar(args[0])?.not_undef()?;
296+
let right = self.read_scalar(args[1])?.not_undef()?;
297297
let n = Size::from_bytes(self.read_scalar(args[2])?.to_usize(self)?);
298298

299299
let result = {
300-
let left_bytes = self.memory().read_bytes(left.with_default_tag(), n)?;
301-
let right_bytes = self.memory().read_bytes(right.with_default_tag(), n)?;
300+
let left_bytes = self.memory().read_bytes(left, n)?;
301+
let right_bytes = self.memory().read_bytes(right, n)?;
302302

303303
use std::cmp::Ordering::*;
304304
match left_bytes.cmp(right_bytes) {
@@ -315,8 +315,8 @@ impl<'a, 'mir, 'tcx: 'mir + 'a> EvalContextExt<'tcx, 'mir> for super::MiriEvalCo
315315
}
316316

317317
"memrchr" => {
318-
let ptr = self.read_scalar(args[0])?.not_undef()?.erase_tag(); // raw ptr operation
319-
let ptr = ptr.with_default_tag();
318+
let ptr = self.read_scalar(args[0])?.not_undef()?;
319+
let ptr = ptr;
320320
let val = self.read_scalar(args[1])?.to_bytes()? as u8;
321321
let num = self.read_scalar(args[2])?.to_usize(self)?;
322322
if let Some(idx) = self.memory().read_bytes(ptr, Size::from_bytes(num))?
@@ -330,8 +330,8 @@ impl<'a, 'mir, 'tcx: 'mir + 'a> EvalContextExt<'tcx, 'mir> for super::MiriEvalCo
330330
}
331331

332332
"memchr" => {
333-
let ptr = self.read_scalar(args[0])?.not_undef()?.erase_tag(); // raw ptr operation
334-
let ptr = ptr.with_default_tag();
333+
let ptr = self.read_scalar(args[0])?.not_undef()?;
334+
let ptr = ptr;
335335
let val = self.read_scalar(args[1])?.to_bytes()? as u8;
336336
let num = self.read_scalar(args[2])?.to_usize(self)?;
337337
if let Some(idx) = self.memory().read_bytes(ptr, Size::from_bytes(num))?.iter().position(
@@ -347,8 +347,8 @@ impl<'a, 'mir, 'tcx: 'mir + 'a> EvalContextExt<'tcx, 'mir> for super::MiriEvalCo
347347

348348
"getenv" => {
349349
let result = {
350-
let name_ptr = self.read_scalar(args[0])?.to_ptr()?.erase_tag(); // raw ptr operation
351-
let name = self.memory().read_c_str(name_ptr.with_default_tag())?;
350+
let name_ptr = self.read_scalar(args[0])?.to_ptr()?;
351+
let name = self.memory().read_c_str(name_ptr)?;
352352
match self.machine.env_vars.get(name) {
353353
Some(&var) => Scalar::Ptr(var),
354354
None => Scalar::ptr_null(&*self.tcx),
@@ -360,10 +360,10 @@ impl<'a, 'mir, 'tcx: 'mir + 'a> EvalContextExt<'tcx, 'mir> for super::MiriEvalCo
360360
"unsetenv" => {
361361
let mut success = None;
362362
{
363-
let name_ptr = self.read_scalar(args[0])?.not_undef()?.erase_tag(); // raw ptr operation
363+
let name_ptr = self.read_scalar(args[0])?.not_undef()?;
364364
if !name_ptr.is_null_ptr(self) {
365365
let name = self.memory().read_c_str(name_ptr.to_ptr()?
366-
.with_default_tag())?.to_owned();
366+
)?.to_owned();
367367
if !name.is_empty() && !name.contains(&b'=') {
368368
success = Some(self.machine.env_vars.remove(&name));
369369
}
@@ -382,11 +382,11 @@ impl<'a, 'mir, 'tcx: 'mir + 'a> EvalContextExt<'tcx, 'mir> for super::MiriEvalCo
382382
"setenv" => {
383383
let mut new = None;
384384
{
385-
let name_ptr = self.read_scalar(args[0])?.not_undef()?.erase_tag(); // raw ptr operation
386-
let value_ptr = self.read_scalar(args[1])?.to_ptr()?.erase_tag(); // raw ptr operation
387-
let value = self.memory().read_c_str(value_ptr.with_default_tag())?;
385+
let name_ptr = self.read_scalar(args[0])?.not_undef()?;
386+
let value_ptr = self.read_scalar(args[1])?.to_ptr()?;
387+
let value = self.memory().read_c_str(value_ptr)?;
388388
if !name_ptr.is_null_ptr(self) {
389-
let name = self.memory().read_c_str(name_ptr.to_ptr()?.with_default_tag())?;
389+
let name = self.memory().read_c_str(name_ptr.to_ptr()?)?;
390390
if !name.is_empty() && !name.contains(&b'=') {
391391
new = Some((name.to_owned(), value.to_owned()));
392392
}
@@ -417,14 +417,14 @@ impl<'a, 'mir, 'tcx: 'mir + 'a> EvalContextExt<'tcx, 'mir> for super::MiriEvalCo
417417

418418
"write" => {
419419
let fd = self.read_scalar(args[0])?.to_bytes()?;
420-
let buf = self.read_scalar(args[1])?.not_undef()?.erase_tag();
420+
let buf = self.read_scalar(args[1])?.not_undef()?;
421421
let n = self.read_scalar(args[2])?.to_bytes()? as u64;
422422
trace!("Called write({:?}, {:?}, {:?})", fd, buf, n);
423423
let result = if fd == 1 || fd == 2 {
424424
// stdout/stderr
425425
use std::io::{self, Write};
426426

427-
let buf_cont = self.memory().read_bytes(buf.with_default_tag(), Size::from_bytes(n))?;
427+
let buf_cont = self.memory().read_bytes(buf, Size::from_bytes(n))?;
428428
let res = if fd == 1 {
429429
io::stdout().write(buf_cont)
430430
} else {
@@ -445,8 +445,8 @@ impl<'a, 'mir, 'tcx: 'mir + 'a> EvalContextExt<'tcx, 'mir> for super::MiriEvalCo
445445
}
446446

447447
"strlen" => {
448-
let ptr = self.read_scalar(args[0])?.to_ptr()?.erase_tag();
449-
let n = self.memory().read_c_str(ptr.with_default_tag())?.len();
448+
let ptr = self.read_scalar(args[0])?.to_ptr()?;
449+
let n = self.memory().read_c_str(ptr)?.len();
450450
self.write_scalar(Scalar::from_uint(n as u64, dest.layout.size), dest)?;
451451
}
452452

@@ -492,7 +492,7 @@ impl<'a, 'mir, 'tcx: 'mir + 'a> EvalContextExt<'tcx, 'mir> for super::MiriEvalCo
492492

493493
// Hook pthread calls that go to the thread-local storage memory subsystem
494494
"pthread_key_create" => {
495-
let key_ptr = self.read_scalar(args[0])?.to_ptr()?.erase_tag(); // raw ptr operation
495+
let key_ptr = self.read_scalar(args[0])?.to_ptr()?;
496496

497497
// Extract the function type out of the signature (that seems easier than constructing it ourselves...)
498498
let dtor = match self.read_scalar(args[1])?.not_undef()? {
@@ -515,7 +515,7 @@ impl<'a, 'mir, 'tcx: 'mir + 'a> EvalContextExt<'tcx, 'mir> for super::MiriEvalCo
515515
return err!(OutOfTls);
516516
}
517517
self.memory_mut().write_scalar(
518-
key_ptr.with_default_tag(),
518+
key_ptr,
519519
key_layout.align,
520520
Scalar::from_uint(key, key_layout.size).into(),
521521
key_layout.size,

src/intrinsic.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -154,12 +154,12 @@ impl<'a, 'mir, 'tcx> EvalContextExt<'tcx> for super::MiriEvalContext<'a, 'mir, '
154154
let count = self.read_scalar(args[2])?.to_usize(self)?;
155155
let elem_align = elem_layout.align;
156156
// erase tags: this is a raw ptr operation
157-
let src = self.read_scalar(args[0])?.not_undef()?.erase_tag();
158-
let dest = self.read_scalar(args[1])?.not_undef()?.erase_tag();
157+
let src = self.read_scalar(args[0])?.not_undef()?;
158+
let dest = self.read_scalar(args[1])?.not_undef()?;
159159
self.memory_mut().copy(
160-
src.with_default_tag(),
160+
src,
161161
elem_align,
162-
dest.with_default_tag(),
162+
dest,
163163
elem_align,
164164
Size::from_bytes(count * elem_size),
165165
intrinsic_name.ends_with("_nonoverlapping"),
@@ -436,7 +436,7 @@ impl<'a, 'mir, 'tcx> EvalContextExt<'tcx> for super::MiriEvalContext<'a, 'mir, '
436436
let ty = substs.type_at(0);
437437
let ty_layout = self.layout_of(ty)?;
438438
let val_byte = self.read_scalar(args[1])?.to_u8()?;
439-
let ptr = self.read_scalar(args[0])?.not_undef()?.erase_tag().with_default_tag();
439+
let ptr = self.read_scalar(args[0])?.not_undef()?;
440440
let count = self.read_scalar(args[2])?.to_usize(self)?;
441441
self.memory().check_align(ptr, ty_layout.align)?;
442442
self.memory_mut().write_repeat(ptr, val_byte, ty_layout.size * count)?;

0 commit comments

Comments
 (0)