fix crinfo swapping
authorIan Lance Taylor <ian@airs.com>
Thu, 11 Jan 1996 21:42:22 +0000 (21:42 +0000)
committerIan Lance Taylor <ian@airs.com>
Thu, 11 Jan 1996 21:42:22 +0000 (21:42 +0000)
bfd/elf32-mips.c

index a45ae13..c254ecf 100644 (file)
@@ -222,30 +222,20 @@ typedef struct
 
 typedef struct
 {
-  union {
-    struct {
-      unsigned long ctype : 1, /* 1: long 0: short format. See below.  */
-      rtype : 4,               /* Relocation types. See below. */
-      dist2to : 10,
-      relvaddr : 17;           /* (VADDR - vaddr of theprevious entry) >> 2 */
-    } b;
-    unsigned long l;
-  } info;
+  unsigned int ctype : 1;      /* 1: long 0: short format. See below.  */
+  unsigned int rtype : 4;      /* Relocation types. See below. */
+  unsigned int dist2to : 8;
+  unsigned int relvaddr : 19;  /* (VADDR - vaddr of the previous entry)/ 4 */
   unsigned long konst;         /* KONST field. See below.  */
   unsigned long vaddr;         /* VADDR to be relocated.  */
 } Elf32_crinfo;
 
 typedef struct
 {
-  union {
-    struct {
-      unsigned long ctype : 1, /* 1: long 0: short format. See below.  */
-      rtype : 4,               /* Relocation types. See below. */
-      dist2to : 10,
-      relvaddr : 17;           /* (VADDR - vaddr of the previous entry)/ 4 */
-    } b;
-    unsigned long l;
-  } info;
+  unsigned int ctype : 1;      /* 1: long 0: short format. See below.  */
+  unsigned int rtype : 4;      /* Relocation types. See below. */
+  unsigned int dist2to : 8;
+  unsigned int relvaddr : 19;  /* (VADDR - vaddr of the previous entry)/ 4 */
   unsigned long konst;         /* KONST field. See below.  */
 } Elf32_crinfo2;
 
@@ -262,6 +252,17 @@ typedef struct
   bfd_byte konst[4];
 } Elf32_External_crinfo2;
 
+/* These are the constants used to swap the bitfields in a crinfo.  */
+
+#define CRINFO_CTYPE (0x1)
+#define CRINFO_CTYPE_SH (31)
+#define CRINFO_RTYPE (0xf)
+#define CRINFO_RTYPE_SH (27)
+#define CRINFO_DIST2TO (0xff)
+#define CRINFO_DIST2TO_SH (19)
+#define CRINFO_RELVADDR (0x7ffff)
+#define CRINFO_RELVADDR_SH (0)
+
 /* A compact relocation info has long (3 words) or short (2 words)
    formats.  A short format doesn't have VADDR field and relvaddr
    fields contains ((VADDR - vaddr of the previous entry) >> 2).  */
@@ -283,12 +284,10 @@ typedef struct
 #define CRT_MIPS_GPHI_LO               0xc
 #define CRT_MIPS_JMPAD                 0xd
 
-#define mips_elf_set_cr_format(x,format)       ((x).info.b.ctype = (format))
-#define mips_elf_set_cr_type(x,type)           ((x).info.b.rtype = (type))
-#define mips_elf_set_cr_dist2to(x,v)           ((x).info.b.dist2to = (v))
-#define mips_elf_set_cr_relvaddr(x,d)          ((x).info.b.relvaddr = (d)<<2)
-
-
+#define mips_elf_set_cr_format(x,format)       ((x).ctype = (format))
+#define mips_elf_set_cr_type(x,type)           ((x).rtype = (type))
+#define mips_elf_set_cr_dist2to(x,v)           ((x).dist2to = (v))
+#define mips_elf_set_cr_relvaddr(x,d)          ((x).relvaddr = (d)<<2)
 
 #define USE_REL        1               /* MIPS uses REL relocations instead of RELA */
 
@@ -1345,7 +1344,13 @@ bfd_elf32_swap_crinfo_out (abfd, in, ex)
      Elf32_crinfo *in;
      Elf32_External_crinfo *ex;
 {
-  bfd_h_put_32 (abfd, (bfd_vma) in->info.l, ex->info);
+  unsigned long l;
+
+  l = (((in->ctype & CRINFO_CTYPE) << CRINFO_CTYPE_SH)
+       | ((in->rtype & CRINFO_RTYPE) << CRINFO_RTYPE_SH)
+       | ((in->dist2to & CRINFO_DIST2TO) << CRINFO_DIST2TO_SH)
+       | ((in->relvaddr & CRINFO_RELVADDR) << CRINFO_RELVADDR_SH));
+  bfd_h_put_32 (abfd, (bfd_vma) l, ex->info);
   bfd_h_put_32 (abfd, (bfd_vma) in->konst, ex->konst);
   bfd_h_put_32 (abfd, (bfd_vma) in->vaddr, ex->vaddr);
 }