CCTLib
Calling-context and data-object attribution library for Intel Pin
cache_client.cpp File Reference
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <iostream>
#include <unistd.h>
#include <assert.h>
#include <string.h>
#include <sys/mman.h>
#include <sstream>
#include <functional>
#include <unordered_set>
#include <vector>
#include <unordered_map>
#include <algorithm>
#include <sys/time.h>
#include <sys/resource.h>
#include "pin.H"
#include "pin_isa_compat.H"
+ Include dependency graph for cache_client.cpp:

Go to the source code of this file.

Classes

struct  Cache_t
 
struct  Stats_t
 
struct  AddrValPair
 
struct  RedSpyThreadData
 
struct  RedSpyAnalysis< AccessLen, bufferOffset >
 
struct  RedSpyInstrument< readBufferSlotIndex >
 

Macros

#define CACHE_LINE_BITS   (6)
 
#define CACHE_INDEX_BITS   (20)
 
#define CACHE_SZ   (1L << (CACHE_LINE_BITS + CACHE_INDEX_BITS))
 
#define CACHE_LINE_SZ   (1L << CACHE_LINE_BITS)
 
#define CACHE_LINE_MASK   (CACHE_LINE_SZ - 1)
 
#define CACHE_LINE_BASE(addr)   ((size_t)(addr) & (~CACHE_LINE_MASK))
 
#define CACHE_NUM_LINES   (CACHE_SZ / CACHE_LINE_SZ)
 
#define CACHE_TAG_MASK   (~CACHE_LINE_MASK)
 
#define CACHE_TAG(address)   (((size_t)address) & CACHE_TAG_MASK)
 
#define CACHE_LINE_INDEX(address)   (((size_t)(address) & (CACHE_SZ - 1)) >> CACHE_LINE_BITS)
 
#define IS_VALID(address)   (cache[CACHE_LINE_INDEX(((size_t)address))].isInUse && (cache[CACHE_LINE_INDEX(((size_t)address))].tag == CACHE_TAG(((size_t)address))))
 
#define SET_TAG(address)   (cache[CACHE_LINE_INDEX(((size_t)address))].tag = CACHE_TAG(address))
 
#define SET_INUSE(address)   (cache[CACHE_LINE_INDEX(((size_t)address))].isInUse = true)
 
#define GET_TAG(address)   (cache[CACHE_LINE_INDEX(((size_t)address))].tag)
 
#define WAS_DIFFERENT(address)   (cache[CACHE_LINE_INDEX(((size_t)address))].wasDifferent)
 
#define MAX_WRITE_OP_LENGTH   (512)
 
#define MAX_WRITE_OPS_IN_INS   (8)
 
#define MAX_FILE_PATH   (1000)
 
#define HANDLE_CASE(NUM, BUFFER_INDEX, HAS_FALLTHRU)
 
#define HANDLE_LARGE(HAS_FALLTHRU)
 

Functions

static INT32 Usage ()
 
RedSpyThreadDataClientGetTLS (const THREADID threadId)
 
void CacheFlush ()
 
static void OnEvict (void **addr)
 
static void HandleOneCacheLine (void **address, bool isWrite)
 
static void OnAccess (void **address, uint64_t accessLen, bool isWrite)
 
static void ClientInit (int argc, char *argv[])
 
static VOID RecordValueBeforeLargeWrite (void *addr, UINT32 accessLen, uint32_t bufferOffset, THREADID threadId)
 
static VOID CheckAfterLargeWrite (UINT32 accessLen, uint32_t bufferOffset, THREADID threadId)
 
static int GetNumWriteOperandsInIns (INS ins, UINT32 &whichOp)
 
static VOID InstrumentInsCallback (INS ins, VOID *v)
 
size_t getPeakRSS ()
 
static VOID FiniFunc (INT32 code, VOID *v)
 
static VOID ImageUnload (IMG img, VOID *v)
 
static void HandleSysCall (THREADID threadIndex, CONTEXT *ctxt, SYSCALL_STANDARD std, VOID *v)
 
VOID Update (uint32_t bytes, THREADID threadId)
 
static void InstrumentTrace (TRACE trace, void *f)
 
static VOID ThreadFiniFunc (THREADID threadId, const CONTEXT *ctxt, INT32 code, VOID *v)
 
static void InitThreadData (RedSpyThreadData *tdata)
 
static VOID ThreadStart (THREADID threadid, CONTEXT *ctxt, INT32 flags, VOID *v)
 
int main (int argc, char *argv[])
 

Variables

static FILE * gTraceFile
 
static TLS_KEY client_tls_key
 
static RedSpyThreadDatagSingleThreadedTData
 
thread_local Stats_t stats
 
thread_local Cache_t cache [CACHE_NUM_LINES]
 

Macro Definition Documentation

◆ CACHE_INDEX_BITS

#define CACHE_INDEX_BITS   (20)

Definition at line 38 of file cache_client.cpp.

◆ CACHE_LINE_BASE

#define CACHE_LINE_BASE (   addr)    ((size_t)(addr) & (~CACHE_LINE_MASK))

Definition at line 42 of file cache_client.cpp.

◆ CACHE_LINE_BITS

#define CACHE_LINE_BITS   (6)

Definition at line 37 of file cache_client.cpp.

◆ CACHE_LINE_INDEX

#define CACHE_LINE_INDEX (   address)    (((size_t)(address) & (CACHE_SZ - 1)) >> CACHE_LINE_BITS)

Definition at line 47 of file cache_client.cpp.

◆ CACHE_LINE_MASK

#define CACHE_LINE_MASK   (CACHE_LINE_SZ - 1)

Definition at line 41 of file cache_client.cpp.

◆ CACHE_LINE_SZ

#define CACHE_LINE_SZ   (1L << CACHE_LINE_BITS)

Definition at line 40 of file cache_client.cpp.

◆ CACHE_NUM_LINES

#define CACHE_NUM_LINES   (CACHE_SZ / CACHE_LINE_SZ)

Definition at line 44 of file cache_client.cpp.

◆ CACHE_SZ

#define CACHE_SZ   (1L << (CACHE_LINE_BITS + CACHE_INDEX_BITS))

Definition at line 39 of file cache_client.cpp.

◆ CACHE_TAG

#define CACHE_TAG (   address)    (((size_t)address) & CACHE_TAG_MASK)

Definition at line 46 of file cache_client.cpp.

◆ CACHE_TAG_MASK

#define CACHE_TAG_MASK   (~CACHE_LINE_MASK)

Definition at line 45 of file cache_client.cpp.

◆ GET_TAG

#define GET_TAG (   address)    (cache[CACHE_LINE_INDEX(((size_t)address))].tag)

Definition at line 51 of file cache_client.cpp.

◆ HANDLE_CASE

#define HANDLE_CASE (   NUM,
  BUFFER_INDEX,
  HAS_FALLTHRU 
)
Value:
case (NUM): { \
INS_InsertPredicatedCall(ins, IPOINT_BEFORE, (AFUNPTR)RedSpyAnalysis<(NUM), (BUFFER_INDEX)>::RecordNByteValueBeforeWrite, IARG_MEMORYOP_EA, memOp, IARG_THREAD_ID, IARG_END); \
INS_InsertPredicatedCall(ins, HAS_FALLTHRU ? IPOINT_AFTER : IPOINT_TAKEN_BRANCH, (AFUNPTR)RedSpyAnalysis<(NUM), (BUFFER_INDEX)>::CheckNByteValueAfterWrite, IARG_THREAD_ID, IARG_INST_PTR, IARG_END); \
} break

Definition at line 341 of file cache_client.cpp.

◆ HANDLE_LARGE

#define HANDLE_LARGE (   HAS_FALLTHRU)
Value:
INS_InsertPredicatedCall(ins, IPOINT_BEFORE, (AFUNPTR)RecordValueBeforeLargeWrite, IARG_MEMORYOP_EA, memOp, IARG_MEMORYWRITE_SIZE, IARG_UINT32, readBufferSlotIndex, IARG_THREAD_ID, IARG_END); \
INS_InsertPredicatedCall(ins, HAS_FALLTHRU ? IPOINT_AFTER : IPOINT_TAKEN_BRANCH, (AFUNPTR)CheckAfterLargeWrite, IARG_MEMORYREAD_SIZE, IARG_UINT32, readBufferSlotIndex, IARG_THREAD_ID, IARG_END)
static VOID RecordValueBeforeLargeWrite(void *addr, UINT32 accessLen, uint32_t bufferOffset, THREADID threadId)
static VOID CheckAfterLargeWrite(UINT32 accessLen, uint32_t bufferOffset, THREADID threadId)

Definition at line 347 of file cache_client.cpp.

◆ IS_VALID

#define IS_VALID (   address)    (cache[CACHE_LINE_INDEX(((size_t)address))].isInUse && (cache[CACHE_LINE_INDEX(((size_t)address))].tag == CACHE_TAG(((size_t)address))))

Definition at line 48 of file cache_client.cpp.

◆ MAX_FILE_PATH

#define MAX_FILE_PATH   (1000)

Definition at line 191 of file cache_client.cpp.

◆ MAX_WRITE_OP_LENGTH

#define MAX_WRITE_OP_LENGTH   (512)

Definition at line 55 of file cache_client.cpp.

◆ MAX_WRITE_OPS_IN_INS

#define MAX_WRITE_OPS_IN_INS   (8)

Definition at line 56 of file cache_client.cpp.

◆ SET_INUSE

#define SET_INUSE (   address)    (cache[CACHE_LINE_INDEX(((size_t)address))].isInUse = true)

Definition at line 50 of file cache_client.cpp.

◆ SET_TAG

#define SET_TAG (   address)    (cache[CACHE_LINE_INDEX(((size_t)address))].tag = CACHE_TAG(address))

Definition at line 49 of file cache_client.cpp.

◆ WAS_DIFFERENT

#define WAS_DIFFERENT (   address)    (cache[CACHE_LINE_INDEX(((size_t)address))].wasDifferent)

Definition at line 52 of file cache_client.cpp.

Function Documentation

◆ CacheFlush()

void CacheFlush ( )

Definition at line 119 of file cache_client.cpp.

References cache, CACHE_NUM_LINES, and Cache_t::isInUse.

Referenced by HandleSysCall(), and ImageUnload().

◆ CheckAfterLargeWrite()

static VOID CheckAfterLargeWrite ( UINT32  accessLen,
uint32_t  bufferOffset,
THREADID  threadId 
)
inlinestatic

◆ ClientGetTLS()

◆ ClientInit()

static void ClientInit ( int  argc,
char *  argv[] 
)
static

Definition at line 194 of file cache_client.cpp.

References CACHE_SZ, gTraceFile, and MAX_FILE_PATH.

Referenced by main().

◆ FiniFunc()

static VOID FiniFunc ( INT32  code,
VOID *  v 
)
static

◆ GetNumWriteOperandsInIns()

static int GetNumWriteOperandsInIns ( INS  ins,
UINT32 &  whichOp 
)
static

Definition at line 351 of file cache_client.cpp.

Referenced by InstrumentInsCallback().

◆ getPeakRSS()

size_t getPeakRSS ( )

Definition at line 446 of file cache_client.cpp.

Referenced by FiniFunc(), and PinCCTLib::PrintStats().

◆ HandleOneCacheLine()

static void HandleOneCacheLine ( void **  address,
bool  isWrite 
)
inlinestatic

Definition at line 163 of file cache_client.cpp.

References address, cache, CACHE_LINE_INDEX, IS_VALID, Cache_t::isDirty, OnEvict(), and SET_INUSE.

Referenced by OnAccess().

◆ HandleSysCall()

static void HandleSysCall ( THREADID  threadIndex,
CONTEXT *  ctxt,
SYSCALL_STANDARD  std,
VOID *  v 
)
static

Definition at line 462 of file cache_client.cpp.

References CacheFlush().

Referenced by main().

◆ ImageUnload()

static VOID ImageUnload ( IMG  img,
VOID *  v 
)
static

Definition at line 457 of file cache_client.cpp.

References CacheFlush().

◆ InitThreadData()

static void InitThreadData ( RedSpyThreadData tdata)
static

Definition at line 491 of file cache_client.cpp.

References RedSpyThreadData::bytesRedundant, and RedSpyThreadData::bytesWritten.

Referenced by ThreadStart().

◆ InstrumentInsCallback()

static VOID InstrumentInsCallback ( INS  ins,
VOID *  v 
)
static

Definition at line 383 of file cache_client.cpp.

References GetNumWriteOperandsInIns(), and OnAccess().

Referenced by main().

◆ InstrumentTrace()

static void InstrumentTrace ( TRACE  trace,
void *  f 
)
static

Definition at line 473 of file cache_client.cpp.

References INS_MemoryWriteSize(), and Update().

Referenced by main().

◆ main()

int main ( int  argc,
char *  argv[] 
)

◆ OnAccess()

static void OnAccess ( void **  address,
uint64_t  accessLen,
bool  isWrite 
)
inlinestatic

Definition at line 174 of file cache_client.cpp.

References address, CACHE_LINE_INDEX, CACHE_LINE_SZ, and HandleOneCacheLine().

Referenced by InstrumentInsCallback().

◆ OnEvict()

◆ RecordValueBeforeLargeWrite()

static VOID RecordValueBeforeLargeWrite ( void *  addr,
UINT32  accessLen,
uint32_t  bufferOffset,
THREADID  threadId 
)
inlinestatic

◆ ThreadFiniFunc()

static VOID ThreadFiniFunc ( THREADID  threadId,
const CONTEXT *  ctxt,
INT32  code,
VOID *  v 
)
static

◆ ThreadStart()

static VOID ThreadStart ( THREADID  threadid,
CONTEXT *  ctxt,
INT32  flags,
VOID *  v 
)
static

Definition at line 496 of file cache_client.cpp.

References client_tls_key, gSingleThreadedTData, and InitThreadData().

Referenced by main().

◆ Update()

VOID Update ( uint32_t  bytes,
THREADID  threadId 
)
inline

Definition at line 467 of file cache_client.cpp.

References RedSpyThreadData::bytesWritten, and ClientGetTLS().

Referenced by InstrumentTrace().

◆ Usage()

static INT32 Usage ( )
static

Definition at line 28 of file cache_client.cpp.

Referenced by main().

Variable Documentation

◆ cache

thread_local Cache_t cache[CACHE_NUM_LINES]

Definition at line 116 of file cache_client.cpp.

Referenced by CacheFlush(), HandleOneCacheLine(), and OnEvict().

◆ client_tls_key

TLS_KEY client_tls_key
static

Definition at line 89 of file cache_client.cpp.

Referenced by ClientGetTLS(), main(), and ThreadStart().

◆ gSingleThreadedTData

RedSpyThreadData* gSingleThreadedTData
static

Definition at line 90 of file cache_client.cpp.

Referenced by ClientGetTLS(), and ThreadStart().

◆ gTraceFile

FILE* gTraceFile
static

Definition at line 34 of file cache_client.cpp.

Referenced by ClientInit(), FiniFunc(), and ThreadFiniFunc().

◆ stats

thread_local Stats_t stats

Definition at line 113 of file cache_client.cpp.

Referenced by FiniFunc(), and OnEvict().