URL
https://opencores.org/ocsvn/or2k/or2k/trunk
Subversion Repositories or2k
[/] [or2k/] [trunk/] [analysis-bin/] [insnanalysis/] [insnanalysis.c] - Rev 17
Go to most recent revision | Compare with Previous | Blame | View Log
/* File for analysis of an architecture's instructions in binary format Julius Baxter, julius.baxter@orsoc.se */ #include<stdio.h> #include <stdlib.h> #include <string.h> #include <stdint.h> #include <arpa/inet.h> // for htonl() #include "insnanalysis.h" // Access to list management functions #include "insn-lists.h" int analyse_insn(instruction insn, instruction_properties *insn_props) { // For now no other instruction sets supported return or1k_32_analyse_insn(insn, insn_props); } void print_insn(instruction_properties *insn_props) { if (insn_props->insn_string != NULL) printf("%s", insn_props->insn_string); } void collect_stats(instruction insn, instruction_properties *insn_props) { or1k_32_collect_stats(insn, insn_props); } void generate_stats(FILE * stream) { or1k_32_generate_stats(stream); } int main(int argc, char *argv[]) { FILE *fp; char insn_buff[INSN_SIZE_BYTES]; // Buffer for instruction data int insns_seen_total = 0; // Keep track of total number of instructions read // Try to open the file passed as first parameter if((fp = fopen(argv[ 1 ], "rb"))==NULL) { printf("Cannot open file.\n"); exit(1); } instruction * insn = (instruction *)insn_buff; instruction_properties insn_props; // Do initial analysis - frequency of each instruction insn_lists_init(); while(!feof(fp)) { if (fread(insn_buff, INSN_SIZE_BYTES, 1, fp) != 1) break; // Endianness is little when read in from binary file created with // or32-elf-objcopy, so swap; *insn = htonl(*insn); if (*insn == 0) // most probably dead space in binary, skip continue; reset_instruction_properties(&insn_props); if (analyse_insn(*insn, &insn_props) == 0) { /* print_insn(&insn_props); printf("\n"); */ insns_seen_total++; collect_stats(*insn, &insn_props); } else { printf("\n"); } } fclose(fp); printf("Saw %d instructions\n", insns_seen_total); generate_stats(stdout); insn_lists_free(); return 0; }
Go to most recent revision | Compare with Previous | Blame | View Log