OpenCores
URL https://opencores.org/ocsvn/amber/amber/trunk

Subversion Repositories amber

[/] [amber/] [trunk/] [sw/] [tools/] [amber-func-jumps.c] - Rev 69

Go to most recent revision | Compare with Previous | Blame | View Log

/*----------------------------------------------------------------
//                                                              //
//  amber-func-jumps.c                                          //
//                                                              //
//  This file is part of the Amber project                      //
//  http://www.opencores.org/project,amber                      //
//                                                              //
//  Description                                                 //
//  Creates a little database of all the function names and     //
//  addresses is a given disassembly file and then uses it      //
//  to list out the jumps in the Amber disassembly log file.    //
//                                                              //
//  Author(s):                                                  //
//      - Conor Santifort, csantifort.amber@gmail.com           //
//                                                              //
//////////////////////////////////////////////////////////////////
//                                                              //
// Copyright (C) 2010 Authors and OPENCORES.ORG                 //
//                                                              //
// This source file may be used and distributed without         //
// restriction provided that this copyright statement is not    //
// removed from the file and that any derivative work contains  //
// the original copyright notice and the associated disclaimer. //
//                                                              //
// This source file is free software; you can redistribute it   //
// and/or modify it under the terms of the GNU Lesser General   //
// Public License as published by the Free Software Foundation; //
// either version 2.1 of the License, or (at your option) any   //
// later version.                                               //
//                                                              //
// This source is distributed in the hope that it will be       //
// useful, but WITHOUT ANY WARRANTY; without even the implied   //
// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR      //
// PURPOSE.  See the GNU Lesser General Public License for more //
// details.                                                     //
//                                                              //
// You should have received a copy of the GNU Lesser General    //
// Public License along with this source; if not, download it   //
// from http://www.opencores.org/lgpl.shtml                     //
//                                                              //
----------------------------------------------------------------*/
 
#include <stdio.h>
#include <stdlib.h> 
#include <string.h> 
#define NAMES_SIZE 20000
 
struct func_name
{
    char name[48];
    unsigned int address;
};    
 
int conv_hstring ( char *string, unsigned int * addr)
{
int pos = 0;
*addr = 0;
 
while (((string[pos] >= '0' && string[pos] <= '9') || 
       (string[pos] >= 'a' && string[pos] <= 'f')) && pos < 9) {
    if (string[pos] >= '0' && string[pos] <= '9')
        *addr =  (*addr << 4) + ( string[pos++] - '0' );
    else
        *addr =  (*addr << 4) + ( string[pos++] - 'a' ) + 10;
    }
 
return pos;    
}
 
 
unsigned int conv_dstring ( char *string, unsigned int * addr)
{
unsigned int pos = 0;
*addr = 0;
 
while (((string[pos] >= '0' && string[pos] <= '9')) && pos < 9) {
    *addr =  (*addr * 10) + ( string[pos++] - '0' );
    }
 
return pos;    
}
 
 
int main (int argc, char **argv)
{
FILE *jumps_file;
FILE *func_names_file;
int i, num_func_names, to_func_num, found, exhausted, exact, start, mid, end;
int bytes_read;
size_t nbytes = 100;
char *line_buffer;
unsigned int addr;
 
struct func_name func_names [NAMES_SIZE];
char a[12], n[48];
char s_clk_count[12], s_from_addr[12], s_to_addr[12], s_r0[12], s_r1[12];
unsigned int from_addr, to_addr, clk_count;
unsigned int x;
char current_func_name [48] = "none";
 
unsigned int slen;
 
if (argc < 3)
    {
    printf("errer agrc = %d - need jums file name, func_names file name\n", argc);
    return 1;
    }
 
jumps_file = fopen (argv[1], "r");
func_names_file = fopen (argv[2], "r");
 
 
if (jumps_file==NULL)
    {
    printf("jumps file open failed\n");
    return 1;
    }
 
if (func_names_file==NULL)
    {
    printf("jumps file open failed\n");
    return 1;
    }
 
 
/* Read the function names file into a structure */
/* reads a line */
line_buffer  = (char *) malloc (nbytes + 1);
 
i=0;
while (((bytes_read = getline (&line_buffer, &nbytes, func_names_file)) > 0) && i < NAMES_SIZE )
    {
    sscanf(line_buffer, "%s %s", a, n);
    if ( !conv_hstring(a, &addr) )
        {
        fprintf(stderr,"ERROR: conv_hstring error in func_names file with i = %d\n", i);
        return 1;
        }
    strcpy(func_names[i].name, n);
    func_names[i++].address = addr;
    } 
 
 
if ( i == NAMES_SIZE )
    {
    fprintf(stderr, "WARNING: ran out of space in the function array, can only hold %d entries\n", i);
    return 1;
    }
 
num_func_names = i;
 
 
 
 
/* Assign names to jumps */
while ( (bytes_read = getline (&line_buffer, &nbytes, jumps_file)) > 0)
    {
    sscanf(line_buffer, "%s %s %s %s %s", s_clk_count, s_from_addr, s_to_addr, s_r0, s_r1);
 
    if ( !conv_hstring(s_from_addr, &from_addr) )
        {
        fprintf(stderr,"ERROR: conv_hstring error in jumps file, from_addr, with i = %d\n", i);
        return 1;
        }
 
    if ( !conv_hstring(s_to_addr, &to_addr) )
        {
        fprintf(stderr,"ERROR: conv_hstring error in jumps file, to_addr, with i = %d\n", i);
        return 1;
        }
 
    if ( !conv_dstring(s_clk_count, &clk_count) )
        {
        fprintf(stderr,"ERROR: conv_dstring error in jumps file, r0, with i = %d\n", i);
        return 1;
        }
 
    /* find matching function name using binary search */
    found       = 0; 
    exhausted   = 0;
    exact       = 0;
    start       = 0; 
    end         = num_func_names-1;
 
    while ( !found && !exhausted )
        {
        mid = (start + end) / 2;
 
        if (  to_addr >= func_names[mid].address &&
             (to_addr <  func_names[mid+1].address || mid == end) )
            {
            found = 1;
            to_func_num = mid;
            if ( to_addr == func_names[mid].address ) exact = 1;
            }
        else
            {
            if ( start == end ) exhausted = 1;
            else if ( start+1 == end )
                start += 1;
            else if (to_addr > func_names[mid].address)
                start = mid;
            else    
                end = mid;
            }    
        }
 
 
    if (!found)
        fprintf(stderr,"WARNING: to_addr 0x%08x not found\n", to_addr);
 
    /* 
       now assign a function to the from_address
       this just assigns a function within the range
    */ 
    if (found) 
        {
        found =0;
 
        start = 0; 
        end = num_func_names-1;
 
        while (!found)
            {
            mid = (start + end) / 2;
 
            if (  from_addr >= func_names[mid].address &&
                 (from_addr <  func_names[mid+1].address || mid == end) )
                {
                found = 1;
                if ( strcmp ( func_names[mid].name, func_names[to_func_num].name ) )
                    {
 
                    if ( exact ) {                    
                        printf("%9d %s ->", clk_count, func_names[mid].name);
 
                        slen = 35 - strlen ( func_names[mid].name );
                        if ( slen > 0 ) {
                            for (x=0;x<slen;x++) printf(" ");
                            }
 
                        printf("( r0 %s, r1 %s ) %s\n",             
                            s_r0,                             
                            s_r1,                             
                            func_names[to_func_num].name);    
 
                        strcpy(current_func_name, func_names[to_func_num].name);
 
                        }   
                    else if ( strcmp(func_names[to_func_num].name, current_func_name)) {
                        printf("%9d %s <-", 
                                clk_count, 
                                func_names[to_func_num].name);
 
                        slen = 35 - strlen ( func_names[to_func_num].name );
                        if ( slen > 0 ) {
                            for (x=0;x<slen;x++) printf(" ");
                            }
 
 
                        printf("( r0 %s, r1 %s )\n", 
                                s_r0, s_r1);
                        }         
                    }        
                }
            else
                {
                if ( start == end ) 
                    found = 1;
                else if ( start+1 == end )
                    start += 1;
                else if (from_addr > func_names[mid].address)
                    start = mid;
                else    
                    end = mid;
                }    
            }
 
        }
 
    }
 
fclose(func_names_file);
fclose(jumps_file);
 
 
}
 
 
 

Go to most recent revision | Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.