CCTLib
Calling-context and data-object attribution library for Intel Pin
runtime_value_numbering_client.cpp File Reference
#include <stdio.h>
#include <stdlib.h>
#include "pin.H"
#include "pin_isa_compat.H"
#include <map>
#include <unordered_map>
#include <list>
#include <stdint.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <semaphore.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <iostream>
#include <locale>
#include <unistd.h>
#include <sys/syscall.h>
#include <assert.h>
#include <sys/mman.h>
#include <exception>
#include <sys/time.h>
#include <signal.h>
#include <string.h>
#include <setjmp.h>
#include <sstream>
#include <pthread.h>
#include <google/sparse_hash_map>
#include <google/dense_hash_map>
#include "cctlib.H"
+ Include dependency graph for runtime_value_numbering_client.cpp:

Go to the source code of this file.

Classes

class  ThreadData_t
 
struct  MergedRedundantInfo
 
struct  RedundantInfoForPresentation
 

Macros

#define PAGE_OFFSET_BITS   (16LL)
 
#define PAGE_OFFSET(addr)   (addr & 0xFFFF)
 
#define PAGE_OFFSET_MASK   (0xFFFF)
 
#define PAGE_SIZE   (1 << PAGE_OFFSET_BITS)
 
#define PTR_SIZE   (sizeof(void*))
 
#define LEVEL_1_PAGE_TABLE_BITS   (20)
 
#define LEVEL_1_PAGE_TABLE_ENTRIES   (1 << LEVEL_1_PAGE_TABLE_BITS)
 
#define LEVEL_1_PAGE_TABLE_SIZE   (LEVEL_1_PAGE_TABLE_ENTRIES * PTR_SIZE)
 
#define LEVEL_2_PAGE_TABLE_BITS   (12)
 
#define LEVEL_2_PAGE_TABLE_ENTRIES   (1 << LEVEL_2_PAGE_TABLE_BITS)
 
#define LEVEL_2_PAGE_TABLE_SIZE   (LEVEL_2_PAGE_TABLE_ENTRIES * PTR_SIZE)
 
#define LEVEL_1_PAGE_TABLE_SLOT(addr)   (((addr) >> (LEVEL_2_PAGE_TABLE_BITS + PAGE_OFFSET_BITS)) & 0xfffff)
 
#define LEVEL_2_PAGE_TABLE_SLOT(addr)   (((addr) >> (PAGE_OFFSET_BITS)) & 0xFFF)
 
#define MAX_FILE_PATH   (200)
 
#define MAX_DEAD_CONTEXTS_TO_LOG   (4000)
 
#define MAX_LOG_NUM   (110)
 
#define MAX_OPERAND   (6)
 
#define SAMPLE_PERIOD   (1000000)
 
#define STOP_PERIOD   (1000000000)
 
#define VALUE_N   (10)
 

Typedefs

using OPMap = struct opMap { uint64_t vNum
 
using OPInfo = struct opcodeInfo { OPCODE opCode
 

Enumerations

enum  AccessType { READ_ACCESS = 0 , WRITE_ACCESS = 1 , READ_ACCESS = 0 , WRITE_ACCESS = 1 }
 

Functions

bool IsIgnorableIns (INS ins)
 
bool IsMov (int opcode)
 
ThreadData_tGetTLS (THREADID threadid)
 
VOID CleanValueNumbers (THREADID threadID)
 
void UpdateValue (uint32_t reg, uint64_t value, ThreadData_t *td)
 
static uint8_t * GetOrCreateShadowBaseAddress (uint64_t address)
 
uint64_t getMemValueNum (uint64_t addr, THREADID threadid)
 
uint64_t getRegValueNum (REG reg, THREADID threadid)
 
VOID setMemValueNum (uint64_t addr, THREADID threadid, uint64_t value)
 
VOID setRegValueNum (REG reg, ThreadData_t *td, uint64_t value)
 
uint64_t getImmediateValueNum (uint64_t immediate, THREADID threadid)
 
void recordRedundantOperation (uint32_t deadCtxt, uint32_t killerCtxt, ThreadData_t *td)
 
void deleteString (uint64_t key, ThreadData_t *td)
 
void removeOldstring (void *ip, uint64_t nValue, ThreadData_t *td)
 
void checkMovValueNum (int opcode, uint64_t svalue, uint64_t target, THREADID threadid, void *ip, const uint32_t opHandle)
 
static void sortSvalues (uint64_t *svalues, int count)
 
bool IsCommutativeOp (int opcode)
 
uint64_t checkOpcodeValueNum (int opcode, uint64_t svalues[], int sCount, THREADID threadid, void *ip, const uint32_t opHandle)
 
VOID valueNumbering (void *op, bool movOrnot, THREADID threadid, void *ip, const uint32_t opHandle)
 
VOID valueNumberingMem1 (void *op, void *addr, uint32_t rMem, uint32_t wMem, bool movOrnot, THREADID threadID, void *ip, const uint32_t opHandle)
 
VOID valueNumberingMem2 (void *op, void *addr1, void *addr2, uint32_t rMem, uint32_t wMem, bool movOrnot, THREADID threadID, void *ip, const uint32_t opHandle)
 
VOID valueNumberingMem3 (void *op, void *addr1, void *addr2, void *addr3, uint32_t rMem, uint32_t wMem, bool movOrnot, THREADID threadID, void *ip, const uint32_t opHandle)
 
VOID valueNumberingMem4 (void *op, void *addr1, void *addr2, void *addr3, void *addr4, uint32_t rMem, uint32_t wMem, bool movOrnot, THREADID threadID, void *ip, const uint32_t opHandle)
 
VOID Instruction (INS ins, VOID *v, const uint32_t opHandle)
 
VOID ThreadStart (THREADID threadid, CONTEXT *ctxt, INT32 flags, VOID *v)
 
bool MergedRedundantInfoComparer (const RedundantInfoForPresentation &first, const RedundantInfoForPresentation &second)
 
static void DumpInfo (uint32_t oldIndex, uint32_t newIndex)
 
VOID ImageUnload (IMG img, VOID *v)
 
VOID RegDeadFini (INT32 code, VOID *v)
 
static INT32 Usage ()
 
void InitValueNumbering (int argc, char *argv[])
 
int main (int argc, char *argv[])
 

Variables

FILE * gTraceFile
 
static uint64_t gValue
 
static uint8_t ** gL1PageTable [LEVEL_1_PAGE_TABLE_SIZE]
 
bool Sample = true
 
uint64_t Num_instructions = 0
 
uint64_t lastGValue
 
uint64_t Num_redundant = 0
 
uint64_t Num_ins = 0
 
uint32_t ip
 
int sCount
 
int immeCount
 
int tCount
 
REG sRegs [MAX_OPERAND]
 
uint64_t immediates [MAX_OPERAND]
 
REG tRegs [MAX_OPERAND]
 
static TLS_KEY tls_key
 
static PIN_MUTEX gMutex
 

Macro Definition Documentation

◆ LEVEL_1_PAGE_TABLE_BITS

#define LEVEL_1_PAGE_TABLE_BITS   (20)

Definition at line 58 of file runtime_value_numbering_client.cpp.

◆ LEVEL_1_PAGE_TABLE_ENTRIES

#define LEVEL_1_PAGE_TABLE_ENTRIES   (1 << LEVEL_1_PAGE_TABLE_BITS)

Definition at line 59 of file runtime_value_numbering_client.cpp.

◆ LEVEL_1_PAGE_TABLE_SIZE

#define LEVEL_1_PAGE_TABLE_SIZE   (LEVEL_1_PAGE_TABLE_ENTRIES * PTR_SIZE)

Definition at line 60 of file runtime_value_numbering_client.cpp.

◆ LEVEL_1_PAGE_TABLE_SLOT

#define LEVEL_1_PAGE_TABLE_SLOT (   addr)    (((addr) >> (LEVEL_2_PAGE_TABLE_BITS + PAGE_OFFSET_BITS)) & 0xfffff)

Definition at line 66 of file runtime_value_numbering_client.cpp.

◆ LEVEL_2_PAGE_TABLE_BITS

#define LEVEL_2_PAGE_TABLE_BITS   (12)

Definition at line 62 of file runtime_value_numbering_client.cpp.

◆ LEVEL_2_PAGE_TABLE_ENTRIES

#define LEVEL_2_PAGE_TABLE_ENTRIES   (1 << LEVEL_2_PAGE_TABLE_BITS)

Definition at line 63 of file runtime_value_numbering_client.cpp.

◆ LEVEL_2_PAGE_TABLE_SIZE

#define LEVEL_2_PAGE_TABLE_SIZE   (LEVEL_2_PAGE_TABLE_ENTRIES * PTR_SIZE)

Definition at line 64 of file runtime_value_numbering_client.cpp.

◆ LEVEL_2_PAGE_TABLE_SLOT

#define LEVEL_2_PAGE_TABLE_SLOT (   addr)    (((addr) >> (PAGE_OFFSET_BITS)) & 0xFFF)

Definition at line 67 of file runtime_value_numbering_client.cpp.

◆ MAX_DEAD_CONTEXTS_TO_LOG

#define MAX_DEAD_CONTEXTS_TO_LOG   (4000)

Definition at line 72 of file runtime_value_numbering_client.cpp.

◆ MAX_FILE_PATH

#define MAX_FILE_PATH   (200)

Definition at line 71 of file runtime_value_numbering_client.cpp.

◆ MAX_LOG_NUM

#define MAX_LOG_NUM   (110)

Definition at line 73 of file runtime_value_numbering_client.cpp.

◆ MAX_OPERAND

#define MAX_OPERAND   (6)

Definition at line 74 of file runtime_value_numbering_client.cpp.

◆ PAGE_OFFSET

#define PAGE_OFFSET (   addr)    (addr & 0xFFFF)

Definition at line 48 of file runtime_value_numbering_client.cpp.

◆ PAGE_OFFSET_BITS

#define PAGE_OFFSET_BITS   (16LL)

Definition at line 47 of file runtime_value_numbering_client.cpp.

◆ PAGE_OFFSET_MASK

#define PAGE_OFFSET_MASK   (0xFFFF)

Definition at line 49 of file runtime_value_numbering_client.cpp.

◆ PAGE_SIZE

#define PAGE_SIZE   (1 << PAGE_OFFSET_BITS)

Definition at line 54 of file runtime_value_numbering_client.cpp.

◆ PTR_SIZE

#define PTR_SIZE   (sizeof(void*))

Definition at line 57 of file runtime_value_numbering_client.cpp.

◆ SAMPLE_PERIOD

#define SAMPLE_PERIOD   (1000000)

Definition at line 75 of file runtime_value_numbering_client.cpp.

◆ STOP_PERIOD

#define STOP_PERIOD   (1000000000)

Definition at line 76 of file runtime_value_numbering_client.cpp.

◆ VALUE_N

#define VALUE_N   (10)

Definition at line 77 of file runtime_value_numbering_client.cpp.

Typedef Documentation

◆ OPInfo

using OPInfo = struct opcodeInfo { OPCODE opCode

Definition at line 119 of file runtime_value_numbering_client.cpp.

◆ OPMap

using OPMap = struct opMap { uint64_t vNum

Definition at line 96 of file runtime_value_numbering_client.cpp.

Enumeration Type Documentation

◆ AccessType

enum AccessType
Enumerator
READ_ACCESS 
WRITE_ACCESS 
READ_ACCESS 
WRITE_ACCESS 

Definition at line 79 of file runtime_value_numbering_client.cpp.

Function Documentation

◆ checkMovValueNum()

void checkMovValueNum ( int  opcode,
uint64_t  svalue,
uint64_t  target,
THREADID  threadid,
void *  ip,
const uint32_t  opHandle 
)

◆ checkOpcodeValueNum()

uint64_t checkOpcodeValueNum ( int  opcode,
uint64_t  svalues[],
int  sCount,
THREADID  threadid,
void *  ip,
const uint32_t  opHandle 
)

◆ CleanValueNumbers()

VOID CleanValueNumbers ( THREADID  threadID)

clean all the value numbers for the registers and memory locations

Definition at line 208 of file runtime_value_numbering_client.cpp.

References GetTLS(), gValue, ThreadData_t::immediateMap, lastGValue, ThreadData_t::opcodeMap, and ThreadData_t::regNumber.

Referenced by valueNumbering(), valueNumberingMem1(), valueNumberingMem2(), valueNumberingMem3(), and valueNumberingMem4().

◆ deleteString()

void deleteString ( uint64_t  key,
ThreadData_t td 
)

◆ DumpInfo()

static void DumpInfo ( uint32_t  oldIndex,
uint32_t  newIndex 
)
static

Definition at line 1300 of file runtime_value_numbering_client.cpp.

References gTraceFile, and PinCCTLib::PrintFullCallingContext().

Referenced by ImageUnload().

◆ getImmediateValueNum()

uint64_t getImmediateValueNum ( uint64_t  immediate,
THREADID  threadid 
)
inline

◆ getMemValueNum()

uint64_t getMemValueNum ( uint64_t  addr,
THREADID  threadid 
)
inline

◆ GetOrCreateShadowBaseAddress()

static uint8_t* GetOrCreateShadowBaseAddress ( uint64_t  address)
static

◆ getRegValueNum()

uint64_t getRegValueNum ( REG  reg,
THREADID  threadid 
)
inline

◆ GetTLS()

◆ ImageUnload()

◆ InitValueNumbering()

void InitValueNumbering ( int  argc,
char *  argv[] 
)

◆ Instruction()

VOID Instruction ( INS  ins,
VOID *  v,
const uint32_t  opHandle 
)

◆ IsCommutativeOp()

bool IsCommutativeOp ( int  opcode)

Definition at line 491 of file runtime_value_numbering_client.cpp.

Referenced by checkOpcodeValueNum().

◆ IsIgnorableIns()

bool IsIgnorableIns ( INS  ins)

Definition at line 138 of file runtime_value_numbering_client.cpp.

References INS_IsMaskedJump().

Referenced by Instruction().

◆ IsMov()

bool IsMov ( int  opcode)

Definition at line 150 of file runtime_value_numbering_client.cpp.

Referenced by Instruction().

◆ main()

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

◆ MergedRedundantInfoComparer()

bool MergedRedundantInfoComparer ( const RedundantInfoForPresentation first,
const RedundantInfoForPresentation second 
)
inline

Definition at line 1296 of file runtime_value_numbering_client.cpp.

References RedundantInfoForPresentation::count.

Referenced by ImageUnload().

◆ recordRedundantOperation()

void recordRedundantOperation ( uint32_t  deadCtxt,
uint32_t  killerCtxt,
ThreadData_t td 
)
inline

◆ RegDeadFini()

VOID RegDeadFini ( INT32  code,
VOID *  v 
)

Definition at line 1384 of file runtime_value_numbering_client.cpp.

References gTraceFile.

Referenced by InitValueNumbering().

◆ removeOldstring()

void removeOldstring ( void *  ip,
uint64_t  nValue,
ThreadData_t td 
)

◆ setMemValueNum()

VOID setMemValueNum ( uint64_t  addr,
THREADID  threadid,
uint64_t  value 
)
inline

◆ setRegValueNum()

VOID setRegValueNum ( REG  reg,
ThreadData_t td,
uint64_t  value 
)
inline

◆ sortSvalues()

static void sortSvalues ( uint64_t *  svalues,
int  count 
)
inlinestatic

Definition at line 475 of file runtime_value_numbering_client.cpp.

Referenced by checkOpcodeValueNum().

◆ ThreadStart()

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

Definition at line 1266 of file runtime_value_numbering_client.cpp.

References tls_key.

Referenced by InitValueNumbering().

◆ UpdateValue()

void UpdateValue ( uint32_t  reg,
uint64_t  value,
ThreadData_t td 
)
inline

Definition at line 218 of file runtime_value_numbering_client.cpp.

References gValue, ThreadData_t::regNumber, and value.

Referenced by setRegValueNum().

◆ Usage()

static INT32 Usage ( )
static

Definition at line 1388 of file runtime_value_numbering_client.cpp.

Referenced by main().

◆ valueNumbering()

VOID valueNumbering ( void *  op,
bool  movOrnot,
THREADID  threadid,
void *  ip,
const uint32_t  opHandle 
)

◆ valueNumberingMem1()

VOID valueNumberingMem1 ( void *  op,
void *  addr,
uint32_t  rMem,
uint32_t  wMem,
bool  movOrnot,
THREADID  threadID,
void *  ip,
const uint32_t  opHandle 
)

◆ valueNumberingMem2()

VOID valueNumberingMem2 ( void *  op,
void *  addr1,
void *  addr2,
uint32_t  rMem,
uint32_t  wMem,
bool  movOrnot,
THREADID  threadID,
void *  ip,
const uint32_t  opHandle 
)

◆ valueNumberingMem3()

VOID valueNumberingMem3 ( void *  op,
void *  addr1,
void *  addr2,
void *  addr3,
uint32_t  rMem,
uint32_t  wMem,
bool  movOrnot,
THREADID  threadID,
void *  ip,
const uint32_t  opHandle 
)

◆ valueNumberingMem4()

VOID valueNumberingMem4 ( void *  op,
void *  addr1,
void *  addr2,
void *  addr3,
void *  addr4,
uint32_t  rMem,
uint32_t  wMem,
bool  movOrnot,
THREADID  threadID,
void *  ip,
const uint32_t  opHandle 
)

Variable Documentation

◆ gL1PageTable

uint8_t** gL1PageTable[LEVEL_1_PAGE_TABLE_SIZE]
static

Definition at line 86 of file runtime_value_numbering_client.cpp.

Referenced by GetOrCreateShadowBaseAddress().

◆ gMutex

PIN_MUTEX gMutex
static

Definition at line 131 of file runtime_value_numbering_client.cpp.

Referenced by ImageUnload(), and InitValueNumbering().

◆ gTraceFile

FILE* gTraceFile

◆ gValue

◆ immeCount

int immeCount

Definition at line 122 of file runtime_value_numbering_client.cpp.

◆ immediates

uint64_t immediates[MAX_OPERAND]

Definition at line 125 of file runtime_value_numbering_client.cpp.

◆ ip

◆ lastGValue

uint64_t lastGValue

◆ Num_ins

◆ Num_instructions

uint64_t Num_instructions = 0

◆ Num_redundant

uint64_t Num_redundant = 0

◆ Sample

◆ sCount

int sCount

Definition at line 121 of file runtime_value_numbering_client.cpp.

Referenced by checkOpcodeValueNum().

◆ sRegs

REG sRegs[MAX_OPERAND]

Definition at line 124 of file runtime_value_numbering_client.cpp.

◆ tCount

int tCount

Definition at line 123 of file runtime_value_numbering_client.cpp.

◆ tls_key

TLS_KEY tls_key
static

Definition at line 130 of file runtime_value_numbering_client.cpp.

Referenced by GetTLS(), InitValueNumbering(), and ThreadStart().

◆ tRegs

REG tRegs[MAX_OPERAND]

Definition at line 126 of file runtime_value_numbering_client.cpp.