diff options
author | Marcin Slusarz <marcin.slusarz@gmail.com> | 2011-09-16 02:18:45 +0200 |
---|---|---|
committer | Marcin Slusarz <marcin.slusarz@gmail.com> | 2011-09-17 23:05:34 +0200 |
commit | 25614a610f4fe5b6516696238161c476b63ab2ed (patch) | |
tree | 6468222b2beedfdbbb605235906abc1b74a90c15 | |
parent | b0d6d4306fcfb9dc89ebbd9568b7159dfac90a30 (diff) |
mmt: resolve as much as possible at instrumentation time
resolve read/write size and number of parameters at
instrumentation time, instead of at runtime
-rw-r--r-- | mmt/mmt_instrument.c | 286 | ||||
-rw-r--r-- | mmt/mmt_trace.c | 434 | ||||
-rw-r--r-- | mmt/mmt_trace.h | 73 |
3 files changed, 635 insertions, 158 deletions
diff --git a/mmt/mmt_instrument.c b/mmt/mmt_instrument.c index 1c4a0bcd..fa591c82 100644 --- a/mmt/mmt_instrument.c +++ b/mmt/mmt_instrument.c @@ -1,7 +1,7 @@ /* Copyright (C) 2006 Dave Airlie Copyright (C) 2007 Wladimir J. van der Laan - Copyright (C) 2009 Marcin Slusarz <marcin.slusarz@gmail.com> + Copyright (C) 2009,2011 Marcin Slusarz <marcin.slusarz@gmail.com> This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as @@ -28,43 +28,138 @@ #include "pub_tool_libcprint.h" #include "pub_tool_libcassert.h" +#define maybe_unused __attribute__((unused)) + int dump_load = True, dump_store = True; -static void add_trace_load1(IRSB *bb, IRExpr *addr, Int size, Addr inst_addr, IRExpr *val1) +static maybe_unused void +__add_trace_load1_ia(IRSB *bb, IRExpr *addr, Int size, Addr inst_addr, IRExpr *val1) +{ + IRExpr **argv; + IRDirty *di; + + argv = mkIRExprVec_3(addr, val1, mkIRExpr_HWord(inst_addr)); + if (size == 1) + di = unsafeIRDirty_0_N(2, "trace_load_1", VG_(fnptr_to_fnentry)(mmt_trace_load_1_ia), argv); + else if (size == 2) + di = unsafeIRDirty_0_N(2, "trace_load_2", VG_(fnptr_to_fnentry)(mmt_trace_load_2_ia), argv); + else if (size == 4) + di = unsafeIRDirty_0_N(2, "trace_load_4", VG_(fnptr_to_fnentry)(mmt_trace_load_4_ia), argv); +#ifdef MMT_64BIT + else if (size == 8) + di = unsafeIRDirty_0_N(2, "trace_load_8", VG_(fnptr_to_fnentry)(mmt_trace_load_8_ia), argv); +#endif + else + tl_assert(0); + + addStmtToIRSB(bb, IRStmt_Dirty(di)); +} + +static maybe_unused void +__add_trace_load1(IRSB *bb, IRExpr *addr, Int size, Addr inst_addr, IRExpr *val1) { - IRExpr **argv = mkIRExprVec_4(addr, mkIRExpr_HWord(size), - mkIRExpr_HWord(inst_addr), val1); - IRDirty *di = unsafeIRDirty_0_N(2, - "trace_load", - VG_(fnptr_to_fnentry) (mmt_trace_load), - argv); + IRExpr **argv; + IRDirty *di; + + argv = mkIRExprVec_2(addr, val1); + if (size == 1) + di = unsafeIRDirty_0_N(2, "trace_load_1", VG_(fnptr_to_fnentry)(mmt_trace_load_1), argv); + else if (size == 2) + di = unsafeIRDirty_0_N(2, "trace_load_2", VG_(fnptr_to_fnentry)(mmt_trace_load_2), argv); + else if (size == 4) + di = unsafeIRDirty_0_N(2, "trace_load_4", VG_(fnptr_to_fnentry)(mmt_trace_load_4), argv); +#ifdef MMT_64BIT + else if (size == 8) + di = unsafeIRDirty_0_N(2, "trace_load_8", VG_(fnptr_to_fnentry)(mmt_trace_load_8), argv); +#endif + else + tl_assert(0); + addStmtToIRSB(bb, IRStmt_Dirty(di)); } -static void add_trace_load2(IRSB *bb, IRExpr *addr, Int size, Addr inst_addr, IRExpr *val1, IRExpr *val2) +static maybe_unused void +__add_trace_load2_ia(IRSB *bb, IRExpr *addr, Int size, Addr inst_addr, IRExpr *val1, IRExpr *val2) { - IRExpr **argv = mkIRExprVec_5(addr, mkIRExpr_HWord(size), - mkIRExpr_HWord(inst_addr), val1, val2); - IRDirty *di = unsafeIRDirty_0_N(2, - "trace_load2", - VG_(fnptr_to_fnentry) (mmt_trace_load2), - argv); + IRExpr **argv; + IRDirty *di; + + argv = mkIRExprVec_4(addr, val1, val2, mkIRExpr_HWord(inst_addr)); + + if (size == 4) + di = unsafeIRDirty_0_N(2, "trace_load_4_4", VG_(fnptr_to_fnentry) (mmt_trace_load_4_4_ia), argv); +#ifdef MMT_64BIT + else if (size == 8) + di = unsafeIRDirty_0_N(2, "trace_load_8_8", VG_(fnptr_to_fnentry) (mmt_trace_load_8_8_ia), argv); +#endif + else + tl_assert(0); + + addStmtToIRSB(bb, IRStmt_Dirty(di)); +} +static maybe_unused void +__add_trace_load2(IRSB *bb, IRExpr *addr, Int size, Addr inst_addr, IRExpr *val1, IRExpr *val2) +{ + IRExpr **argv; + IRDirty *di; + + argv = mkIRExprVec_3(addr, val1, val2); + + if (size == 4) + di = unsafeIRDirty_0_N(2, "trace_load_4_4", VG_(fnptr_to_fnentry) (mmt_trace_load_4_4), argv); +#ifdef MMT_64BIT + else if (size == 8) + di = unsafeIRDirty_0_N(2, "trace_load_8_8", VG_(fnptr_to_fnentry) (mmt_trace_load_8_8), argv); +#endif + else + tl_assert(0); + addStmtToIRSB(bb, IRStmt_Dirty(di)); } #ifndef MMT_64BIT -static void add_trace_load4(IRSB *bb, IRExpr *addr, Int size, Addr inst_addr, IRExpr *val1, IRExpr *val2, IRExpr *val3, IRExpr *val4) +static maybe_unused void +__add_trace_load4_ia(IRSB *bb, IRExpr *addr, Int size, Addr inst_addr, IRExpr *val1, IRExpr *val2, IRExpr *val3, IRExpr *val4) { - IRExpr **argv = mkIRExprVec_7(addr, mkIRExpr_HWord(size), - mkIRExpr_HWord(inst_addr), val1, val2, val3, val4); - IRDirty *di = unsafeIRDirty_0_N(2, - "trace_load4", - VG_(fnptr_to_fnentry) (mmt_trace_load4), - argv); + IRExpr **argv; + IRDirty *di; + + argv = mkIRExprVec_6(addr, val1, val2, val3, val4, mkIRExpr_HWord(inst_addr)); + + if (size == 4) + di = unsafeIRDirty_0_N(2, "trace_load_4_4_4_4", VG_(fnptr_to_fnentry)(mmt_trace_load_4_4_4_4_ia), argv); + else + tl_assert(0); + + addStmtToIRSB(bb, IRStmt_Dirty(di)); +} +static maybe_unused void +__add_trace_load4(IRSB *bb, IRExpr *addr, Int size, Addr inst_addr, IRExpr *val1, IRExpr *val2, IRExpr *val3, IRExpr *val4) +{ + IRExpr **argv; + IRDirty *di; + + argv = mkIRExprVec_5(addr, val1, val2, val3, val4); + + if (size == 4) + di = unsafeIRDirty_0_N(2, "trace_load_4_4_4_4", VG_(fnptr_to_fnentry)(mmt_trace_load_4_4_4_4), argv); + else + tl_assert(0); + addStmtToIRSB(bb, IRStmt_Dirty(di)); } #endif +#ifdef MMT_PRINT_FILENAMES +#define add_trace_load1 __add_trace_load1_ia +#define add_trace_load2 __add_trace_load2_ia +#define add_trace_load4 __add_trace_load4_ia +#else +#define add_trace_load1 __add_trace_load1 +#define add_trace_load2 __add_trace_load2 +#define add_trace_load4 __add_trace_load4 +#endif + #ifdef MMT_64BIT static void add_trace_load(IRSB *bb, IRExpr *addr, Int size, Addr inst_addr, IRExpr *data, IRType arg_ty) { @@ -260,46 +355,139 @@ static void add_trace_load(IRSB *bb, IRExpr *addr, Int size, Addr inst_addr, IRE } #endif -static void -add_trace_store1(IRSB *bb, IRExpr *addr, Int size, Addr inst_addr, - IRExpr *data) +static maybe_unused void +__add_trace_store1_ia(IRSB *bb, IRExpr *addr, Int size, Addr inst_addr, IRExpr *data) +{ + IRExpr **argv; + IRDirty *di; + + argv = mkIRExprVec_3(addr, data, mkIRExpr_HWord(inst_addr)); + + if (size == 1) + di = unsafeIRDirty_0_N(2, "trace_store_1", VG_(fnptr_to_fnentry)(mmt_trace_store_1_ia), argv); + else if (size == 2) + di = unsafeIRDirty_0_N(2, "trace_store_2", VG_(fnptr_to_fnentry)(mmt_trace_store_2_ia), argv); + else if (size == 4) + di = unsafeIRDirty_0_N(2, "trace_store_4", VG_(fnptr_to_fnentry)(mmt_trace_store_4_ia), argv); +#ifdef MMT_64BIT + else if (size == 8) + di = unsafeIRDirty_0_N(2, "trace_store_8", VG_(fnptr_to_fnentry)(mmt_trace_store_8_ia), argv); +#endif + else + tl_assert(0); + + addStmtToIRSB(bb, IRStmt_Dirty(di)); +} + +static maybe_unused void +__add_trace_store1(IRSB *bb, IRExpr *addr, Int size, Addr inst_addr, IRExpr *data) +{ + IRExpr **argv; + IRDirty *di; + + argv = mkIRExprVec_2(addr, data); + + if (size == 1) + di = unsafeIRDirty_0_N(2, "trace_store_1", VG_(fnptr_to_fnentry)(mmt_trace_store_1), argv); + else if (size == 2) + di = unsafeIRDirty_0_N(2, "trace_store_2", VG_(fnptr_to_fnentry)(mmt_trace_store_2), argv); + else if (size == 4) + di = unsafeIRDirty_0_N(2, "trace_store_4", VG_(fnptr_to_fnentry)(mmt_trace_store_4), argv); +#ifdef MMT_64BIT + else if (size == 8) + di = unsafeIRDirty_0_N(2, "trace_store_8", VG_(fnptr_to_fnentry)(mmt_trace_store_8), argv); +#endif + else + tl_assert(0); + + addStmtToIRSB(bb, IRStmt_Dirty(di)); +} + +static maybe_unused void +__add_trace_store2_ia(IRSB *bb, IRExpr *addr, Int size, Addr inst_addr, + IRExpr *data1, IRExpr *data2) { - IRExpr **argv = mkIRExprVec_4(addr, mkIRExpr_HWord(size), - mkIRExpr_HWord(inst_addr), data); - IRDirty *di = unsafeIRDirty_0_N(2, - "trace_store", - VG_(fnptr_to_fnentry) (mmt_trace_store), - argv); + IRExpr **argv; + IRDirty *di; + + argv = mkIRExprVec_4(addr, data1, data2, mkIRExpr_HWord(inst_addr)); + + if (size == 4) + di = unsafeIRDirty_0_N(2, "trace_store_4_4", VG_(fnptr_to_fnentry)(mmt_trace_store_4_4_ia), argv); +#ifdef MMT_64BIT + else if (size == 8) + di = unsafeIRDirty_0_N(2, "trace_store_8_8", VG_(fnptr_to_fnentry)(mmt_trace_store_8_8_ia), argv); +#endif + else + tl_assert(0); + addStmtToIRSB(bb, IRStmt_Dirty(di)); } -static void -add_trace_store2(IRSB *bb, IRExpr *addr, Int size, Addr inst_addr, +static maybe_unused void +__add_trace_store2(IRSB *bb, IRExpr *addr, Int size, Addr inst_addr, IRExpr *data1, IRExpr *data2) { - IRExpr **argv = mkIRExprVec_5(addr, mkIRExpr_HWord(size), - mkIRExpr_HWord(inst_addr), - data1, data2); - IRDirty *di = unsafeIRDirty_0_N(2, - "trace_store2", - VG_(fnptr_to_fnentry) (mmt_trace_store2), - argv); + IRExpr **argv; + IRDirty *di; + + argv = mkIRExprVec_3(addr, data1, data2); + + if (size == 4) + di = unsafeIRDirty_0_N(2, "trace_store_4_4", VG_(fnptr_to_fnentry)(mmt_trace_store_4_4), argv); +#ifdef MMT_64BIT + else if (size == 8) + di = unsafeIRDirty_0_N(2, "trace_store_8_8", VG_(fnptr_to_fnentry)(mmt_trace_store_8_8), argv); +#endif + else + tl_assert(0); + addStmtToIRSB(bb, IRStmt_Dirty(di)); } #ifndef MMT_64BIT -static void -add_trace_store4(IRSB *bb, IRExpr *addr, Addr inst_addr, +static maybe_unused void +__add_trace_store4_ia(IRSB *bb, IRExpr *addr, Int size, Addr inst_addr, IRExpr *data1, IRExpr *data2, IRExpr *data3, IRExpr *data4) { - IRExpr **argv = mkIRExprVec_6(addr, mkIRExpr_HWord(inst_addr), - data1, data2, data3, data4); - IRDirty *di = unsafeIRDirty_0_N(2, - "trace_store4", - VG_(fnptr_to_fnentry) (mmt_trace_store4), - argv); + IRExpr **argv; + IRDirty *di; + + argv = mkIRExprVec_6(addr, data1, data2, data3, data4, mkIRExpr_HWord(inst_addr)); + + if (size == 4) + di = unsafeIRDirty_0_N(2, "trace_store_4_4_4_4", VG_(fnptr_to_fnentry)(mmt_trace_store_4_4_4_4_ia), argv); + else + tl_assert(0); + addStmtToIRSB(bb, IRStmt_Dirty(di)); } +static maybe_unused void +__add_trace_store4(IRSB *bb, IRExpr *addr, Int size, Addr inst_addr, + IRExpr *data1, IRExpr *data2, IRExpr *data3, IRExpr *data4) +{ + IRExpr **argv; + IRDirty *di; + + argv = mkIRExprVec_5(addr, data1, data2, data3, data4); + + if (size == 4) + di = unsafeIRDirty_0_N(2, "trace_store_4_4_4_4", VG_(fnptr_to_fnentry)(mmt_trace_store_4_4_4_4), argv); + else + tl_assert(0); + + addStmtToIRSB(bb, IRStmt_Dirty(di)); +} +#endif + +#ifdef MMT_PRINT_FILENAMES +#define add_trace_store1 __add_trace_store1_ia +#define add_trace_store2 __add_trace_store2_ia +#define add_trace_store4 __add_trace_store4_ia +#else +#define add_trace_store1 __add_trace_store1 +#define add_trace_store2 __add_trace_store2 +#define add_trace_store4 __add_trace_store4 #endif #ifdef MMT_64BIT @@ -491,7 +679,7 @@ static void add_trace_store(IRSB *bbOut, IRExpr *destAddr, Addr inst_addr, addStmtToIRSB(bbOut, cast); data_expr4 = IRExpr_RdTmp(t); - add_trace_store4(bbOut, destAddr, inst_addr, + add_trace_store4(bbOut, destAddr, sizeofIRType(Ity_I32), inst_addr, data_expr1, data_expr2, data_expr3, data_expr4); break; diff --git a/mmt/mmt_trace.c b/mmt/mmt_trace.c index abd21c61..50c620e2 100644 --- a/mmt/mmt_trace.c +++ b/mmt/mmt_trace.c @@ -30,7 +30,7 @@ #include "pub_tool_debuginfo.h" #include "pub_tool_libcassert.h" -//#define MMT_PRINT_FILENAMES +#define MMT_PRINT_DATA static struct mmt_mmap_data mmt_mmaps[MMT_MAX_REGIONS]; static int mmt_last_region = -1; @@ -437,8 +437,6 @@ struct mmt_mmap_data *mmt_add_region(int fd, Addr start, Addr end, return region; } -#ifdef MMT_PRINT_FILENAMES -#define MMT_NAMESTR_LEN 256 static void mydescribe(Addr inst_addr, char *namestr, int len) { char filename[100]; @@ -452,182 +450,416 @@ static void mydescribe(Addr inst_addr, char *namestr, int len) else VG_(snprintf) (namestr, len, "@%08lx", inst_addr); } + +#ifdef MMT_PRINT_DATA +#define print_store(fmt, ...) \ + VG_(message)(Vg_DebugMsg, "w %d:0x%04x, " fmt "\n", \ + region->id, (unsigned int)(addr - region->start), __VA_ARGS__) +#define print_load(fmt, ...) \ + VG_(message)(Vg_DebugMsg, "r %d:0x%04x, " fmt "\n", \ + region->id, (unsigned int)(addr - region->start), __VA_ARGS__) #else -#define MMT_NAMESTR_LEN 1 -static inline void mydescribe(Addr inst_addr, char *namestr, int len) +#define print_store(fmt, ...) \ + VG_(message)(Vg_DebugMsg, "", \ + region->id, (unsigned int)(addr - region->start), __VA_ARGS__) +#define print_load(fmt, ...) \ + VG_(message)(Vg_DebugMsg, "", \ + region->id, (unsigned int)(addr - region->start), __VA_ARGS__) +#endif + +VG_REGPARM(2) +void mmt_trace_store_1(Addr addr, UWord value) { - namestr[0] = 0; + struct mmt_mmap_data *region; + + region = find_mmap(addr); + if (likely(!region)) + return; + + print_store("0x%02lx ", value); } -#endif VG_REGPARM(2) -void mmt_trace_store(Addr addr, SizeT size, Addr inst_addr, UWord value) +void mmt_trace_store_1_ia(Addr addr, UWord value, Addr inst_addr) { struct mmt_mmap_data *region; - char valstr[22]; - char namestr[MMT_NAMESTR_LEN]; + char namestr[256]; region = find_mmap(addr); if (likely(!region)) return; - switch (size) - { - case 1: - VG_(sprintf) (valstr, "0x%02lx", value); - break; - case 2: - VG_(sprintf) (valstr, "0x%04lx", value); - break; - case 4: - VG_(sprintf) (valstr, "0x%08lx", value); - break; + mydescribe(inst_addr, namestr, 256); + + print_store("0x%02lx %s", value, namestr); +} + +VG_REGPARM(2) +void mmt_trace_store_2(Addr addr, UWord value) +{ + struct mmt_mmap_data *region; + + region = find_mmap(addr); + if (likely(!region)) + return; + + print_store("0x%04lx ", value); +} + +VG_REGPARM(2) +void mmt_trace_store_2_ia(Addr addr, UWord value, Addr inst_addr) +{ + struct mmt_mmap_data *region; + char namestr[256]; + + region = find_mmap(addr); + if (likely(!region)) + return; + + mydescribe(inst_addr, namestr, 256); + + print_store("0x%04lx %s", value, namestr); +} + +VG_REGPARM(2) +void mmt_trace_store_4(Addr addr, UWord value) +{ + struct mmt_mmap_data *region; + + region = find_mmap(addr); + if (likely(!region)) + return; + + print_store("0x%08lx ", value); +} + +VG_REGPARM(2) +void mmt_trace_store_4_ia(Addr addr, UWord value, Addr inst_addr) +{ + struct mmt_mmap_data *region; + char namestr[256]; + + region = find_mmap(addr); + if (likely(!region)) + return; + + mydescribe(inst_addr, namestr, 256); + + print_store("0x%08lx %s", value, namestr); +} + #ifdef MMT_64BIT - case 8: - VG_(sprintf) (valstr, "0x%08lx,0x%08lx", value >> 32, value & 0xffffffff); - break; +VG_REGPARM(2) +void mmt_trace_store_8(Addr addr, UWord value) +{ + struct mmt_mmap_data *region; + + region = find_mmap(addr); + if (likely(!region)) + return; + + print_store("0x%08lx,0x%08lx ", value >> 32, value & 0xffffffff); +} +VG_REGPARM(2) +void mmt_trace_store_8_ia(Addr addr, UWord value, Addr inst_addr) +{ + struct mmt_mmap_data *region; + char namestr[256]; + + region = find_mmap(addr); + if (likely(!region)) + return; + + mydescribe(inst_addr, namestr, 256); + + print_store("0x%08lx,0x%08lx %s", value >> 32, value & 0xffffffff, namestr); +} #endif - default: - return; - } - mydescribe(inst_addr, namestr, MMT_NAMESTR_LEN); - VG_(message) (Vg_DebugMsg, "w %d:0x%04x, %s %s\n", region->id, (unsigned int)(addr - region->start), valstr, namestr); +VG_REGPARM(2) +void mmt_trace_store_4_4(Addr addr, UWord value1, UWord value2) +{ + struct mmt_mmap_data *region; + + region = find_mmap(addr); + if (likely(!region)) + return; + + print_store("0x%08lx,0x%08lx ", value1, value2); } VG_REGPARM(2) -void mmt_trace_store2(Addr addr, SizeT size, Addr inst_addr, UWord value1, UWord value2) +void mmt_trace_store_4_4_ia(Addr addr, UWord value1, UWord value2, Addr inst_addr) { struct mmt_mmap_data *region; - char valstr[44]; - char namestr[MMT_NAMESTR_LEN]; + char namestr[256]; region = find_mmap(addr); if (likely(!region)) return; - switch (size) - { - case 4: - VG_(sprintf) (valstr, "0x%08lx,0x%08lx", value1, value2); - break; + mydescribe(inst_addr, namestr, 256); + + print_store("0x%08lx,0x%08lx %s", value1, value2, namestr); +} + #ifdef MMT_64BIT - case 8: - VG_(sprintf) (valstr, "0x%08lx,0x%08lx,0x%08lx,0x%08lx", - value1 >> 32, value1 & 0xffffffff, - value2 >> 32, value2 & 0xffffffff); - break; -#endif - default: - return; - } +VG_REGPARM(2) +void mmt_trace_store_8_8(Addr addr, UWord value1, UWord value2) +{ + struct mmt_mmap_data *region; - mydescribe(inst_addr, namestr, MMT_NAMESTR_LEN); + region = find_mmap(addr); + if (likely(!region)) + return; - VG_(message) (Vg_DebugMsg, "w %d:0x%04x, %s %s\n", region->id, (unsigned int)(addr - region->start), valstr, namestr); + print_store("0x%08lx,0x%08lx,0x%08lx,0x%08lx ", value1 >> 32, + value1 & 0xffffffff, value2 >> 32, value2 & 0xffffffff); } +VG_REGPARM(2) +void mmt_trace_store_8_8_ia(Addr addr, UWord value1, UWord value2, Addr inst_addr) +{ + struct mmt_mmap_data *region; + char namestr[256]; + + region = find_mmap(addr); + if (likely(!region)) + return; + + mydescribe(inst_addr, namestr, 256); + + print_store("0x%08lx,0x%08lx,0x%08lx,0x%08lx %s", value1 >> 32, + value1 & 0xffffffff, value2 >> 32, value2 & 0xffffffff, namestr); +} +#endif #ifndef MMT_64BIT VG_REGPARM(2) -void mmt_trace_store4(Addr addr, Addr inst_addr, UWord value1, UWord value2, UWord value3, UWord value4) +void mmt_trace_store_4_4_4_4(Addr addr, UWord value1, UWord value2, + UWord value3, UWord value4) +{ + struct mmt_mmap_data *region; + + region = find_mmap(addr); + if (likely(!region)) + return; + + print_store("0x%08lx,0x%08lx,0x%08lx,0x%08lx ", value1, value2, + value3, value4); +} +VG_REGPARM(2) +void mmt_trace_store_4_4_4_4_ia(Addr addr, UWord value1, UWord value2, + UWord value3, UWord value4, Addr inst_addr) { struct mmt_mmap_data *region; - char valstr[44]; - char namestr[MMT_NAMESTR_LEN]; + char namestr[256]; region = find_mmap(addr); if (likely(!region)) return; - VG_(sprintf) (valstr, "0x%08lx,0x%08lx,0x%08lx,0x%08lx", value1, value2, value3, value4); - mydescribe(inst_addr, namestr, MMT_NAMESTR_LEN); + mydescribe(inst_addr, namestr, 256); - VG_(message) (Vg_DebugMsg, "w %d:0x%04x, %s %s\n", region->id, (unsigned int)(addr - region->start), valstr, namestr); + print_store("0x%08lx,0x%08lx,0x%08lx,0x%08lx %s", value1, value2, + value3, value4, namestr); } #endif VG_REGPARM(2) -void mmt_trace_load(Addr addr, SizeT size, UInt inst_addr, UWord value) +void mmt_trace_load_1(Addr addr, UWord value) { struct mmt_mmap_data *region; - char valstr[22]; - char namestr[MMT_NAMESTR_LEN]; region = find_mmap(addr); if (likely(!region)) return; - switch (size) - { - case 1: - VG_(sprintf) (valstr, "0x%02lx", value); - break; - case 2: - VG_(sprintf) (valstr, "0x%04lx", value); - break; - case 4: - VG_(sprintf) (valstr, "0x%08lx", value); - break; + print_load("0x%02lx ", value); +} + +VG_REGPARM(2) +void mmt_trace_load_1_ia(Addr addr, UWord value, Addr inst_addr) +{ + struct mmt_mmap_data *region; + char namestr[256]; + + region = find_mmap(addr); + if (likely(!region)) + return; + + mydescribe(inst_addr, namestr, 256); + + print_load("0x%02lx %s", value, namestr); +} + +VG_REGPARM(2) +void mmt_trace_load_2(Addr addr, UWord value) +{ + struct mmt_mmap_data *region; + + region = find_mmap(addr); + if (likely(!region)) + return; + + print_load("0x%04lx ", value); +} + +VG_REGPARM(2) +void mmt_trace_load_2_ia(Addr addr, UWord value, Addr inst_addr) +{ + struct mmt_mmap_data *region; + char namestr[256]; + + region = find_mmap(addr); + if (likely(!region)) + return; + + mydescribe(inst_addr, namestr, 256); + + print_load("0x%04lx %s", value, namestr); +} + +VG_REGPARM(2) +void mmt_trace_load_4(Addr addr, UWord value) +{ + struct mmt_mmap_data *region; + + region = find_mmap(addr); + if (likely(!region)) + return; + + print_load("0x%08lx ", value); +} + +VG_REGPARM(2) +void mmt_trace_load_4_ia(Addr addr, UWord value, Addr inst_addr) +{ + struct mmt_mmap_data *region; + char namestr[256]; + + region = find_mmap(addr); + if (likely(!region)) + return; + + mydescribe(inst_addr, namestr, 256); + + print_load("0x%08lx %s", value, namestr); +} + #ifdef MMT_64BIT - case 8: - VG_(sprintf) (valstr, "0x%08lx,0x%08lx", value >> 32, value & 0xffffffff); - break; +VG_REGPARM(2) +void mmt_trace_load_8(Addr addr, UWord value) +{ + struct mmt_mmap_data *region; + + region = find_mmap(addr); + if (likely(!region)) + return; + + print_load("0x%08lx,0x%08lx ", value >> 32, value & 0xffffffff); +} +VG_REGPARM(2) +void mmt_trace_load_8_ia(Addr addr, UWord value, Addr inst_addr) +{ + struct mmt_mmap_data *region; + char namestr[256]; + + region = find_mmap(addr); + if (likely(!region)) + return; + + mydescribe(inst_addr, namestr, 256); + + print_load("0x%08lx,0x%08lx %s", value >> 32, value & 0xffffffff, namestr); +} #endif - default: - return; - } - mydescribe(inst_addr, namestr, MMT_NAMESTR_LEN); - VG_(message) (Vg_DebugMsg, "r %d:0x%04x, %s %s\n", region->id, (unsigned int)(addr - region->start), valstr, namestr); +VG_REGPARM(2) +void mmt_trace_load_4_4(Addr addr, UWord value1, UWord value2) +{ + struct mmt_mmap_data *region; + + region = find_mmap(addr); + if (likely(!region)) + return; + + print_load("0x%08lx,0x%08lx ", value1, value2); } VG_REGPARM(2) -void mmt_trace_load2(Addr addr, SizeT size, UInt inst_addr, UWord value1, UWord value2) +void mmt_trace_load_4_4_ia(Addr addr, UWord value1, UWord value2, Addr inst_addr) { struct mmt_mmap_data *region; - char valstr[44]; - char namestr[MMT_NAMESTR_LEN]; + char namestr[256]; region = find_mmap(addr); if (likely(!region)) return; - switch (size) - { - case 4: - VG_(sprintf) (valstr, "0x%08lx,0x%08lx", value1, value2); - break; + mydescribe(inst_addr, namestr, 256); + + print_load("0x%08lx,0x%08lx %s", value1, value2, namestr); +} + #ifdef MMT_64BIT - case 8: - VG_(sprintf) (valstr, "0x%08lx,0x%08lx,0x%08lx,0x%08lx", - value1 >> 32, value1 & 0xffffffff, - value2 >> 32, value2 & 0xffffffff); - break; -#endif - default: - return; - } - mydescribe(inst_addr, namestr, MMT_NAMESTR_LEN); +VG_REGPARM(2) +void mmt_trace_load_8_8(Addr addr, UWord value1, UWord value2) +{ + struct mmt_mmap_data *region; + + region = find_mmap(addr); + if (likely(!region)) + return; - VG_(message) (Vg_DebugMsg, "r %d:0x%04x, %s %s\n", region->id, (unsigned int)(addr - region->start), valstr, namestr); + print_load("0x%08lx,0x%08lx,0x%08lx,0x%08lx ", value1 >> 32, + value1 & 0xffffffff, value2 >> 32, value2 & 0xffffffff); } +VG_REGPARM(2) +void mmt_trace_load_8_8_ia(Addr addr, UWord value1, UWord value2, Addr inst_addr) +{ + struct mmt_mmap_data *region; + char namestr[256]; + + region = find_mmap(addr); + if (likely(!region)) + return; + + mydescribe(inst_addr, namestr, 256); + + print_load("0x%08lx,0x%08lx,0x%08lx,0x%08lx %s", value1 >> 32, + value1 & 0xffffffff, value2 >> 32, value2 & 0xffffffff, namestr); +} +#endif #ifndef MMT_64BIT VG_REGPARM(2) -void mmt_trace_load4(Addr addr, SizeT size, UInt inst_addr, UWord value1, UWord value2, UWord value3, UWord value4) +void mmt_trace_load_4_4_4_4(Addr addr, UWord value1, UWord value2, + UWord value3, UWord value4) +{ + struct mmt_mmap_data *region; + + region = find_mmap(addr); + if (likely(!region)) + return; + + print_load("0x%08lx,0x%08lx,0x%08lx,0x%08lx ", value1, value2, + value3, value4); +} +VG_REGPARM(2) +void mmt_trace_load_4_4_4_4_ia(Addr addr, UWord value1, UWord value2, + UWord value3, UWord value4, Addr inst_addr) { struct mmt_mmap_data *region; - char valstr[44]; - char namestr[MMT_NAMESTR_LEN]; + char namestr[256]; region = find_mmap(addr); if (likely(!region)) return; - VG_(sprintf) (valstr, "0x%08lx,0x%08lx,0x%08lx,0x%08lx", value1, value2, value3, value4); - mydescribe(inst_addr, namestr, MMT_NAMESTR_LEN); + mydescribe(inst_addr, namestr, 256); - VG_(message) (Vg_DebugMsg, "r %d:0x%04x, %s %s\n", region->id, (unsigned int)(addr - region->start), valstr, namestr); + print_load("0x%08lx,0x%08lx,0x%08lx,0x%08lx %s", value1, value2, + value3, value4, namestr); } #endif diff --git a/mmt/mmt_trace.h b/mmt/mmt_trace.h index 2318028a..06393634 100644 --- a/mmt/mmt_trace.h +++ b/mmt/mmt_trace.h @@ -9,6 +9,7 @@ #define MMT_64BIT #endif +//#define MMT_PRINT_FILENAMES #define MMT_MAX_TRACE_FILES 10 #define MMT_MAX_REGIONS 1000 @@ -44,25 +45,81 @@ void mmt_pre_syscall(ThreadId tid, UInt syscallno, UWord *args, UInt nArgs); void mmt_post_syscall(ThreadId tid, UInt syscallno, UWord *args, UInt nArgs, SysRes res); VG_REGPARM(2) -void mmt_trace_store(Addr addr, SizeT size, Addr inst_addr, UWord value); +void mmt_trace_store_1(Addr addr, UWord value); +VG_REGPARM(2) +void mmt_trace_store_1_ia(Addr addr, UWord value, Addr inst_addr); +VG_REGPARM(2) +void mmt_trace_store_2(Addr addr, UWord value); +VG_REGPARM(2) +void mmt_trace_store_2_ia(Addr addr, UWord value, Addr inst_addr); +VG_REGPARM(2) +void mmt_trace_store_4(Addr addr, UWord value); +VG_REGPARM(2) +void mmt_trace_store_4_ia(Addr addr, UWord value, Addr inst_addr); +#ifdef MMT_64BIT + VG_REGPARM(2) + void mmt_trace_store_8(Addr addr, UWord value); + VG_REGPARM(2) + void mmt_trace_store_8_ia(Addr addr, UWord value, Addr inst_addr); +#endif + +VG_REGPARM(2) +void mmt_trace_store_4_4(Addr addr, UWord value1, UWord value2); VG_REGPARM(2) -void mmt_trace_store2(Addr addr, SizeT size, Addr inst_addr, UWord value1, UWord value2); +void mmt_trace_store_4_4_ia(Addr addr, UWord value1, UWord value2, Addr inst_addr); + +#ifdef MMT_64BIT + VG_REGPARM(2) + void mmt_trace_store_8_8(Addr addr, UWord value1, UWord value2); + VG_REGPARM(2) + void mmt_trace_store_8_8_ia(Addr addr, UWord value1, UWord value2, Addr inst_addr); +#endif #ifndef MMT_64BIT -VG_REGPARM(2) -void mmt_trace_store4(Addr addr, Addr inst_addr, UWord value1, UWord value2, UWord value3, UWord value4); + VG_REGPARM(2) + void mmt_trace_store_4_4_4_4(Addr addr, UWord value1, UWord value2, UWord value3, UWord value4); + VG_REGPARM(2) + void mmt_trace_store_4_4_4_4_ia(Addr addr, UWord value1, UWord value2, UWord value3, UWord value4, Addr inst_addr); #endif VG_REGPARM(2) -void mmt_trace_load(Addr addr, SizeT size, UInt inst_addr, UWord value); +void mmt_trace_load_1(Addr addr, UWord value); +VG_REGPARM(2) +void mmt_trace_load_1_ia(Addr addr, UWord value, Addr inst_addr); +VG_REGPARM(2) +void mmt_trace_load_2(Addr addr, UWord value); +VG_REGPARM(2) +void mmt_trace_load_2_ia(Addr addr, UWord value, Addr inst_addr); +VG_REGPARM(2) +void mmt_trace_load_4(Addr addr, UWord value); +VG_REGPARM(2) +void mmt_trace_load_4_ia(Addr addr, UWord value, Addr inst_addr); +#ifdef MMT_64BIT + VG_REGPARM(2) + void mmt_trace_load_8(Addr addr, UWord value); + VG_REGPARM(2) + void mmt_trace_load_8_ia(Addr addr, UWord value, Addr inst_addr); +#endif + +VG_REGPARM(2) +void mmt_trace_load_4_4(Addr addr, UWord value1, UWord value2); VG_REGPARM(2) -void mmt_trace_load2(Addr addr, SizeT size, UInt inst_addr, UWord value1, UWord value2); +void mmt_trace_load_4_4_ia(Addr addr, UWord value1, UWord value2, Addr inst_addr); + +#ifdef MMT_64BIT + VG_REGPARM(2) + void mmt_trace_load_8_8(Addr addr, UWord value1, UWord value2); + VG_REGPARM(2) + void mmt_trace_load_8_8_ia(Addr addr, UWord value1, UWord value2, Addr inst_addr); +#endif #ifndef MMT_64BIT -VG_REGPARM(2) -void mmt_trace_load4(Addr addr, SizeT size, UInt inst_addr, UWord value1, UWord value2, UWord value3, UWord value4); + VG_REGPARM(2) + void mmt_trace_load_4_4_4_4(Addr addr, UWord value1, UWord value2, UWord value3, UWord value4); + VG_REGPARM(2) + void mmt_trace_load_4_4_4_4_ia(Addr addr, UWord value1, UWord value2, UWord value3, UWord value4, Addr inst_addr); #endif |