mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2025-01-18 05:54:26 +08:00
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:
parent
47e8018d71
commit
5c32d34406
@ -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
|
||||
|
@ -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)
|
||||
|
Loading…
Reference in New Issue
Block a user