Skip to content

Commit d2a72cd

Browse files
committed
shadow changes
1 parent 0d1e276 commit d2a72cd

File tree

2 files changed

+76
-1
lines changed

2 files changed

+76
-1
lines changed

src/llvm-project

src/tools/bsan/bsan-rt/src/shadow.rs

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -293,4 +293,79 @@ mod tests {
293293
let _ = ShadowHeap::<TestProv>::default();
294294
teardown();
295295
}
296+
297+
#[test]
298+
fn test_shadow_heap_performance() {
299+
setup();
300+
let heap = ShadowHeap::<TestProv>::default();
301+
302+
// Create test data
303+
const NUM_OPERATIONS: usize = 1000;
304+
let test_values: Vec<TestProv> = (0..NUM_OPERATIONS)
305+
.map(|i| TestProv { value: (i % 255) as u8 })
306+
.collect();
307+
308+
// Sequential addresses
309+
unsafe {
310+
for i in 0..NUM_OPERATIONS {
311+
let addr = i * 8; // Word-aligned addresses
312+
heap.store_prov(&test_values[i], addr);
313+
}
314+
315+
for i in 0..NUM_OPERATIONS {
316+
let addr = i * 8;
317+
let loaded = heap.load_prov(addr);
318+
assert_eq!(loaded.value, test_values[i].value);
319+
}
320+
}
321+
322+
// Scattered addresses (using different L1/L2 indices)
323+
unsafe {
324+
for i in 0..NUM_OPERATIONS {
325+
let addr = i * 0x1_0000_0000; // Spread across L1 entries
326+
heap.store_prov(&test_values[i], addr);
327+
}
328+
329+
for i in 0..NUM_OPERATIONS {
330+
let addr = i * 0x1_0000_0000;
331+
let loaded = heap.load_prov(addr);
332+
assert_eq!(loaded.value, test_values[i].value);
333+
}
334+
}
335+
336+
// Random access pattern
337+
let random_addrs: Vec<usize> = (0..NUM_OPERATIONS)
338+
.map(|i| i * 0x1234_5678)
339+
.collect();
340+
341+
unsafe {
342+
for i in 0..NUM_OPERATIONS {
343+
heap.store_prov(&test_values[i], random_addrs[i]);
344+
}
345+
346+
for i in 0..NUM_OPERATIONS {
347+
let loaded = heap.load_prov(random_addrs[i]);
348+
assert_eq!(loaded.value, test_values[i].value);
349+
}
350+
}
351+
352+
// Mixed operations (interleaved stores and loads)
353+
unsafe {
354+
for i in 0..NUM_OPERATIONS {
355+
let addr = i * 0x1000;
356+
heap.store_prov(&test_values[i], addr);
357+
let loaded = heap.load_prov(addr);
358+
assert_eq!(loaded.value, test_values[i].value);
359+
360+
// Also load from a previous address
361+
if i > 0 {
362+
let prev_addr = (i - 1) * 0x1000;
363+
let loaded = heap.load_prov(prev_addr);
364+
assert_eq!(loaded.value, test_values[i - 1].value);
365+
}
366+
}
367+
}
368+
369+
teardown();
370+
}
296371
}

0 commit comments

Comments
 (0)