Hi:
In my code below, I have a verbose mode which prints results of a trace file.
I need count the branches that are taken.
Which would be if the branch instruction on the line before is used in the instruction on the next line, then the branch is taken.
How do i create a counter that will count if the line before's address is used...
then count it...
Code:#include <stdio.h>
// You can include the trace item structure and type by including a header file
#include "mytrace.h"
#define TRACE_BUFSIZE 1024*1024
#include <stdint.h>
#include <stdlib.h>
static FILE *trace_fd;
static int trace_buf_ptr;
static int trace_buf_end;
static struct trace_item *trace_buf;
void trace_init()
{
trace_buf = (trace_item*)malloc(sizeof(struct trace_item) * TRACE_BUFSIZE);
if (!trace_buf) {
fprintf(stdout, "** trace_buf not allocated\n");
exit(-1);
}
trace_buf_ptr = 0;
trace_buf_end = 0;
}
void trace_uninit()
{
free(trace_buf);
fclose(trace_fd);
}
int trace_get_item(struct trace_item **item)
{
int n_items;
if (trace_buf_ptr == trace_buf_end) {
// get new data
n_items = fread(trace_buf, sizeof(struct trace_item), TRACE_BUFSIZE, trace_fd);
if (!n_items) return 0;
trace_buf_ptr = 0;
trace_buf_end = n_items;
}
*item = &trace_buf[trace_buf_ptr];
trace_buf_ptr++;
return 1;
}
int main(int argc, char **argv)
{
struct trace_item *tr_entry;
size_t size;
char *trace_file_name;
int trace_view_on = 0;
unsigned char t_type = 0;
unsigned char t_sReg_a= 0;
unsigned char t_sReg_b= 0;
unsigned char t_dReg= 0;
unsigned int t_PC = 0;
unsigned int t_Addr = 0;
unsigned int n_items = 0;
unsigned int n_nop = 0;
unsigned int n_rtype = 0;
unsigned int n_itype = 0;
unsigned int n_load = 0;
unsigned int n_store = 0;
unsigned int n_branch = 0;
unsigned int n_jtype = 0;
unsigned int n_jrtype = 0;
unsigned int n_special = 0;
unsigned int n_unknown = 0;
unsigned int n_mem_inst = 0;
unsigned int n_cont_inst = 0;
if (argc == 1) {
fprintf(stdout, "\nUSAGE: tv <trace_file> <switch - any character>\n");
fprintf(stdout, "\n(switch) to turn on or off individual item view.\n\n");
exit(0);
}
trace_file_name = argv[1];
trace_view_on = (argc == 3);
fprintf(stdout, "\n ** opening file %s\n", trace_file_name);
trace_fd = fopen(trace_file_name, "rb");
if (!trace_fd) {
fprintf(stdout, "\ntrace file %s not opened.\n\n", trace_file_name);
exit(0);
}
trace_init();
while(1) {
size = trace_get_item(&tr_entry);
if (!size) {
printf("+ total # items : %u\n", n_items);
printf("+ # nop: %u\n", n_nop);
printf("+ # rtype: %u\n", n_rtype);
printf("+ # itype: %u\n", n_itype);
printf("+ # load: %u\n", n_load);
printf("+ # store: %u\n", n_store);
printf("+ # branch: %u\n", n_branch);
printf("+ # jtype: %u\n", n_jtype);
printf("+ # jrtype: %u\n", n_jrtype);
printf("+ # special: %u\n", n_special);
printf("+ # unknown: %u\n", n_unknown);
printf("+ # Avg mem instr: %4.2f\n", (double)n_mem_inst/(double)n_items);
printf("+ # Avg control instr: %4.2f\n", (double)n_cont_inst/(double)n_items);
break;
}
else{
n_items++;
t_type = tr_entry->type;
t_sReg_a = tr_entry->sReg_a;
t_sReg_b = tr_entry->sReg_b;
t_dReg = tr_entry->dReg;
t_PC = tr_entry->PC;
t_Addr = tr_entry->Addr;
}
switch(tr_entry->type) {
case ti_NOP:
if (trace_view_on){
printf("[item %d] [entry NOP:] [(PC: %x)] [(sReg_a: %d)] [(sReg_b: %d)] [(dReg: %d)] [(addr: %x)]\n", n_items, tr_entry->PC, tr_entry->sReg_a, tr_entry->sReg_b, tr_entry->dReg, tr_entry->Addr);
}
n_nop++;
break;
case ti_RTYPE:
if (trace_view_on){
printf("[item %d] [entry RTYPE:] [(PC: %x)] [(sReg_a: %d)] [(sReg_b: %d)] [(dReg: %d)] [(addr: %x)]\n", n_items, tr_entry->PC, tr_entry->sReg_a, tr_entry->sReg_b, tr_entry->dReg, tr_entry->Addr);
}
n_rtype++;
break;
case ti_ITYPE:
if (trace_view_on){
printf("[item %d] [entry ITYPE:] [(PC: %x)] [(sReg_a: %d)] [(sReg_b: %d)] [(dReg: %d)] [(addr: %x)]\n", n_items, tr_entry->PC, tr_entry->sReg_a, tr_entry->sReg_b, tr_entry->dReg, tr_entry->Addr);
}
n_itype++;
break;
case ti_LOAD:
if (trace_view_on){
printf("[item %d] [entry LOAD:] [(PC: %x)] [(sReg_a: %d)] [(sReg_b: %d)] [(dReg: %d)] [(addr: %x)]\n", n_items, tr_entry->PC, tr_entry->sReg_a, tr_entry->sReg_b, tr_entry->dReg, tr_entry->Addr);
}
n_load++; n_mem_inst++;
break;
case ti_STORE:
if (trace_view_on){
printf("[item %d] [entry STORE:] [(PC: %x)] [(sReg_a: %d)] [(sReg_b: %d)] [(dReg: %d)] [(addr: %x)]\n", n_items, tr_entry->PC, tr_entry->sReg_a, tr_entry->sReg_b, tr_entry->dReg, tr_entry->Addr);
}
n_store++; n_mem_inst++;
break;
case ti_BRANCH:
if (trace_view_on){
printf("[item %d] [entry BRANCH:] [(PC: %x)] [(sReg_a: %d)] [(sReg_b: %d)] [(dReg: %d)] [(addr: %x)]\n", n_items, tr_entry->PC, tr_entry->sReg_a, tr_entry->sReg_b, tr_entry->dReg, tr_entry->Addr);
}
n_branch++; n_cont_inst++;
break;
case ti_JTYPE:
if (trace_view_on){
printf("[item %d] [entry JTYPE:] [(PC: %x)] [(sReg_a: %d)] [(sReg_b: %d)] [(dReg: %d)] [(addr: %x)]\n", n_items, tr_entry->PC, tr_entry->sReg_a, tr_entry->sReg_b, tr_entry->dReg, tr_entry->Addr);
}
n_jtype++; n_cont_inst++;
break;
case ti_SPECIAL:
if (trace_view_on){
printf("[item %d] [entry SPECIAL:] [(PC: %x)] [(sReg_a: %d)] [(sReg_b: %d)] [(dReg: %d)] [(addr: %x)]\n", n_items, tr_entry->PC, tr_entry->sReg_a, tr_entry->sReg_b, tr_entry->dReg, tr_entry->Addr);
}
n_special++; n_cont_inst++;
break;
case ti_JRTYPE:
if (trace_view_on){
printf("[item %d] [entry JRTYPE:] [(PC: %x)] [(sReg_a: %d)] [(sReg_b: %d)] [(dReg: %d)] [(addr: %x)]\n", n_items, tr_entry->PC, tr_entry->sReg_a, tr_entry->sReg_b, tr_entry->dReg, tr_entry->Addr);
}
n_jrtype++; n_cont_inst++;
break;
default:
n_unknown++;
break;
}
}
trace_uninit();
exit(0);
}