CCTLib
Calling-context and data-object attribution library for Intel Pin
deadspy_tp_sizes.c
Go to the documentation of this file.
1 // True-positive victim exercising a range of write sizes.
2 //
3 // For each size class (1/2/4/8 bytes), we do two back-to-back stores to the
4 // same address with no intervening read. Every second store is dead.
5 #include <stdint.h>
6 #include <stdio.h>
7 #include <stdlib.h>
8 
9 #define WORK_COUNT 5000
10 
11 static volatile uint64_t sink;
12 
13 __attribute__((noinline)) void s1(volatile uint8_t* p, uint8_t v) { *p = v; }
14 __attribute__((noinline)) void s2(volatile uint16_t* p, uint16_t v) { *p = v; }
15 __attribute__((noinline)) void s4(volatile uint32_t* p, uint32_t v) { *p = v; }
16 __attribute__((noinline)) void s8(volatile uint64_t* p, uint64_t v) { *p = v; }
17 
18 int main(int argc, char** argv) {
19  (void)argc; (void)argv;
20  uint8_t b1[WORK_COUNT] __attribute__((aligned(64)));
21  uint16_t b2[WORK_COUNT] __attribute__((aligned(64)));
22  uint32_t b4[WORK_COUNT] __attribute__((aligned(64)));
23  uint64_t b8[WORK_COUNT] __attribute__((aligned(64)));
24 
25  // Prime.
26  for (int i = 0; i < WORK_COUNT; ++i) { b1[i]=0xA; b2[i]=0xAAAA; b4[i]=0xAAAAAAAAu; b8[i]=0xAAAAAAAAAAAAAAAAull; }
27 
28  for (int i = 0; i < WORK_COUNT; ++i) {
29  s1(&b1[i], 1); s1(&b1[i], 2);
30  s2(&b2[i], 1); s2(&b2[i], 2);
31  s4(&b4[i], 1); s4(&b4[i], 2);
32  s8(&b8[i], 1); s8(&b8[i], 2);
33  }
34 
35  // Publish checksum.
36  uint64_t s = 0;
37  for (int i = 0; i < WORK_COUNT; ++i) s += (uint64_t)b1[i] + b2[i] + b4[i] + b8[i];
38  sink = s;
39  return 0;
40 }
#define WORK_COUNT
int main(int argc, char **argv)
__attribute__((noinline))
static volatile uint64_t sink