bug-binutils
[Top][All Lists]
Advanced

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

[Bug binutils/15369] New: Wrong endian is used in cgen-dis.c.


From: cole945 at gmail dot com
Subject: [Bug binutils/15369] New: Wrong endian is used in cgen-dis.c.
Date: Mon, 15 Apr 2013 06:49:36 +0000

http://sourceware.org/bugzilla/show_bug.cgi?id=15369

             Bug #: 15369
           Summary: Wrong endian is used in cgen-dis.c.
           Product: binutils
           Version: 2.24 (HEAD)
            Status: NEW
          Severity: normal
          Priority: P2
         Component: binutils
        AssignedTo: address@hidden
        ReportedBy: address@hidden
    Classification: Unclassified


Wrong endian is used in cgen-dis.c.

When manipulating instructions,
instruction endian (`cd->insn_endian') should be used, instead of default
endian.

I think hash_insn_list() and hash_insn_array() use the wrong endian in
cgen-dis.c
for building hash table.

  int big_p = CGEN_CPU_ENDIAN (cd) == CGEN_ENDIAN_BIG;
              ***************

Instruction endian should be used intead, just like cgen_get_insn_value() and
cgen_put_insn_value()
in cgen-opc.c.

  int big_p = (cd->insn_endian == CGEN_ENDIAN_BIG);
               ***************

Otherwise, it fails to look-up an instruction in hash-table
if instruction endian differs from data endian.

  value = CGEN_INSN_BASE_VALUE (insn);
  bfd_put_bits ((bfd_vma) value,
                buf,
                CGEN_INSN_MASK_BITSIZE (insn),
                big_p);

The value put in `buf' will be in reverse order.
Put in other words, the byte order in `buf' passed from cgen_get_insn_value()
and hash_insn_list/array() to `cd->dis_hash' are inconsistent.

We, on behalf of Andes Technology, are planing to contribute binutils
along with gcc and gdb around July.  In our ISA, instruction endian is always
big-endian,
but data endian may be little or small. Without this fix, our disassembler
cannot work properly.

---- >8 ---- >8 ---- >8 ---- >8 ---- >8 ---- >8 ---- >8 ----
diff --git a/opcodes/cgen-dis.c b/opcodes/cgen-dis.c
--- a/opcodes/cgen-dis.c
+++ b/opcodes/cgen-dis.c
@@ -104,7 +104,7 @@ hash_insn_array (CGEN_CPU_DESC cd,
                 CGEN_INSN_LIST ** htable,
                 CGEN_INSN_LIST * hentbuf)
 {
-  int big_p = CGEN_CPU_ENDIAN (cd) == CGEN_ENDIAN_BIG;
+  int big_p = (cd->insn_endian == CGEN_ENDIAN_BIG);
   int i;

   for (i = count - 1; i >= 0; --i, ++hentbuf)
@@ -142,7 +142,7 @@ hash_insn_list (CGEN_CPU_DESC cd,
                CGEN_INSN_LIST **htable,
                CGEN_INSN_LIST *hentbuf)
 {
-  int big_p = CGEN_CPU_ENDIAN (cd) == CGEN_ENDIAN_BIG;
+  int big_p = (cd->insn_endian == CGEN_ENDIAN_BIG);
   const CGEN_INSN_LIST *ilist;

   for (ilist = insns; ilist != NULL; ilist = ilist->next, ++ hentbuf)
---- 8< ---- 8< ---- 8< ---- 8< ---- 8< ---- 8< ---- 8< ----

Any suggestion?


Wei-cheng Wang

-- 
Configure bugmail: http://sourceware.org/bugzilla/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are on the CC list for the bug.



reply via email to

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