1 /* Support for generating PDB CodeView debugging files.
2    Copyright (C) 2022-2024 Free Software Foundation, Inc.
3 
4    This file is part of the GNU Binutils.
5 
6    This program is free software; you can redistribute it and/or modify
7    it under the terms of the GNU General Public License as published by
8    the Free Software Foundation; either version 3 of the License, or
9    (at your option) any later version.
10 
11    This program is distributed in the hope that it will be useful,
12    but WITHOUT ANY WARRANTY; without even the implied warranty of
13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14    GNU General Public License for more details.
15 
16    You should have received a copy of the GNU General Public License
17    along with this program; if not, write to the Free Software
18    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
19    MA 02110-1301, USA.  */
20 
21 #include "pdb.h"
22 #include "bfdlink.h"
23 #include "ld.h"
24 #include "ldmain.h"
25 #include "ldmisc.h"
26 #include "libbfd.h"
27 #include "libiberty.h"
28 #include "coff/i386.h"
29 #include "coff/external.h"
30 #include "coff/internal.h"
31 #include "coff/pe.h"
32 #include "libcoff.h"
33 #include <time.h>
34 
35 struct public
36 {
37   struct public *next;
38   uint32_t offset;
39   uint32_t hash;
40   unsigned int index;
41   uint16_t section;
42   uint32_t address;
43 };
44 
45 struct string
46 {
47   struct string *next;
48   uint32_t hash;
49   uint32_t offset;
50   uint32_t source_file_offset;
51   size_t len;
52   char s[];
53 };
54 
55 struct string_table
56 {
57   struct string *strings_head;
58   struct string *strings_tail;
59   uint32_t strings_len;
60   htab_t hashmap;
61 };
62 
63 struct mod_source_files
64 {
65   uint16_t files_count;
66   struct string **files;
67 };
68 
69 struct source_files_info
70 {
71   uint16_t mod_count;
72   struct mod_source_files *mods;
73 };
74 
75 struct type_entry
76 {
77   struct type_entry *next;
78   uint32_t index;
79   uint32_t cv_hash;
80   bool has_udt_src_line;
81   uint8_t data[];
82 };
83 
84 struct types
85 {
86   htab_t hashmap;
87   uint32_t num_types;
88   struct type_entry *first;
89   struct type_entry *last;
90 };
91 
92 struct global
93 {
94   struct global *next;
95   uint32_t offset;
96   uint32_t hash;
97   uint32_t refcount;
98   unsigned int index;
99   uint8_t data[];
100 };
101 
102 struct globals
103 {
104   uint32_t num_entries;
105   struct global *first;
106   struct global *last;
107   htab_t hashmap;
108 };
109 
110 struct in_sc
111 {
112   asection *s;
113   uint16_t sect_num;
114   uint16_t mod_index;
115 };
116 
117 static const uint32_t crc_table[] =
118 {
119   0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f,
120   0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988,
121   0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, 0x1db71064, 0x6ab020f2,
122   0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7,
123   0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9,
124   0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172,
125   0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 0x35b5a8fa, 0x42b2986c,
126   0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59,
127   0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423,
128   0xcfba9599, 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
129   0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, 0x01db7106,
130   0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433,
131   0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d,
132   0x91646c97, 0xe6635c01, 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e,
133   0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950,
134   0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65,
135   0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7,
136   0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0,
137   0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa,
138   0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
139   0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81,
140   0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a,
141   0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, 0xe3630b12, 0x94643b84,
142   0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1,
143   0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb,
144   0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc,
145   0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 0xd6d6a3e8, 0xa1d1937e,
146   0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b,
147   0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55,
148   0x316e8eef, 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
149   0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28,
150   0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d,
151   0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f,
152   0x72076785, 0x05005713, 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38,
153   0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242,
154   0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,
155   0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69,
156   0x616bffd3, 0x166ccf45, 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2,
157   0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc,
158   0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
159   0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693,
160   0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94,
161   0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d
162 };
163 
164 /* Add a new stream to the PDB archive, and return its BFD.  */
165 static bfd *
add_stream(bfd * pdb,const char * name,uint16_t * stream_num)166 add_stream (bfd *pdb, const char *name, uint16_t *stream_num)
167 {
168   bfd *stream;
169   uint16_t num;
170 
171   stream = bfd_create (name ? name : "", pdb);
172   if (!stream)
173     return NULL;
174 
175   if (!bfd_make_writable (stream))
176     {
177       bfd_close (stream);
178       return false;
179     }
180 
181   if (!pdb->archive_head)
182     {
183       bfd_set_archive_head (pdb, stream);
184       num = 0;
185     }
186   else
187     {
188       bfd *b = pdb->archive_head;
189 
190       num = 1;
191 
192       while (b->archive_next)
193           {
194             num++;
195             b = b->archive_next;
196           }
197 
198       b->archive_next = stream;
199     }
200 
201   if (stream_num)
202     *stream_num = num;
203 
204   return stream;
205 }
206 
207 /* Stream 0 ought to be a copy of the MSF directory from the last
208    time the PDB file was written.  Because we don't do incremental
209    writes this isn't applicable to us, but we fill it with a dummy
210    value so as not to confuse radare.  */
211 static bool
create_old_directory_stream(bfd * pdb)212 create_old_directory_stream (bfd *pdb)
213 {
214   bfd *stream;
215   char buf[sizeof (uint32_t)];
216 
217   stream = add_stream (pdb, NULL, NULL);
218   if (!stream)
219     return false;
220 
221   bfd_putl32 (0, buf);
222 
223   return bfd_write (buf, sizeof (uint32_t), stream) == sizeof (uint32_t);
224 }
225 
226 /* Calculate the hash of a given string.  */
227 static uint32_t
calc_hash(const char * data,size_t len)228 calc_hash (const char *data, size_t len)
229 {
230   uint32_t hash = 0;
231 
232   while (len >= 4)
233     {
234       hash ^= data[0];
235       hash ^= data[1] << 8;
236       hash ^= data[2] << 16;
237       hash ^= data[3] << 24;
238 
239       data += 4;
240       len -= 4;
241     }
242 
243   if (len >= 2)
244     {
245       hash ^= data[0];
246       hash ^= data[1] << 8;
247 
248       data += 2;
249       len -= 2;
250     }
251 
252   if (len != 0)
253     hash ^= *data;
254 
255   hash |= 0x20202020;
256   hash ^= (hash >> 11);
257 
258   return hash ^ (hash >> 16);
259 }
260 
261 /* Stream 1 is the PDB info stream - see
262    https://llvm.org/docs/PDB/PdbStream.html.  */
263 static bool
populate_info_stream(bfd * pdb,bfd * info_stream,const unsigned char * guid)264 populate_info_stream (bfd *pdb, bfd *info_stream, const unsigned char *guid)
265 {
266   bool ret = false;
267   struct pdb_stream_70 h;
268   uint32_t num_entries, num_buckets;
269   uint32_t names_length, stream_num;
270   char int_buf[sizeof (uint32_t)];
271 
272   struct hash_entry
273   {
274     uint32_t offset;
275     uint32_t value;
276   };
277 
278   struct hash_entry **buckets = NULL;
279 
280   /* Write header.  */
281 
282   bfd_putl32 (PDB_STREAM_VERSION_VC70, &h.version);
283   bfd_putl32 (time (NULL), &h.signature);
284   bfd_putl32 (1, &h.age);
285 
286   bfd_putl32 (bfd_getb32 (guid), h.guid);
287   bfd_putl16 (bfd_getb16 (&guid[4]), &h.guid[4]);
288   bfd_putl16 (bfd_getb16 (&guid[6]), &h.guid[6]);
289   memcpy (&h.guid[8], &guid[8], 8);
290 
291   if (bfd_write (&h, sizeof (h), info_stream) != sizeof (h))
292     return false;
293 
294   /* Write hash list of named streams.  This is a "rollover" hash, i.e.
295      if a bucket is filled an entry gets placed in the next free
296      slot.  */
297 
298   num_entries = 0;
299   for (bfd *b = pdb->archive_head; b; b = b->archive_next)
300     {
301       if (strcmp (b->filename, ""))
302           num_entries++;
303     }
304 
305   num_buckets = num_entries * 2;
306 
307   names_length = 0;
308   stream_num = 0;
309 
310   if (num_buckets > 0)
311     {
312       buckets = xmalloc (sizeof (struct hash_entry *) * num_buckets);
313       memset (buckets, 0, sizeof (struct hash_entry *) * num_buckets);
314 
315       for (bfd *b = pdb->archive_head; b; b = b->archive_next)
316           {
317             if (strcmp (b->filename, ""))
318               {
319                 size_t len = strlen (b->filename);
320                 uint32_t hash = (uint16_t) calc_hash (b->filename, len);
321                 uint32_t bucket_num = hash % num_buckets;
322 
323                 while (buckets[bucket_num])
324                     {
325                       bucket_num++;
326 
327                       if (bucket_num == num_buckets)
328                         bucket_num = 0;
329                     }
330 
331                 buckets[bucket_num] = xmalloc (sizeof (struct hash_entry));
332 
333                 buckets[bucket_num]->offset = names_length;
334                 buckets[bucket_num]->value = stream_num;
335 
336                 names_length += len + 1;
337               }
338 
339             stream_num++;
340           }
341     }
342 
343   /* Write the strings list - the hash keys are indexes into this.  */
344 
345   bfd_putl32 (names_length, int_buf);
346 
347   if (bfd_write (int_buf, sizeof (uint32_t), info_stream) !=
348       sizeof (uint32_t))
349     goto end;
350 
351   for (bfd *b = pdb->archive_head; b; b = b->archive_next)
352     {
353       if (!strcmp (b->filename, ""))
354           continue;
355 
356       size_t len = strlen (b->filename) + 1;
357 
358       if (bfd_write (b->filename, len, info_stream) != len)
359           goto end;
360     }
361 
362   /* Write the number of entries and buckets.  */
363 
364   bfd_putl32 (num_entries, int_buf);
365 
366   if (bfd_write (int_buf, sizeof (uint32_t), info_stream) !=
367       sizeof (uint32_t))
368     goto end;
369 
370   bfd_putl32 (num_buckets, int_buf);
371 
372   if (bfd_write (int_buf, sizeof (uint32_t), info_stream) !=
373       sizeof (uint32_t))
374     goto end;
375 
376   /* Write the present bitmap.  */
377 
378   bfd_putl32 ((num_buckets + 31) / 32, int_buf);
379 
380   if (bfd_write (int_buf, sizeof (uint32_t), info_stream) !=
381       sizeof (uint32_t))
382     goto end;
383 
384   for (unsigned int i = 0; i < num_buckets; i += 32)
385     {
386       uint32_t v = 0;
387 
388       for (unsigned int j = 0; j < 32; j++)
389           {
390             if (i + j >= num_buckets)
391               break;
392 
393             if (buckets[i + j])
394               v |= 1 << j;
395           }
396 
397       bfd_putl32 (v, int_buf);
398 
399       if (bfd_write (int_buf, sizeof (uint32_t), info_stream) !=
400             sizeof (uint32_t))
401           goto end;
402     }
403 
404   /* Write the (empty) deleted bitmap.  */
405 
406   bfd_putl32 (0, int_buf);
407 
408   if (bfd_write (int_buf, sizeof (uint32_t), info_stream) !=
409       sizeof (uint32_t))
410     goto end;
411 
412   /* Write the buckets.  */
413 
414   for (unsigned int i = 0; i < num_buckets; i++)
415     {
416       if (buckets[i])
417           {
418             bfd_putl32 (buckets[i]->offset, int_buf);
419 
420             if (bfd_write (int_buf, sizeof (uint32_t), info_stream) !=
421                 sizeof (uint32_t))
422               goto end;
423 
424             bfd_putl32 (buckets[i]->value, int_buf);
425 
426             if (bfd_write (int_buf, sizeof (uint32_t), info_stream) !=
427                 sizeof (uint32_t))
428               goto end;
429           }
430     }
431 
432   bfd_putl32 (0, int_buf);
433 
434   if (bfd_write (int_buf, sizeof (uint32_t), info_stream) !=
435       sizeof (uint32_t))
436     goto end;
437 
438   bfd_putl32 (PDB_STREAM_VERSION_VC140, int_buf);
439 
440   if (bfd_write (int_buf, sizeof (uint32_t), info_stream) !=
441       sizeof (uint32_t))
442     goto end;
443 
444   ret = true;
445 
446 end:
447   for (unsigned int i = 0; i < num_buckets; i++)
448     {
449       if (buckets[i])
450           free (buckets[i]);
451     }
452 
453   free (buckets);
454 
455   return ret;
456 }
457 
458 /* Calculate the CRC32 used for type hashes.  */
459 static uint32_t
crc32(const uint8_t * data,size_t len)460 crc32 (const uint8_t *data, size_t len)
461 {
462   uint32_t crc = 0;
463 
464   while (len > 0)
465     {
466       crc = (crc >> 8) ^ crc_table[(crc & 0xff) ^ *data];
467 
468       data++;
469       len--;
470     }
471 
472   return crc;
473 }
474 
475 /* Stream 2 is the type information (TPI) stream, and stream 4 is
476    the ID information (IPI) stream.  They differ only in which records
477    go in which stream. */
478 static bool
populate_type_stream(bfd * pdb,bfd * stream,struct types * types)479 populate_type_stream (bfd *pdb, bfd *stream, struct types *types)
480 {
481   struct pdb_tpi_stream_header h;
482   struct type_entry *e;
483   uint32_t len = 0, index_offset_len, off;
484   struct bfd *hash_stream = NULL;
485   uint16_t hash_stream_index;
486 
487   static const uint32_t index_skip = 0x2000;
488 
489   e = types->first;
490 
491   index_offset_len = 0;
492 
493   while (e)
494     {
495       uint32_t old_len = len;
496 
497       len += sizeof (uint16_t) + bfd_getl16 (e->data);
498 
499       if (old_len == 0 || old_len / index_skip != len / index_skip)
500           index_offset_len += sizeof (uint32_t) * 2;
501 
502       e = e->next;
503     }
504 
505   /* Each type stream also has a stream which holds the hash value for each
506      type, along with a skip list to speed up searching.  */
507 
508   hash_stream = add_stream (pdb, "", &hash_stream_index);
509 
510   if (!hash_stream)
511     return false;
512 
513   bfd_putl32 (TPI_STREAM_VERSION_80, &h.version);
514   bfd_putl32 (sizeof (h), &h.header_size);
515   bfd_putl32 (TPI_FIRST_INDEX, &h.type_index_begin);
516   bfd_putl32 (TPI_FIRST_INDEX + types->num_types, &h.type_index_end);
517   bfd_putl32 (len, &h.type_record_bytes);
518   bfd_putl16 (hash_stream_index, &h.hash_stream_index);
519   bfd_putl16 (0xffff, &h.hash_aux_stream_index);
520   bfd_putl32 (sizeof (uint32_t), &h.hash_key_size);
521   bfd_putl32 (NUM_TPI_HASH_BUCKETS, &h.num_hash_buckets);
522   bfd_putl32 (0, &h.hash_value_buffer_offset);
523   bfd_putl32 (types->num_types * sizeof (uint32_t),
524                 &h.hash_value_buffer_length);
525   bfd_putl32 (types->num_types * sizeof (uint32_t),
526                 &h.index_offset_buffer_offset);
527   bfd_putl32 (index_offset_len, &h.index_offset_buffer_length);
528   bfd_putl32 ((types->num_types * sizeof (uint32_t)) + index_offset_len,
529                 &h.hash_adj_buffer_offset);
530   bfd_putl32 (0, &h.hash_adj_buffer_length);
531 
532   if (bfd_write (&h, sizeof (h), stream) != sizeof (h))
533     return false;
534 
535   /* Write the type definitions into the main stream, and the hashes
536      into the hash stream.  The hashes have already been calculated
537      in handle_type.  */
538 
539   e = types->first;
540 
541   while (e)
542     {
543       uint8_t buf[sizeof (uint32_t)];
544       uint16_t size;
545 
546       size = bfd_getl16 (e->data);
547 
548       if (bfd_write (e->data, size + sizeof (uint16_t), stream)
549             != size + sizeof (uint16_t))
550           return false;
551 
552       bfd_putl32 (e->cv_hash % NUM_TPI_HASH_BUCKETS, buf);
553 
554       if (bfd_write (buf, sizeof (uint32_t), hash_stream)
555             != sizeof (uint32_t))
556           return false;
557 
558       e = e->next;
559     }
560 
561   /* Write the index offsets, i.e. the skip list, into the hash stream.  We
562      copy MSVC here by writing a new entry for every 8192 bytes.  */
563 
564   e = types->first;
565   off = 0;
566 
567   while (e)
568     {
569       uint32_t old_off = off;
570       uint16_t size = bfd_getl16 (e->data);
571 
572       off += size + sizeof (uint16_t);
573 
574       if (old_off == 0 || old_off / index_skip != len / index_skip)
575           {
576             uint8_t buf[sizeof (uint32_t)];
577 
578             bfd_putl32 (TPI_FIRST_INDEX + e->index, buf);
579 
580             if (bfd_write (buf, sizeof (uint32_t), hash_stream)
581                 != sizeof (uint32_t))
582               return false;
583 
584             bfd_putl32 (old_off, buf);
585 
586             if (bfd_write (buf, sizeof (uint32_t), hash_stream)
587                 != sizeof (uint32_t))
588               return false;
589           }
590 
591       e = e->next;
592     }
593 
594   return true;
595 }
596 
597 /* Return the PE architecture number for the image.  */
598 static uint16_t
get_arch_number(bfd * abfd)599 get_arch_number (bfd *abfd)
600 {
601   switch (abfd->arch_info->arch)
602     {
603     case bfd_arch_i386:
604       if (abfd->arch_info->mach & bfd_mach_x86_64)
605           return IMAGE_FILE_MACHINE_AMD64;
606       else
607           return IMAGE_FILE_MACHINE_I386;
608 
609     case bfd_arch_aarch64:
610       return IMAGE_FILE_MACHINE_ARM64;
611 
612     default:
613       return 0;
614     }
615 }
616 
617 /* Validate the DEBUG_S_FILECHKSMS entry within a module's .debug$S
618    section, and copy it to the module's symbol stream.  */
619 static bool
copy_filechksms(uint8_t * data,uint32_t size,char * string_table,struct string_table * strings,uint8_t * out,struct mod_source_files * mod_source)620 copy_filechksms (uint8_t *data, uint32_t size, char *string_table,
621                      struct string_table *strings, uint8_t *out,
622                      struct mod_source_files *mod_source)
623 {
624   uint8_t *orig_data = data;
625   uint32_t orig_size = size;
626   uint16_t num_files = 0;
627   struct string **strptr;
628 
629   bfd_putl32 (DEBUG_S_FILECHKSMS, out);
630   out += sizeof (uint32_t);
631 
632   bfd_putl32 (size, out);
633   out += sizeof (uint32_t);
634 
635   /* Calculate the number of files, and check for any overflows.  */
636 
637   while (size > 0)
638     {
639       struct file_checksum *fc = (struct file_checksum *) data;
640       uint8_t padding;
641       size_t len;
642 
643       if (size < sizeof (struct file_checksum))
644           {
645             bfd_set_error (bfd_error_bad_value);
646             return false;
647           }
648 
649       len = sizeof (struct file_checksum) + fc->checksum_length;
650 
651       if (size < len)
652           {
653             bfd_set_error (bfd_error_bad_value);
654             return false;
655           }
656 
657       data += len;
658       size -= len;
659 
660       if (len % sizeof (uint32_t))
661           padding = sizeof (uint32_t) - (len % sizeof (uint32_t));
662       else
663           padding = 0;
664 
665       if (size < padding)
666           {
667             bfd_set_error (bfd_error_bad_value);
668             return false;
669           }
670 
671       num_files++;
672 
673       data += padding;
674       size -= padding;
675     }
676 
677   /* Add the files to mod_source, so that they'll appear in the source
678      info substream.  */
679 
680   strptr = NULL;
681   if (num_files > 0)
682     {
683       uint16_t new_count = num_files + mod_source->files_count;
684 
685       mod_source->files = xrealloc (mod_source->files,
686                                             sizeof (struct string *) * new_count);
687 
688       strptr = mod_source->files + mod_source->files_count;
689 
690       mod_source->files_count += num_files;
691     }
692 
693   /* Actually copy the data.  */
694 
695   data = orig_data;
696   size = orig_size;
697 
698   while (size > 0)
699     {
700       struct file_checksum *fc = (struct file_checksum *) data;
701       uint32_t string_off;
702       uint8_t padding;
703       size_t len;
704       struct string *str = NULL;
705 
706       string_off = bfd_getl32 (&fc->file_id);
707       len = sizeof (struct file_checksum) + fc->checksum_length;
708 
709       if (len % sizeof (uint32_t))
710           padding = sizeof (uint32_t) - (len % sizeof (uint32_t));
711       else
712           padding = 0;
713 
714       /* Remap the "file ID", i.e. the offset in the module's string table,
715            so it points to the right place in the main string table.  */
716 
717       if (string_table)
718           {
719             char *fn = string_table + string_off;
720             size_t fn_len = strlen (fn);
721             uint32_t hash = calc_hash (fn, fn_len);
722             void **slot;
723 
724             slot = htab_find_slot_with_hash (strings->hashmap, fn, hash,
725                                                      NO_INSERT);
726 
727             if (slot)
728               str = (struct string *) *slot;
729           }
730 
731       *strptr = str;
732       strptr++;
733 
734       bfd_putl32 (str ? str->offset : 0, &fc->file_id);
735 
736       memcpy (out, data, len + padding);
737 
738       data += len + padding;
739       size -= len + padding;
740       out += len + padding;
741     }
742 
743   return true;
744 }
745 
746 /* Add a string to the strings table, if it's not already there.  Returns its
747    offset within the string table.  */
748 static uint32_t
add_string(char * str,size_t len,struct string_table * strings)749 add_string (char *str, size_t len, struct string_table *strings)
750 {
751   uint32_t hash = calc_hash (str, len);
752   struct string *s;
753   void **slot;
754 
755   slot = htab_find_slot_with_hash (strings->hashmap, str, hash, INSERT);
756 
757   if (!*slot)
758     {
759       *slot = xmalloc (offsetof (struct string, s) + len);
760 
761       s = (struct string *) *slot;
762 
763       s->next = NULL;
764       s->hash = hash;
765       s->offset = strings->strings_len;
766       s->source_file_offset = 0xffffffff;
767       s->len = len;
768       memcpy (s->s, str, len);
769 
770       if (strings->strings_tail)
771           strings->strings_tail->next = s;
772       else
773           strings->strings_head = s;
774 
775       strings->strings_tail = s;
776 
777       strings->strings_len += len + 1;
778     }
779   else
780     {
781       s = (struct string *) *slot;
782     }
783 
784   return s->offset;
785 }
786 
787 /* Return the hash of an entry in the string table.  */
788 static hashval_t
hash_string_table_entry(const void * p)789 hash_string_table_entry (const void *p)
790 {
791   const struct string *s = (const struct string *) p;
792 
793   return s->hash;
794 }
795 
796 /* Compare an entry in the string table with a string.  */
797 static int
eq_string_table_entry(const void * a,const void * b)798 eq_string_table_entry (const void *a, const void *b)
799 {
800   const struct string *s1 = (const struct string *) a;
801   const char *s2 = (const char *) b;
802   size_t s2_len = strlen (s2);
803 
804   if (s2_len != s1->len)
805     return 0;
806 
807   return memcmp (s1->s, s2, s2_len) == 0;
808 }
809 
810 /* Parse the string table within the .debug$S section.  */
811 static void
parse_string_table(bfd_byte * data,size_t size,struct string_table * strings)812 parse_string_table (bfd_byte *data, size_t size,
813                         struct string_table *strings)
814 {
815   while (true)
816     {
817       size_t len = strnlen ((char *) data, size);
818 
819       add_string ((char *) data, len, strings);
820 
821       data += len + 1;
822 
823       if (size <= len + 1)
824           break;
825 
826       size -= len + 1;
827     }
828 }
829 
830 /* Remap a type reference within a CodeView symbol.  */
831 static bool
remap_symbol_type(void * data,struct type_entry ** map,uint32_t num_types)832 remap_symbol_type (void *data, struct type_entry **map, uint32_t num_types)
833 {
834   uint32_t type = bfd_getl32 (data);
835 
836   /* Ignore builtin types (those with IDs below 0x1000).  */
837   if (type < TPI_FIRST_INDEX)
838     return true;
839 
840   if (type >= TPI_FIRST_INDEX + num_types)
841     {
842       einfo (_("%P: CodeView symbol references out of range type %v\n"),
843                  type);
844       return false;
845     }
846 
847   type = TPI_FIRST_INDEX + map[type - TPI_FIRST_INDEX]->index;
848   bfd_putl32 (type, data);
849 
850   return true;
851 }
852 
853 /* Add an entry into the globals stream.  If it already exists, increase
854    the refcount.  */
855 static bool
add_globals_ref(struct globals * glob,bfd * sym_rec_stream,const char * name,size_t name_len,uint8_t * data,size_t len)856 add_globals_ref (struct globals *glob, bfd *sym_rec_stream, const char *name,
857                      size_t name_len, uint8_t *data, size_t len)
858 {
859   void **slot;
860   uint32_t hash;
861   struct global *g;
862 
863   slot = htab_find_slot_with_hash (glob->hashmap, data,
864                                            iterative_hash (data, len, 0), INSERT);
865 
866   if (*slot)
867     {
868       g = *slot;
869       g->refcount++;
870       return true;
871     }
872 
873   *slot = xmalloc (offsetof (struct global, data) + len);
874 
875   hash = crc32 ((const uint8_t *) name, name_len);
876   hash %= NUM_GLOBALS_HASH_BUCKETS;
877 
878   g = *slot;
879   g->next = NULL;
880   g->offset = bfd_tell (sym_rec_stream);
881   g->hash = hash;
882   g->refcount = 1;
883   memcpy (g->data, data, len);
884 
885   glob->num_entries++;
886 
887   if (glob->last)
888     glob->last->next = g;
889   else
890     glob->first = g;
891 
892   glob->last = g;
893 
894   return bfd_write (data, len, sym_rec_stream) == len;
895 }
896 
897 /* Find the end of the current scope within symbols data.  */
898 static uint8_t *
find_end_of_scope(uint8_t * data,uint32_t size)899 find_end_of_scope (uint8_t *data, uint32_t size)
900 {
901   unsigned int scope_level = 1;
902   uint16_t len;
903 
904   len = bfd_getl16 (data) + sizeof (uint16_t);
905 
906   data += len;
907   size -= len;
908 
909   while (true)
910     {
911       uint16_t type;
912 
913       if (size < sizeof (uint32_t))
914           return NULL;
915 
916       len = bfd_getl16 (data) + sizeof (uint16_t);
917       type = bfd_getl16 (data + sizeof (uint16_t));
918 
919       if (size < len)
920           return NULL;
921 
922       switch (type)
923           {
924           case S_GPROC32:
925           case S_LPROC32:
926           case S_BLOCK32:
927           case S_INLINESITE:
928           case S_THUNK32:
929             scope_level++;
930             break;
931 
932           case S_END:
933           case S_PROC_ID_END:
934           case S_INLINESITE_END:
935             scope_level--;
936 
937             if (scope_level == 0)
938               return data;
939 
940             break;
941           }
942 
943       data += len;
944       size -= len;
945     }
946 }
947 
948 /* Return the size of an extended value parameter, as used in
949    LF_ENUMERATE etc.  */
950 static unsigned int
extended_value_len(uint16_t type)951 extended_value_len (uint16_t type)
952 {
953   switch (type)
954     {
955     case LF_CHAR:
956       return 1;
957 
958     case LF_SHORT:
959     case LF_USHORT:
960       return 2;
961 
962     case LF_LONG:
963     case LF_ULONG:
964       return 4;
965 
966     case LF_QUADWORD:
967     case LF_UQUADWORD:
968       return 8;
969     }
970 
971   return 0;
972 }
973 
974 /* Parse the symbols in a .debug$S section, and copy them to the module's
975    symbol stream.  */
976 static bool
parse_symbols(uint8_t * data,uint32_t size,uint8_t ** buf,struct type_entry ** map,uint32_t num_types,bfd * sym_rec_stream,struct globals * glob,uint16_t mod_num)977 parse_symbols (uint8_t *data, uint32_t size, uint8_t **buf,
978                  struct type_entry **map, uint32_t num_types,
979                  bfd *sym_rec_stream, struct globals *glob, uint16_t mod_num)
980 {
981   uint8_t *orig_buf = *buf;
982   unsigned int scope_level = 0;
983   uint8_t *scope = NULL;
984 
985   while (size >= sizeof (uint16_t))
986     {
987       uint16_t len, type;
988 
989       len = bfd_getl16 (data) + sizeof (uint16_t);
990 
991       if (len > size)
992           {
993             bfd_set_error (bfd_error_bad_value);
994             return false;
995           }
996 
997       type = bfd_getl16 (data + sizeof (uint16_t));
998 
999       switch (type)
1000           {
1001           case S_LDATA32:
1002           case S_GDATA32:
1003           case S_LTHREAD32:
1004           case S_GTHREAD32:
1005             {
1006               struct datasym *d = (struct datasym *) data;
1007               size_t name_len;
1008 
1009               if (len < offsetof (struct datasym, name))
1010                 {
1011                     einfo (_("%P: warning: truncated CodeView record"
1012                                " S_LDATA32/S_GDATA32/S_LTHREAD32/S_GTHREAD32\n"));
1013                     bfd_set_error (bfd_error_bad_value);
1014                     return false;
1015                 }
1016 
1017               if (scope_level == 0)
1018                 {
1019                     uint16_t section = bfd_getl16 (&d->section);
1020 
1021                     if (section == 0) /* GC'd, ignore */
1022                       break;
1023                 }
1024 
1025               name_len =
1026                 strnlen (d->name, len - offsetof (struct datasym, name));
1027 
1028               if (name_len == len - offsetof (struct datasym, name))
1029                 {
1030                     einfo (_("%P: warning: name for S_LDATA32/S_GDATA32/"
1031                                "S_LTHREAD32/S_GTHREAD32 has no terminating"
1032                                " zero\n"));
1033                     bfd_set_error (bfd_error_bad_value);
1034                     return false;
1035                 }
1036 
1037               if (!remap_symbol_type (&d->type, map, num_types))
1038                 {
1039                     bfd_set_error (bfd_error_bad_value);
1040                     return false;
1041                 }
1042 
1043               /* If S_LDATA32 or S_LTHREAD32, copy into module symbols.  */
1044 
1045               if (type == S_LDATA32 || type == S_LTHREAD32)
1046                 {
1047                     memcpy (*buf, d, len);
1048                     *buf += len;
1049                 }
1050 
1051               /* S_LDATA32 and S_LTHREAD32 only go in globals if
1052                  not in function scope.  */
1053               if (type == S_GDATA32 || type == S_GTHREAD32 || scope_level == 0)
1054                 {
1055                     if (!add_globals_ref (glob, sym_rec_stream, d->name,
1056                                               name_len, data, len))
1057                       return false;
1058                 }
1059 
1060               break;
1061             }
1062 
1063           case S_GPROC32:
1064           case S_LPROC32:
1065           case S_GPROC32_ID:
1066           case S_LPROC32_ID:
1067             {
1068               struct procsym *proc = (struct procsym *) data;
1069               size_t name_len;
1070               uint16_t section;
1071               uint32_t end;
1072               uint8_t *endptr;
1073               size_t ref_size, padding;
1074               struct refsym *ref;
1075 
1076               if (len < offsetof (struct procsym, name))
1077                 {
1078                     einfo (_("%P: warning: truncated CodeView record"
1079                                " S_GPROC32/S_LPROC32\n"));
1080                     bfd_set_error (bfd_error_bad_value);
1081                     return false;
1082                 }
1083 
1084               section = bfd_getl16 (&proc->section);
1085 
1086               endptr = find_end_of_scope (data, size);
1087 
1088               if (!endptr)
1089                 {
1090                     einfo (_("%P: warning: could not find end of"
1091                                " S_GPROC32/S_LPROC32 record\n"));
1092                     bfd_set_error (bfd_error_bad_value);
1093                     return false;
1094                 }
1095 
1096               if (section == 0) /* skip if GC'd */
1097                 {
1098                     /* Skip to after S_END.  */
1099 
1100                     size -= endptr - data;
1101                     data = endptr;
1102 
1103                     len = bfd_getl16 (data) + sizeof (uint16_t);
1104 
1105                     data += len;
1106                     size -= len;
1107 
1108                     continue;
1109                 }
1110 
1111               name_len =
1112                 strnlen (proc->name, len - offsetof (struct procsym, name));
1113 
1114               if (name_len == len - offsetof (struct procsym, name))
1115                 {
1116                     einfo (_("%P: warning: name for S_GPROC32/S_LPROC32 has no"
1117                                " terminating zero\n"));
1118                     bfd_set_error (bfd_error_bad_value);
1119                     return false;
1120                 }
1121 
1122               if (type == S_GPROC32_ID || type == S_LPROC32_ID)
1123                 {
1124                     /* Transform into S_GPROC32 / S_LPROC32.  */
1125 
1126                     uint32_t t_idx = bfd_getl32 (&proc->type);
1127                     struct type_entry *t;
1128                     uint16_t t_type;
1129 
1130                     if (t_idx < TPI_FIRST_INDEX
1131                         || t_idx >= TPI_FIRST_INDEX + num_types)
1132                       {
1133                         einfo (_("%P: CodeView symbol references out of range"
1134                                    " type %v\n"), type);
1135                         bfd_set_error (bfd_error_bad_value);
1136                         return false;
1137                       }
1138 
1139                     t = map[t_idx - TPI_FIRST_INDEX];
1140 
1141                     t_type = bfd_getl16 (t->data + sizeof (uint16_t));
1142 
1143                     switch (t_type)
1144                       {
1145                       case LF_FUNC_ID:
1146                         {
1147                           struct lf_func_id *t_data =
1148                               (struct lf_func_id *) t->data;
1149 
1150                           /* Replace proc->type with function type.  */
1151 
1152                           memcpy (&proc->type, &t_data->function_type,
1153                                     sizeof (uint32_t));
1154 
1155                           break;
1156                         }
1157 
1158                       case LF_MFUNC_ID:
1159                         {
1160                           struct lf_mfunc_id *t_data =
1161                               (struct lf_mfunc_id *) t->data;
1162 
1163                           /* Replace proc->type with function type.  */
1164 
1165                           memcpy (&proc->type, &t_data->function_type,
1166                                     sizeof (uint32_t));
1167 
1168                           break;
1169                         }
1170 
1171                       default:
1172                         einfo (_("%P: CodeView S_GPROC32_ID/S_LPROC32_ID symbol"
1173                                    " referenced unknown type as ID\n"));
1174                         bfd_set_error (bfd_error_bad_value);
1175                         return false;
1176                       }
1177 
1178                     /* Change record type.  */
1179 
1180                     if (type == S_GPROC32_ID)
1181                       bfd_putl32 (S_GPROC32, &proc->kind);
1182                     else
1183                       bfd_putl32 (S_LPROC32, &proc->kind);
1184                 }
1185               else
1186                 {
1187                     if (!remap_symbol_type (&proc->type, map, num_types))
1188                       {
1189                         bfd_set_error (bfd_error_bad_value);
1190                         return false;
1191                       }
1192                 }
1193 
1194               end = *buf - orig_buf + sizeof (uint32_t) + endptr - data;
1195               bfd_putl32 (end, &proc->end);
1196 
1197               /* Add S_PROCREF / S_LPROCREF to globals stream.  */
1198 
1199               ref_size = offsetof (struct refsym, name) + name_len + 1;
1200 
1201               if (ref_size % sizeof (uint32_t))
1202                 padding = sizeof (uint32_t) - (ref_size % sizeof (uint32_t));
1203               else
1204                 padding = 0;
1205 
1206               ref = xmalloc (ref_size + padding);
1207 
1208               bfd_putl16 (ref_size + padding - sizeof (uint16_t), &ref->size);
1209               bfd_putl16 (type == S_GPROC32 || type == S_GPROC32_ID ?
1210                               S_PROCREF : S_LPROCREF, &ref->kind);
1211               bfd_putl32 (0, &ref->sum_name);
1212               bfd_putl32 (*buf - orig_buf + sizeof (uint32_t),
1213                               &ref->symbol_offset);
1214               bfd_putl16 (mod_num + 1, &ref->mod);
1215 
1216               memcpy (ref->name, proc->name, name_len + 1);
1217 
1218               memset (ref->name + name_len + 1, 0, padding);
1219 
1220               if (!add_globals_ref (glob, sym_rec_stream, proc->name, name_len,
1221                                           (uint8_t *) ref, ref_size + padding))
1222                 {
1223                     free (ref);
1224                     return false;
1225                 }
1226 
1227               free (ref);
1228 
1229               scope = *buf;
1230 
1231               memcpy (*buf, proc, len);
1232               *buf += len;
1233 
1234               scope_level++;
1235 
1236               break;
1237             }
1238 
1239           case S_UDT:
1240             {
1241               struct udtsym *udt = (struct udtsym *) data;
1242               size_t name_len;
1243 
1244               if (len < offsetof (struct udtsym, name))
1245                 {
1246                     einfo (_("%P: warning: truncated CodeView record"
1247                                " S_UDT\n"));
1248                     bfd_set_error (bfd_error_bad_value);
1249                     return false;
1250                 }
1251 
1252               name_len =
1253                 strnlen (udt->name, len - offsetof (struct udtsym, name));
1254 
1255               if (name_len == len - offsetof (struct udtsym, name))
1256                 {
1257                     einfo (_("%P: warning: name for S_UDT has no"
1258                                " terminating zero\n"));
1259                     bfd_set_error (bfd_error_bad_value);
1260                     return false;
1261                 }
1262 
1263               if (!remap_symbol_type (&udt->type, map, num_types))
1264                 {
1265                     bfd_set_error (bfd_error_bad_value);
1266                     return false;
1267                 }
1268 
1269               /* S_UDT goes in the symbols stream if within a procedure,
1270                  otherwise it goes in the globals stream.  */
1271               if (scope_level == 0)
1272                 {
1273                     if (!add_globals_ref (glob, sym_rec_stream, udt->name,
1274                                               name_len, data, len))
1275                       return false;
1276                 }
1277               else
1278                 {
1279                     memcpy (*buf, udt, len);
1280                     *buf += len;
1281                 }
1282 
1283               break;
1284             }
1285 
1286           case S_CONSTANT:
1287             {
1288               struct constsym *c = (struct constsym *) data;
1289               size_t name_len, rec_size;
1290               uint16_t val;
1291 
1292               if (len < offsetof (struct constsym, name))
1293                 {
1294                     einfo (_("%P: warning: truncated CodeView record"
1295                                " S_CONSTANT\n"));
1296                     bfd_set_error (bfd_error_bad_value);
1297                     return false;
1298                 }
1299 
1300               rec_size = offsetof (struct constsym, name);
1301 
1302               val = bfd_getl16 (&c->value);
1303 
1304               /* If val >= 0x8000, actual value follows.  */
1305               if (val >= 0x8000)
1306                 {
1307                     unsigned int param_len = extended_value_len (val);
1308 
1309                     if (param_len == 0)
1310                       {
1311                         einfo (_("%P: warning: unhandled type %v within"
1312                                    " S_CONSTANT\n"), val);
1313                         bfd_set_error (bfd_error_bad_value);
1314                         return false;
1315                       }
1316 
1317                     rec_size += param_len;
1318                 }
1319 
1320               name_len =
1321                 strnlen ((const char *) data + rec_size, len - rec_size);
1322 
1323               if (name_len == len - rec_size)
1324                 {
1325                     einfo (_("%P: warning: name for S_CONSTANT has no"
1326                                " terminating zero\n"));
1327                     bfd_set_error (bfd_error_bad_value);
1328                     return false;
1329                 }
1330 
1331               if (!remap_symbol_type (&c->type, map, num_types))
1332                 {
1333                     bfd_set_error (bfd_error_bad_value);
1334                     return false;
1335                 }
1336 
1337               if (!add_globals_ref (glob, sym_rec_stream,
1338                                           (const char *) data + rec_size, name_len,
1339                                           data, len))
1340                 return false;
1341 
1342               break;
1343             }
1344 
1345           case S_END:
1346           case S_INLINESITE_END:
1347           case S_PROC_ID_END:
1348             memcpy (*buf, data, len);
1349 
1350             if (type == S_PROC_ID_END) /* transform to S_END */
1351               bfd_putl16 (S_END, *buf + sizeof (uint16_t));
1352 
1353             /* Reset scope variable back to the address of the previous
1354                scope start.  */
1355             if (scope)
1356               {
1357                 uint32_t parent;
1358                 uint16_t scope_start_type =
1359                     bfd_getl16 (scope + sizeof (uint16_t));
1360 
1361                 switch (scope_start_type)
1362                     {
1363                     case S_GPROC32:
1364                     case S_LPROC32:
1365                       parent = bfd_getl32 (scope + offsetof (struct procsym,
1366                                                                        parent));
1367                       break;
1368 
1369                     case S_BLOCK32:
1370                       parent = bfd_getl32 (scope + offsetof (struct blocksym,
1371                                                                        parent));
1372                       break;
1373 
1374                     case S_INLINESITE:
1375                       parent = bfd_getl32 (scope + offsetof (struct inline_site,
1376                                                                        parent));
1377                       break;
1378 
1379                     case S_THUNK32:
1380                       parent = bfd_getl32 (scope + offsetof (struct thunk,
1381                                                                        parent));
1382                       break;
1383 
1384                     default:
1385                       einfo (_("%P: warning: unexpected CodeView scope start"
1386                                  " record %v\n"), scope_start_type);
1387                       bfd_set_error (bfd_error_bad_value);
1388                       return false;
1389                     }
1390 
1391                 if (parent == 0)
1392                     scope = NULL;
1393                 else
1394                     scope = orig_buf + parent - sizeof (uint32_t);
1395               }
1396 
1397             *buf += len;
1398             scope_level--;
1399             break;
1400 
1401           case S_BUILDINFO:
1402             {
1403               struct buildinfosym *bi = (struct buildinfosym *) data;
1404 
1405               if (len < sizeof (struct buildinfosym))
1406                 {
1407                     einfo (_("%P: warning: truncated CodeView record"
1408                                " S_BUILDINFO\n"));
1409                     bfd_set_error (bfd_error_bad_value);
1410                     return false;
1411                 }
1412 
1413               if (!remap_symbol_type (&bi->type, map, num_types))
1414                 {
1415                     bfd_set_error (bfd_error_bad_value);
1416                     return false;
1417                 }
1418 
1419               memcpy (*buf, data, len);
1420               *buf += len;
1421 
1422               break;
1423             }
1424 
1425           case S_BLOCK32:
1426             {
1427               struct blocksym *bl = (struct blocksym *) data;
1428               uint8_t *endptr;
1429               uint32_t end;
1430 
1431               if (len < offsetof (struct blocksym, name))
1432                 {
1433                     einfo (_("%P: warning: truncated CodeView record"
1434                                " S_BLOCK32\n"));
1435                     bfd_set_error (bfd_error_bad_value);
1436                     return false;
1437                 }
1438 
1439               bfd_putl32 (scope - orig_buf + sizeof (uint32_t), &bl->parent);
1440 
1441               endptr = find_end_of_scope (data, size);
1442 
1443               if (!endptr)
1444                 {
1445                     einfo (_("%P: warning: could not find end of"
1446                                " S_BLOCK32 record\n"));
1447                     bfd_set_error (bfd_error_bad_value);
1448                     return false;
1449                 }
1450 
1451               end = *buf - orig_buf + sizeof (uint32_t) + endptr - data;
1452               bfd_putl32 (end, &bl->end);
1453 
1454               scope = *buf;
1455 
1456               memcpy (*buf, data, len);
1457               *buf += len;
1458 
1459               scope_level++;
1460 
1461               break;
1462             }
1463 
1464           case S_BPREL32:
1465             {
1466               struct bprelsym *bp = (struct bprelsym *) data;
1467 
1468               if (len < offsetof (struct bprelsym, name))
1469                 {
1470                     einfo (_("%P: warning: truncated CodeView record"
1471                                " S_BPREL32\n"));
1472                     bfd_set_error (bfd_error_bad_value);
1473                     return false;
1474                 }
1475 
1476               if (!remap_symbol_type (&bp->type, map, num_types))
1477                 {
1478                     bfd_set_error (bfd_error_bad_value);
1479                     return false;
1480                 }
1481 
1482               memcpy (*buf, data, len);
1483               *buf += len;
1484 
1485               break;
1486             }
1487 
1488           case S_REGISTER:
1489             {
1490               struct regsym *reg = (struct regsym *) data;
1491 
1492               if (len < offsetof (struct regsym, name))
1493                 {
1494                     einfo (_("%P: warning: truncated CodeView record"
1495                                " S_REGISTER\n"));
1496                     bfd_set_error (bfd_error_bad_value);
1497                     return false;
1498                 }
1499 
1500               if (!remap_symbol_type (&reg->type, map, num_types))
1501                 {
1502                     bfd_set_error (bfd_error_bad_value);
1503                     return false;
1504                 }
1505 
1506               memcpy (*buf, data, len);
1507               *buf += len;
1508 
1509               break;
1510             }
1511 
1512           case S_REGREL32:
1513             {
1514               struct regrel *rr = (struct regrel *) data;
1515 
1516               if (len < offsetof (struct regrel, name))
1517                 {
1518                     einfo (_("%P: warning: truncated CodeView record"
1519                                " S_REGREL32\n"));
1520                     bfd_set_error (bfd_error_bad_value);
1521                     return false;
1522                 }
1523 
1524               if (!remap_symbol_type (&rr->type, map, num_types))
1525                 {
1526                     bfd_set_error (bfd_error_bad_value);
1527                     return false;
1528                 }
1529 
1530               memcpy (*buf, data, len);
1531               *buf += len;
1532 
1533               break;
1534             }
1535 
1536           case S_LOCAL:
1537             {
1538               struct localsym *l = (struct localsym *) data;
1539 
1540               if (len < offsetof (struct localsym, name))
1541                 {
1542                     einfo (_("%P: warning: truncated CodeView record"
1543                                " S_LOCAL\n"));
1544                     bfd_set_error (bfd_error_bad_value);
1545                     return false;
1546                 }
1547 
1548               if (!remap_symbol_type (&l->type, map, num_types))
1549                 {
1550                     bfd_set_error (bfd_error_bad_value);
1551                     return false;
1552                 }
1553 
1554               memcpy (*buf, data, len);
1555               *buf += len;
1556 
1557               break;
1558             }
1559 
1560           case S_INLINESITE:
1561             {
1562               struct inline_site *is = (struct inline_site *) data;
1563               uint8_t *endptr;
1564               uint32_t end;
1565 
1566               if (len < offsetof (struct inline_site, binary_annotations))
1567                 {
1568                     einfo (_("%P: warning: truncated CodeView record"
1569                                " S_INLINESITE\n"));
1570                     bfd_set_error (bfd_error_bad_value);
1571                     return false;
1572                 }
1573 
1574               bfd_putl32 (scope - orig_buf + sizeof (uint32_t), &is->parent);
1575 
1576               endptr = find_end_of_scope (data, size);
1577 
1578               if (!endptr)
1579                 {
1580                     einfo (_("%P: warning: could not find end of"
1581                                " S_INLINESITE record\n"));
1582                     bfd_set_error (bfd_error_bad_value);
1583                     return false;
1584                 }
1585 
1586               end = *buf - orig_buf + sizeof (uint32_t) + endptr - data;
1587               bfd_putl32 (end, &is->end);
1588 
1589               if (!remap_symbol_type (&is->inlinee, map, num_types))
1590                 {
1591                     bfd_set_error (bfd_error_bad_value);
1592                     return false;
1593                 }
1594 
1595               scope = *buf;
1596 
1597               memcpy (*buf, data, len);
1598               *buf += len;
1599 
1600               scope_level++;
1601 
1602               break;
1603             }
1604 
1605           case S_THUNK32:
1606             {
1607               struct thunk *th = (struct thunk *) data;
1608               uint8_t *endptr;
1609               uint32_t end;
1610 
1611               if (len < offsetof (struct thunk, name))
1612                 {
1613                     einfo (_("%P: warning: truncated CodeView record"
1614                                " S_THUNK32\n"));
1615                     bfd_set_error (bfd_error_bad_value);
1616                     return false;
1617                 }
1618 
1619               bfd_putl32 (scope - orig_buf + sizeof (uint32_t), &th->parent);
1620 
1621               endptr = find_end_of_scope (data, size);
1622 
1623               if (!endptr)
1624                 {
1625                     einfo (_("%P: warning: could not find end of"
1626                                " S_THUNK32 record\n"));
1627                     bfd_set_error (bfd_error_bad_value);
1628                     return false;
1629                 }
1630 
1631               end = *buf - orig_buf + sizeof (uint32_t) + endptr - data;
1632               bfd_putl32 (end, &th->end);
1633 
1634               scope = *buf;
1635 
1636               memcpy (*buf, data, len);
1637               *buf += len;
1638 
1639               scope_level++;
1640 
1641               break;
1642             }
1643 
1644           case S_HEAPALLOCSITE:
1645             {
1646               struct heap_alloc_site *has = (struct heap_alloc_site *) data;
1647 
1648               if (len < sizeof (struct heap_alloc_site))
1649                 {
1650                     einfo (_("%P: warning: truncated CodeView record"
1651                                " S_HEAPALLOCSITE\n"));
1652                     bfd_set_error (bfd_error_bad_value);
1653                     return false;
1654                 }
1655 
1656               if (!remap_symbol_type (&has->type, map, num_types))
1657                 {
1658                     bfd_set_error (bfd_error_bad_value);
1659                     return false;
1660                 }
1661 
1662               memcpy (*buf, data, len);
1663               *buf += len;
1664 
1665               break;
1666             }
1667 
1668           case S_OBJNAME: /* just copy */
1669           case S_COMPILE3:
1670           case S_UNAMESPACE:
1671           case S_FRAMEPROC:
1672           case S_FRAMECOOKIE:
1673           case S_LABEL32:
1674           case S_DEFRANGE_REGISTER_REL:
1675           case S_DEFRANGE_FRAMEPOINTER_REL:
1676           case S_DEFRANGE_SUBFIELD_REGISTER:
1677           case S_DEFRANGE_FRAMEPOINTER_REL_FULL_SCOPE:
1678           case S_DEFRANGE_REGISTER:
1679             memcpy (*buf, data, len);
1680             *buf += len;
1681             break;
1682 
1683           default:
1684             einfo (_("%P: warning: unrecognized CodeView record %v\n"), type);
1685             bfd_set_error (bfd_error_bad_value);
1686             return false;
1687           }
1688 
1689       data += len;
1690       size -= len;
1691     }
1692 
1693   return true;
1694 }
1695 
1696 /* For a given symbol subsection, work out how much space to allocate in the
1697    result module stream.  This is different because we don't copy certain
1698    symbols, such as S_CONSTANT, and we skip over any procedures or data that
1699    have been GC'd out.  */
1700 static bool
calculate_symbols_size(uint8_t * data,uint32_t size,uint32_t * sym_size)1701 calculate_symbols_size (uint8_t *data, uint32_t size, uint32_t *sym_size)
1702 {
1703   unsigned int scope_level = 0;
1704 
1705   while (size >= sizeof (uint32_t))
1706     {
1707       uint16_t len = bfd_getl16 (data) + sizeof (uint16_t);
1708       uint16_t type = bfd_getl16 (data + sizeof (uint16_t));
1709 
1710       switch (type)
1711           {
1712           case S_LDATA32:
1713           case S_LTHREAD32:
1714             {
1715               struct datasym *d = (struct datasym *) data;
1716               uint16_t section;
1717 
1718               if (len < offsetof (struct datasym, name))
1719                 {
1720                     einfo (_("%P: warning: truncated CodeView record"
1721                                " S_LDATA32/S_LTHREAD32\n"));
1722                     return false;
1723                 }
1724 
1725               section = bfd_getl16 (&d->section);
1726 
1727               /* copy if not GC'd or within function */
1728               if (scope_level != 0 || section != 0)
1729                 *sym_size += len;
1730             }
1731 
1732           case S_GDATA32:
1733           case S_GTHREAD32:
1734           case S_CONSTANT:
1735             /* Not copied into symbols stream.  */
1736             break;
1737 
1738           case S_GPROC32:
1739           case S_LPROC32:
1740           case S_GPROC32_ID:
1741           case S_LPROC32_ID:
1742             {
1743               struct procsym *proc = (struct procsym *) data;
1744               uint16_t section;
1745 
1746               if (len < offsetof (struct procsym, name))
1747                 {
1748                     einfo (_("%P: warning: truncated CodeView record"
1749                                " S_GPROC32/S_LPROC32\n"));
1750                     return false;
1751                 }
1752 
1753               section = bfd_getl16 (&proc->section);
1754 
1755               if (section != 0)
1756                 {
1757                     *sym_size += len;
1758                 }
1759               else
1760                 {
1761                     uint8_t *endptr = find_end_of_scope (data, size);
1762 
1763                     if (!endptr)
1764                       {
1765                         einfo (_("%P: warning: could not find end of"
1766                                    " S_GPROC32/S_LPROC32 record\n"));
1767                         return false;
1768                       }
1769 
1770                     /* Skip to after S_END.  */
1771 
1772                     size -= endptr - data;
1773                     data = endptr;
1774 
1775                     len = bfd_getl16 (data) + sizeof (uint16_t);
1776 
1777                     data += len;
1778                     size -= len;
1779 
1780                     continue;
1781                 }
1782 
1783               scope_level++;
1784 
1785               break;
1786             }
1787 
1788           case S_UDT:
1789             if (scope_level != 0) /* only goes in symbols if local */
1790               *sym_size += len;
1791             break;
1792 
1793           case S_BLOCK32: /* always copied */
1794           case S_INLINESITE:
1795           case S_THUNK32:
1796             *sym_size += len;
1797             scope_level++;
1798             break;
1799 
1800           case S_END: /* always copied */
1801           case S_PROC_ID_END:
1802           case S_INLINESITE_END:
1803             *sym_size += len;
1804             scope_level--;
1805             break;
1806 
1807           case S_OBJNAME: /* always copied */
1808           case S_COMPILE3:
1809           case S_UNAMESPACE:
1810           case S_FRAMEPROC:
1811           case S_FRAMECOOKIE:
1812           case S_LABEL32:
1813           case S_BUILDINFO:
1814           case S_BPREL32:
1815           case S_REGISTER:
1816           case S_REGREL32:
1817           case S_LOCAL:
1818           case S_DEFRANGE_REGISTER_REL:
1819           case S_DEFRANGE_FRAMEPOINTER_REL:
1820           case S_DEFRANGE_SUBFIELD_REGISTER:
1821           case S_DEFRANGE_FRAMEPOINTER_REL_FULL_SCOPE:
1822           case S_DEFRANGE_REGISTER:
1823           case S_HEAPALLOCSITE:
1824             *sym_size += len;
1825             break;
1826 
1827           default:
1828             einfo (_("%P: warning: unrecognized CodeView record %v\n"), type);
1829             return false;
1830           }
1831 
1832       data += len;
1833       size -= len;
1834     }
1835 
1836   return true;
1837 }
1838 
1839 /* Parse the .debug$S section within an object file.  */
1840 static bool
handle_debugs_section(asection * s,bfd * mod,struct string_table * strings,uint8_t ** dataptr,uint32_t * sizeptr,struct mod_source_files * mod_source,bfd * abfd,uint8_t ** syms,uint32_t * sym_byte_size,struct type_entry ** map,uint32_t num_types,bfd * sym_rec_stream,struct globals * glob,uint16_t mod_num)1841 handle_debugs_section (asection *s, bfd *mod, struct string_table *strings,
1842                            uint8_t **dataptr, uint32_t *sizeptr,
1843                            struct mod_source_files *mod_source,
1844                            bfd *abfd, uint8_t **syms, uint32_t *sym_byte_size,
1845                            struct type_entry **map, uint32_t num_types,
1846                            bfd *sym_rec_stream, struct globals *glob,
1847                            uint16_t mod_num)
1848 {
1849   bfd_byte *data = NULL;
1850   size_t off;
1851   uint32_t c13_size = 0;
1852   char *string_table = NULL;
1853   uint8_t *buf, *bufptr, *symbuf, *symbufptr;
1854   uint32_t sym_size = 0;
1855 
1856   if (!bfd_get_full_section_contents (mod, s, &data))
1857     return false;
1858 
1859   if (!data)
1860     return false;
1861 
1862   /* Resolve relocations.  Addresses are stored within the .debug$S section as
1863      a .secidx, .secrel32 pair.  */
1864 
1865   if (s->flags & SEC_RELOC)
1866     {
1867       struct internal_reloc *relocs;
1868       struct internal_syment *symbols;
1869       asection **sectlist;
1870       unsigned int syment_count;
1871       int sect_num;
1872       struct external_syment *ext;
1873 
1874       syment_count = obj_raw_syment_count (mod);
1875 
1876       relocs =
1877           _bfd_coff_read_internal_relocs (mod, s, false, NULL, true, NULL);
1878 
1879       symbols = xmalloc (sizeof (struct internal_syment) * syment_count);
1880       sectlist = xmalloc (sizeof (asection *) * syment_count);
1881 
1882       ext = (struct external_syment *) (coff_data (mod)->external_syms);
1883 
1884       for (unsigned int i = 0; i < syment_count; i++)
1885           {
1886             bfd_coff_swap_sym_in (mod, &ext[i], &symbols[i]);
1887           }
1888 
1889       sect_num = 1;
1890 
1891       for (asection *sect = mod->sections; sect; sect = sect->next)
1892           {
1893             for (unsigned int i = 0; i < syment_count; i++)
1894               {
1895                 if (symbols[i].n_scnum == sect_num)
1896                     sectlist[i] = sect;
1897               }
1898 
1899             sect_num++;
1900           }
1901 
1902       if (!bfd_coff_relocate_section (abfd, coff_data (abfd)->link_info, mod,
1903                                               s, data, relocs, symbols, sectlist))
1904           {
1905             free (sectlist);
1906             free (symbols);
1907             free (data);
1908             return false;
1909           }
1910 
1911       free (sectlist);
1912       free (symbols);
1913     }
1914 
1915   if (bfd_getl32 (data) != CV_SIGNATURE_C13)
1916     {
1917       free (data);
1918       return true;
1919     }
1920 
1921   off = sizeof (uint32_t);
1922 
1923   /* calculate size */
1924 
1925   while (off + sizeof (uint32_t) <= s->size)
1926     {
1927       uint32_t type, size;
1928 
1929       type = bfd_getl32 (data + off);
1930 
1931       off += sizeof (uint32_t);
1932 
1933       if (off + sizeof (uint32_t) > s->size)
1934           {
1935             free (data);
1936             bfd_set_error (bfd_error_bad_value);
1937             return false;
1938           }
1939 
1940       size = bfd_getl32 (data + off);
1941 
1942       off += sizeof (uint32_t);
1943 
1944       if (off + size > s->size)
1945           {
1946             free (data);
1947             bfd_set_error (bfd_error_bad_value);
1948             return false;
1949           }
1950 
1951       switch (type)
1952           {
1953           case DEBUG_S_FILECHKSMS:
1954             c13_size += sizeof (uint32_t) + sizeof (uint32_t) + size;
1955 
1956             if (c13_size % sizeof (uint32_t))
1957               c13_size += sizeof (uint32_t) - (c13_size % sizeof (uint32_t));
1958 
1959             break;
1960 
1961           case DEBUG_S_STRINGTABLE:
1962             parse_string_table (data + off, size, strings);
1963 
1964             string_table = (char *) data + off;
1965 
1966             break;
1967 
1968           case DEBUG_S_LINES:
1969             {
1970               uint16_t sect;
1971 
1972               if (size < sizeof (uint32_t) + sizeof (uint16_t))
1973                 {
1974                     free (data);
1975                     bfd_set_error (bfd_error_bad_value);
1976                     return false;
1977                 }
1978 
1979               sect = bfd_getl16 (data + off + sizeof (uint32_t));
1980 
1981               /* Skip GC'd symbols.  */
1982               if (sect != 0)
1983                 {
1984                     c13_size += sizeof (uint32_t) + sizeof (uint32_t) + size;
1985 
1986                     if (c13_size % sizeof (uint32_t))
1987                       c13_size +=
1988                         sizeof (uint32_t) - (c13_size % sizeof (uint32_t));
1989                 }
1990 
1991               break;
1992             }
1993 
1994           case DEBUG_S_SYMBOLS:
1995             if (!calculate_symbols_size (data + off, size, &sym_size))
1996               {
1997                 free (data);
1998                 bfd_set_error (bfd_error_bad_value);
1999                 return false;
2000               }
2001 
2002             break;
2003           }
2004 
2005       off += size;
2006 
2007       if (off % sizeof (uint32_t))
2008           off += sizeof (uint32_t) - (off % sizeof (uint32_t));
2009     }
2010 
2011   if (sym_size % sizeof (uint32_t))
2012     sym_size += sizeof (uint32_t) - (sym_size % sizeof (uint32_t));
2013 
2014   if (c13_size == 0 && sym_size == 0)
2015     {
2016       free (data);
2017       return true;
2018     }
2019 
2020   /* copy data */
2021 
2022   buf = NULL;
2023   if (c13_size != 0)
2024     buf = xmalloc (c13_size);
2025   bufptr = buf;
2026 
2027   symbuf = NULL;
2028   if (sym_size != 0)
2029     symbuf = xmalloc (sym_size);
2030   symbufptr = symbuf;
2031 
2032   off = sizeof (uint32_t);
2033 
2034   while (off + sizeof (uint32_t) <= s->size)
2035     {
2036       uint32_t type, size;
2037 
2038       type = bfd_getl32 (data + off);
2039       off += sizeof (uint32_t);
2040 
2041       size = bfd_getl32 (data + off);
2042       off += sizeof (uint32_t);
2043 
2044       switch (type)
2045           {
2046           case DEBUG_S_FILECHKSMS:
2047             if (!copy_filechksms (data + off, size, string_table,
2048                                         strings, bufptr, mod_source))
2049               {
2050                 free (data);
2051                 free (symbuf);
2052                 return false;
2053               }
2054 
2055             bufptr += sizeof (uint32_t) + sizeof (uint32_t) + size;
2056 
2057             break;
2058 
2059           case DEBUG_S_LINES:
2060             {
2061               uint16_t sect;
2062 
2063               sect = bfd_getl16 (data + off + sizeof (uint32_t));
2064 
2065               /* Skip if GC'd.  */
2066               if (sect != 0)
2067                 {
2068                     bfd_putl32 (type, bufptr);
2069                     bufptr += sizeof (uint32_t);
2070 
2071                     bfd_putl32 (size, bufptr);
2072                     bufptr += sizeof (uint32_t);
2073 
2074                     memcpy (bufptr, data + off, size);
2075                     bufptr += size;
2076                 }
2077 
2078               break;
2079             }
2080 
2081           case DEBUG_S_SYMBOLS:
2082             if (!parse_symbols (data + off, size, &symbufptr, map, num_types,
2083                                     sym_rec_stream, glob, mod_num))
2084               {
2085                 free (data);
2086                 free (symbuf);
2087                 return false;
2088               }
2089 
2090             break;
2091           }
2092 
2093       off += size;
2094 
2095       if (off % sizeof (uint32_t))
2096           off += sizeof (uint32_t) - (off % sizeof (uint32_t));
2097     }
2098 
2099   free (data);
2100 
2101   if (buf)
2102     {
2103       if (*dataptr)
2104           {
2105             /* Append the C13 info to what's already there, if the module has
2106                multiple .debug$S sections.  */
2107 
2108             *dataptr = xrealloc (*dataptr, *sizeptr + c13_size);
2109             memcpy (*dataptr + *sizeptr, buf, c13_size);
2110 
2111             free (buf);
2112           }
2113       else
2114           {
2115             *dataptr = buf;
2116           }
2117 
2118       *sizeptr += c13_size;
2119     }
2120 
2121   if (symbuf)
2122     {
2123       if (*syms)
2124           {
2125             *syms = xrealloc (*syms, *sym_byte_size + sym_size);
2126             memcpy (*syms + *sym_byte_size, symbuf, sym_size);
2127 
2128             free (symbuf);
2129           }
2130       else
2131           {
2132             *syms = symbuf;
2133           }
2134 
2135       *sym_byte_size += sym_size;
2136     }
2137 
2138   return true;
2139 }
2140 
2141 /* Remap the type number stored in data from the per-module numbering to
2142    that of the deduplicated output list.  */
2143 static bool
remap_type(void * data,struct type_entry ** map,uint32_t type_num,uint32_t num_types)2144 remap_type (void *data, struct type_entry **map,
2145               uint32_t type_num, uint32_t num_types)
2146 {
2147   uint32_t type = bfd_getl32 (data);
2148 
2149   /* Ignore builtin types (those with IDs below 0x1000).  */
2150   if (type < TPI_FIRST_INDEX)
2151     return true;
2152 
2153   if (type >= TPI_FIRST_INDEX + type_num)
2154     {
2155       einfo (_("%P: CodeView type %v references other type %v not yet "
2156                  "declared\n"), TPI_FIRST_INDEX + type_num, type);
2157       return false;
2158     }
2159 
2160   if (type >= TPI_FIRST_INDEX + num_types)
2161     {
2162       einfo (_("%P: CodeView type %v references out of range type %v\n"),
2163                TPI_FIRST_INDEX + type_num, type);
2164       return false;
2165     }
2166 
2167   type = TPI_FIRST_INDEX + map[type - TPI_FIRST_INDEX]->index;
2168   bfd_putl32 (type, data);
2169 
2170   return true;
2171 }
2172 
2173 /* Determines whether the name of a struct, class, or union counts as
2174    "anonymous".  Non-anonymous types have a hash based on just the name,
2175    rather than the whole structure.  */
2176 static bool
is_name_anonymous(char * name,size_t len)2177 is_name_anonymous (char *name, size_t len)
2178 {
2179   static const char tag1[] = "<unnamed-tag>";
2180   static const char tag2[] = "__unnamed";
2181   static const char tag3[] = "::<unnamed-tag>";
2182   static const char tag4[] = "::__unnamed";
2183 
2184   if (len == sizeof (tag1) - 1 && !memcmp (name, tag1, sizeof (tag1) - 1))
2185     return true;
2186 
2187   if (len == sizeof (tag2) - 1 && !memcmp (name, tag2, sizeof (tag2) - 1))
2188     return true;
2189 
2190   if (len >= sizeof (tag3) - 1
2191       && !memcmp (name + len - sizeof (tag3) + 1, tag3, sizeof (tag3) - 1))
2192     return true;
2193 
2194   if (len >= sizeof (tag4) - 1
2195       && !memcmp (name + len - sizeof (tag4) + 1, tag4, sizeof (tag4) - 1))
2196     return true;
2197 
2198   return false;
2199 }
2200 
2201 /* Handle LF_UDT_SRC_LINE type entries, which are a special case.  These
2202    give the source file and line number for each user-defined type that is
2203    declared.  We parse these and emit instead an LF_UDT_MOD_SRC_LINE entry,
2204    which also includes the module number.  */
2205 static bool
handle_udt_src_line(uint8_t * data,uint16_t size,struct type_entry ** map,uint32_t type_num,uint32_t num_types,struct types * ids,uint16_t mod_num,struct string_table * strings)2206 handle_udt_src_line (uint8_t *data, uint16_t size, struct type_entry **map,
2207                          uint32_t type_num, uint32_t num_types,
2208                          struct types *ids, uint16_t mod_num,
2209                          struct string_table *strings)
2210 {
2211   struct lf_udt_src_line *usl = (struct lf_udt_src_line *) data;
2212   uint32_t orig_type, source_file_type;
2213   void **slot;
2214   hashval_t hash;
2215   struct type_entry *e, *type_e, *str_e;
2216   struct lf_udt_mod_src_line *umsl;
2217   struct lf_string_id *str;
2218   uint32_t source_file_offset;
2219 
2220   if (size < sizeof (struct lf_udt_src_line))
2221     {
2222       einfo (_("%P: warning: truncated CodeView type record"
2223                  " LF_UDT_SRC_LINE\n"));
2224       return false;
2225     }
2226 
2227   /* Check if LF_UDT_MOD_SRC_LINE already present for type, and return.  */
2228 
2229   orig_type = bfd_getl32 (&usl->type);
2230 
2231   if (orig_type < TPI_FIRST_INDEX ||
2232       orig_type >= TPI_FIRST_INDEX + num_types ||
2233       !map[orig_type - TPI_FIRST_INDEX])
2234     {
2235       einfo (_("%P: warning: CodeView type record LF_UDT_SRC_LINE"
2236                  " referred to unknown type %v\n"), orig_type);
2237       return false;
2238     }
2239 
2240   type_e = map[orig_type - TPI_FIRST_INDEX];
2241 
2242   /* Skip if type already declared in other module.  */
2243   if (type_e->has_udt_src_line)
2244     return true;
2245 
2246   if (!remap_type (&usl->type, map, type_num, num_types))
2247     return false;
2248 
2249   /* Extract string from source_file_type.  */
2250 
2251   source_file_type = bfd_getl32 (&usl->source_file_type);
2252 
2253   if (source_file_type < TPI_FIRST_INDEX ||
2254       source_file_type >= TPI_FIRST_INDEX + num_types ||
2255       !map[source_file_type - TPI_FIRST_INDEX])
2256     {
2257       einfo (_("%P: warning: CodeView type record LF_UDT_SRC_LINE"
2258                  " referred to unknown string %v\n"), source_file_type);
2259       return false;
2260     }
2261 
2262   str_e = map[source_file_type - TPI_FIRST_INDEX];
2263 
2264   if (bfd_getl16 (str_e->data + sizeof (uint16_t)) != LF_STRING_ID)
2265     {
2266       einfo (_("%P: warning: CodeView type record LF_UDT_SRC_LINE"
2267                  " pointed to unexpected record type\n"));
2268       return false;
2269     }
2270 
2271   str = (struct lf_string_id *) str_e->data;
2272 
2273   /* Add string to string table.  */
2274 
2275   source_file_offset = add_string (str->string, strlen (str->string),
2276                                            strings);
2277 
2278   /* Add LF_UDT_MOD_SRC_LINE entry.  */
2279 
2280   size = sizeof (struct lf_udt_mod_src_line);
2281 
2282   e = xmalloc (offsetof (struct type_entry, data) + size);
2283 
2284   e->next = NULL;
2285   e->index = ids->num_types;
2286   e->has_udt_src_line = false;
2287 
2288   /* LF_UDT_MOD_SRC_LINE use calc_hash on the type number, rather than
2289      the crc32 used for type hashes elsewhere.  */
2290   e->cv_hash = calc_hash ((char *) &usl->type, sizeof (uint32_t));
2291 
2292   type_e->has_udt_src_line = true;
2293 
2294   umsl = (struct lf_udt_mod_src_line *) e->data;
2295 
2296   bfd_putl16 (size - sizeof (uint16_t), &umsl->size);
2297   bfd_putl16 (LF_UDT_MOD_SRC_LINE, &umsl->kind);
2298   memcpy (&umsl->type, &usl->type, sizeof (uint32_t));
2299   bfd_putl32 (source_file_offset, &umsl->source_file_string);
2300   memcpy (&umsl->line_no, &usl->line_no, sizeof (uint32_t));
2301   bfd_putl16 (mod_num + 1, &umsl->module_no);
2302 
2303   hash = iterative_hash (e->data, size, 0);
2304 
2305   slot = htab_find_slot_with_hash (ids->hashmap, data, hash, INSERT);
2306   if (!slot)
2307     {
2308       free (e);
2309       return false;
2310     }
2311 
2312   if (*slot)
2313     {
2314       free (e);
2315       einfo (_("%P: warning: duplicate CodeView type record "
2316                  "LF_UDT_MOD_SRC_LINE\n"));
2317       return false;
2318     }
2319 
2320   *slot = e;
2321 
2322   if (ids->last)
2323     ids->last->next = e;
2324   else
2325     ids->first = e;
2326 
2327   ids->last = e;
2328 
2329   map[type_num] = e;
2330 
2331   ids->num_types++;
2332 
2333   return true;
2334 }
2335 
2336 /* Parse a type definition in the .debug$T section.  We remap the numbers
2337    of any referenced types, and if the type is not a duplicate of one
2338    already seen add it to types (for TPI types) or ids (for IPI types).  */
2339 static bool
handle_type(uint8_t * data,struct type_entry ** map,uint32_t type_num,uint32_t num_types,struct types * types,struct types * ids,uint16_t mod_num,struct string_table * strings)2340 handle_type (uint8_t *data, struct type_entry **map, uint32_t type_num,
2341                uint32_t num_types, struct types *types,
2342                struct types *ids, uint16_t mod_num,
2343                struct string_table *strings)
2344 {
2345   uint16_t size, type;
2346   void **slot;
2347   hashval_t hash;
2348   bool other_hash = false;
2349   uint32_t cv_hash;
2350   struct types *t;
2351   bool ipi = false;
2352 
2353   size = bfd_getl16 (data) + sizeof (uint16_t);
2354   type = bfd_getl16 (data + sizeof (uint16_t));
2355 
2356   switch (type)
2357     {
2358     case LF_MODIFIER:
2359       {
2360           struct lf_modifier *mod = (struct lf_modifier *) data;
2361 
2362           if (size < offsetof (struct lf_modifier, modifier))
2363             {
2364               einfo (_("%P: warning: truncated CodeView type record "
2365                          "LF_MODIFIER\n"));
2366               return false;
2367             }
2368 
2369           if (!remap_type (&mod->base_type, map, type_num, num_types))
2370             return false;
2371 
2372           break;
2373       }
2374 
2375     case LF_POINTER:
2376       {
2377           struct lf_pointer *ptr = (struct lf_pointer *) data;
2378 
2379           if (size < offsetof (struct lf_pointer, attributes))
2380             {
2381               einfo (_("%P: warning: truncated CodeView type record"
2382                          " LF_POINTER\n"));
2383               return false;
2384             }
2385 
2386           if (!remap_type (&ptr->base_type, map, type_num, num_types))
2387             return false;
2388 
2389           break;
2390       }
2391 
2392     case LF_PROCEDURE:
2393       {
2394           struct lf_procedure *proc = (struct lf_procedure *) data;
2395 
2396           if (size < sizeof (struct lf_procedure))
2397             {
2398               einfo (_("%P: warning: truncated CodeView type record"
2399                          " LF_PROCEDURE\n"));
2400               return false;
2401             }
2402 
2403           if (!remap_type (&proc->return_type, map, type_num, num_types))
2404             return false;
2405 
2406           if (!remap_type (&proc->arglist, map, type_num, num_types))
2407             return false;
2408 
2409           break;
2410       }
2411 
2412     case LF_MFUNCTION:
2413       {
2414           struct lf_mfunction *func = (struct lf_mfunction *) data;
2415 
2416           if (size < sizeof (struct lf_procedure))
2417             {
2418               einfo (_("%P: warning: truncated CodeView type record"
2419                          " LF_MFUNCTION\n"));
2420               return false;
2421             }
2422 
2423           if (!remap_type (&func->return_type, map, type_num, num_types))
2424             return false;
2425 
2426           if (!remap_type (&func->containing_class_type, map, type_num,
2427                                num_types))
2428             return false;
2429 
2430           if (!remap_type (&func->this_type, map, type_num, num_types))
2431             return false;
2432 
2433           if (!remap_type (&func->arglist, map, type_num, num_types))
2434             return false;
2435 
2436           break;
2437       }
2438 
2439     case LF_ARGLIST:
2440       {
2441           uint32_t num_entries;
2442           struct lf_arglist *al = (struct lf_arglist *) data;
2443 
2444           if (size < offsetof (struct lf_arglist, args))
2445             {
2446               einfo (_("%P: warning: truncated CodeView type record"
2447                          " LF_ARGLIST\n"));
2448               return false;
2449             }
2450 
2451           num_entries = bfd_getl32 (&al->num_entries);
2452 
2453           if (size < offsetof (struct lf_arglist, args)
2454                        + (num_entries * sizeof (uint32_t)))
2455             {
2456               einfo (_("%P: warning: truncated CodeView type record"
2457                          " LF_ARGLIST\n"));
2458               return false;
2459             }
2460 
2461           for (uint32_t i = 0; i < num_entries; i++)
2462             {
2463               if (!remap_type (&al->args[i], map, type_num, num_types))
2464                 return false;
2465             }
2466 
2467           break;
2468       }
2469 
2470     case LF_FIELDLIST:
2471       {
2472           uint16_t left = size - sizeof (uint16_t) - sizeof (uint16_t);
2473           uint8_t *ptr = data + sizeof (uint16_t) + sizeof (uint16_t);
2474 
2475           while (left > 0)
2476             {
2477               uint16_t subtype;
2478 
2479               if (left < sizeof (uint16_t))
2480                 {
2481                     einfo (_("%P: warning: truncated CodeView type record"
2482                                " LF_FIELDLIST\n"));
2483                     return false;
2484                 }
2485 
2486               subtype = bfd_getl16 (ptr);
2487 
2488               switch (subtype)
2489                 {
2490                 case LF_MEMBER:
2491                     {
2492                       struct lf_member *mem = (struct lf_member *) ptr;
2493                       uint16_t offset;
2494                       size_t name_len, subtype_len;
2495 
2496                       if (left < offsetof (struct lf_member, name))
2497                         {
2498                           einfo (_("%P: warning: truncated CodeView type record"
2499                                      " LF_MEMBER\n"));
2500                           return false;
2501                         }
2502 
2503                       if (!remap_type (&mem->type, map, type_num, num_types))
2504                         return false;
2505 
2506                       subtype_len = offsetof (struct lf_member, name);
2507 
2508                       offset = bfd_getl16 (&mem->offset);
2509 
2510                       /* If offset >= 0x8000, actual value follows.  */
2511                       if (offset >= 0x8000)
2512                         {
2513                           unsigned int param_len = extended_value_len (offset);
2514 
2515                           if (param_len == 0)
2516                               {
2517                                 einfo (_("%P: warning: unhandled type %v within"
2518                                            " LF_MEMBER\n"), offset);
2519                                 return false;
2520                               }
2521 
2522                           subtype_len += param_len;
2523 
2524                           if (left < subtype_len)
2525                               {
2526                                 einfo (_("%P: warning: truncated CodeView type record"
2527                                           " LF_MEMBER\n"));
2528                                 return false;
2529                               }
2530                         }
2531 
2532                       name_len =
2533                         strnlen ((char *) mem + subtype_len, left - subtype_len);
2534 
2535                       if (name_len == left - offsetof (struct lf_member, name))
2536                         {
2537                           einfo (_("%P: warning: name for LF_MEMBER has no"
2538                                      " terminating zero\n"));
2539                           return false;
2540                         }
2541 
2542                       name_len++;
2543 
2544                       subtype_len += name_len;
2545 
2546                       if (subtype_len % 4 != 0)
2547                         subtype_len += 4 - (subtype_len % 4);
2548 
2549                       if (left < subtype_len)
2550                         {
2551                           einfo (_("%P: warning: truncated CodeView type record"
2552                                      " LF_FIELDLIST\n"));
2553                           return false;
2554                         }
2555 
2556                       ptr += subtype_len;
2557                       left -= subtype_len;
2558 
2559                       break;
2560                     }
2561 
2562                 case LF_ENUMERATE:
2563                     {
2564                       struct lf_enumerate *en = (struct lf_enumerate *) ptr;
2565                       size_t name_len, subtype_len;
2566                       uint16_t val;
2567 
2568                       if (left < offsetof (struct lf_enumerate, name))
2569                         {
2570                           einfo (_("%P: warning: truncated CodeView type record"
2571                                      " LF_ENUMERATE\n"));
2572                           return false;
2573                         }
2574 
2575                       subtype_len = offsetof (struct lf_enumerate, name);
2576 
2577                       val = bfd_getl16 (&en->value);
2578 
2579                       /* If val >= 0x8000, the actual value immediately follows.  */
2580                       if (val >= 0x8000)
2581                         {
2582                           unsigned int param_len = extended_value_len (val);
2583 
2584                           if (param_len == 0)
2585                               {
2586                                 einfo (_("%P: warning: unhandled type %v within"
2587                                            " LF_ENUMERATE\n"), val);
2588                                 return false;
2589                               }
2590 
2591                           if (left < subtype_len + param_len)
2592                               {
2593                                 einfo (_("%P: warning: truncated CodeView type"
2594                                            " record LF_ENUMERATE\n"));
2595                                 return false;
2596                               }
2597 
2598                           subtype_len += param_len;
2599                         }
2600 
2601                       name_len = strnlen ((char *) ptr + subtype_len,
2602                                               left - subtype_len);
2603 
2604                       if (name_len == left - offsetof (struct lf_enumerate, name))
2605                         {
2606                           einfo (_("%P: warning: name for LF_ENUMERATE has no"
2607                                      " terminating zero\n"));
2608                           return false;
2609                         }
2610 
2611                       name_len++;
2612 
2613                       subtype_len += name_len;
2614 
2615                       if (subtype_len % 4 != 0)
2616                         subtype_len += 4 - (subtype_len % 4);
2617 
2618                       if (left < subtype_len)
2619                         {
2620                           einfo (_("%P: warning: truncated CodeView type record"
2621                                      " LF_ENUMERATE\n"));
2622                           return false;
2623                         }
2624 
2625                       ptr += subtype_len;
2626                       left -= subtype_len;
2627 
2628                       break;
2629                     }
2630 
2631                 case LF_INDEX:
2632                     {
2633                       struct lf_index *ind = (struct lf_index *) ptr;
2634 
2635                       if (left < sizeof (struct lf_index))
2636                         {
2637                           einfo (_("%P: warning: truncated CodeView type record"
2638                                      " LF_INDEX\n"));
2639                           return false;
2640                         }
2641 
2642                       if (!remap_type (&ind->index, map, type_num, num_types))
2643                         return false;
2644 
2645                       ptr += sizeof (struct lf_index);
2646                       left -= sizeof (struct lf_index);
2647 
2648                       break;
2649                     }
2650 
2651                 case LF_ONEMETHOD:
2652                     {
2653                       struct lf_onemethod *meth = (struct lf_onemethod *) ptr;
2654                       size_t name_len, subtype_len;
2655 
2656                       if (left < offsetof (struct lf_onemethod, name))
2657                         {
2658                           einfo (_("%P: warning: truncated CodeView type record"
2659                                      " LF_ONEMETHOD\n"));
2660                           return false;
2661                         }
2662 
2663                       if (!remap_type (&meth->method_type, map, type_num,
2664                                            num_types))
2665                         return false;
2666 
2667                       name_len =
2668                         strnlen (meth->name,
2669                                    left - offsetof (struct lf_onemethod, name));
2670 
2671                       if (name_len == left - offsetof (struct lf_onemethod, name))
2672                         {
2673                           einfo (_("%P: warning: name for LF_ONEMETHOD has no"
2674                                      " terminating zero\n"));
2675                           return false;
2676                         }
2677 
2678                       name_len++;
2679 
2680                       subtype_len = offsetof (struct lf_onemethod, name)
2681                                         + name_len;
2682 
2683                       if (subtype_len % 4 != 0)
2684                         subtype_len += 4 - (subtype_len % 4);
2685 
2686                       if (left < subtype_len)
2687                         {
2688                           einfo (_("%P: warning: truncated CodeView type record"
2689                                      " LF_FIELDLIST\n"));
2690                           return false;
2691                         }
2692 
2693                       ptr += subtype_len;
2694                       left -= subtype_len;
2695 
2696                       break;
2697                     }
2698 
2699                 case LF_METHOD:
2700                     {
2701                       struct lf_method *meth = (struct lf_method *) ptr;
2702                       size_t name_len, subtype_len;
2703 
2704                       if (left < offsetof (struct lf_method, name))
2705                         {
2706                           einfo (_("%P: warning: truncated CodeView type record"
2707                                      " LF_METHOD\n"));
2708                           return false;
2709                         }
2710 
2711                       if (!remap_type (&meth->method_list, map, type_num,
2712                                            num_types))
2713                         return false;
2714 
2715                       name_len =
2716                         strnlen (meth->name,
2717                                    left - offsetof (struct lf_method, name));
2718 
2719                       if (name_len == left - offsetof (struct lf_method, name))
2720                         {
2721                           einfo (_("%P: warning: name for LF_METHOD has no"
2722                                      " terminating zero\n"));
2723                           return false;
2724                         }
2725 
2726                       name_len++;
2727 
2728                       subtype_len = offsetof (struct lf_method, name) + name_len;
2729 
2730                       if (subtype_len % 4 != 0)
2731                         subtype_len += 4 - (subtype_len % 4);
2732 
2733                       if (left < subtype_len)
2734                         {
2735                           einfo (_("%P: warning: truncated CodeView type record"
2736                                      " LF_FIELDLIST\n"));
2737                           return false;
2738                         }
2739 
2740                       ptr += subtype_len;
2741                       left -= subtype_len;
2742 
2743                       break;
2744                     }
2745 
2746                 case LF_BCLASS:
2747                     {
2748                       struct lf_bclass *bc = (struct lf_bclass *) ptr;
2749                       size_t subtype_len;
2750                       uint16_t offset;
2751 
2752                       if (left < sizeof (struct lf_bclass))
2753                         {
2754                           einfo (_("%P: warning: truncated CodeView type record"
2755                                      " LF_BCLASS\n"));
2756                           return false;
2757                         }
2758 
2759                       if (!remap_type (&bc->base_class_type, map, type_num,
2760                                            num_types))
2761                         return false;
2762 
2763                       subtype_len = sizeof (struct lf_bclass);
2764 
2765                       offset = bfd_getl16 (&bc->offset);
2766 
2767                       /* If offset >= 0x8000, actual value follows.  */
2768                       if (offset >= 0x8000)
2769                         {
2770                           unsigned int param_len = extended_value_len (offset);
2771 
2772                           if (param_len == 0)
2773                               {
2774                                 einfo (_("%P: warning: unhandled type %v within"
2775                                            " LF_BCLASS\n"), offset);
2776                                 return false;
2777                               }
2778 
2779                           subtype_len += param_len;
2780 
2781                           if (left < subtype_len)
2782                               {
2783                                 einfo (_("%P: warning: truncated CodeView type record"
2784                                            " LF_BCLASS\n"));
2785                                 return false;
2786                               }
2787                         }
2788 
2789                       if (subtype_len % 4 != 0)
2790                         subtype_len += 4 - (subtype_len % 4);
2791 
2792                       if (left < subtype_len)
2793                         {
2794                           einfo (_("%P: warning: truncated CodeView type record"
2795                                      " LF_BCLASS\n"));
2796                           return false;
2797                         }
2798 
2799                       ptr += subtype_len;
2800                       left -= subtype_len;
2801 
2802                       break;
2803                     }
2804 
2805                 case LF_VFUNCTAB:
2806                     {
2807                       struct lf_vfunctab *vft = (struct lf_vfunctab *) ptr;
2808 
2809                       if (left < sizeof (struct lf_vfunctab))
2810                         {
2811                           einfo (_("%P: warning: truncated CodeView type record"
2812                                      " LF_VFUNCTAB\n"));
2813                           return false;
2814                         }
2815 
2816                       if (!remap_type (&vft->type, map, type_num, num_types))
2817                         return false;
2818 
2819                       ptr += sizeof (struct lf_vfunctab);
2820                       left -= sizeof (struct lf_vfunctab);
2821 
2822                       break;
2823                     }
2824 
2825                 case LF_VBCLASS:
2826                 case LF_IVBCLASS:
2827                     {
2828                       struct lf_vbclass *vbc = (struct lf_vbclass *) ptr;
2829                       size_t subtype_len;
2830                       uint16_t offset;
2831 
2832                       if (left < sizeof (struct lf_vbclass))
2833                         {
2834                           einfo (_("%P: warning: truncated CodeView type record"
2835                                      " LF_VBCLASS/LF_IVBCLASS\n"));
2836                           return false;
2837                         }
2838 
2839                       if (!remap_type (&vbc->base_class_type, map, type_num,
2840                                            num_types))
2841                         return false;
2842 
2843                       if (!remap_type (&vbc->virtual_base_pointer_type, map,
2844                                            type_num, num_types))
2845                         return false;
2846 
2847                       subtype_len = offsetof (struct lf_vbclass,
2848                                                     virtual_base_vbtable_offset);
2849 
2850                       offset = bfd_getl16 (&vbc->virtual_base_pointer_offset);
2851 
2852                       /* If offset >= 0x8000, actual value follows.  */
2853                       if (offset >= 0x8000)
2854                         {
2855                           unsigned int param_len = extended_value_len (offset);
2856 
2857                           if (param_len == 0)
2858                               {
2859                                 einfo (_("%P: warning: unhandled type %v within"
2860                                            " LF_VBCLASS/LF_IVBCLASS\n"), offset);
2861                                 return false;
2862                               }
2863 
2864                           subtype_len += param_len;
2865 
2866                           if (left < subtype_len)
2867                               {
2868                                 einfo (_("%P: warning: truncated CodeView type record"
2869                                            " LF_VBCLASS/LF_IVBCLASS\n"));
2870                                 return false;
2871                               }
2872                         }
2873 
2874                       offset = bfd_getl16 ((char *)vbc + subtype_len);
2875                       subtype_len += sizeof (uint16_t);
2876 
2877                       /* If offset >= 0x8000, actual value follows.  */
2878                       if (offset >= 0x8000)
2879                         {
2880                           unsigned int param_len = extended_value_len (offset);
2881 
2882                           if (param_len == 0)
2883                               {
2884                                 einfo (_("%P: warning: unhandled type %v within"
2885                                            " LF_VBCLASS/LF_IVBCLASS\n"), offset);
2886                                 return false;
2887                               }
2888 
2889                           subtype_len += param_len;
2890 
2891                           if (left < subtype_len)
2892                               {
2893                                 einfo (_("%P: warning: truncated CodeView type record"
2894                                            " LF_VBCLASS/LF_IVBCLASS\n"));
2895                                 return false;
2896                               }
2897                         }
2898 
2899                       if (subtype_len % 4 != 0)
2900                         subtype_len += 4 - (subtype_len % 4);
2901 
2902                       if (left < subtype_len)
2903                         {
2904                           einfo (_("%P: warning: truncated CodeView type record"
2905                                      " LF_VBCLASS/LF_IVBCLASS\n"));
2906                           return false;
2907                         }
2908 
2909                       ptr += subtype_len;
2910                       left -= subtype_len;
2911 
2912                       break;
2913                     }
2914 
2915                 case LF_STMEMBER:
2916                     {
2917                       struct lf_static_member *st =
2918                         (struct lf_static_member *) ptr;
2919                       size_t name_len, subtype_len;
2920 
2921                       if (left < offsetof (struct lf_static_member, name))
2922                         {
2923                           einfo (_("%P: warning: truncated CodeView type record"
2924                                      " LF_STMEMBER\n"));
2925                           return false;
2926                         }
2927 
2928                       if (!remap_type (&st->type, map, type_num, num_types))
2929                         return false;
2930 
2931                       name_len =
2932                         strnlen (st->name,
2933                                    left - offsetof (struct lf_static_member, name));
2934 
2935                       if (name_len == left
2936                                           - offsetof (struct lf_static_member, name))
2937                         {
2938                           einfo (_("%P: warning: name for LF_STMEMBER has no"
2939                                      " terminating zero\n"));
2940                           return false;
2941                         }
2942 
2943                       name_len++;
2944 
2945                       subtype_len = offsetof (struct lf_static_member, name)
2946                                         + name_len;
2947 
2948                       if (subtype_len % 4 != 0)
2949                         subtype_len += 4 - (subtype_len % 4);
2950 
2951                       if (left < subtype_len)
2952                         {
2953                           einfo (_("%P: warning: truncated CodeView type record"
2954                                      " LF_FIELDLIST\n"));
2955                           return false;
2956                         }
2957 
2958                       ptr += subtype_len;
2959                       left -= subtype_len;
2960 
2961                       break;
2962                     }
2963 
2964                 case LF_NESTTYPE:
2965                     {
2966                       struct lf_nest_type *nest = (struct lf_nest_type *) ptr;
2967                       size_t name_len, subtype_len;
2968 
2969                       if (left < offsetof (struct lf_nest_type, name))
2970                         {
2971                           einfo (_("%P: warning: truncated CodeView type record"
2972                                      " LF_NESTTYPE\n"));
2973                           return false;
2974                         }
2975 
2976                       if (!remap_type (&nest->type, map, type_num, num_types))
2977                         return false;
2978 
2979                       name_len =
2980                         strnlen (nest->name,
2981                                    left - offsetof (struct lf_nest_type, name));
2982 
2983                       if (name_len == left - offsetof (struct lf_nest_type, name))
2984                         {
2985                           einfo (_("%P: warning: name for LF_NESTTYPE has no"
2986                                      " terminating zero\n"));
2987                           return false;
2988                         }
2989 
2990                       name_len++;
2991 
2992                       subtype_len = offsetof (struct lf_nest_type, name)
2993                                         + name_len;
2994 
2995                       if (subtype_len % 4 != 0)
2996                         subtype_len += 4 - (subtype_len % 4);
2997 
2998                       if (left < subtype_len)
2999                         {
3000                           einfo (_("%P: warning: truncated CodeView type record"
3001                                      " LF_FIELDLIST\n"));
3002                           return false;
3003                         }
3004 
3005                       ptr += subtype_len;
3006                       left -= subtype_len;
3007 
3008                       break;
3009                     }
3010 
3011                 default:
3012                     einfo (_("%P: warning: unrecognized CodeView subtype %v\n"),
3013                            subtype);
3014                     return false;
3015                 }
3016             }
3017 
3018           break;
3019       }
3020 
3021     case LF_BITFIELD:
3022       {
3023           struct lf_bitfield *bf = (struct lf_bitfield *) data;
3024 
3025           if (size < offsetof (struct lf_bitfield, length))
3026             {
3027               einfo (_("%P: warning: truncated CodeView type record"
3028                          " LF_BITFIELD\n"));
3029               return false;
3030             }
3031 
3032           if (!remap_type (&bf->base_type, map, type_num, num_types))
3033             return false;
3034 
3035           break;
3036       }
3037 
3038     case LF_METHODLIST:
3039       {
3040           struct lf_methodlist *ml = (struct lf_methodlist *) data;
3041           unsigned int num_entries;
3042 
3043           if (size < offsetof (struct lf_methodlist, entries))
3044             {
3045               einfo (_("%P: warning: truncated CodeView type record"
3046                          " LF_METHODLIST\n"));
3047               return false;
3048             }
3049 
3050           if ((size - offsetof (struct lf_methodlist, entries))
3051               % sizeof (struct lf_methodlist_entry))
3052             {
3053               einfo (_("%P: warning: malformed CodeView type record"
3054                          " LF_METHODLIST\n"));
3055               return false;
3056             }
3057 
3058           num_entries = (size - offsetof (struct lf_methodlist, entries))
3059                           / sizeof (struct lf_methodlist_entry);
3060 
3061           for (unsigned int i = 0; i < num_entries; i++)
3062             {
3063               if (!remap_type (&ml->entries[i].method_type, map,
3064                                    type_num, num_types))
3065                 return false;
3066             }
3067 
3068           break;
3069       }
3070 
3071     case LF_ARRAY:
3072       {
3073           struct lf_array *arr = (struct lf_array *) data;
3074 
3075           if (size < offsetof (struct lf_array, length_in_bytes))
3076             {
3077               einfo (_("%P: warning: truncated CodeView type record"
3078                          " LF_ARRAY\n"));
3079               return false;
3080             }
3081 
3082           if (!remap_type (&arr->element_type, map, type_num, num_types))
3083             return false;
3084 
3085           if (!remap_type (&arr->index_type, map, type_num, num_types))
3086             return false;
3087 
3088           break;
3089       }
3090 
3091     case LF_CLASS:
3092     case LF_STRUCTURE:
3093       {
3094           struct lf_class *cl = (struct lf_class *) data;
3095           uint16_t prop, num_bytes;
3096           size_t name_len, name_off;
3097 
3098           if (size < offsetof (struct lf_class, name))
3099             {
3100               einfo (_("%P: warning: truncated CodeView type record"
3101                          " LF_CLASS/LF_STRUCTURE\n"));
3102               return false;
3103             }
3104 
3105           if (!remap_type (&cl->field_list, map, type_num, num_types))
3106             return false;
3107 
3108           if (!remap_type (&cl->derived_from, map, type_num, num_types))
3109             return false;
3110 
3111           if (!remap_type (&cl->vshape, map, type_num, num_types))
3112             return false;
3113 
3114           name_off = offsetof (struct lf_class, name);
3115 
3116           num_bytes = bfd_getl16 (&cl->length);
3117 
3118           /* If num_bytes >= 0x8000, actual value follows.  */
3119           if (num_bytes >= 0x8000)
3120             {
3121               unsigned int param_len = extended_value_len (num_bytes);
3122 
3123               if (param_len == 0)
3124                 {
3125                     einfo (_("%P: warning: unhandled type %v within"
3126                                " LF_CLASS/LF_STRUCTURE\n"), num_bytes);
3127                     return false;
3128                 }
3129 
3130               name_off += param_len;
3131 
3132               if (size < name_off)
3133                 {
3134                     einfo (_("%P: warning: truncated CodeView type record"
3135                                " LF_CLASS/LF_STRUCTURE\n"));
3136                     return false;
3137                 }
3138             }
3139 
3140           name_len = strnlen ((char *) cl + name_off, size - name_off);
3141 
3142           if (name_len == size - name_off)
3143             {
3144               einfo (_("%P: warning: name for LF_CLASS/LF_STRUCTURE has no"
3145                          " terminating zero\n"));
3146               return false;
3147             }
3148 
3149           prop = bfd_getl16 (&cl->properties);
3150 
3151           if (prop & CV_PROP_HAS_UNIQUE_NAME)
3152             {
3153               /* Structure has another name following first one.  */
3154 
3155               size_t len = name_off + name_len + 1;
3156               size_t unique_name_len;
3157 
3158               unique_name_len = strnlen ((char *) cl + name_off + name_len + 1,
3159                                                size - len);
3160 
3161               if (unique_name_len == size - len)
3162                 {
3163                     einfo (_("%P: warning: unique name for LF_CLASS/LF_STRUCTURE"
3164                                " has no terminating zero\n"));
3165                     return false;
3166                 }
3167             }
3168 
3169           if (!(prop & (CV_PROP_FORWARD_REF | CV_PROP_SCOPED))
3170               && !is_name_anonymous ((char *) cl + name_off, name_len))
3171             {
3172               other_hash = true;
3173               cv_hash = crc32 ((uint8_t *) cl + name_off, name_len);
3174             }
3175 
3176           break;
3177       }
3178 
3179     case LF_UNION:
3180       {
3181           struct lf_union *un = (struct lf_union *) data;
3182           uint16_t prop, num_bytes;
3183           size_t name_len, name_off;
3184 
3185           if (size < offsetof (struct lf_union, name))
3186             {
3187               einfo (_("%P: warning: truncated CodeView type record"
3188                          " LF_UNION\n"));
3189               return false;
3190             }
3191 
3192           if (!remap_type (&un->field_list, map, type_num, num_types))
3193             return false;
3194 
3195           name_off = offsetof (struct lf_union, name);
3196 
3197           num_bytes = bfd_getl16 (&un->length);
3198 
3199           /* If num_bytes >= 0x8000, actual value follows.  */
3200           if (num_bytes >= 0x8000)
3201             {
3202               unsigned int param_len = extended_value_len (num_bytes);
3203 
3204               if (param_len == 0)
3205                 {
3206                     einfo (_("%P: warning: unhandled type %v within"
3207                                " LF_UNION\n"), num_bytes);
3208                     return false;
3209                 }
3210 
3211               name_off += param_len;
3212 
3213               if (size < name_off)
3214                 {
3215                     einfo (_("%P: warning: truncated CodeView type record"
3216                                " LF_UNION\n"));
3217                     return false;
3218                 }
3219             }
3220 
3221           name_len = strnlen ((char *) un + name_off, size - name_off);
3222 
3223           if (name_len == size - name_off)
3224             {
3225               einfo (_("%P: warning: name for LF_UNION has no"
3226                          " terminating zero\n"));
3227               return false;
3228             }
3229 
3230           prop = bfd_getl16 (&un->properties);
3231 
3232           if (prop & CV_PROP_HAS_UNIQUE_NAME)
3233             {
3234               /* Structure has another name following first one.  */
3235 
3236               size_t len = name_off + name_len + 1;
3237               size_t unique_name_len;
3238 
3239               unique_name_len = strnlen ((char *) un + name_off + name_len + 1,
3240                                                size - len);
3241 
3242               if (unique_name_len == size - len)
3243                 {
3244                     einfo (_("%P: warning: unique name for LF_UNION has"
3245                                " no terminating zero\n"));
3246                     return false;
3247                 }
3248             }
3249 
3250           if (!(prop & (CV_PROP_FORWARD_REF | CV_PROP_SCOPED))
3251               && !is_name_anonymous ((char *) un + name_off, name_len))
3252             {
3253               other_hash = true;
3254               cv_hash = crc32 ((uint8_t *) un + name_off, name_len);
3255             }
3256 
3257           break;
3258       }
3259 
3260     case LF_ENUM:
3261       {
3262           struct lf_enum *en = (struct lf_enum *) data;
3263           uint16_t prop;
3264           size_t name_len;
3265 
3266           if (size < offsetof (struct lf_enum, name))
3267             {
3268               einfo (_("%P: warning: truncated CodeView type record"
3269                          " LF_ENUM\n"));
3270               return false;
3271             }
3272 
3273           if (!remap_type (&en->underlying_type, map, type_num, num_types))
3274             return false;
3275 
3276           if (!remap_type (&en->field_list, map, type_num, num_types))
3277             return false;
3278 
3279           name_len = strnlen (en->name, size - offsetof (struct lf_enum, name));
3280 
3281           if (name_len == size - offsetof (struct lf_enum, name))
3282             {
3283               einfo (_("%P: warning: name for LF_ENUM has no"
3284                          " terminating zero\n"));
3285               return false;
3286             }
3287 
3288           prop = bfd_getl16 (&en->properties);
3289 
3290           if (prop & CV_PROP_HAS_UNIQUE_NAME)
3291             {
3292               /* Structure has another name following first one.  */
3293 
3294               size_t len = offsetof (struct lf_enum, name) + name_len + 1;
3295               size_t unique_name_len;
3296 
3297               unique_name_len = strnlen (en->name + name_len + 1, size - len);
3298 
3299               if (unique_name_len == size - len)
3300                 {
3301                     einfo (_("%P: warning: unique name for LF_ENUM has"
3302                                " no terminating zero\n"));
3303                     return false;
3304                 }
3305             }
3306 
3307           break;
3308       }
3309 
3310     case LF_VTSHAPE:
3311       /* Does not reference any types, nothing to be done.  */
3312       break;
3313 
3314     case LF_VFTABLE:
3315       {
3316           struct lf_vftable *vft = (struct lf_vftable *) data;
3317 
3318           if (size < offsetof (struct lf_vftable, names))
3319             {
3320               einfo (_("%P: warning: truncated CodeView type record"
3321                          " LF_VFTABLE\n"));
3322               return false;
3323             }
3324 
3325           if (!remap_type (&vft->type, map, type_num, num_types))
3326             return false;
3327 
3328           if (!remap_type (&vft->base_vftable, map, type_num, num_types))
3329             return false;
3330 
3331           break;
3332       }
3333 
3334     case LF_STRING_ID:
3335       {
3336           struct lf_string_id *str = (struct lf_string_id *) data;
3337           size_t string_len;
3338 
3339           if (size < offsetof (struct lf_string_id, string))
3340             {
3341               einfo (_("%P: warning: truncated CodeView type record"
3342                          " LF_STRING_ID\n"));
3343               return false;
3344             }
3345 
3346           if (!remap_type (&str->substring, map, type_num, num_types))
3347             return false;
3348 
3349           string_len = strnlen (str->string,
3350                                     size - offsetof (struct lf_string_id, string));
3351 
3352           if (string_len == size - offsetof (struct lf_string_id, string))
3353             {
3354               einfo (_("%P: warning: string for LF_STRING_ID has no"
3355                          " terminating zero\n"));
3356               return false;
3357             }
3358 
3359           ipi = true;
3360 
3361           break;
3362       }
3363 
3364     case LF_SUBSTR_LIST:
3365       {
3366           uint32_t num_entries;
3367           struct lf_arglist *ssl = (struct lf_arglist *) data;
3368 
3369           if (size < offsetof (struct lf_arglist, args))
3370             {
3371               einfo (_("%P: warning: truncated CodeView type record"
3372                          " LF_SUBSTR_LIST\n"));
3373               return false;
3374             }
3375 
3376           num_entries = bfd_getl32 (&ssl->num_entries);
3377 
3378           if (size < offsetof (struct lf_arglist, args)
3379                        + (num_entries * sizeof (uint32_t)))
3380             {
3381               einfo (_("%P: warning: truncated CodeView type record"
3382                          " LF_SUBSTR_LIST\n"));
3383               return false;
3384             }
3385 
3386           for (uint32_t i = 0; i < num_entries; i++)
3387             {
3388               if (!remap_type (&ssl->args[i], map, type_num, num_types))
3389                 return false;
3390             }
3391 
3392           ipi = true;
3393 
3394           break;
3395       }
3396 
3397     case LF_BUILDINFO:
3398       {
3399           uint16_t num_entries;
3400           struct lf_build_info *bi = (struct lf_build_info *) data;
3401 
3402           if (size < offsetof (struct lf_build_info, strings))
3403             {
3404               einfo (_("%P: warning: truncated CodeView type record"
3405                          " LF_BUILDINFO\n"));
3406               return false;
3407             }
3408 
3409           num_entries = bfd_getl16 (&bi->count);
3410 
3411           if (size < offsetof (struct lf_build_info, strings)
3412                        + (num_entries * sizeof (uint32_t)))
3413             {
3414               einfo (_("%P: warning: truncated CodeView type record"
3415                          " LF_BUILDINFO\n"));
3416               return false;
3417             }
3418 
3419           for (uint32_t i = 0; i < num_entries; i++)
3420             {
3421               if (!remap_type (&bi->strings[i], map, type_num, num_types))
3422                 return false;
3423             }
3424 
3425           ipi = true;
3426 
3427           break;
3428       }
3429 
3430     case LF_FUNC_ID:
3431       {
3432           struct lf_func_id *func = (struct lf_func_id *) data;
3433           size_t name_len;
3434 
3435           if (size < offsetof (struct lf_func_id, name))
3436             {
3437               einfo (_("%P: warning: truncated CodeView type record"
3438                          " LF_FUNC_ID\n"));
3439               return false;
3440             }
3441 
3442           if (!remap_type (&func->parent_scope, map, type_num, num_types))
3443             return false;
3444 
3445           if (!remap_type (&func->function_type, map, type_num, num_types))
3446             return false;
3447 
3448           name_len = strnlen (func->name,
3449                                   size - offsetof (struct lf_func_id, name));
3450 
3451           if (name_len == size - offsetof (struct lf_func_id, name))
3452             {
3453               einfo (_("%P: warning: string for LF_FUNC_ID has no"
3454                          " terminating zero\n"));
3455               return false;
3456             }
3457 
3458           ipi = true;
3459 
3460           break;
3461       }
3462 
3463     case LF_MFUNC_ID:
3464       {
3465           struct lf_mfunc_id *mfunc = (struct lf_mfunc_id *) data;
3466           size_t name_len;
3467 
3468           if (size < offsetof (struct lf_mfunc_id, name))
3469             {
3470               einfo (_("%P: warning: truncated CodeView type record"
3471                          " LF_MFUNC_ID\n"));
3472               return false;
3473             }
3474 
3475           if (!remap_type (&mfunc->parent_type, map, type_num, num_types))
3476             return false;
3477 
3478           if (!remap_type (&mfunc->function_type, map, type_num, num_types))
3479             return false;
3480 
3481           name_len = strnlen (mfunc->name,
3482                                   size - offsetof (struct lf_mfunc_id, name));
3483 
3484           if (name_len == size - offsetof (struct lf_mfunc_id, name))
3485             {
3486               einfo (_("%P: warning: string for LF_MFUNC_ID has no"
3487                          " terminating zero\n"));
3488               return false;
3489             }
3490 
3491           ipi = true;
3492 
3493           break;
3494       }
3495 
3496     case LF_UDT_SRC_LINE:
3497       return handle_udt_src_line (data, size, map, type_num, num_types,
3498                                           ids, mod_num, strings);
3499 
3500     default:
3501       einfo (_("%P: warning: unrecognized CodeView type %v\n"), type);
3502       return false;
3503     }
3504 
3505   hash = iterative_hash (data, size, 0);
3506 
3507   t = ipi ? ids : types;
3508 
3509   slot = htab_find_slot_with_hash (t->hashmap, data, hash, INSERT);
3510   if (!slot)
3511     return false;
3512 
3513   if (!*slot) /* new entry */
3514     {
3515       struct type_entry *e;
3516 
3517       *slot = xmalloc (offsetof (struct type_entry, data) + size);
3518 
3519       e = (struct type_entry *) *slot;
3520 
3521       e->next = NULL;
3522       e->index = t->num_types;
3523 
3524       if (other_hash)
3525           e->cv_hash = cv_hash;
3526       else
3527           e->cv_hash = crc32 (data, size);
3528 
3529       e->has_udt_src_line = false;
3530 
3531       memcpy (e->data, data, size);
3532 
3533       if (t->last)
3534           t->last->next = e;
3535       else
3536           t->first = e;
3537 
3538       t->last = e;
3539 
3540       map[type_num] = e;
3541 
3542       t->num_types++;
3543     }
3544   else /* duplicate */
3545     {
3546       map[type_num] = (struct type_entry *) *slot;
3547     }
3548 
3549   return true;
3550 }
3551 
3552 /* Parse the .debug$T section of a module, and pass any type definitions
3553    found to handle_type.  */
3554 static bool
handle_debugt_section(asection * s,bfd * mod,struct types * types,struct types * ids,uint16_t mod_num,struct string_table * strings,struct type_entry *** map,uint32_t * num_types)3555 handle_debugt_section (asection *s, bfd *mod, struct types *types,
3556                            struct types *ids, uint16_t mod_num,
3557                            struct string_table *strings,
3558                            struct type_entry ***map, uint32_t *num_types)
3559 {
3560   bfd_byte *data = NULL;
3561   size_t off;
3562   uint32_t type_num;
3563 
3564   if (!bfd_get_full_section_contents (mod, s, &data))
3565     return false;
3566 
3567   if (!data)
3568     return false;
3569 
3570   if (bfd_getl32 (data) != CV_SIGNATURE_C13)
3571     {
3572       free (data);
3573       return true;
3574     }
3575 
3576   off = sizeof (uint32_t);
3577 
3578   while (off + sizeof (uint16_t) <= s->size)
3579     {
3580       uint16_t size;
3581 
3582       size = bfd_getl16 (data + off);
3583       off += sizeof (uint16_t);
3584 
3585       if (size + off > s->size || size <= sizeof (uint16_t))
3586           {
3587             free (data);
3588             bfd_set_error (bfd_error_bad_value);
3589             return false;
3590           }
3591 
3592       (*num_types)++;
3593       off += size;
3594     }
3595 
3596   if (*num_types == 0)
3597     {
3598       free (data);
3599       return true;
3600     }
3601 
3602   *map = xcalloc (*num_types, sizeof (struct type_entry *));
3603 
3604   off = sizeof (uint32_t);
3605   type_num = 0;
3606 
3607   while (off + sizeof (uint16_t) <= s->size)
3608     {
3609       uint16_t size;
3610 
3611       size = bfd_getl16 (data + off);
3612 
3613       if (!handle_type (data + off, *map, type_num, *num_types, types, ids,
3614                               mod_num, strings))
3615           {
3616             free (data);
3617             free (*map);
3618             bfd_set_error (bfd_error_bad_value);
3619             return false;
3620           }
3621 
3622       off += sizeof (uint16_t) + size;
3623       type_num++;
3624     }
3625 
3626   free (data);
3627 
3628   return true;
3629 }
3630 
3631 /* Return the CodeView constant for the selected architecture.  */
3632 static uint16_t
target_processor(bfd * abfd)3633 target_processor (bfd *abfd)
3634 {
3635   switch (abfd->arch_info->arch)
3636     {
3637     case bfd_arch_i386:
3638       if (abfd->arch_info->mach & bfd_mach_x86_64)
3639           return CV_CFL_X64;
3640       else
3641           return CV_CFL_80386;
3642 
3643     case bfd_arch_aarch64:
3644       return CV_CFL_ARM64;
3645 
3646     default:
3647       return 0;
3648     }
3649 }
3650 
3651 /* Create the symbols that go in "* Linker *", the dummy module created
3652    for the linker itself.  */
3653 static bool
create_linker_symbols(bfd * abfd,uint8_t ** syms,uint32_t * sym_byte_size,const char * pdb_name)3654 create_linker_symbols (bfd *abfd, uint8_t **syms, uint32_t *sym_byte_size,
3655                            const char *pdb_name)
3656 {
3657   uint8_t *ptr;
3658   struct objname *name;
3659   struct compile3 *comp;
3660   struct envblock *env;
3661   size_t padding1, padding2, env_size;
3662   char *cwdval, *exeval, *pdbval;
3663 
3664   /* extra NUL for padding */
3665   static const char linker_fn[] = "* Linker *\0";
3666   static const char linker_name[] = "GNU LD " VERSION;
3667 
3668   static const char cwd[] = "cwd";
3669   static const char exe[] = "exe";
3670   static const char pdb[] = "pdb";
3671 
3672   cwdval = getcwd (NULL, 0);
3673   if (!cwdval)
3674     {
3675       einfo (_("%P: warning: unable to get working directory\n"));
3676       return false;
3677     }
3678 
3679   exeval = lrealpath (program_name);
3680 
3681   if (!exeval)
3682     {
3683       einfo (_("%P: warning: unable to get program name\n"));
3684       free (cwdval);
3685       return false;
3686     }
3687 
3688   pdbval = lrealpath (pdb_name);
3689 
3690   if (!pdbval)
3691     {
3692       einfo (_("%P: warning: unable to get full path to PDB\n"));
3693       free (exeval);
3694       free (cwdval);
3695       return false;
3696     }
3697 
3698   *sym_byte_size += offsetof (struct objname, name) + sizeof (linker_fn);
3699   *sym_byte_size += offsetof (struct compile3, compiler) + sizeof (linker_name);
3700 
3701   if (*sym_byte_size % 4)
3702     padding1 = 4 - (*sym_byte_size % 4);
3703   else
3704     padding1 = 0;
3705 
3706   *sym_byte_size += padding1;
3707 
3708   env_size = offsetof (struct envblock, strings);
3709   env_size += sizeof (cwd);
3710   env_size += strlen (cwdval) + 1;
3711   env_size += sizeof (exe);
3712   env_size += strlen (exeval) + 1;
3713   env_size += sizeof (pdb);
3714   env_size += strlen (pdbval) + 1;
3715 
3716   if (env_size % 4)
3717     padding2 = 4 - (env_size % 4);
3718   else
3719     padding2 = 0;
3720 
3721   env_size += padding2;
3722 
3723   *sym_byte_size += env_size;
3724 
3725   *syms = xmalloc (*sym_byte_size);
3726   ptr = *syms;
3727 
3728   /* Write S_OBJNAME */
3729 
3730   name = (struct objname *) ptr;
3731   bfd_putl16 (offsetof (struct objname, name)
3732                 + sizeof (linker_fn) - sizeof (uint16_t), &name->size);
3733   bfd_putl16 (S_OBJNAME, &name->kind);
3734   bfd_putl32 (0, &name->signature);
3735   memcpy (name->name, linker_fn, sizeof (linker_fn));
3736 
3737   ptr += offsetof (struct objname, name) + sizeof (linker_fn);
3738 
3739   /* Write S_COMPILE3 */
3740 
3741   comp = (struct compile3 *) ptr;
3742 
3743   bfd_putl16 (offsetof (struct compile3, compiler) + sizeof (linker_name)
3744                 + padding1 - sizeof (uint16_t), &comp->size);
3745   bfd_putl16 (S_COMPILE3, &comp->kind);
3746   bfd_putl32 (CV_CFL_LINK, &comp->flags);
3747   bfd_putl16 (target_processor (abfd), &comp->machine);
3748   bfd_putl16 (0, &comp->frontend_major);
3749   bfd_putl16 (0, &comp->frontend_minor);
3750   bfd_putl16 (0, &comp->frontend_build);
3751   bfd_putl16 (0, &comp->frontend_qfe);
3752   bfd_putl16 (0, &comp->backend_major);
3753   bfd_putl16 (0, &comp->backend_minor);
3754   bfd_putl16 (0, &comp->backend_build);
3755   bfd_putl16 (0, &comp->backend_qfe);
3756   memcpy (comp->compiler, linker_name, sizeof (linker_name));
3757 
3758   memset (comp->compiler + sizeof (linker_name), 0, padding1);
3759 
3760   ptr += offsetof (struct compile3, compiler) + sizeof (linker_name) + padding1;
3761 
3762   /* Write S_ENVBLOCK */
3763 
3764   env = (struct envblock *) ptr;
3765 
3766   bfd_putl16 (env_size - sizeof (uint16_t), &env->size);
3767   bfd_putl16 (S_ENVBLOCK, &env->kind);
3768   env->flags = 0;
3769 
3770   ptr += offsetof (struct envblock, strings);
3771 
3772   memcpy (ptr, cwd, sizeof (cwd));
3773   ptr += sizeof (cwd);
3774   memcpy (ptr, cwdval, strlen (cwdval) + 1);
3775   ptr += strlen (cwdval) + 1;
3776 
3777   memcpy (ptr, exe, sizeof (exe));
3778   ptr += sizeof (exe);
3779   memcpy (ptr, exeval, strlen (exeval) + 1);
3780   ptr += strlen (exeval) + 1;
3781 
3782   memcpy (ptr, pdb, sizeof (pdb));
3783   ptr += sizeof (pdb);
3784   memcpy (ptr, pdbval, strlen (pdbval) + 1);
3785   ptr += strlen (pdbval) + 1;
3786 
3787   /* Microsoft's LINK also includes "cmd", the command-line options passed
3788      to the linker, but unfortunately we don't have access to argc and argv
3789      at this stage.  */
3790 
3791   memset (ptr, 0, padding2);
3792 
3793   free (pdbval);
3794   free (exeval);
3795   free (cwdval);
3796 
3797   return true;
3798 }
3799 
3800 /* Populate the module stream, which consists of the transformed .debug$S
3801    data for each object file.  */
3802 static bool
populate_module_stream(bfd * stream,bfd * mod,uint32_t * sym_byte_size,struct string_table * strings,uint32_t * c13_info_size,struct mod_source_files * mod_source,bfd * abfd,struct types * types,struct types * ids,uint16_t mod_num,bfd * sym_rec_stream,struct globals * glob,const char * pdb_name)3803 populate_module_stream (bfd *stream, bfd *mod, uint32_t *sym_byte_size,
3804                               struct string_table *strings,
3805                               uint32_t *c13_info_size,
3806                               struct mod_source_files *mod_source,
3807                               bfd *abfd, struct types *types,
3808                               struct types *ids, uint16_t mod_num,
3809                               bfd *sym_rec_stream, struct globals *glob,
3810                               const char *pdb_name)
3811 {
3812   uint8_t int_buf[sizeof (uint32_t)];
3813   uint8_t *c13_info = NULL;
3814   uint8_t *syms = NULL;
3815 
3816   *sym_byte_size = 0;
3817   *c13_info_size = 0;
3818 
3819   if (!strcmp (bfd_get_filename (mod), "dll stuff"))
3820     {
3821       if (!create_linker_symbols (mod, &syms, sym_byte_size, pdb_name))
3822           return false;
3823     }
3824   else
3825     {
3826       struct type_entry **map = NULL;
3827       uint32_t num_types = 0;
3828 
3829       /* Process .debug$T section.  */
3830 
3831       for (asection *s = mod->sections; s; s = s->next)
3832           {
3833             if (!strcmp (s->name, ".debug$T") && s->size >= sizeof (uint32_t))
3834               {
3835                 if (!handle_debugt_section (s, mod, types, ids, mod_num, strings,
3836                                                     &map, &num_types))
3837                     {
3838                       free (mod_source->files);
3839                       return false;
3840                     }
3841 
3842                 break;
3843               }
3844           }
3845 
3846       /* Process .debug$S section(s).  */
3847 
3848       for (asection *s = mod->sections; s; s = s->next)
3849           {
3850             if (!strcmp (s->name, ".debug$S") && s->size >= sizeof (uint32_t))
3851               {
3852                 if (!handle_debugs_section (s, mod, strings, &c13_info,
3853                                                     c13_info_size, mod_source, abfd,
3854                                                     &syms, sym_byte_size, map, num_types,
3855                                                     sym_rec_stream, glob, mod_num))
3856                     {
3857                       free (c13_info);
3858                       free (syms);
3859                       free (mod_source->files);
3860                       free (map);
3861                       return false;
3862                     }
3863               }
3864           }
3865 
3866       free (map);
3867     }
3868 
3869   /* Write the signature.  */
3870 
3871   bfd_putl32 (CV_SIGNATURE_C13, int_buf);
3872 
3873   if (bfd_write (int_buf, sizeof (uint32_t), stream) != sizeof (uint32_t))
3874     {
3875       free (c13_info);
3876       free (syms);
3877       return false;
3878     }
3879 
3880   if (syms)
3881     {
3882       if (bfd_write (syms, *sym_byte_size, stream) != *sym_byte_size)
3883           {
3884             free (c13_info);
3885             free (syms);
3886             return false;
3887           }
3888 
3889       free (syms);
3890     }
3891 
3892   if (c13_info)
3893     {
3894       if (bfd_write (c13_info, *c13_info_size, stream) != *c13_info_size)
3895           {
3896             free (c13_info);
3897             return false;
3898           }
3899 
3900       free (c13_info);
3901     }
3902 
3903   /* Write the global refs size.  */
3904 
3905   bfd_putl32 (0, int_buf);
3906 
3907   if (bfd_write (int_buf, sizeof (uint32_t), stream) != sizeof (uint32_t))
3908     return false;
3909 
3910   return true;
3911 }
3912 
3913 /* Create the module info substream within the DBI.  */
3914 static bool
create_module_info_substream(bfd * abfd,bfd * pdb,void ** data,uint32_t * size,struct string_table * strings,struct source_files_info * source,struct types * types,struct types * ids,bfd * sym_rec_stream,struct globals * glob,const char * pdb_name)3915 create_module_info_substream (bfd *abfd, bfd *pdb, void **data,
3916                                     uint32_t *size, struct string_table *strings,
3917                                     struct source_files_info *source,
3918                                     struct types *types, struct types *ids,
3919                                     bfd *sym_rec_stream, struct globals *glob,
3920                                     const char *pdb_name)
3921 {
3922   uint8_t *ptr;
3923   unsigned int mod_num;
3924 
3925   static const char linker_fn[] = "* Linker *";
3926 
3927   *size = 0;
3928 
3929   for (bfd *in = coff_data (abfd)->link_info->input_bfds; in;
3930        in = in->link.next)
3931     {
3932       size_t len = sizeof (struct module_info);
3933 
3934       if (!strcmp (bfd_get_filename (in), "dll stuff"))
3935           {
3936             len += sizeof (linker_fn); /* Object name.  */
3937             len++; /* Empty module name.  */
3938           }
3939       else if (in->my_archive)
3940           {
3941             char *name = lrealpath (bfd_get_filename (in));
3942 
3943             len += strlen (name) + 1; /* Object name.  */
3944 
3945             free (name);
3946 
3947             name = lrealpath (bfd_get_filename (in->my_archive));
3948 
3949             len += strlen (name) + 1; /* Archive name.  */
3950 
3951             free (name);
3952           }
3953       else
3954           {
3955             char *name = lrealpath (bfd_get_filename (in));
3956             size_t name_len = strlen (name) + 1;
3957 
3958             len += name_len; /* Object name.  */
3959             len += name_len; /* And again as the archive name.  */
3960 
3961             free (name);
3962           }
3963 
3964       if (len % 4)
3965           len += 4 - (len % 4);
3966 
3967       *size += len;
3968 
3969       source->mod_count++;
3970     }
3971 
3972   *data = xmalloc (*size);
3973 
3974   ptr = *data;
3975 
3976   source->mods = xmalloc (source->mod_count
3977                                 * sizeof (struct mod_source_files));
3978   memset (source->mods, 0,
3979             source->mod_count * sizeof (struct mod_source_files));
3980 
3981   mod_num = 0;
3982 
3983   for (bfd *in = coff_data (abfd)->link_info->input_bfds; in;
3984        in = in->link.next)
3985     {
3986       struct module_info *mod = (struct module_info *) ptr;
3987       uint16_t stream_num;
3988       bfd *stream;
3989       uint32_t sym_byte_size, c13_info_size;
3990       uint8_t *start = ptr;
3991 
3992       stream = add_stream (pdb, NULL, &stream_num);
3993 
3994       if (!stream)
3995           {
3996             for (unsigned int i = 0; i < source->mod_count; i++)
3997               {
3998                 free (source->mods[i].files);
3999               }
4000 
4001             free (source->mods);
4002             free (*data);
4003             return false;
4004           }
4005 
4006       if (!populate_module_stream (stream, in, &sym_byte_size,
4007                                            strings, &c13_info_size,
4008                                            &source->mods[mod_num], abfd,
4009                                            types, ids, mod_num,
4010                                            sym_rec_stream, glob, pdb_name))
4011           {
4012             for (unsigned int i = 0; i < source->mod_count; i++)
4013               {
4014                 free (source->mods[i].files);
4015               }
4016 
4017             free (source->mods);
4018             free (*data);
4019             return false;
4020           }
4021 
4022       bfd_putl32 (0, &mod->unused1);
4023 
4024       /* These are dummy values - MSVC copies the first section contribution
4025            entry here, but doesn't seem to use it for anything.  */
4026       bfd_putl16 (0xffff, &mod->sc.section);
4027       bfd_putl16 (0, &mod->sc.padding1);
4028       bfd_putl32 (0, &mod->sc.offset);
4029       bfd_putl32 (0xffffffff, &mod->sc.size);
4030       bfd_putl32 (0, &mod->sc.characteristics);
4031       bfd_putl16 (0xffff, &mod->sc.module_index);
4032       bfd_putl16 (0, &mod->sc.padding2);
4033       bfd_putl32 (0, &mod->sc.data_crc);
4034       bfd_putl32 (0, &mod->sc.reloc_crc);
4035 
4036       bfd_putl16 (0, &mod->flags);
4037       bfd_putl16 (stream_num, &mod->module_sym_stream);
4038       bfd_putl32 (sizeof (uint32_t) + sym_byte_size, &mod->sym_byte_size);
4039       bfd_putl32 (0, &mod->c11_byte_size);
4040       bfd_putl32 (c13_info_size, &mod->c13_byte_size);
4041       bfd_putl16 (0, &mod->source_file_count);
4042       bfd_putl16 (0, &mod->padding);
4043       bfd_putl32 (0, &mod->unused2);
4044       bfd_putl32 (0, &mod->source_file_name_index);
4045       bfd_putl32 (0, &mod->pdb_file_path_name_index);
4046 
4047       ptr += sizeof (struct module_info);
4048 
4049       if (!strcmp (bfd_get_filename (in), "dll stuff"))
4050           {
4051             /* Object name.  */
4052             memcpy (ptr, linker_fn, sizeof (linker_fn));
4053             ptr += sizeof (linker_fn);
4054 
4055             /* Empty module name.  */
4056             *ptr = 0;
4057             ptr++;
4058           }
4059       else if (in->my_archive)
4060           {
4061             char *name = lrealpath (bfd_get_filename (in));
4062             size_t name_len = strlen (name) + 1;
4063 
4064             /* Object name.  */
4065             memcpy (ptr, name, name_len);
4066             ptr += name_len;
4067 
4068             free (name);
4069 
4070             name = lrealpath (bfd_get_filename (in->my_archive));
4071             name_len = strlen (name) + 1;
4072 
4073             /* Archive name.  */
4074             memcpy (ptr, name, name_len);
4075             ptr += name_len;
4076 
4077             free (name);
4078           }
4079       else
4080           {
4081             char *name = lrealpath (bfd_get_filename (in));
4082             size_t name_len = strlen (name) + 1;
4083 
4084             /* Object name.  */
4085             memcpy (ptr, name, name_len);
4086             ptr += name_len;
4087 
4088             /* Object name again as archive name.  */
4089             memcpy (ptr, name, name_len);
4090             ptr += name_len;
4091 
4092             free (name);
4093           }
4094 
4095       /* Pad to next four-byte boundary.  */
4096 
4097       if ((ptr - start) % 4)
4098           {
4099             memset (ptr, 0, 4 - ((ptr - start) % 4));
4100             ptr += 4 - ((ptr - start) % 4);
4101           }
4102 
4103       mod_num++;
4104     }
4105 
4106   return true;
4107 }
4108 
4109 /* Return the index of a given output section.  */
4110 static uint16_t
find_section_number(bfd * abfd,asection * sect)4111 find_section_number (bfd *abfd, asection *sect)
4112 {
4113   uint16_t i = 1;
4114 
4115   for (asection *s = abfd->sections; s; s = s->next)
4116     {
4117       if (s == sect)
4118           return i;
4119 
4120       /* Empty sections aren't output.  */
4121       if (s->size != 0)
4122           i++;
4123     }
4124 
4125   return 0;
4126 }
4127 
4128 /* Used as parameter to qsort, to sort section contributions by section and
4129    offset.  */
4130 static int
section_contribs_compare(const void * p1,const void * p2)4131 section_contribs_compare (const void *p1, const void *p2)
4132 {
4133   const struct in_sc *sc1 = p1;
4134   const struct in_sc *sc2 = p2;
4135 
4136   if (sc1->sect_num < sc2->sect_num)
4137     return -1;
4138   if (sc1->sect_num > sc2->sect_num)
4139     return 1;
4140 
4141   if (sc1->s->output_offset < sc2->s->output_offset)
4142     return -1;
4143   if (sc1->s->output_offset > sc2->s->output_offset)
4144     return 1;
4145 
4146   return 0;
4147 }
4148 
4149 /* Create the substream which maps addresses in the image file to locations
4150    in the original object files.  */
4151 static bool
create_section_contrib_substream(bfd * abfd,void ** data,uint32_t * size)4152 create_section_contrib_substream (bfd *abfd, void **data, uint32_t *size)
4153 {
4154   unsigned int num_sc = 0;
4155   struct section_contribution *sc;
4156   uint16_t mod_index;
4157   char *sect_flags;
4158   file_ptr offset;
4159   struct in_sc *sc_in, *sc2;
4160   uint32_t *ptr;
4161 
4162   for (bfd *in = coff_data (abfd)->link_info->input_bfds; in;
4163        in = in->link.next)
4164     {
4165       for (asection *s = in->sections; s; s = s->next)
4166           {
4167             if (s->size == 0 || discarded_section (s))
4168               continue;
4169 
4170             num_sc++;
4171           }
4172     }
4173 
4174   *size = sizeof (uint32_t) + (num_sc * sizeof (struct section_contribution));
4175   *data = xmalloc (*size);
4176 
4177   bfd_putl32 (SECTION_CONTRIB_VERSION_60, *data);
4178 
4179   /* Read characteristics of outputted sections.  */
4180 
4181   sect_flags = xmalloc (sizeof (uint32_t) * abfd->section_count);
4182 
4183   offset = bfd_coff_filhsz (abfd) + bfd_coff_aoutsz (abfd);
4184   offset += offsetof (struct external_scnhdr, s_flags);
4185 
4186   for (unsigned int i = 0; i < abfd->section_count; i++)
4187     {
4188       if (bfd_seek (abfd, offset, SEEK_SET) != 0
4189             || bfd_read (sect_flags + (i * sizeof (uint32_t)), sizeof (uint32_t),
4190                            abfd) != sizeof (uint32_t))
4191           {
4192             free (*data);
4193             free (sect_flags);
4194             return false;
4195           }
4196 
4197       offset += sizeof (struct external_scnhdr);
4198     }
4199 
4200   /* Microsoft's DIA expects section contributions to be sorted by section
4201      number and offset, otherwise it will be unable to resolve line numbers.  */
4202 
4203   sc_in = xmalloc (num_sc * sizeof (* sc_in));
4204   sc2 = sc_in;
4205 
4206   mod_index = 0;
4207   for (bfd *in = coff_data (abfd)->link_info->input_bfds; in;
4208        in = in->link.next)
4209     {
4210       for (asection *s = in->sections; s; s = s->next)
4211           {
4212             if (s->size == 0 || discarded_section (s))
4213               continue;
4214 
4215             sc2->s = s;
4216             sc2->sect_num = find_section_number (abfd, s->output_section);
4217             sc2->mod_index = mod_index;
4218 
4219             sc2++;
4220           }
4221 
4222       mod_index++;
4223     }
4224 
4225   qsort (sc_in, num_sc, sizeof (* sc_in), section_contribs_compare);
4226 
4227   ptr = *data;
4228   sc = (struct section_contribution *) (ptr + 1); /* Skip the version word.  */
4229 
4230   for (unsigned int i = 0; i < num_sc; i++)
4231     {
4232       memcpy (&sc->characteristics,
4233                 sect_flags + ((sc_in[i].sect_num - 1) * sizeof (uint32_t)),
4234                 sizeof (uint32_t));
4235 
4236       bfd_putl16 (sc_in[i].sect_num, &sc->section);
4237       bfd_putl16 (0, &sc->padding1);
4238       bfd_putl32 (sc_in[i].s->output_offset, &sc->offset);
4239       bfd_putl32 (sc_in[i].s->size, &sc->size);
4240       bfd_putl16 (sc_in[i].mod_index, &sc->module_index);
4241       bfd_putl16 (0, &sc->padding2);
4242       bfd_putl32 (0, &sc->data_crc);
4243       bfd_putl32 (0, &sc->reloc_crc);
4244 
4245       sc++;
4246     }
4247 
4248   free (sc_in);
4249   free (sect_flags);
4250 
4251   return true;
4252 }
4253 
4254 /* The source info substream lives within the DBI stream, and lists the
4255    source files for each object file (i.e. it's derived from the
4256    DEBUG_S_FILECHKSMS parts of the .debug$S sections).  This is a bit
4257    superfluous, as the filenames are also available in the C13 parts of
4258    the module streams, but MSVC relies on it to work properly.  */
4259 static void
create_source_info_substream(void ** data,uint32_t * size,struct source_files_info * source)4260 create_source_info_substream (void **data, uint32_t *size,
4261                                     struct source_files_info *source)
4262 {
4263   uint16_t dedupe_source_files_count = 0;
4264   uint16_t source_files_count = 0;
4265   uint32_t strings_len = 0;
4266   uint8_t *ptr;
4267 
4268   /* Loop through the source files, marking unique filenames.  The pointers
4269      here are for entries in the main string table, and so have already
4270      been deduplicated.  */
4271 
4272   for (uint16_t i = 0; i < source->mod_count; i++)
4273     {
4274       for (uint16_t j = 0; j < source->mods[i].files_count; j++)
4275           {
4276             if (source->mods[i].files[j])
4277               {
4278                 if (source->mods[i].files[j]->source_file_offset == 0xffffffff)
4279                     {
4280                       source->mods[i].files[j]->source_file_offset = strings_len;
4281                       strings_len += source->mods[i].files[j]->len + 1;
4282                       dedupe_source_files_count++;
4283                     }
4284 
4285                 source_files_count++;
4286               }
4287           }
4288     }
4289 
4290   *size = sizeof (uint16_t) + sizeof (uint16_t);
4291   *size += (sizeof (uint16_t) + sizeof (uint16_t)) * source->mod_count;
4292   *size += sizeof (uint32_t) * source_files_count;
4293   *size += strings_len;
4294 
4295   *data = xmalloc (*size);
4296 
4297   ptr = (uint8_t *) *data;
4298 
4299   /* Write header (module count and source file count).  */
4300 
4301   bfd_putl16 (source->mod_count, ptr);
4302   ptr += sizeof (uint16_t);
4303 
4304   bfd_putl16 (dedupe_source_files_count, ptr);
4305   ptr += sizeof (uint16_t);
4306 
4307   /* Write "ModIndices".  As the LLVM documentation puts it, "this array is
4308      present, but does not appear to be useful".  */
4309 
4310   for (uint16_t i = 0; i < source->mod_count; i++)
4311     {
4312       bfd_putl16 (i, ptr);
4313       ptr += sizeof (uint16_t);
4314     }
4315 
4316   /* Write source file count for each module.  */
4317 
4318   for (uint16_t i = 0; i < source->mod_count; i++)
4319     {
4320       bfd_putl16 (source->mods[i].files_count, ptr);
4321       ptr += sizeof (uint16_t);
4322     }
4323 
4324   /* For each module, write the offsets within the string table
4325      for each source file.  */
4326 
4327   for (uint16_t i = 0; i < source->mod_count; i++)
4328     {
4329       for (uint16_t j = 0; j < source->mods[i].files_count; j++)
4330           {
4331             if (source->mods[i].files[j])
4332               {
4333                 bfd_putl32 (source->mods[i].files[j]->source_file_offset, ptr);
4334                 ptr += sizeof (uint32_t);
4335               }
4336           }
4337     }
4338 
4339   /* Write the string table.  We set source_file_offset to a dummy value for
4340      each entry we write, so we don't write duplicate filenames.  */
4341 
4342   for (uint16_t i = 0; i < source->mod_count; i++)
4343     {
4344       for (uint16_t j = 0; j < source->mods[i].files_count; j++)
4345           {
4346             if (source->mods[i].files[j]
4347                 && source->mods[i].files[j]->source_file_offset != 0xffffffff)
4348               {
4349                 memcpy (ptr, source->mods[i].files[j]->s,
4350                           source->mods[i].files[j]->len);
4351                 ptr += source->mods[i].files[j]->len;
4352 
4353                 *ptr = 0;
4354                 ptr++;
4355 
4356                 source->mods[i].files[j]->source_file_offset = 0xffffffff;
4357               }
4358           }
4359     }
4360 }
4361 
4362 /* Used as parameter to qsort, to sort globals by hash.  */
4363 static int
global_compare_hash(const void * s1,const void * s2)4364 global_compare_hash (const void *s1, const void *s2)
4365 {
4366   const struct global *g1 = *(const struct global **) s1;
4367   const struct global *g2 = *(const struct global **) s2;
4368 
4369   if (g1->hash < g2->hash)
4370     return -1;
4371   if (g1->hash > g2->hash)
4372     return 1;
4373 
4374   return 0;
4375 }
4376 
4377 /* Create the globals stream, which contains the unmangled symbol names.  */
4378 static bool
create_globals_stream(bfd * pdb,struct globals * glob,uint16_t * stream_num)4379 create_globals_stream (bfd *pdb, struct globals *glob, uint16_t *stream_num)
4380 {
4381   bfd *stream;
4382   struct globals_hash_header h;
4383   uint32_t buckets_size, filled_buckets = 0;
4384   struct global **sorted = NULL;
4385   bool ret = false;
4386   struct global *buckets[NUM_GLOBALS_HASH_BUCKETS];
4387   char int_buf[sizeof (uint32_t)];
4388 
4389   stream = add_stream (pdb, NULL, stream_num);
4390   if (!stream)
4391     return false;
4392 
4393   memset (buckets, 0, sizeof (buckets));
4394 
4395   if (glob->num_entries > 0)
4396     {
4397       struct global *g;
4398 
4399       /* Create an array of pointers, sorted by hash value.  */
4400 
4401       sorted = xmalloc (sizeof (struct global *) * glob->num_entries);
4402 
4403       g = glob->first;
4404       for (unsigned int i = 0; i < glob->num_entries; i++)
4405           {
4406             sorted[i] = g;
4407             g = g->next;
4408           }
4409 
4410       qsort (sorted, glob->num_entries, sizeof (struct global *),
4411                global_compare_hash);
4412 
4413       /* Populate the buckets.  */
4414 
4415       for (unsigned int i = 0; i < glob->num_entries; i++)
4416           {
4417             if (!buckets[sorted[i]->hash])
4418               {
4419                 buckets[sorted[i]->hash] = sorted[i];
4420                 filled_buckets++;
4421               }
4422 
4423             sorted[i]->index = i;
4424           }
4425     }
4426 
4427   buckets_size = NUM_GLOBALS_HASH_BUCKETS / 8;
4428   buckets_size += sizeof (uint32_t);
4429   buckets_size += filled_buckets * sizeof (uint32_t);
4430 
4431   bfd_putl32 (GLOBALS_HASH_SIGNATURE, &h.signature);
4432   bfd_putl32 (GLOBALS_HASH_VERSION_70, &h.version);
4433   bfd_putl32 (glob->num_entries * sizeof (struct hash_record),
4434                 &h.entries_size);
4435   bfd_putl32 (buckets_size, &h.buckets_size);
4436 
4437   if (bfd_write (&h, sizeof (h), stream) != sizeof (h))
4438     return false;
4439 
4440   /* Write hash entries, sorted by hash.  */
4441 
4442   for (unsigned int i = 0; i < glob->num_entries; i++)
4443     {
4444       struct hash_record hr;
4445 
4446       bfd_putl32 (sorted[i]->offset + 1, &hr.offset);
4447       bfd_putl32 (sorted[i]->refcount, &hr.reference);
4448 
4449       if (bfd_write (&hr, sizeof (hr), stream) != sizeof (hr))
4450           goto end;
4451     }
4452 
4453   /* Write the bitmap for filled and unfilled buckets.  */
4454 
4455   for (unsigned int i = 0; i < NUM_GLOBALS_HASH_BUCKETS; i += 8)
4456     {
4457       uint8_t v = 0;
4458 
4459       for (unsigned int j = 0; j < 8; j++)
4460           {
4461             if (buckets[i + j])
4462               v |= 1 << j;
4463           }
4464 
4465       if (bfd_write (&v, sizeof (v), stream) != sizeof (v))
4466           goto end;
4467     }
4468 
4469   /* Add a 4-byte gap.  */
4470 
4471   bfd_putl32 (0, int_buf);
4472 
4473   if (bfd_write (int_buf, sizeof (uint32_t), stream) != sizeof (uint32_t))
4474     goto end;
4475 
4476   /* Write the bucket offsets.  */
4477 
4478   for (unsigned int i = 0; i < NUM_GLOBALS_HASH_BUCKETS; i++)
4479     {
4480       if (buckets[i])
4481           {
4482             /* 0xc is size of internal hash_record structure in
4483                Microsoft's parser.  */
4484             bfd_putl32 (buckets[i]->index * 0xc, int_buf);
4485 
4486             if (bfd_write (int_buf, sizeof (uint32_t), stream) !=
4487                 sizeof (uint32_t))
4488               goto end;
4489           }
4490     }
4491 
4492   ret = true;
4493 
4494 end:
4495   free (sorted);
4496 
4497   return ret;
4498 }
4499 
4500 /* Hash an entry in the globals list.  */
4501 static hashval_t
hash_global_entry(const void * p)4502 hash_global_entry (const void *p)
4503 {
4504   const struct global *g = (const struct global *) p;
4505   uint16_t len = bfd_getl16 (g->data);
4506 
4507   return iterative_hash (g->data, len, 0);
4508 }
4509 
4510 /* Compare an entry in the globals list with a symbol.  */
4511 static int
eq_global_entry(const void * a,const void * b)4512 eq_global_entry (const void *a, const void *b)
4513 {
4514   const struct global *g = (const struct global *) a;
4515   uint16_t len1, len2;
4516 
4517   len1 = bfd_getl16 (g->data) + sizeof (uint16_t);
4518   len2 = bfd_getl16 (b) + sizeof (uint16_t);
4519 
4520   if (len1 != len2)
4521     return 0;
4522 
4523   return !memcmp (g->data, b, len1);
4524 }
4525 
4526 /* Stream 4 is the debug information (DBI) stream.  */
4527 static bool
populate_dbi_stream(bfd * stream,bfd * abfd,bfd * pdb,uint16_t section_header_stream_num,uint16_t sym_rec_stream_num,uint16_t publics_stream_num,struct string_table * strings,struct types * types,struct types * ids,bfd * sym_rec_stream,const char * pdb_name)4528 populate_dbi_stream (bfd *stream, bfd *abfd, bfd *pdb,
4529                          uint16_t section_header_stream_num,
4530                          uint16_t sym_rec_stream_num,
4531                          uint16_t publics_stream_num,
4532                          struct string_table *strings,
4533                          struct types *types,
4534                          struct types *ids,
4535                          bfd *sym_rec_stream, const char *pdb_name)
4536 {
4537   struct pdb_dbi_stream_header h;
4538   struct optional_dbg_header opt;
4539   void *mod_info, *sc, *source_info;
4540   uint32_t mod_info_size, sc_size, source_info_size;
4541   struct source_files_info source;
4542   struct globals glob;
4543   uint16_t globals_stream_num;
4544 
4545   source.mod_count = 0;
4546   source.mods = NULL;
4547 
4548   glob.num_entries = 0;
4549   glob.first = NULL;
4550   glob.last = NULL;
4551 
4552   glob.hashmap = htab_create_alloc (0, hash_global_entry,
4553                                             eq_global_entry, free, xcalloc, free);
4554 
4555   if (!create_module_info_substream (abfd, pdb, &mod_info, &mod_info_size,
4556                                              strings, &source, types, ids,
4557                                              sym_rec_stream, &glob, pdb_name))
4558     {
4559       htab_delete (glob.hashmap);
4560       return false;
4561     }
4562 
4563   if (!create_globals_stream (pdb, &glob, &globals_stream_num))
4564     {
4565       htab_delete (glob.hashmap);
4566 
4567       for (unsigned int i = 0; i < source.mod_count; i++)
4568           {
4569             free (source.mods[i].files);
4570           }
4571       free (source.mods);
4572 
4573       free (mod_info);
4574       return false;
4575     }
4576 
4577   htab_delete (glob.hashmap);
4578 
4579   if (!create_section_contrib_substream (abfd, &sc, &sc_size))
4580     {
4581       for (unsigned int i = 0; i < source.mod_count; i++)
4582           {
4583             free (source.mods[i].files);
4584           }
4585       free (source.mods);
4586 
4587       free (mod_info);
4588       return false;
4589     }
4590 
4591   create_source_info_substream (&source_info, &source_info_size, &source);
4592 
4593   for (unsigned int i = 0; i < source.mod_count; i++)
4594     {
4595       free (source.mods[i].files);
4596     }
4597   free (source.mods);
4598 
4599   bfd_putl32 (0xffffffff, &h.version_signature);
4600   bfd_putl32 (DBI_STREAM_VERSION_70, &h.version_header);
4601   bfd_putl32 (1, &h.age);
4602   bfd_putl16 (globals_stream_num, &h.global_stream_index);
4603   bfd_putl16 (0x8e1d, &h.build_number); // MSVC 14.29
4604   bfd_putl16 (publics_stream_num, &h.public_stream_index);
4605   bfd_putl16 (0, &h.pdb_dll_version);
4606   bfd_putl16 (sym_rec_stream_num, &h.sym_record_stream);
4607   bfd_putl16 (0, &h.pdb_dll_rbld);
4608   bfd_putl32 (mod_info_size, &h.mod_info_size);
4609   bfd_putl32 (sc_size, &h.section_contribution_size);
4610   bfd_putl32 (0, &h.section_map_size);
4611   bfd_putl32 (source_info_size, &h.source_info_size);
4612   bfd_putl32 (0, &h.type_server_map_size);
4613   bfd_putl32 (0, &h.mfc_type_server_index);
4614   bfd_putl32 (sizeof (opt), &h.optional_dbg_header_size);
4615   bfd_putl32 (0, &h.ec_substream_size);
4616   bfd_putl16 (0, &h.flags);
4617   bfd_putl16 (get_arch_number (abfd), &h.machine);
4618   bfd_putl32 (0, &h.padding);
4619 
4620   if (bfd_write (&h, sizeof (h), stream) != sizeof (h))
4621     {
4622       free (source_info);
4623       free (sc);
4624       free (mod_info);
4625       return false;
4626     }
4627 
4628   if (bfd_write (mod_info, mod_info_size, stream) != mod_info_size)
4629     {
4630       free (source_info);
4631       free (sc);
4632       free (mod_info);
4633       return false;
4634     }
4635 
4636   free (mod_info);
4637 
4638   if (bfd_write (sc, sc_size, stream) != sc_size)
4639     {
4640       free (source_info);
4641       free (sc);
4642       return false;
4643     }
4644 
4645   free (sc);
4646 
4647   if (bfd_write (source_info, source_info_size, stream) != source_info_size)
4648     {
4649       free (source_info);
4650       return false;
4651     }
4652 
4653   free (source_info);
4654 
4655   bfd_putl16 (0xffff, &opt.fpo_stream);
4656   bfd_putl16 (0xffff, &opt.exception_stream);
4657   bfd_putl16 (0xffff, &opt.fixup_stream);
4658   bfd_putl16 (0xffff, &opt.omap_to_src_stream);
4659   bfd_putl16 (0xffff, &opt.omap_from_src_stream);
4660   bfd_putl16 (section_header_stream_num, &opt.section_header_stream);
4661   bfd_putl16 (0xffff, &opt.token_map_stream);
4662   bfd_putl16 (0xffff, &opt.xdata_stream);
4663   bfd_putl16 (0xffff, &opt.pdata_stream);
4664   bfd_putl16 (0xffff, &opt.new_fpo_stream);
4665   bfd_putl16 (0xffff, &opt.orig_section_header_stream);
4666 
4667   if (bfd_write (&opt, sizeof (opt), stream) != sizeof (opt))
4668     return false;
4669 
4670   return true;
4671 }
4672 
4673 /* Used as parameter to qsort, to sort publics by hash.  */
4674 static int
public_compare_hash(const void * s1,const void * s2)4675 public_compare_hash (const void *s1, const void *s2)
4676 {
4677   const struct public *p1 = *(const struct public **) s1;
4678   const struct public *p2 = *(const struct public **) s2;
4679 
4680   if (p1->hash < p2->hash)
4681     return -1;
4682   if (p1->hash > p2->hash)
4683     return 1;
4684 
4685   return 0;
4686 }
4687 
4688 /* Used as parameter to qsort, to sort publics by address.  */
4689 static int
public_compare_addr(const void * s1,const void * s2)4690 public_compare_addr (const void *s1, const void *s2)
4691 {
4692   const struct public *p1 = *(const struct public **) s1;
4693   const struct public *p2 = *(const struct public **) s2;
4694 
4695   if (p1->section < p2->section)
4696     return -1;
4697   if (p1->section > p2->section)
4698     return 1;
4699 
4700   if (p1->address < p2->address)
4701     return -1;
4702   if (p1->address > p2->address)
4703     return 1;
4704 
4705   return 0;
4706 }
4707 
4708 /* The publics stream is a hash map of S_PUB32 records, which are stored
4709    in the symbol record stream.  Each S_PUB32 entry represents a symbol
4710    from the point of view of the linker: a section index, an offset within
4711    the section, and a mangled name.  Compare with S_GDATA32 and S_GPROC32,
4712    which are the same thing but generated by the compiler.  */
4713 static bool
populate_publics_stream(bfd * stream,bfd * abfd,bfd * sym_rec_stream)4714 populate_publics_stream (bfd *stream, bfd *abfd, bfd *sym_rec_stream)
4715 {
4716   struct publics_header header;
4717   struct globals_hash_header hash_header;
4718   const unsigned int num_buckets = 4096;
4719   unsigned int num_entries = 0, filled_buckets = 0;
4720   unsigned int buckets_size, sym_hash_size;
4721   char int_buf[sizeof (uint32_t)];
4722   struct public *publics_head = NULL, *publics_tail = NULL;
4723   struct public **buckets;
4724   struct public **sorted = NULL;
4725   bool ret = false;
4726 
4727   buckets = xmalloc (sizeof (struct public *) * num_buckets);
4728   memset (buckets, 0, sizeof (struct public *) * num_buckets);
4729 
4730   /* Loop through the global symbols in our input files, and write S_PUB32
4731      records in the symbol record stream for those that make it into the
4732      final image.  */
4733   for (bfd *in = coff_data (abfd)->link_info->input_bfds; in;
4734        in = in->link.next)
4735     {
4736       if (!in->outsymbols)
4737           continue;
4738 
4739       for (unsigned int i = 0; i < in->symcount; i++)
4740           {
4741             struct bfd_symbol *sym = in->outsymbols[i];
4742 
4743             if (sym->flags & BSF_GLOBAL)
4744               {
4745                 struct pubsym ps;
4746                 uint16_t record_length;
4747                 const char *name = sym->name;
4748                 size_t name_len = strlen (name);
4749                 struct public *p = xmalloc (sizeof (struct public));
4750                 unsigned int padding = 0;
4751                 uint16_t section;
4752                 uint32_t flags = 0;
4753 
4754                 section =
4755                     find_section_number (abfd, sym->section->output_section);
4756 
4757                 if (section == 0)
4758                     continue;
4759 
4760                 p->next = NULL;
4761                 p->offset = bfd_tell (sym_rec_stream);
4762                 p->hash = calc_hash (name, name_len) % num_buckets;
4763                 p->section = section;
4764                 p->address = sym->section->output_offset + sym->value;
4765 
4766                 record_length = sizeof (struct pubsym) + name_len + 1;
4767 
4768                 if (record_length % 4)
4769                     padding = 4 - (record_length % 4);
4770 
4771                 /* Assume that all global symbols in executable sections
4772                      are functions.  */
4773                 if (sym->section->flags & SEC_CODE)
4774                     flags = PUBSYM_FUNCTION;
4775 
4776                 bfd_putl16 (record_length + padding - sizeof (uint16_t),
4777                                 &ps.record_length);
4778                 bfd_putl16 (S_PUB32, &ps.record_type);
4779                 bfd_putl32 (flags, &ps.flags);
4780                 bfd_putl32 (p->address, &ps.offset);
4781                 bfd_putl16 (p->section, &ps.section);
4782 
4783                 if (bfd_write (&ps, sizeof (struct pubsym), sym_rec_stream) !=
4784                       sizeof (struct pubsym))
4785                     goto end;
4786 
4787                 if (bfd_write (name, name_len + 1, sym_rec_stream) !=
4788                       name_len + 1)
4789                     goto end;
4790 
4791                 for (unsigned int j = 0; j < padding; j++)
4792                     {
4793                       uint8_t b = 0;
4794 
4795                       if (bfd_write (&b, sizeof (uint8_t), sym_rec_stream) !=
4796                           sizeof (uint8_t))
4797                         goto end;
4798                     }
4799 
4800                 if (!publics_head)
4801                     publics_head = p;
4802                 else
4803                     publics_tail->next = p;
4804 
4805                 publics_tail = p;
4806                 num_entries++;
4807               }
4808           }
4809     }
4810 
4811 
4812   if (num_entries > 0)
4813     {
4814       /* Create an array of pointers, sorted by hash value.  */
4815 
4816       sorted = xmalloc (sizeof (struct public *) * num_entries);
4817 
4818       struct public *p = publics_head;
4819       for (unsigned int i = 0; i < num_entries; i++)
4820           {
4821             sorted[i] = p;
4822             p = p->next;
4823           }
4824 
4825       qsort (sorted, num_entries, sizeof (struct public *),
4826                public_compare_hash);
4827 
4828       /* Populate the buckets.  */
4829 
4830       for (unsigned int i = 0; i < num_entries; i++)
4831           {
4832             if (!buckets[sorted[i]->hash])
4833               {
4834                 buckets[sorted[i]->hash] = sorted[i];
4835                 filled_buckets++;
4836               }
4837 
4838             sorted[i]->index = i;
4839           }
4840     }
4841 
4842   buckets_size = num_buckets / 8;
4843   buckets_size += sizeof (uint32_t);
4844   buckets_size += filled_buckets * sizeof (uint32_t);
4845 
4846   sym_hash_size = sizeof (hash_header);
4847   sym_hash_size += num_entries * sizeof (struct hash_record);
4848   sym_hash_size += buckets_size;
4849 
4850   /* Output the publics header.  */
4851 
4852   bfd_putl32 (sym_hash_size, &header.sym_hash_size);
4853   bfd_putl32 (num_entries * sizeof (uint32_t), &header.addr_map_size);
4854   bfd_putl32 (0, &header.num_thunks);
4855   bfd_putl32 (0, &header.thunks_size);
4856   bfd_putl32 (0, &header.thunk_table);
4857   bfd_putl32 (0, &header.thunk_table_offset);
4858   bfd_putl32 (0, &header.num_sects);
4859 
4860   if (bfd_write (&header, sizeof (header), stream) != sizeof (header))
4861     goto end;
4862 
4863   /* Output the global hash header.  */
4864 
4865   bfd_putl32 (GLOBALS_HASH_SIGNATURE, &hash_header.signature);
4866   bfd_putl32 (GLOBALS_HASH_VERSION_70, &hash_header.version);
4867   bfd_putl32 (num_entries * sizeof (struct hash_record),
4868                 &hash_header.entries_size);
4869   bfd_putl32 (buckets_size, &hash_header.buckets_size);
4870 
4871   if (bfd_write (&hash_header, sizeof (hash_header), stream) !=
4872       sizeof (hash_header))
4873     goto end;
4874 
4875   /* Write the entries in hash order.  */
4876 
4877   for (unsigned int i = 0; i < num_entries; i++)
4878     {
4879       struct hash_record hr;
4880 
4881       bfd_putl32 (sorted[i]->offset + 1, &hr.offset);
4882       bfd_putl32 (1, &hr.reference);
4883 
4884       if (bfd_write (&hr, sizeof (hr), stream) != sizeof (hr))
4885           goto end;
4886     }
4887 
4888   /* Write the bitmap for filled and unfilled buckets.  */
4889 
4890   for (unsigned int i = 0; i < num_buckets; i += 8)
4891     {
4892       uint8_t v = 0;
4893 
4894       for (unsigned int j = 0; j < 8; j++)
4895           {
4896             if (buckets[i + j])
4897               v |= 1 << j;
4898           }
4899 
4900       if (bfd_write (&v, sizeof (v), stream) != sizeof (v))
4901           goto end;
4902     }
4903 
4904   /* Add a 4-byte gap.  */
4905 
4906   bfd_putl32 (0, int_buf);
4907 
4908   if (bfd_write (int_buf, sizeof (uint32_t), stream) != sizeof (uint32_t))
4909     goto end;
4910 
4911   /* Write the bucket offsets.  */
4912 
4913   for (unsigned int i = 0; i < num_buckets; i++)
4914     {
4915       if (buckets[i])
4916           {
4917             /* 0xc is size of internal hash_record structure in
4918                Microsoft's parser.  */
4919             bfd_putl32 (buckets[i]->index * 0xc, int_buf);
4920 
4921             if (bfd_write (int_buf, sizeof (uint32_t), stream) !=
4922                 sizeof (uint32_t))
4923               goto end;
4924           }
4925     }
4926 
4927   /* Write the address map: offsets into the symbol record stream of
4928      S_PUB32 records, ordered by address.  */
4929 
4930   if (num_entries > 0)
4931     {
4932       qsort (sorted, num_entries, sizeof (struct public *),
4933                public_compare_addr);
4934 
4935       for (unsigned int i = 0; i < num_entries; i++)
4936           {
4937             bfd_putl32 (sorted[i]->offset, int_buf);
4938 
4939             if (bfd_write (int_buf, sizeof (uint32_t), stream) !=
4940                 sizeof (uint32_t))
4941               goto end;
4942           }
4943     }
4944 
4945   ret = true;
4946 
4947 end:
4948   free (buckets);
4949 
4950   while (publics_head)
4951     {
4952       struct public *p = publics_head->next;
4953 
4954       free (publics_head);
4955       publics_head = p;
4956     }
4957 
4958   free (sorted);
4959 
4960   return ret;
4961 }
4962 
4963 /* The section header stream contains a copy of the section headers
4964    from the PE file, in the same format.  */
4965 static bool
create_section_header_stream(bfd * pdb,bfd * abfd,uint16_t * num)4966 create_section_header_stream (bfd *pdb, bfd *abfd, uint16_t *num)
4967 {
4968   bfd *stream;
4969   unsigned int section_count;
4970   file_ptr scn_base;
4971   size_t len;
4972   char *buf;
4973 
4974   stream = add_stream (pdb, NULL, num);
4975   if (!stream)
4976     return false;
4977 
4978   section_count = abfd->section_count;
4979 
4980   /* Empty sections aren't output.  */
4981   for (asection *sect = abfd->sections; sect; sect = sect->next)
4982     {
4983       if (sect->size == 0)
4984           section_count--;
4985     }
4986 
4987   if (section_count == 0)
4988     return true;
4989 
4990   /* Copy section table from output - it's already been written at this
4991      point.  */
4992 
4993   scn_base = bfd_coff_filhsz (abfd) + bfd_coff_aoutsz (abfd);
4994 
4995   if (bfd_seek (abfd, scn_base, SEEK_SET) != 0)
4996     return false;
4997 
4998   len = section_count * sizeof (struct external_scnhdr);
4999   buf = xmalloc (len);
5000 
5001   if (bfd_read (buf, len, abfd) != len)
5002     {
5003       free (buf);
5004       return false;
5005     }
5006 
5007   if (bfd_write (buf, len, stream) != len)
5008     {
5009       free (buf);
5010       return false;
5011     }
5012 
5013   free (buf);
5014 
5015   return true;
5016 }
5017 
5018 /* Populate the "/names" named stream, which contains the string table.  */
5019 static bool
populate_names_stream(bfd * stream,struct string_table * strings)5020 populate_names_stream (bfd *stream, struct string_table *strings)
5021 {
5022   char int_buf[sizeof (uint32_t)];
5023   struct string_table_header h;
5024   uint32_t num_strings = 0, num_buckets;
5025   struct string **buckets;
5026 
5027   bfd_putl32 (STRING_TABLE_SIGNATURE, &h.signature);
5028   bfd_putl32 (STRING_TABLE_VERSION, &h.version);
5029 
5030   if (bfd_write (&h, sizeof (h), stream) != sizeof (h))
5031     return false;
5032 
5033   bfd_putl32 (strings->strings_len, int_buf);
5034 
5035   if (bfd_write (int_buf, sizeof (uint32_t), stream) != sizeof (uint32_t))
5036     return false;
5037 
5038   int_buf[0] = 0;
5039 
5040   if (bfd_write (int_buf, 1, stream) != 1)
5041     return false;
5042 
5043   for (struct string *s = strings->strings_head; s; s = s->next)
5044     {
5045       if (bfd_write (s->s, s->len, stream) != s->len)
5046           return false;
5047 
5048       if (bfd_write (int_buf, 1, stream) != 1)
5049           return false;
5050 
5051       num_strings++;
5052     }
5053 
5054   num_buckets = num_strings * 2;
5055 
5056   buckets = xmalloc (sizeof (struct string *) * num_buckets);
5057   memset (buckets, 0, sizeof (struct string *) * num_buckets);
5058 
5059   for (struct string *s = strings->strings_head; s; s = s->next)
5060     {
5061       uint32_t bucket_num = s->hash % num_buckets;
5062 
5063       while (buckets[bucket_num])
5064           {
5065             bucket_num++;
5066 
5067             if (bucket_num == num_buckets)
5068               bucket_num = 0;
5069           }
5070 
5071       buckets[bucket_num] = s;
5072     }
5073 
5074   bfd_putl32 (num_buckets, int_buf);
5075 
5076   if (bfd_write (int_buf, sizeof (uint32_t), stream) != sizeof (uint32_t))
5077     {
5078       free (buckets);
5079       return false;
5080     }
5081 
5082   for (unsigned int i = 0; i < num_buckets; i++)
5083     {
5084       if (buckets[i])
5085           bfd_putl32 (buckets[i]->offset, int_buf);
5086       else
5087           bfd_putl32 (0, int_buf);
5088 
5089       if (bfd_write (int_buf, sizeof (uint32_t), stream) !=
5090             sizeof (uint32_t))
5091           {
5092             free (buckets);
5093             return false;
5094           }
5095     }
5096 
5097   free (buckets);
5098 
5099   bfd_putl32 (num_strings, int_buf);
5100 
5101   if (bfd_write (int_buf, sizeof (uint32_t), stream) != sizeof (uint32_t))
5102     return false;
5103 
5104   return true;
5105 }
5106 
5107 /* Calculate the hash of a type_entry.  */
5108 static hashval_t
hash_type_entry(const void * p)5109 hash_type_entry (const void *p)
5110 {
5111   const struct type_entry *e = (const struct type_entry *) p;
5112   uint16_t size = bfd_getl16 (e->data) + sizeof (uint16_t);
5113 
5114   return iterative_hash (e->data, size, 0);
5115 }
5116 
5117 /* Compare a type_entry with a type.  */
5118 static int
eq_type_entry(const void * a,const void * b)5119 eq_type_entry (const void *a, const void *b)
5120 {
5121   const struct type_entry *e = (const struct type_entry *) a;
5122   uint16_t size_a = bfd_getl16 (e->data);
5123   uint16_t size_b = bfd_getl16 (b);
5124 
5125   if (size_a != size_b)
5126     return 0;
5127 
5128   return memcmp (e->data + sizeof (uint16_t),
5129                      (const uint8_t *) b + sizeof (uint16_t), size_a) == 0;
5130 }
5131 
5132 /* Create a PDB debugging file for the PE image file abfd with the build ID
5133    guid, stored at pdb_name.  */
5134 bool
create_pdb_file(bfd * abfd,const char * pdb_name,const unsigned char * guid)5135 create_pdb_file (bfd *abfd, const char *pdb_name, const unsigned char *guid)
5136 {
5137   bfd *pdb;
5138   bool ret = false;
5139   bfd *info_stream, *dbi_stream, *names_stream, *sym_rec_stream,
5140     *publics_stream, *tpi_stream, *ipi_stream;
5141   uint16_t section_header_stream_num, sym_rec_stream_num, publics_stream_num;
5142   struct string_table strings;
5143   struct types types, ids;
5144 
5145   pdb = bfd_openw (pdb_name, "pdb");
5146   if (!pdb)
5147     {
5148       einfo (_("%P: warning: cannot create PDB file: %E\n"));
5149       return false;
5150     }
5151 
5152   strings.strings_head = NULL;
5153   strings.strings_tail = NULL;
5154   strings.strings_len = 1;
5155   strings.hashmap = htab_create_alloc (0, hash_string_table_entry,
5156                                                eq_string_table_entry, free,
5157                                                xcalloc, free);
5158 
5159   bfd_set_format (pdb, bfd_archive);
5160 
5161   if (!create_old_directory_stream (pdb))
5162     {
5163       einfo (_("%P: warning: cannot create old directory stream "
5164                  "in PDB file: %E\n"));
5165       goto end;
5166     }
5167 
5168   info_stream = add_stream (pdb, NULL, NULL);
5169 
5170   if (!info_stream)
5171     {
5172       einfo (_("%P: warning: cannot create info stream "
5173                  "in PDB file: %E\n"));
5174       goto end;
5175     }
5176 
5177   tpi_stream = add_stream (pdb, NULL, NULL);
5178 
5179   if (!tpi_stream)
5180     {
5181       einfo (_("%P: warning: cannot create TPI stream "
5182                  "in PDB file: %E\n"));
5183       goto end;
5184     }
5185 
5186   dbi_stream = add_stream (pdb, NULL, NULL);
5187 
5188   if (!dbi_stream)
5189     {
5190       einfo (_("%P: warning: cannot create DBI stream "
5191                  "in PDB file: %E\n"));
5192       goto end;
5193     }
5194 
5195   ipi_stream = add_stream (pdb, NULL, NULL);
5196 
5197   if (!ipi_stream)
5198     {
5199       einfo (_("%P: warning: cannot create IPI stream "
5200                  "in PDB file: %E\n"));
5201       goto end;
5202     }
5203 
5204   names_stream = add_stream (pdb, "/names", NULL);
5205 
5206   if (!names_stream)
5207     {
5208       einfo (_("%P: warning: cannot create /names stream "
5209                  "in PDB file: %E\n"));
5210       goto end;
5211     }
5212 
5213   sym_rec_stream = add_stream (pdb, NULL, &sym_rec_stream_num);
5214 
5215   if (!sym_rec_stream)
5216     {
5217       einfo (_("%P: warning: cannot create symbol record stream "
5218                  "in PDB file: %E\n"));
5219       goto end;
5220     }
5221 
5222   publics_stream = add_stream (pdb, NULL, &publics_stream_num);
5223 
5224   if (!publics_stream)
5225     {
5226       einfo (_("%P: warning: cannot create publics stream "
5227                  "in PDB file: %E\n"));
5228       goto end;
5229     }
5230 
5231   if (!create_section_header_stream (pdb, abfd, &section_header_stream_num))
5232     {
5233       einfo (_("%P: warning: cannot create section header stream "
5234                  "in PDB file: %E\n"));
5235       goto end;
5236     }
5237 
5238   types.num_types = 0;
5239   types.hashmap = htab_create_alloc (0, hash_type_entry, eq_type_entry,
5240                                              free, xcalloc, free);
5241   types.first = types.last = NULL;
5242 
5243   ids.num_types = 0;
5244   ids.hashmap = htab_create_alloc (0, hash_type_entry, eq_type_entry,
5245                                            free, xcalloc, free);
5246   ids.first = ids.last = NULL;
5247 
5248   if (!populate_dbi_stream (dbi_stream, abfd, pdb, section_header_stream_num,
5249                                   sym_rec_stream_num, publics_stream_num,
5250                                   &strings, &types, &ids, sym_rec_stream, pdb_name))
5251     {
5252       einfo (_("%P: warning: cannot populate DBI stream "
5253                  "in PDB file: %E\n"));
5254       htab_delete (types.hashmap);
5255       htab_delete (ids.hashmap);
5256       goto end;
5257     }
5258 
5259   if (!populate_type_stream (pdb, tpi_stream, &types))
5260     {
5261       einfo (_("%P: warning: cannot populate TPI stream "
5262                  "in PDB file: %E\n"));
5263       htab_delete (types.hashmap);
5264       htab_delete (ids.hashmap);
5265       goto end;
5266     }
5267 
5268   htab_delete (types.hashmap);
5269 
5270   if (!populate_type_stream (pdb, ipi_stream, &ids))
5271     {
5272       einfo (_("%P: warning: cannot populate IPI stream "
5273                  "in PDB file: %E\n"));
5274       htab_delete (ids.hashmap);
5275       goto end;
5276     }
5277 
5278   htab_delete (ids.hashmap);
5279 
5280   add_string ("", 0, &strings);
5281 
5282   if (!populate_names_stream (names_stream, &strings))
5283     {
5284       einfo (_("%P: warning: cannot populate names stream "
5285                  "in PDB file: %E\n"));
5286       goto end;
5287     }
5288 
5289   if (!populate_publics_stream (publics_stream, abfd, sym_rec_stream))
5290     {
5291       einfo (_("%P: warning: cannot populate publics stream "
5292                  "in PDB file: %E\n"));
5293       goto end;
5294     }
5295 
5296   if (!populate_info_stream (pdb, info_stream, guid))
5297     {
5298       einfo (_("%P: warning: cannot populate info stream "
5299                  "in PDB file: %E\n"));
5300       goto end;
5301     }
5302 
5303   ret = true;
5304 
5305 end:
5306   bfd_close (pdb);
5307 
5308   htab_delete (strings.hashmap);
5309 
5310   return ret;
5311 }
5312