avr-gcc-list
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[avr-gcc-list] objdump patch


From: Svein E. Seldal
Subject: [avr-gcc-list] objdump patch
Date: Mon, 06 Sep 2004 16:39:27 +0200
User-agent: Mozilla Thunderbird 0.7.3 (X11/20040830)

Hello

I've grown too annoied by the fact that objdump (-d) does not print any symbol on code-space references. To be a good open-source programmer, I have prepared a patch for binutils to fix this. But before I even try to commit it into gnu binutils, I would like to get your feedback on this.

The snippet below shows the changes that I suggest. In short:

20c:       02 c0           rjmp    .+4             ; 0x212

becomes

20c:       02 c0           rjmp    0x212 <.do_copy_data_start>     ; .+4


Does this look nice? Its downside is that it kind of ruins the right-aliged row of ';' and makes the output more cluttered. But on the upside, it proves it faster and simpler to review code.

What I really want to discuss is if we do need the "; .+4" comment in the example above or not. I dont think I will ever need that information, but I'm humble if anyone else protests.


The patch is appended in this mail and can be applied with patch:

$ cd binutils-2.15
$ patch -p0 <avr-binutils-symbprint.diff

It patches cleanly angainst binutils HEAD, 2.15 and 2.14 (and maybe older).


Regards,
Svein Seldal


Example:


00000202 <__do_copy_data>:
     202:       11 e0           ldi     r17, 0x01       ; 1
     204:       a0 e0           ldi     r26, 0x00       ; 0
     206:       b1 e0           ldi     r27, 0x01       ; 1
     208:       e0 e2           ldi     r30, 0x20       ; 32
     20a:       f5 e3           ldi     r31, 0x35       ; 53
20c: 02 c0 rjmp 0x212 <.do_copy_data_start> ; .+4

0000020e <.do_copy_data_loop>:
     20e:       05 90           lpm     r0, Z+
     210:       0d 92           st      X+, r0

00000212 <.do_copy_data_start>:
     212:       ae 31           cpi     r26, 0x1E       ; 30
     214:       b1 07           cpc     r27, r17
216: d9 f7 brne 0x20e <.do_copy_data_loop> ; .-10

00000218 <__do_clear_bss>:
     218:       11 e0           ldi     r17, 0x01       ; 1
     21a:       ae e1           ldi     r26, 0x1E       ; 30
     21c:       b1 e0           ldi     r27, 0x01       ; 1
21e: 01 c0 rjmp 0x222 <.do_clear_bss_start> ; .+2

00000220 <.do_clear_bss_loop>:
     220:       1d 92           st      X+, r1

00000222 <.do_clear_bss_start>:
     222:       aa 3f           cpi     r26, 0xFA       ; 250
     224:       b1 07           cpc     r27, r17
226: e1 f7 brne 0x220 <.do_clear_bss_loop> ; .-8
? avr-binutils-symprint.diff
? build.avr
? build.native
? gas/doc/as.info
Index: opcodes/avr-dis.c
===================================================================
RCS file: /cvs/src/src/opcodes/avr-dis.c,v
retrieving revision 1.10
diff -c -3 -p -r1.10 avr-dis.c
*** opcodes/avr-dis.c   18 Nov 2002 16:54:08 -0000      1.10
--- opcodes/avr-dis.c   6 Sep 2004 14:31:07 -0000
*************** const struct avr_opcodes_s avr_opcodes[]
*** 43,52 ****
  };
  
  static int avr_operand PARAMS ((unsigned int, unsigned int,
!                               unsigned int, int, char *, char *, int));
  
  static int
! avr_operand (insn, insn2, pc, constraint, buf, comment, regs)
       unsigned int insn;
       unsigned int insn2;
       unsigned int pc;
--- 43,52 ----
  };
  
  static int avr_operand PARAMS ((unsigned int, unsigned int,
!                               unsigned int, int, char *, char *, int, int *, 
bfd_vma *));
  
  static int
! avr_operand (insn, insn2, pc, constraint, buf, comment, regs, sym, sym_addr)
       unsigned int insn;
       unsigned int insn2;
       unsigned int pc;
*************** avr_operand (insn, insn2, pc, constraint
*** 54,61 ****
--- 54,64 ----
       char *buf;
       char *comment;
       int regs;
+      int *sym;
+      bfd_vma *sym_addr;
  {
    int ok = 1;
+   *sym = 0;
  
    switch (constraint)
      {
*************** avr_operand (insn, insn2, pc, constraint
*** 145,167 ****
        break;
        
      case 'h':
!       sprintf (buf, "0x%x",
!              ((((insn & 1) | ((insn & 0x1f0) >> 3)) << 16) | insn2) * 2);
        break;
        
      case 'L':
        {
        int rel_addr = (((insn & 0xfff) ^ 0x800) - 0x800) * 2;
!       sprintf (buf, ".%+-8d", rel_addr);
!       sprintf (comment, "0x%x", pc + 2 + rel_addr);
        }
        break;
  
      case 'l':
        {
        int rel_addr = ((((insn >> 3) & 0x7f) ^ 0x40) - 0x40) * 2;
!       sprintf (buf, ".%+-8d", rel_addr);
!       sprintf (comment, "0x%x", pc + 2 + rel_addr);
        }
        break;
  
--- 148,175 ----
        break;
        
      case 'h':
!       *sym = 1;
!       *sym_addr = ((((insn & 1) | ((insn & 0x1f0) >> 3)) << 16) | insn2) * 2;
!       sprintf (buf, "0x");
        break;
        
      case 'L':
        {
        int rel_addr = (((insn & 0xfff) ^ 0x800) - 0x800) * 2;
!       sprintf (comment, ".%+-8d", rel_addr);
!         *sym = 1;
!         *sym_addr = pc + 2 + rel_addr;
!       sprintf (buf, "0x");
        }
        break;
  
      case 'l':
        {
        int rel_addr = ((((insn >> 3) & 0x7f) ^ 0x40) - 0x40) * 2;
!       sprintf (comment, ".%+-8d", rel_addr);
!         *sym = 1;
!         *sym_addr = pc + 2 + rel_addr;
!       sprintf (buf, "0x");
        }
        break;
  
*************** print_insn_avr(addr, info)
*** 265,270 ****
--- 273,280 ----
    int cmd_len = 2;
    int ok = 0;
    char op1[20], op2[20], comment1[40], comment2[40];
+   int sym_op1 = 0, sym_op2 = 0;
+   bfd_vma sym_addr1, sym_addr2;
  
    if (!initialized)
      {
*************** print_insn_avr(addr, info)
*** 336,346 ****
        {
          int regs = REGISTER_P (*op);
  
!         ok = avr_operand (insn, insn2, addr, *op, op1, comment1, 0);
  
          if (ok && *(++op) == ',')
            ok = avr_operand (insn, insn2, addr, *(++op), op2,
!                             *comment1 ? comment2 : comment1, regs);
        }
      }
  
--- 346,356 ----
        {
          int regs = REGISTER_P (*op);
  
!         ok = avr_operand (insn, insn2, addr, *op, op1, comment1, 0, &sym_op1, 
&sym_addr1);
  
          if (ok && *(++op) == ',')
            ok = avr_operand (insn, insn2, addr, *(++op), op2,
!                             *comment1 ? comment2 : comment1, regs, &sym_op2, 
&sym_addr2);
        }
      }
  
*************** print_insn_avr(addr, info)
*** 356,366 ****
    (*prin) (stream, "%s", ok ? opcode->name : ".word");
  
    if (*op1)
!     (*prin) (stream, "\t%s", op1);
  
    if (*op2)
      (*prin) (stream, ", %s", op2);
  
    if (*comment1)
      (*prin) (stream, "\t; %s", comment1);
  
--- 366,382 ----
    (*prin) (stream, "%s", ok ? opcode->name : ".word");
  
    if (*op1)
!       (*prin) (stream, "\t%s", op1);
! 
!   if (sym_op1)
!     info->print_address_func(sym_addr1, info);
  
    if (*op2)
      (*prin) (stream, ", %s", op2);
  
+   if (sym_op2)
+     info->print_address_func(sym_addr2, info);
+ 
    if (*comment1)
      (*prin) (stream, "\t; %s", comment1);
  

reply via email to

[Prev in Thread] Current Thread [Next in Thread]