diff options
author | Tristan Gingold <gingold@adacore.com> | 2010-11-17 11:32:53 +0000 |
---|---|---|
committer | Tristan Gingold <gingold@adacore.com> | 2010-11-17 11:32:53 +0000 |
commit | 5c32d34406d29ca618c0d72ff509efaee8b7fb39 (patch) | |
tree | bb285e9b3c166ad6e386cff1c7058b78ff9e1872 /bfd/vms-lib.c | |
parent | 47e8018d71f9ebc3c2e40af48ace59ac23d7d6db (diff) | |
download | gdb-5c32d34406d29ca618c0d72ff509efaee8b7fb39.zip gdb-5c32d34406d29ca618c0d72ff509efaee8b7fb39.tar.gz gdb-5c32d34406d29ca618c0d72ff509efaee8b7fb39.tar.bz2 |
2010-11-17 Tristan Gingold <gingold@adacore.com>
* vms-lib.c (vms_write_index): Add comments.
Partially revert previous patch. Free blocks later.
Diffstat (limited to 'bfd/vms-lib.c')
-rw-r--r-- | bfd/vms-lib.c | 40 |
1 files changed, 21 insertions, 19 deletions
diff --git a/bfd/vms-lib.c b/bfd/vms-lib.c index 6ab78ea..813ea39 100644 --- a/bfd/vms-lib.c +++ b/bfd/vms-lib.c @@ -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) |