2010-11-17 Tristan Gingold <gingold@adacore.com>
authorTristan Gingold <gingold@adacore.com>
Wed, 17 Nov 2010 11:32:53 +0000 (11:32 +0000)
committerTristan Gingold <gingold@adacore.com>
Wed, 17 Nov 2010 11:32:53 +0000 (11:32 +0000)
* vms-lib.c (vms_write_index): Add comments.
Partially revert previous patch.  Free blocks later.

bfd/ChangeLog
bfd/vms-lib.c

index 979d1b6fd93fea1b862a570b1fdd93c75932c2c6..8839ea0f7f55ae6efae8b4545886bf3dceb35cae 100644 (file)
@@ -1,3 +1,8 @@
+2010-11-17  Tristan Gingold  <gingold@adacore.com>
+
+       * vms-lib.c (vms_write_index): Add comments.
+       Partially revert previous patch.  Free blocks later.
+
 2010-11-17  Nick Clifton  <nickc@redhat.com>
 
        PR ld/12161
index 6ab78eab6138bba5f1cda983b5b67f3d32509ec2..813ea39eddc22ed65ee9caff8de6c6a63e09fabf 100644 (file)
@@ -1551,6 +1551,7 @@ get_idxlen (struct lib_index *idx, bfd_boolean is_elfidx)
 
 /* Write the index.  VBN is the first vbn to be used, and will contain
    on return the last vbn.
+   Can be called with ABFD set to NULL just to size the index.
    Return TRUE on success.  */
 
 static bfd_boolean
@@ -1570,8 +1571,8 @@ vms_write_index (bfd *abfd,
   } blk[MAX_LEVEL];
 
   /* The kbn blocks are used to store long symbol names.  */
-  unsigned int kbn_sz = 0;      /* Number of bytes availble in the kbn block.  */
-  unsigned int kbn_vbn = 0;     /* VBN of the kbn block.  */
+  unsigned int kbn_sz = 0;   /* Number of bytes available in the kbn block.  */
+  unsigned int kbn_vbn = 0;  /* VBN of the kbn block.  */
   unsigned char *kbn_blk = NULL; /* Contents of the kbn block.  */
 
   if (nbr == 0)
@@ -1607,12 +1608,12 @@ vms_write_index (bfd *abfd,
 
       if (is_elfidx && idx->namlen >= MAX_KEYLEN)
         {
-          /* If the name is too long, write it in the kbn block.  */
+          /* If the key (ie name) is too long, write it in the kbn block.  */
           unsigned int kl = idx->namlen;
           unsigned int kl_chunk;
           const char *key = idx->name;
 
-          /* Write the name in the kbn, chunk after chunk.  */
+          /* Write the key in the kbn, chunk after chunk.  */
           do
             {
               if (kbn_sz < sizeof (struct vms_kbn))
@@ -1807,23 +1808,23 @@ vms_write_index (bfd *abfd,
     return TRUE;
 
   /* Flush.  */
-  for (j = level - 1; j >= 0; j--)
+  for (j = 1; j < level; j++)
     {
-      if (j > 0)
-        {
-          /* Update parent block: write the new entry.  */
-          unsigned char *en;
-          unsigned char *par;
-          struct vms_rfa *rfa;
-
-          en = rblk[j - 1]->keys + blk[j - 1].len;
-          par = rblk[j]->keys + blk[j].len;
-          memcpy (par, en, blk[j - 1].lastlen);
-          rfa = (struct vms_rfa *)par;
-          bfd_putl32 (blk[j - 1].vbn, rfa->vbn);
-          bfd_putl16 (RFADEF__C_INDEX, rfa->offset);
-        }
+      /* Update parent block: write the new entry.  */
+      unsigned char *en;
+      unsigned char *par;
+      struct vms_rfa *rfa;
+
+      en = rblk[j - 1]->keys + blk[j - 1].len;
+      par = rblk[j]->keys + blk[j].len;
+      memcpy (par, en, blk[j - 1].lastlen);
+      rfa = (struct vms_rfa *)par;
+      bfd_putl32 (blk[j - 1].vbn, rfa->vbn);
+      bfd_putl16 (RFADEF__C_INDEX, rfa->offset);
+    }
 
+  for (j = 0; j < level; j++)
+    {
       /* Write this block on the disk.  */
       bfd_putl16 (blk[j].len + blk[j].lastlen, rblk[j]->used);
       if (vms_write_block (abfd, blk[j].vbn, rblk[j]) != TRUE)
@@ -1832,6 +1833,7 @@ vms_write_index (bfd *abfd,
       free (rblk[j]);
     }
 
+  /* Write the last kbn (if any).  */
   if (kbn_vbn != 0)
     {
       if (vms_write_block (abfd, kbn_vbn, kbn_blk) != TRUE)