2010-05-24 Tristan Gingold <gingold@adacore.com>
authorTristan Gingold <gingold@adacore.com>
Mon, 24 May 2010 10:41:52 +0000 (10:41 +0000)
committerTristan Gingold <gingold@adacore.com>
Mon, 24 May 2010 10:41:52 +0000 (10:41 +0000)
* vms-alpha.c (struct vms_private_data_struct): Add section_max
field.
(_bfd_vms_slurp_egsd): Put PSC into the sections array.
(vms_new_section_hook): Do not put section in the sections
array.

bfd/ChangeLog
bfd/vms-alpha.c

index b650c568c5bbaab04d8afe863ae0aaedfa6ed0dd..30078b4fb6ee6a874e255a53512f6e3aab3dcb07 100644 (file)
@@ -1,3 +1,11 @@
+2010-05-24  Tristan Gingold  <gingold@adacore.com>
+
+       * vms-alpha.c (struct vms_private_data_struct): Add section_max
+       field.
+       (_bfd_vms_slurp_egsd): Put PSC into the sections array.
+       (vms_new_section_hook): Do not put section in the sections
+       array.
+
 2010-05-24  Tristan Gingold  <gingold@adacore.com>
 
        * vms-alpha.c (_bfd_vms_slurp_egsd): Fix indentation.
index 5c519b096fff4e180ef352b1edaf49cbb5674f2a..b2f205e5c8fb0f38cf6d504b1153e5e4cf52991f 100644 (file)
@@ -271,8 +271,11 @@ struct vms_private_data_struct
 
   struct hdr_struct hdr_data;          /* data from HDR/EMH record  */
   struct eom_struct eom_data;          /* data from EOM/EEOM record  */
-  unsigned int section_count;          /* # of sections in following array  */
-  asection **sections;                 /* array of GSD/EGSD sections  */
+
+  /* Array of GSD sections to get the correspond BFD one.  */
+  unsigned int section_max;            /* Size of the sections array.  */
+  unsigned int section_count;          /* Number of GSD sections.  */
+  asection **sections;
 
   /* Array of raw symbols.  */
   struct vms_symbol_entry **syms;
@@ -1143,6 +1146,23 @@ _bfd_vms_slurp_egsd (bfd *abfd)
            section->vma = (bfd_vma)base_addr;
            base_addr += section->size;
            section->filepos = (unsigned int)-1;
+
+            /* Append it to the section array.  */
+            if (PRIV (section_count) >= PRIV (section_max))
+              {
+                if (PRIV (section_max) == 0)
+                  PRIV (section_max) = 16;
+                else
+                  PRIV (section_max) *= 2;
+                PRIV (sections) = bfd_realloc_or_free
+                  (PRIV (sections), PRIV (section_max) * sizeof (asection *));
+                if (PRIV (sections) == NULL)
+                  return FALSE;
+              }
+
+            PRIV (sections)[PRIV (section_count)] = section;
+            PRIV (section_count)++;
+
 #if VMS_DEBUG
            vms_debug (4, "EGSD P-section %d (%s, flags %04x) ",
                       section->index, name, old_flags);
@@ -8827,28 +8847,11 @@ vms_new_section_hook (bfd * abfd, asection *section)
 {
   bfd_size_type amt;
 
-  /* Count hasn't been incremented yet.  */
-  unsigned int section_count = abfd->section_count + 1;
-
-  vms_debug2 ((1, "vms_new_section_hook (%p, [%d]%s), count %d\n",
-               abfd, section->index, section->name, section_count));
+  vms_debug2 ((1, "vms_new_section_hook (%p, [%d]%s)\n",
+               abfd, section->index, section->name));
 
   bfd_set_section_alignment (abfd, section, 0);
 
-  if (section_count > PRIV (section_count))
-    {
-      amt = section_count;
-      amt *= sizeof (asection *);
-      PRIV (sections) = bfd_realloc_or_free (PRIV (sections), amt);
-      if (PRIV (sections) == NULL)
-       return FALSE;
-      PRIV (section_count) = section_count;
-    }
-
-  vms_debug2 ((6, "section_count: %d\n", PRIV (section_count)));
-
-  PRIV (sections)[section->index] = section;
-
   vms_debug2 ((7, "%d: %s\n", section->index, section->name));
 
   amt = sizeof (struct vms_section_data_struct);