bfd/
authorTristan Gingold <gingold@adacore.com>
Mon, 17 May 2010 08:07:46 +0000 (08:07 +0000)
committerTristan Gingold <gingold@adacore.com>
Mon, 17 May 2010 08:07:46 +0000 (08:07 +0000)
2010-05-17  Tristan Gingold  <gingold@adacore.com>

* vms-alpha.c: Include esgps.h and eidc.h.
(_bfd_vms_slurp_egsd): Ignore SPSC and IDC sub-records.
(evax_bfd_print_egsd_flags): New function, extracted from ...
(evax_bfd_print_egsd): ..., calls evax_bfd_print_egsd_flags.  Handles
EGSD__C_SPSC and EGSD__C_IDC.

include/vms:
2010-05-17  Tristan Gingold  <gingold@adacore.com>

* eidc.h: New file.
* esgps.h: New file.

bfd/ChangeLog
bfd/vms-alpha.c
include/vms/ChangeLog
include/vms/eidc.h [new file with mode: 0644]
include/vms/esgps.h [new file with mode: 0644]

index 02f9c05..adec88e 100644 (file)
@@ -1,3 +1,11 @@
+2010-05-17  Tristan Gingold  <gingold@adacore.com>
+
+       * vms-alpha.c: Include esgps.h and eidc.h.
+       (_bfd_vms_slurp_egsd): Ignore SPSC and IDC sub-records.
+       (evax_bfd_print_egsd_flags): New function, extracted from evax_bfd_print_egsd.
+       (evax_bfd_print_egsd): Calls evax_bfd_print_egsd_flags.  Handles
+       EGSD__C_SPSC and EGSD__C_IDC.
+
 2010-05-14  Tristan Gingold  <gingold@adacore.com>
 
        * vms-alpha.c (alpha_vms_object_p): Accept header size of 0.
index c4e4c9c..cf4cc06 100644 (file)
@@ -51,6 +51,7 @@
 #include "vms/eobjrec.h"
 #include "vms/egsd.h"
 #include "vms/egps.h"
+#include "vms/esgps.h"
 #include "vms/eeom.h"
 #include "vms/emh.h"
 #include "vms/eiaf.h"
@@ -63,6 +64,7 @@
 #include "vms/esdfv.h"
 #include "vms/esrf.h"
 #include "vms/egst.h"
+#include "vms/eidc.h"
 #include "vms/dsc.h"
 #include "vms/prt.h"
 #include "vms/internal.h"
@@ -1240,7 +1242,10 @@ _bfd_vms_slurp_egsd (bfd * abfd)
           }
          break;
 
-       case EGSD__C_IDC:
+        case EGSD__C_SPSC:
+        case EGSD__C_IDC:
+          /* Currently ignored.  */
+          break;
        case EGSD__C_SYMM:
        case EGSD__C_SYMV:
        default:
@@ -5629,6 +5634,37 @@ exav_bfd_print_egsy_flags (unsigned int flags, FILE *file)
 }
 
 static void
+evax_bfd_print_egsd_flags (FILE *file, unsigned int flags)
+{
+  if (flags & EGPS__V_PIC)
+    fputs (_(" PIC"), file);
+  if (flags & EGPS__V_LIB)
+    fputs (_(" LIB"), file);
+  if (flags & EGPS__V_OVR)
+    fputs (_(" OVR"), file);
+  if (flags & EGPS__V_REL)
+    fputs (_(" REL"), file);
+  if (flags & EGPS__V_GBL)
+    fputs (_(" GBL"), file);
+  if (flags & EGPS__V_SHR)
+    fputs (_(" SHR"), file);
+  if (flags & EGPS__V_EXE)
+    fputs (_(" EXE"), file);
+  if (flags & EGPS__V_RD)
+    fputs (_(" RD"), file);
+  if (flags & EGPS__V_WRT)
+    fputs (_(" WRT"), file);
+  if (flags & EGPS__V_VEC)
+    fputs (_(" VEC"), file);
+  if (flags & EGPS__V_NOMOD)
+    fputs (_(" NOMOD"), file);
+  if (flags & EGPS__V_COM)
+    fputs (_(" COM"), file);
+  if (flags & EGPS__V_ALLOC_64BIT)
+    fputs (_(" 64B"), file);
+}
+
+static void
 evax_bfd_print_egsd (FILE *file, unsigned char *rec, unsigned int rec_len)
 {
   unsigned int off = sizeof (struct vms_egsd);
@@ -5661,32 +5697,7 @@ evax_bfd_print_egsd (FILE *file, unsigned char *rec, unsigned int rec_len)
             fprintf (file, _("PSC - Program section definition\n"));
             fprintf (file, _("   alignment  : 2**%u\n"), egps->align);
             fprintf (file, _("   flags      : 0x%04x"), flags);
-            if (flags & EGPS__V_PIC)
-              fputs (_(" PIC"), file);
-            if (flags & EGPS__V_LIB)
-              fputs (_(" LIB"), file);
-            if (flags & EGPS__V_OVR)
-              fputs (_(" OVR"), file);
-            if (flags & EGPS__V_REL)
-              fputs (_(" REL"), file);
-            if (flags & EGPS__V_GBL)
-              fputs (_(" GBL"), file);
-            if (flags & EGPS__V_SHR)
-              fputs (_(" SHR"), file);
-            if (flags & EGPS__V_EXE)
-              fputs (_(" EXE"), file);
-            if (flags & EGPS__V_RD)
-              fputs (_(" RD"), file);
-            if (flags & EGPS__V_WRT)
-              fputs (_(" WRT"), file);
-            if (flags & EGPS__V_VEC)
-              fputs (_(" VEC"), file);
-            if (flags & EGPS__V_NOMOD)
-              fputs (_(" NOMOD"), file);
-            if (flags & EGPS__V_COM)
-              fputs (_(" COM"), file);
-            if (flags & EGPS__V_ALLOC_64BIT)
-              fputs (_(" 64B"), file);
+            evax_bfd_print_egsd_flags (file, flags);
             fputc ('\n', file);
             l = bfd_getl32 (egps->alloc);
             fprintf (file, _("   alloc (len): %u (0x%08x)\n"), l, l);
@@ -5694,6 +5705,27 @@ evax_bfd_print_egsd (FILE *file, unsigned char *rec, unsigned int rec_len)
                      egps->namlng, egps->name);
           }
           break;
+        case EGSD__C_SPSC:
+          {
+            struct vms_esgps *esgps = (struct vms_esgps *)e;
+            unsigned int flags = bfd_getl16 (esgps->flags);
+            unsigned int l;
+
+            fprintf (file, _("SPSC - Shared Image Program section def\n"));
+            fprintf (file, _("   alignment  : 2**%u\n"), esgps->align);
+            fprintf (file, _("   flags      : 0x%04x"), flags);
+            evax_bfd_print_egsd_flags (file, flags);
+            fputc ('\n', file);
+            l = bfd_getl32 (esgps->alloc);
+            fprintf (file, _("   alloc (len)   : %u (0x%08x)\n"), l, l);
+            fprintf (file, _("   image offset  : 0x%08x\n"),
+                     (unsigned int)bfd_getl32 (esgps->base));
+            fprintf (file, _("   symvec offset : 0x%08x\n"),
+                     (unsigned int)bfd_getl32 (esgps->value));
+            fprintf (file, _("   name          : %.*s\n"),
+                     esgps->namlng, esgps->name);
+          }
+          break;
         case EGSD__C_SYM:
           {
             struct vms_egsy *egsy = (struct vms_egsy *)e;
@@ -5731,6 +5763,33 @@ evax_bfd_print_egsd (FILE *file, unsigned char *rec, unsigned int rec_len)
               }
           }
           break;
+        case EGSD__C_IDC:
+          {
+            struct vms_eidc *eidc = (struct vms_eidc *)e;
+            unsigned int flags = bfd_getl32 (eidc->flags);
+            unsigned char *p;
+
+            fprintf (file, _("IDC - Ident Consistency check\n"));
+            fprintf (file, _("   flags         : 0x%08x"), flags);
+            if (flags & EIDC__V_BINIDENT)
+              fputs (" BINDENT", file);
+            fputc ('\n', file);
+            fprintf (file, _("   id match      : %x\n"),
+                     (flags >> EIDC__V_IDMATCH_SH) & EIDC__V_IDMATCH_MASK);
+            fprintf (file, _("   error severity: %x\n"),
+                     (flags >> EIDC__V_ERRSEV_SH) & EIDC__V_ERRSEV_MASK);
+            p = eidc->name;
+            fprintf (file, _("   entity name   : %.*s\n"), p[0], p + 1);
+            p += 1 + p[0];
+            fprintf (file, _("   object name   : %.*s\n"), p[0], p + 1);
+            p += 1 + p[0];
+            if (flags & EIDC__V_BINIDENT)
+              fprintf (file, _("   binary ident  : 0x%08x\n"),
+                       (unsigned)bfd_getl32 (p + 1));
+            else
+              fprintf (file, _("   ascii ident   : %.*s\n"), p[0], p + 1);
+          }
+          break;
         case EGSD__C_SYMG:
           {
             struct vms_egst *egst = (struct vms_egst *)e;
index edd78fe..e8042bf 100644 (file)
@@ -1,3 +1,8 @@
+2010-05-17  Tristan Gingold  <gingold@adacore.com>
+
+       * eidc.h: New file.
+       * esgps.h: New file.
+
 2010-05-03  Tristan Gingold  <gingold@adacore.com>
 
        * dmt.h: Improve comments.
diff --git a/include/vms/eidc.h b/include/vms/eidc.h
new file mode 100644 (file)
index 0000000..987e8c2
--- /dev/null
@@ -0,0 +1,49 @@
+/* Alpha VMS external format of Ident Consistency check.
+
+   Copyright 2010 Free Software Foundation, Inc.
+   Written by Tristan Gingold <gingold@adacore.com>, AdaCore.
+
+   This file is part of BFD, the Binary File Descriptor library.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program 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 General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
+   MA 02110-1301, USA.  */
+
+#ifndef _VMS_EIDC_H
+#define _VMS_EIDC_H
+
+struct vms_eidc
+{
+  /* Record type.  */
+  unsigned char rectyp[2];
+
+  /* Record size.  */
+  unsigned char recsiz[2];
+
+  unsigned char flags[4];
+
+  /* Entity name (ASCIC).  */
+  /* Object name (ASCIC).  */
+  /* Ident string (ASCIC or binary BINIDENT set).  */
+  unsigned char name[1];
+};
+
+/* Fields of flags.  */
+#define EIDC__V_BINIDENT       (1 << 0)        /* Ident is a longword.  */
+#define EIDC__V_IDMATCH_SH     1               /* Ident match control.  */
+#define EIDC__V_IDMATCH_MASK   3
+#define EIDC__V_ERRSEV_SH      3               /* Error severity.  */
+#define EIDC__V_ERRSEV_MASK    7
+
+#endif /* _VMS_EIDC_H */
diff --git a/include/vms/esgps.h b/include/vms/esgps.h
new file mode 100644 (file)
index 0000000..e668a87
--- /dev/null
@@ -0,0 +1,72 @@
+/* Alpha VMS external format of Extended Shared Program Section Definition.
+
+   Copyright 2010 Free Software Foundation, Inc.
+   Written by Tristan Gingold <gingold@adacore.com>, AdaCore.
+
+   This file is part of BFD, the Binary File Descriptor library.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program 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 General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
+   MA 02110-1301, USA.  */
+
+#ifndef _VMS_ESGPS_H
+#define _VMS_ESGPS_H
+
+struct vms_esgps
+{
+  /* Entry type.  */
+  unsigned char gsdtyp[2];
+
+  /* Length of the entry.  */
+  unsigned char gsdsiz[2];
+
+  /* Psect alignment.  */
+  unsigned char align;
+
+  /* Pad for alignment.  */
+  unsigned char temp;
+
+  unsigned char flags[2];
+
+  /* Length of this contribution.  */
+  unsigned char alloc[4];
+
+  /* Image offset of the psect.  */
+  unsigned char base[4];
+
+  /* Symbol vector offset.  */
+  unsigned char value[8];
+
+  /* Name.  */
+  unsigned char namlng;
+  unsigned char name[31];
+};
+
+/* These are the same as EGPS flags.  */
+
+#define ESGPS__V_PIC (1 << 0)  /* Not meaningful.  */
+#define ESGPS__V_LIB (1 << 1)  /* Defined in a shareable image.  */
+#define ESGPS__V_OVR (1 << 2)  /* Overlaid contribution.  */
+#define ESGPS__V_REL (1 << 3)  /* Relocatable.  */
+#define ESGPS__V_GBL (1 << 4)  /* Global.  */
+#define ESGPS__V_SHR (1 << 5)  /* Shareable.  */
+#define ESGPS__V_EXE (1 << 6)  /* Executable.  */
+#define ESGPS__V_RD  (1 << 7)  /* Readable.  */
+#define ESGPS__V_WRT (1 << 8)  /* Writable.  */
+#define ESGPS__V_VEC (1 << 9)  /* Change mode dispatch or message vectors.  */
+#define ESGPS__V_NOMOD (1 << 10)       /* Demand-zero.  */
+#define ESGPS__V_COM (1 << 11) /* Conditional storage.  */
+#define ESGPS__V_ALLOC_64BIT (1 << 12) /* Allocated in 64-bit space.  */
+
+#endif /* _VMS_ESGPS_H */