Next we add code to track the size of blocks as we build them for our as-built count. This will give us the number of blocks built and their average size. Next we will add the dynamic execution counts.
+ #ifdef WINDOWS
+ #else
+ # define DISPLAY_STRING(msg)
dr_printf(
"%s\n", msg)
+ #endif
+ typedef struct bb_counts {
+ uint64 blocks;
+ uint64 total_size;
+ } bb_counts;
+ static bb_counts counts_as_built;
+ void *as_built_lock;
static void
event_exit(void);
event_basic_block(void *drcontext, void *tag, instrlist_t *bb,
bool for_trace, bool translating);
DR_EXPORT void
{
+
+
}
static void
event_exit(void)
{
+
+ char msg[512];
+ int len;
+ len = snprintf(msg, sizeof(msg)/sizeof(msg[0]),
+ "Number of basic blocks built : %"UINT64_FORMAT_CODE"\n"
+ " Average size : %5.2lf instructions\n",
+ counts_as_built.blocks,
+ counts_as_built.total_size / (double)counts_as_built.blocks);
+ msg[sizeof(msg)/sizeof(msg[0])-1] = '\0';
+ DISPLAY_STRING(msg);
+
+
}
event_basic_block(void *drcontext, void *tag, instrlist_t *bb,
bool for_trace, bool translating)
{
+ uint num_instructions = 0;
+
+
+ num_instructions++;
+ }
+
+
+ counts_as_built.blocks++;
+ counts_as_built.total_size += num_instructions;
}
[ prev | next ]