2010-11-17 Tristan Gingold <gingold@adacore.com>

* vms-lib.c (vms_write_index): Add comments.
	Partially revert previous patch.  Free blocks later.
This commit is contained in:
Tristan Gingold 2010-11-17 11:32:53 +00:00
parent 47e8018d71
commit 5c32d34406
2 changed files with 25 additions and 18 deletions

View 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

View 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;
/* 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);
}
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)