Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(6)

Side by Side Diff: bfd/vms-lib.c

Issue 11969036: Merge GDB 7.5.1 (Closed) Base URL: http://git.chromium.org/native_client/nacl-gdb.git@master
Patch Set: Created 7 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « bfd/version.h ('k') | bfd/xsym.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* BFD back-end for VMS archive files. 1 /* BFD back-end for VMS archive files.
2 2
3 Copyright 2010, 2011 Free Software Foundation, Inc. 3 Copyright 2010, 2011 Free Software Foundation, Inc.
4 Written by Tristan Gingold <gingold@adacore.com>, AdaCore. 4 Written by Tristan Gingold <gingold@adacore.com>, AdaCore.
5 5
6 This file is part of BFD, the Binary File Descriptor library. 6 This file is part of BFD, the Binary File Descriptor library.
7 7
8 This program is free software; you can redistribute it and/or modify 8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by 9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 3 of the License, or 10 the Free Software Foundation; either version 3 of the License, or
(...skipping 17 matching lines...) Expand all
28 #include "vms.h" 28 #include "vms.h"
29 #include "vms/lbr.h" 29 #include "vms/lbr.h"
30 #include "vms/dcx.h" 30 #include "vms/dcx.h"
31 31
32 /* The standard VMS disk block size. */ 32 /* The standard VMS disk block size. */
33 #ifndef VMS_BLOCK_SIZE 33 #ifndef VMS_BLOCK_SIZE
34 #define VMS_BLOCK_SIZE 512 34 #define VMS_BLOCK_SIZE 512
35 #endif 35 #endif
36 36
37 /* Maximum key length (which is also the maximum symbol length in archive). */ 37 /* Maximum key length (which is also the maximum symbol length in archive). */
38 #define MAX_KEYLEN 129 38 #define MAX_KEYLEN 128
39 #define MAX_EKEYLEN 1024
39 40
40 /* DCX Submaps. */ 41 /* DCX Submaps. */
41 42
42 struct dcxsbm_desc 43 struct dcxsbm_desc
43 { 44 {
44 unsigned char min_char; 45 unsigned char min_char;
45 unsigned char max_char; 46 unsigned char max_char;
46 unsigned char *flags; 47 unsigned char *flags;
47 unsigned char *nodes; 48 unsigned char *nodes;
48 unsigned short *next; 49 unsigned short *next;
(...skipping 221 matching lines...) Expand 10 before | Expand all | Expand 10 after
270 flags = ridx->flags; 271 flags = ridx->flags;
271 keyname = ridx->keyname; 272 keyname = ridx->keyname;
272 } 273 }
273 else 274 else
274 return FALSE; 275 return FALSE;
275 276
276 /* Illegal value. */ 277 /* Illegal value. */
277 if (idx_vbn == 0) 278 if (idx_vbn == 0)
278 return FALSE; 279 return FALSE;
279 280
281 /* Point to the next index entry. */
282 p = keyname + keylen;
283
280 if (idx_off == RFADEF__C_INDEX) 284 if (idx_off == RFADEF__C_INDEX)
281 { 285 {
282 /* Indirect entry. Recurse. */ 286 /* Indirect entry. Recurse. */
283 if (!vms_traverse_index (abfd, idx_vbn, cs)) 287 if (!vms_traverse_index (abfd, idx_vbn, cs))
284 return FALSE; 288 return FALSE;
285 } 289 }
286 else 290 else
287 { 291 {
288 /* Add a new entry. */ 292 /* Add a new entry. */
289 char *name; 293 char *name;
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
361 return FALSE; 365 return FALSE;
362 if (!vms_add_indexes_from_list (abfd, cs, name, &lhs.g_wk_rfa)) 366 if (!vms_add_indexes_from_list (abfd, cs, name, &lhs.g_wk_rfa))
363 return FALSE; 367 return FALSE;
364 } 368 }
365 else 369 else
366 { 370 {
367 if (!vms_add_index (cs, name, idx_vbn, idx_off)) 371 if (!vms_add_index (cs, name, idx_vbn, idx_off))
368 return FALSE; 372 return FALSE;
369 } 373 }
370 } 374 }
371
372 /* Point to the next index entry. */
373 p = keyname + keylen;
374 } 375 }
375 376
376 return TRUE; 377 return TRUE;
377 } 378 }
378 379
379 /* Read index #IDX, which must have NBREL entries. */ 380 /* Read index #IDX, which must have NBREL entries. */
380 381
381 static struct carsym * 382 static struct carsym *
382 vms_lib_read_index (bfd *abfd, int idx, unsigned int *nbrel) 383 vms_lib_read_index (bfd *abfd, int idx, unsigned int *nbrel)
383 { 384 {
(...skipping 904 matching lines...) Expand 10 before | Expand all | Expand 10 after
1288 } 1289 }
1289 1290
1290 /* Get member MODIDX. Return NULL in case of error. */ 1291 /* Get member MODIDX. Return NULL in case of error. */
1291 1292
1292 static bfd * 1293 static bfd *
1293 _bfd_vms_lib_get_module (bfd *abfd, unsigned int modidx) 1294 _bfd_vms_lib_get_module (bfd *abfd, unsigned int modidx)
1294 { 1295 {
1295 struct lib_tdata *tdata = bfd_libdata (abfd); 1296 struct lib_tdata *tdata = bfd_libdata (abfd);
1296 bfd *res; 1297 bfd *res;
1297 file_ptr file_off; 1298 file_ptr file_off;
1299 char *name;
1298 1300
1299 /* Sanity check. */ 1301 /* Sanity check. */
1300 if (modidx >= tdata->nbr_modules) 1302 if (modidx >= tdata->nbr_modules)
1301 return NULL; 1303 return NULL;
1302 1304
1303 /* Already loaded. */ 1305 /* Already loaded. */
1304 if (tdata->cache[modidx]) 1306 if (tdata->cache[modidx])
1305 return tdata->cache[modidx]; 1307 return tdata->cache[modidx];
1306 1308
1307 /* Build it. */ 1309 /* Build it. */
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
1349 res->mtime = vms_rawtime_to_time_t (mhd->datim); 1351 res->mtime = vms_rawtime_to_time_t (mhd->datim);
1350 res->mtime_set = TRUE; 1352 res->mtime_set = TRUE;
1351 1353
1352 arelt->parsed_size = bfd_getl32 (mhd->modsize); 1354 arelt->parsed_size = bfd_getl32 (mhd->modsize);
1353 1355
1354 /* No need for a special reader as members are stored linearly. 1356 /* No need for a special reader as members are stored linearly.
1355 Just skip the MHD. */ 1357 Just skip the MHD. */
1356 res->origin = file_off + tdata->mhd_size; 1358 res->origin = file_off + tdata->mhd_size;
1357 } 1359 }
1358 1360
1359 res->filename = tdata->modules[modidx].name; 1361 /* Set filename. */
1362 name = tdata->modules[modidx].name;
1363 switch (tdata->type)
1364 {
1365 case LBR__C_TYP_IOBJ:
1366 case LBR__C_TYP_EOBJ:
1367 /* For object archives, append .obj to mimic standard behaviour. */
1368 {
1369 » size_t namelen = strlen (name);
1370 » char *name1 = bfd_alloc (res, namelen + 4 + 1);
1371 » memcpy (name1, name, namelen);
1372 » strcpy (name1 + namelen, ".obj");
1373 » name = name1;
1374 }
1375 break;
1376 default:
1377 break;
1378 }
1379 res->filename = name;
1360 1380
1361 tdata->cache[modidx] = res; 1381 tdata->cache[modidx] = res;
1362 1382
1363 return res; 1383 return res;
1364 } 1384 }
1365 1385
1366 /* Standard function: get member at IDX. */ 1386 /* Standard function: get member at IDX. */
1367 1387
1368 bfd * 1388 bfd *
1369 _bfd_vms_lib_get_elt_at_index (bfd *abfd, symindex symidx) 1389 _bfd_vms_lib_get_elt_at_index (bfd *abfd, symindex symidx)
(...skipping 190 matching lines...) Expand 10 before | Expand all | Expand 10 after
1560 Can be called with ABFD set to NULL just to size the index. 1580 Can be called with ABFD set to NULL just to size the index.
1561 If not null, TOPVBN will be assigned to the vbn of the root index tree. 1581 If not null, TOPVBN will be assigned to the vbn of the root index tree.
1562 IS_ELFIDX is true for elfidx (ie ia64) indexes layout. 1582 IS_ELFIDX is true for elfidx (ie ia64) indexes layout.
1563 Return TRUE on success. */ 1583 Return TRUE on success. */
1564 1584
1565 static bfd_boolean 1585 static bfd_boolean
1566 vms_write_index (bfd *abfd, 1586 vms_write_index (bfd *abfd,
1567 struct lib_index *idx, unsigned int nbr, unsigned int *vbn, 1587 struct lib_index *idx, unsigned int nbr, unsigned int *vbn,
1568 unsigned int *topvbn, bfd_boolean is_elfidx) 1588 unsigned int *topvbn, bfd_boolean is_elfidx)
1569 { 1589 {
1590 /* The index is organized as a tree. This function implements a naive
1591 algorithm to balance the tree: it fills the leaves, and create a new
1592 branch when all upper leaves and branches are full. We only keep in
1593 memory a path to the current leaf. */
1570 unsigned int i; 1594 unsigned int i;
1571 int j; 1595 int j;
1572 int level; 1596 int level;
1597 /* Disk blocks for the current path. */
1573 struct vms_indexdef *rblk[MAX_LEVEL]; 1598 struct vms_indexdef *rblk[MAX_LEVEL];
1599 /* Info on the current blocks. */
1574 struct idxblk 1600 struct idxblk
1575 { 1601 {
1576 unsigned int vbn; 1602 unsigned int vbn;» » /* VBN of the block. */
1577 unsigned short len; 1603 /* The last entry is identified so that it could be copied to the
1578 unsigned short lastlen; 1604 parent block. */
1605 unsigned short len;»» /* Length up to the last entry. */
1606 unsigned short lastlen;» /* Length of the last entry. */
1579 } blk[MAX_LEVEL]; 1607 } blk[MAX_LEVEL];
1580 1608
1581 /* The kbn blocks are used to store long symbol names. */ 1609 /* The kbn blocks are used to store long symbol names. */
1582 unsigned int kbn_sz = 0; /* Number of bytes available in the kbn block. */ 1610 unsigned int kbn_sz = 0; /* Number of bytes available in the kbn block. */
1583 unsigned int kbn_vbn = 0; /* VBN of the kbn block. */ 1611 unsigned int kbn_vbn = 0; /* VBN of the kbn block. */
1584 unsigned char *kbn_blk = NULL; /* Contents of the kbn block. */ 1612 unsigned char *kbn_blk = NULL; /* Contents of the kbn block. */
1585 1613
1586 if (nbr == 0) 1614 if (nbr == 0)
1587 { 1615 {
1588 /* No entries. Very easy to handle. */ 1616 /* No entries. Very easy to handle. */
(...skipping 18 matching lines...) Expand all
1607 1635
1608 for (i = 0; i < nbr; i++, idx++) 1636 for (i = 0; i < nbr; i++, idx++)
1609 { 1637 {
1610 unsigned int idxlen; 1638 unsigned int idxlen;
1611 int flush = 0; 1639 int flush = 0;
1612 unsigned int key_vbn = 0; 1640 unsigned int key_vbn = 0;
1613 unsigned int key_off = 0; 1641 unsigned int key_off = 0;
1614 1642
1615 idxlen = get_idxlen (idx, is_elfidx); 1643 idxlen = get_idxlen (idx, is_elfidx);
1616 1644
1617 if (is_elfidx && idx->namlen >= MAX_KEYLEN) 1645 if (is_elfidx && idx->namlen > MAX_KEYLEN)
1618 { 1646 {
1619 /* If the key (ie name) is too long, write it in the kbn block. */ 1647 /* If the key (ie name) is too long, write it in the kbn block. */
1620 unsigned int kl = idx->namlen; 1648 unsigned int kl = idx->namlen;
1621 unsigned int kl_chunk; 1649 unsigned int kl_chunk;
1622 const char *key = idx->name; 1650 const char *key = idx->name;
1623 1651
1624 /* Write the key in the kbn, chunk after chunk. */ 1652 /* Write the key in the kbn, chunk after chunk. */
1625 do 1653 do
1626 { 1654 {
1627 if (kbn_sz < sizeof (struct vms_kbn)) 1655 if (kbn_sz < sizeof (struct vms_kbn))
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
1686 kl_chunk = (kl_chunk + 1) & ~1; /* Always align. */ 1714 kl_chunk = (kl_chunk + 1) & ~1; /* Always align. */
1687 kbn_sz -= kl_chunk + sizeof (struct vms_kbn); 1715 kbn_sz -= kl_chunk + sizeof (struct vms_kbn);
1688 } 1716 }
1689 while (kl > 0); 1717 while (kl > 0);
1690 } 1718 }
1691 1719
1692 /* Check if a block might overflow. In this case we will flush this 1720 /* Check if a block might overflow. In this case we will flush this
1693 block and all the blocks below it. */ 1721 block and all the blocks below it. */
1694 for (j = 0; j < level; j++) 1722 for (j = 0; j < level; j++)
1695 if (blk[j].len + blk[j].lastlen + idxlen > INDEXDEF__BLKSIZ) 1723 if (blk[j].len + blk[j].lastlen + idxlen > INDEXDEF__BLKSIZ)
1696 flush = j + 1; 1724 » flush = j + 1;
1697 1725
1698 for (j = 0; j < level; j++) 1726 for (j = 0; j < level; j++)
1699 { 1727 {
1700 if (j < flush) 1728 if (j < flush)
1701 { 1729 {
1702 /* There is not enough room to write the new entry in this 1730 /* There is not enough room to write the new entry in this
1703 block or in a parent block. */ 1731 block or in a parent block. */
1704 1732
1705 if (j + 1 == level) 1733 if (j + 1 == level)
1706 { 1734 {
1707 BFD_ASSERT (level < MAX_LEVEL); 1735 BFD_ASSERT (level < MAX_LEVEL);
1708 1736
1709 /* Need to create a parent. */ 1737 /* Need to create a parent. */
1710 if (abfd != NULL) 1738 if (abfd != NULL)
1711 { 1739 {
1712 rblk[level] = bfd_zmalloc (sizeof (struct vms_indexdef)); 1740 rblk[level] = bfd_zmalloc (sizeof (struct vms_indexdef));
1713 bfd_putl32 (*vbn, rblk[j]->parent); 1741 bfd_putl32 (*vbn, rblk[j]->parent);
1714 } 1742 }
1715 blk[level].vbn = (*vbn)++; 1743 blk[level].vbn = (*vbn)++;
1716 blk[level].len = 0; 1744 blk[level].len = 0;
1717 blk[level].lastlen = 0; 1745 blk[level].lastlen = blk[j].lastlen;
1718 1746
1719 level++; 1747 level++;
1720 } 1748 }
1721 1749
1722 /* Update parent block: write the new entry. */ 1750 /* Update parent block: write the last entry from the current
1751 » » block. */
1723 if (abfd != NULL) 1752 if (abfd != NULL)
1724 { 1753 {
1725 struct vms_rfa *rfa; 1754 struct vms_rfa *rfa;
1726 1755
1756 /* Pointer to the last entry in parent block. */
1757 rfa = (struct vms_rfa *)(rblk[j + 1]->keys + blk[j + 1].len);
1758
1727 /* Copy the whole entry. */ 1759 /* Copy the whole entry. */
1728 memcpy (rblk[j + 1]->keys + blk[j + 1].len, 1760 » » BFD_ASSERT (blk[j + 1].lastlen == blk[j].lastlen);
1729 rblk[j]->keys + blk[j].len, 1761 memcpy (rfa, rblk[j]->keys + blk[j].len, blk[j].lastlen);
1730 blk[j].lastlen);
1731 /* Fix the entry (which in always the first field of an 1762 /* Fix the entry (which in always the first field of an
1732 entry. */ 1763 entry. */
1733 rfa = (struct vms_rfa *)(rblk[j + 1]->keys + blk[j + 1].len);
1734 bfd_putl32 (blk[j].vbn, rfa->vbn); 1764 bfd_putl32 (blk[j].vbn, rfa->vbn);
1735 bfd_putl16 (RFADEF__C_INDEX, rfa->offset); 1765 bfd_putl16 (RFADEF__C_INDEX, rfa->offset);
1736 } 1766 }
1737 1767
1738 if (j + 1 == flush) 1768 if (j + 1 == flush)
1739 { 1769 {
1740 /* And allocate it. Do it only on the block that won't be 1770 /* And allocate it. Do it only on the block that won't be
1741 flushed (so that the parent of the parent can be 1771 flushed (so that the parent of the parent can be
1742 updated too). */ 1772 updated too). */
1743 blk[j + 1].len += blk[j].lastlen; 1773 blk[j + 1].len += blk[j + 1].lastlen;
1744 blk[j + 1].lastlen = 0; 1774 blk[j + 1].lastlen = 0;
1745 } 1775 }
1746 1776
1747 /* Write this block on the disk. */ 1777 /* Write this block on the disk. */
1748 if (abfd != NULL) 1778 if (abfd != NULL)
1749 { 1779 {
1750 bfd_putl16 (blk[j].len + blk[j].lastlen, rblk[j]->used); 1780 bfd_putl16 (blk[j].len + blk[j].lastlen, rblk[j]->used);
1751 if (vms_write_block (abfd, blk[j].vbn, rblk[j]) != TRUE) 1781 if (vms_write_block (abfd, blk[j].vbn, rblk[j]) != TRUE)
1752 return FALSE; 1782 return FALSE;
1753 } 1783 }
1754 1784
1755 /* Reset this block. */ 1785 /* Reset this block. */
1756 blk[j].len = 0; 1786 blk[j].len = 0;
1757 blk[j].lastlen = 0; 1787 blk[j].lastlen = 0;
1758 blk[j].vbn = (*vbn)++; 1788 blk[j].vbn = (*vbn)++;
1759 } 1789 }
1760 1790
1761 /* Append it to the block. */ 1791 /* Append it to the block. */
1762 if (j == 0) 1792 if (j == 0)
1763 { 1793 {
1794 /* Keep the previous last entry. */
1764 blk[j].len += blk[j].lastlen; 1795 blk[j].len += blk[j].lastlen;
1765 1796
1766 if (abfd != NULL) 1797 if (abfd != NULL)
1767 { 1798 {
1768 struct vms_rfa *rfa; 1799 struct vms_rfa *rfa;
1769 1800
1770 rfa = (struct vms_rfa *)(rblk[j]->keys + blk[j].len); 1801 rfa = (struct vms_rfa *)(rblk[j]->keys + blk[j].len);
1771 bfd_putl32 ((idx->abfd->proxy_origin / VMS_BLOCK_SIZE) + 1, 1802 bfd_putl32 ((idx->abfd->proxy_origin / VMS_BLOCK_SIZE) + 1,
1772 rfa->vbn); 1803 rfa->vbn);
1773 bfd_putl16 1804 bfd_putl16
(...skipping 24 matching lines...) Expand all
1798 } 1829 }
1799 } 1830 }
1800 else 1831 else
1801 { 1832 {
1802 /* Use idx format. */ 1833 /* Use idx format. */
1803 struct vms_idx *en = (struct vms_idx *)rfa; 1834 struct vms_idx *en = (struct vms_idx *)rfa;
1804 en->keylen = idx->namlen; 1835 en->keylen = idx->namlen;
1805 memcpy (en->keyname, idx->name, idx->namlen); 1836 memcpy (en->keyname, idx->name, idx->namlen);
1806 } 1837 }
1807 } 1838 }
1808 } 1839 » }
1809 1840 » /* The last added key can now be the last one all blocks in the
1810 blk[j].lastlen = idxlen; 1841 » path. */
1842 » blk[j].lastlen = idxlen;
1811 } 1843 }
1812 } 1844 }
1813 1845
1846 /* Save VBN of the root. */
1814 if (topvbn != NULL) 1847 if (topvbn != NULL)
1815 *topvbn = blk[level - 1].vbn; 1848 *topvbn = blk[level - 1].vbn;
1816 1849
1817 if (abfd == NULL) 1850 if (abfd == NULL)
1818 return TRUE; 1851 return TRUE;
1819 1852
1820 /* Flush. */ 1853 /* Flush. */
1821 for (j = 1; j < level; j++) 1854 for (j = 1; j < level; j++)
1822 { 1855 {
1823 /* Update parent block: write the new entry. */ 1856 /* Update parent block: write the new entry. */
1824 unsigned char *en; 1857 unsigned char *en;
1825 unsigned char *par; 1858 unsigned char *par;
1826 struct vms_rfa *rfa; 1859 struct vms_rfa *rfa;
1827 1860
1828 en = rblk[j - 1]->keys + blk[j - 1].len; 1861 en = rblk[j - 1]->keys + blk[j - 1].len;
1829 par = rblk[j]->keys + blk[j].len; 1862 par = rblk[j]->keys + blk[j].len;
1863 BFD_ASSERT (blk[j].lastlen == blk[j - 1].lastlen);
1830 memcpy (par, en, blk[j - 1].lastlen); 1864 memcpy (par, en, blk[j - 1].lastlen);
1831 rfa = (struct vms_rfa *)par; 1865 rfa = (struct vms_rfa *)par;
1832 bfd_putl32 (blk[j - 1].vbn, rfa->vbn); 1866 bfd_putl32 (blk[j - 1].vbn, rfa->vbn);
1833 bfd_putl16 (RFADEF__C_INDEX, rfa->offset); 1867 bfd_putl16 (RFADEF__C_INDEX, rfa->offset);
1834 } 1868 }
1835 1869
1836 for (j = 0; j < level; j++) 1870 for (j = 0; j < level; j++)
1837 { 1871 {
1838 /* Write this block on the disk. */ 1872 /* Write this block on the disk. */
1839 bfd_putl16 (blk[j].len + blk[j].lastlen, rblk[j]->used); 1873 bfd_putl16 (blk[j].len + blk[j].lastlen, rblk[j]->used);
1840 if (vms_write_block (abfd, blk[j].vbn, rblk[j]) != TRUE) 1874 if (vms_write_block (abfd, blk[j].vbn, rblk[j]) != TRUE)
1841 return FALSE; 1875 return FALSE;
1842 1876
1843 free (rblk[j]); 1877 free (rblk[j]);
1844 } 1878 }
1845 1879
1846 /* Write the last kbn (if any). */ 1880 /* Write the last kbn (if any). */
1847 if (kbn_vbn != 0) 1881 if (kbn_vbn != 0)
1848 { 1882 {
1849 if (vms_write_block (abfd, kbn_vbn, kbn_blk) != TRUE) 1883 if (vms_write_block (abfd, kbn_vbn, kbn_blk) != TRUE)
1850 return FALSE; 1884 return FALSE;
1885 free (kbn_blk);
1851 } 1886 }
1852 1887
1853 return TRUE; 1888 return TRUE;
1854 } 1889 }
1855 1890
1856 /* Append data to the data block DATA. Force write if PAD is true. */ 1891 /* Append data to the data block DATA. Force write if PAD is true. */
1857 1892
1858 static bfd_boolean 1893 static bfd_boolean
1859 vms_write_data_block (bfd *arch, struct vms_datadef *data, file_ptr *off, 1894 vms_write_data_block (bfd *arch, struct vms_datadef *data, file_ptr *off,
1860 const unsigned char *buf, unsigned int len, int pad) 1895 const unsigned char *buf, unsigned int len, int pad)
(...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after
1999 struct lib_index *symbols; 2034 struct lib_index *symbols;
2000 struct lib_tdata *tdata = bfd_libdata (arch); 2035 struct lib_tdata *tdata = bfd_libdata (arch);
2001 unsigned int i; 2036 unsigned int i;
2002 file_ptr off; 2037 file_ptr off;
2003 unsigned int nbr_mod_iblk; 2038 unsigned int nbr_mod_iblk;
2004 unsigned int nbr_sym_iblk; 2039 unsigned int nbr_sym_iblk;
2005 unsigned int vbn; 2040 unsigned int vbn;
2006 unsigned int mod_idx_vbn; 2041 unsigned int mod_idx_vbn;
2007 unsigned int sym_idx_vbn; 2042 unsigned int sym_idx_vbn;
2008 bfd_boolean is_elfidx = tdata->kind == vms_lib_ia64; 2043 bfd_boolean is_elfidx = tdata->kind == vms_lib_ia64;
2044 unsigned int max_keylen = is_elfidx ? MAX_EKEYLEN : MAX_KEYLEN;
2009 2045
2010 /* Count the number of modules (and do a first sanity check). */ 2046 /* Count the number of modules (and do a first sanity check). */
2011 nbr_modules = 0; 2047 nbr_modules = 0;
2012 for (current = arch->archive_head; 2048 for (current = arch->archive_head;
2013 current != NULL; 2049 current != NULL;
2014 current = current->archive_next) 2050 current = current->archive_next)
2015 { 2051 {
2016 /* This check is checking the bfds for the objects we're reading 2052 /* This check is checking the bfds for the objects we're reading
2017 from (which are usually either an object file or archive on 2053 from (which are usually either an object file or archive on
2018 disk), not the archive entries we're writing to. We don't 2054 disk), not the archive entries we're writing to. We don't
(...skipping 11 matching lines...) Expand all
2030 /* Build the modules list. */ 2066 /* Build the modules list. */
2031 BFD_ASSERT (tdata->modules == NULL); 2067 BFD_ASSERT (tdata->modules == NULL);
2032 modules = bfd_alloc (arch, nbr_modules * sizeof (struct lib_index)); 2068 modules = bfd_alloc (arch, nbr_modules * sizeof (struct lib_index));
2033 if (modules == NULL) 2069 if (modules == NULL)
2034 return FALSE; 2070 return FALSE;
2035 2071
2036 for (current = arch->archive_head, i = 0; 2072 for (current = arch->archive_head, i = 0;
2037 current != NULL; 2073 current != NULL;
2038 current = current->archive_next, i++) 2074 current = current->archive_next, i++)
2039 { 2075 {
2040 int nl; 2076 unsigned int nl;
2041 2077
2042 modules[i].abfd = current; 2078 modules[i].abfd = current;
2043 modules[i].name = vms_get_module_name (current->filename, FALSE); 2079 modules[i].name = vms_get_module_name (current->filename, FALSE);
2044 modules[i].ref = 1; 2080 modules[i].ref = 1;
2045 2081
2046 /* FIXME: silently truncate long names ? */ 2082 /* FIXME: silently truncate long names ? */
2047 nl = strlen (modules[i].name); 2083 nl = strlen (modules[i].name);
2048 modules[i].namlen = (nl > MAX_KEYLEN ? MAX_KEYLEN : nl); 2084 modules[i].namlen = (nl > max_keylen ? max_keylen : nl);
2049 } 2085 }
2050 2086
2051 /* Create the module index. */ 2087 /* Create the module index. */
2052 vbn = 0; 2088 vbn = 0;
2053 if (!vms_write_index (NULL, modules, nbr_modules, &vbn, NULL, is_elfidx)) 2089 if (!vms_write_index (NULL, modules, nbr_modules, &vbn, NULL, is_elfidx))
2054 return FALSE; 2090 return FALSE;
2055 nbr_mod_iblk = vbn; 2091 nbr_mod_iblk = vbn;
2056 2092
2057 /* Create symbol index. */ 2093 /* Create symbol index. */
2058 if (!_bfd_vms_lib_build_map (nbr_modules, modules, &nbr_symbols, &symbols)) 2094 if (!_bfd_vms_lib_build_map (nbr_modules, modules, &nbr_symbols, &symbols))
(...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after
2229 bfd_putl32 (tdata->credat_lo, lhd->credat + 0); 2265 bfd_putl32 (tdata->credat_lo, lhd->credat + 0);
2230 bfd_putl32 (tdata->credat_hi, lhd->credat + 4); 2266 bfd_putl32 (tdata->credat_hi, lhd->credat + 4);
2231 vms_raw_get_time (lhd->updtim); 2267 vms_raw_get_time (lhd->updtim);
2232 2268
2233 lhd->mhdusz = tdata->mhd_size - MHD__C_USRDAT; 2269 lhd->mhdusz = tdata->mhd_size - MHD__C_USRDAT;
2234 2270
2235 bfd_putl32 (nbr_modules + nbr_symbols, lhd->idxcnt); 2271 bfd_putl32 (nbr_modules + nbr_symbols, lhd->idxcnt);
2236 bfd_putl32 (nbr_modules, lhd->modcnt); 2272 bfd_putl32 (nbr_modules, lhd->modcnt);
2237 bfd_putl32 (nbr_modules, lhd->modhdrs); 2273 bfd_putl32 (nbr_modules, lhd->modhdrs);
2238 2274
2275 /* Number of blocks for index. */
2276 bfd_putl32 (nbr_mod_iblk + nbr_sym_iblk, lhd->idxblks);
2239 bfd_putl32 (vbn - 1, lhd->hipreal); 2277 bfd_putl32 (vbn - 1, lhd->hipreal);
2240 bfd_putl32 (vbn - 1, lhd->hiprusd); 2278 bfd_putl32 (vbn - 1, lhd->hiprusd);
2241 2279
2280 /* VBN of the next free block. */
2281 bfd_putl32 ((off / VMS_BLOCK_SIZE) + 1, lhd->nextvbn);
2282 bfd_putl32 ((off / VMS_BLOCK_SIZE) + 1, lhd->nextrfa + 0);
2283 bfd_putl16 (0, lhd->nextrfa + 4);
2284
2242 /* First index (modules name). */ 2285 /* First index (modules name). */
2243 idd_flags = IDD__FLAGS_ASCII | IDD__FLAGS_VARLENIDX 2286 idd_flags = IDD__FLAGS_ASCII | IDD__FLAGS_VARLENIDX
2244 | IDD__FLAGS_NOCASECMP | IDD__FLAGS_NOCASENTR; 2287 | IDD__FLAGS_NOCASECMP | IDD__FLAGS_NOCASENTR;
2245 bfd_putl16 (idd_flags, idd->flags); 2288 bfd_putl16 (idd_flags, idd->flags);
2246 bfd_putl16 (MAX_KEYLEN, idd->keylen); 2289 bfd_putl16 (max_keylen + 1, idd->keylen);
2247 bfd_putl16 (mod_idx_vbn, idd->vbn); 2290 bfd_putl16 (mod_idx_vbn, idd->vbn);
2248 idd++; 2291 idd++;
2249 2292
2250 /* Second index (symbols name). */ 2293 /* Second index (symbols name). */
2251 bfd_putl16 (idd_flags, idd->flags); 2294 bfd_putl16 (idd_flags, idd->flags);
2252 bfd_putl16 (MAX_KEYLEN, idd->keylen); 2295 bfd_putl16 (max_keylen + 1, idd->keylen);
2253 bfd_putl16 (sym_idx_vbn, idd->vbn); 2296 bfd_putl16 (sym_idx_vbn, idd->vbn);
2254 idd++; 2297 idd++;
2255 2298
2256 if (vms_write_block (arch, 1, blk) != TRUE) 2299 if (vms_write_block (arch, 1, blk) != TRUE)
2257 return FALSE; 2300 return FALSE;
2258 } 2301 }
2259 2302
2260 return TRUE; 2303 return TRUE;
2261 2304
2262 input_err: 2305 input_err:
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
2296 BFD_JUMP_TABLE_CORE (_bfd_nocore), 2339 BFD_JUMP_TABLE_CORE (_bfd_nocore),
2297 BFD_JUMP_TABLE_ARCHIVE (_bfd_vms_lib), 2340 BFD_JUMP_TABLE_ARCHIVE (_bfd_vms_lib),
2298 BFD_JUMP_TABLE_SYMBOLS (_bfd_nosymbols), 2341 BFD_JUMP_TABLE_SYMBOLS (_bfd_nosymbols),
2299 BFD_JUMP_TABLE_RELOCS (_bfd_norelocs), 2342 BFD_JUMP_TABLE_RELOCS (_bfd_norelocs),
2300 BFD_JUMP_TABLE_WRITE (_bfd_nowrite), 2343 BFD_JUMP_TABLE_WRITE (_bfd_nowrite),
2301 BFD_JUMP_TABLE_LINK (_bfd_nolink), 2344 BFD_JUMP_TABLE_LINK (_bfd_nolink),
2302 BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic), 2345 BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic),
2303 2346
2304 NULL, 2347 NULL,
2305 2348
2306 (PTR) 0 2349 NULL
2307 }; 2350 };
OLDNEW
« no previous file with comments | « bfd/version.h ('k') | bfd/xsym.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698