This is the mail archive of the sid@sourceware.org mailing list for the SID project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[patch][commit] cgen_symbol_at_address and cgen_print_address


Hi,

I've committed the attached patch which implements cgen_symbol_at_address and cgen_print_address (in cgen_bi_endian_cpu). The implementation uses the loader's function? pin and current-function attribute (added previously for dynamic configuration) to determine which symbol is associated with the given address.

Previously, cgen_symbol_at_address simply wrote a message to cerr.

The disassembly for ports which use these functions now looks more like the disassembly produced by objdump.

Dave
2006-06-20  Dave Brolley  <brolley@redhat.com>

	* commonCfg.cxx (BoardCfg::write_config): If there is a loader, then
	relate it to the cpu and connect the cpu's disassembly-symbol-address
	pin to the loader's function? pin.

2006-06-20  Dave Brolley  <brolley@redhat.com>

	* compCGEN.cxx (cgen_bi_endian_cpu): Initialize loader. Add "loader"
	relation and "disassembly-symbol-address" pin.
	(cgen_print_address): Call cgen_symbol_at_address and print the
	symbol name.
	(cgen_symbol_at_address): Implemented.
	* cgen-cpu.h (class cgen_bi_endian_cpu): Add symbol_at_address,
	loader and disassembly_symbol_address_pin.

Index: sid/component/cgen-cpu/cgen-cpu.h
===================================================================
RCS file: /cvs/src/src/sid/component/cgen-cpu/cgen-cpu.h,v
retrieving revision 1.17
diff -c -p -r1.17 cgen-cpu.h
*** sid/component/cgen-cpu/cgen-cpu.h	10 May 2006 20:58:29 -0000	1.17
--- sid/component/cgen-cpu/cgen-cpu.h	20 Jun 2006 18:25:18 -0000
*************** public:
*** 70,76 ****
--- 70,80 ----
    void disassemble (PCADDR pc, disassembler_ftype printfn,
  		    enum bfd_flavour flavour, enum bfd_architecture arch,
  		    enum bfd_endian endian, const char *name, CGEN_BITSET *isas = 0, int machine = 0);
+   string symbol_at_address;
    struct disassemble_info info;
+   component *loader;
+   output_pin disassembly_symbol_address_pin;
+ 
  protected:
    static int cgen_read_memory (bfd_vma memaddr, bfd_byte *myaddr,
  		     unsigned int length,
Index: sid/component/cgen-cpu/compCGEN.cxx
===================================================================
RCS file: /cvs/src/src/sid/component/cgen-cpu/compCGEN.cxx,v
retrieving revision 1.18
diff -c -p -r1.18 compCGEN.cxx
*** sid/component/cgen-cpu/compCGEN.cxx	11 May 2006 14:33:40 -0000	1.18
--- sid/component/cgen-cpu/compCGEN.cxx	20 Jun 2006 18:25:18 -0000
*************** using namespace cgen;
*** 42,47 ****
--- 42,48 ----
  // ----------------------------------------------------------------------------
  cgen_bi_endian_cpu::cgen_bi_endian_cpu ()
  {
+   loader = 0;
    branch_was_return = false;
    warnings_enabled = false;
    add_attribute ("enable-warnings?", & warnings_enabled, "setting");
*************** cgen_bi_endian_cpu::cgen_bi_endian_cpu (
*** 50,55 ****
--- 51,58 ----
  			 & cgen_bi_endian_cpu::set_engine_type,
  			 & cgen_bi_endian_cpu::get_engine_type,
  			 "setting");
+   add_uni_relation("loader", &loader);
+   add_pin ("disassembly-symbol-address", & disassembly_symbol_address_pin);
  }
  
  
*************** cgen_bi_endian_cpu::cgen_print_address(b
*** 230,245 ****
  {
    cgen_bi_endian_cpu *thisp = static_cast<cgen_bi_endian_cpu *>(info->application_data);
  
!   thisp->trace_stream
!     << "0x" << hex << addr << dec;
  }
  
  int
  cgen_bi_endian_cpu::cgen_symbol_at_address(bfd_vma addr,
  					   struct disassemble_info * info)
  {
!   cerr << "cgen_bi_endian_cpu::symbol_at_address!?" << endl;
!   return 0;
  }
  
  
--- 233,265 ----
  {
    cgen_bi_endian_cpu *thisp = static_cast<cgen_bi_endian_cpu *>(info->application_data);
  
!   thisp->trace_stream << hex << addr << dec;
! 
!   if (cgen_symbol_at_address (addr, info))
!     if (! thisp->symbol_at_address.empty ())
!       thisp->trace_stream << " <" << thisp->symbol_at_address << '>';
  }
  
  int
  cgen_bi_endian_cpu::cgen_symbol_at_address(bfd_vma addr,
  					   struct disassemble_info * info)
  {
!   cgen_bi_endian_cpu *thisp = static_cast<cgen_bi_endian_cpu *>(info->application_data);
!   if (thisp->loader)
!     {
!       thisp->disassembly_symbol_address_pin.drive (addr);
!       thisp->symbol_at_address = thisp->loader->attribute_value("current-function");
!     }
!   else
!     thisp->symbol_at_address = "";
!     
!   if (thisp->symbol_at_address.empty ())
!     {
!       cerr << "cgen_bi_endian_cpu::symbol_at_address!?" << endl;
!       return 0; // failed
!     }
! 
!   return 1; // success
  }
  
  
Index: sid/main/dynamic/commonCfg.cxx
===================================================================
RCS file: /cvs/src/src/sid/main/dynamic/commonCfg.cxx,v
retrieving revision 1.13
diff -c -p -r1.13 commonCfg.cxx
*** sid/main/dynamic/commonCfg.cxx	14 Jun 2006 20:41:28 -0000	1.13
--- sid/main/dynamic/commonCfg.cxx	20 Jun 2006 18:25:18 -0000
*************** void BoardCfg::write_config (Writer &w)
*** 1256,1261 ****
--- 1256,1269 ----
  {
    AggregateCfg::write_config (w);
  
+   // Make the connection which allows the cpu to query the loader regarding
+   // addresses.
+   if (loader)
+     {
+       Relation (cpu, "loader", loader).write_to (w);
+       PinConnection (cpu, "disassembly-symbol-address", loader, "function?").write_to (w);
+     }
+ 
    if (gloss)
      {      
        if (gdb)
Index: sid/component/loader/compLoader.cxx
===================================================================
RCS file: /cvs/src/src/sid/component/loader/compLoader.cxx,v
retrieving revision 1.12
diff -c -p -r1.12 compLoader.cxx
*** sid/component/loader/compLoader.cxx	1 Mar 2006 21:07:01 -0000	1.12
--- sid/component/loader/compLoader.cxx	20 Jun 2006 18:25:18 -0000
*************** void
*** 420,426 ****
  elf_loader::check_function_pin_handler (host_int_4 addr)
  {
    // Find the function corresponding to the given address in the symbol
!   // table, if any, and set current_function to that name. If no function is
    // found, set current_function to a string representing the address.
    if (symbol_table)
      {
--- 420,426 ----
  elf_loader::check_function_pin_handler (host_int_4 addr)
  {
    // Find the function corresponding to the given address in the symbol
!   // table, if any, and set current_function to that name. If a function is
    // found, set current_function to a string representing the address.
    if (symbol_table)
      {

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]