Subversion Repositories Kolibri OS

Rev

Rev 5197 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
5197 serge 1
/* hash.c -- hash table routines for BFD
6324 serge 2
   Copyright (C) 1993-2015 Free Software Foundation, Inc.
5197 serge 3
   Written by Steve Chamberlain 
4
 
5
   This file is part of BFD, the Binary File Descriptor library.
6
 
7
   This program is free software; you can redistribute it and/or modify
8
   it under the terms of the GNU General Public License as published by
9
   the Free Software Foundation; either version 3 of the License, or
10
   (at your option) any later version.
11
 
12
   This program is distributed in the hope that it will be useful,
13
   but WITHOUT ANY WARRANTY; without even the implied warranty of
14
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15
   GNU General Public License for more details.
16
 
17
   You should have received a copy of the GNU General Public License
18
   along with this program; if not, write to the Free Software
19
   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
20
   MA 02110-1301, USA.  */
21
 
22
#include "sysdep.h"
23
#include "bfd.h"
24
#include "libbfd.h"
25
#include "objalloc.h"
26
#include "libiberty.h"
27
 
28
/*
29
SECTION
30
	Hash Tables
31
 
32
@cindex Hash tables
33
	BFD provides a simple set of hash table functions.  Routines
34
	are provided to initialize a hash table, to free a hash table,
35
	to look up a string in a hash table and optionally create an
36
	entry for it, and to traverse a hash table.  There is
37
	currently no routine to delete an string from a hash table.
38
 
39
	The basic hash table does not permit any data to be stored
40
	with a string.  However, a hash table is designed to present a
41
	base class from which other types of hash tables may be
42
	derived.  These derived types may store additional information
43
	with the string.  Hash tables were implemented in this way,
44
	rather than simply providing a data pointer in a hash table
45
	entry, because they were designed for use by the linker back
46
	ends.  The linker may create thousands of hash table entries,
47
	and the overhead of allocating private data and storing and
48
	following pointers becomes noticeable.
49
 
50
	The basic hash table code is in <>.
51
 
52
@menu
53
@* Creating and Freeing a Hash Table::
54
@* Looking Up or Entering a String::
55
@* Traversing a Hash Table::
56
@* Deriving a New Hash Table Type::
57
@end menu
58
 
59
INODE
60
Creating and Freeing a Hash Table, Looking Up or Entering a String, Hash Tables, Hash Tables
61
SUBSECTION
62
	Creating and freeing a hash table
63
 
64
@findex bfd_hash_table_init
65
@findex bfd_hash_table_init_n
66
	To create a hash table, create an instance of a <
67
	bfd_hash_table>> (defined in <>) and call
68
	<> (if you know approximately how many
69
	entries you will need, the function <>,
70
	which takes a @var{size} argument, may be used).
71
	<> returns <> if some sort of
72
	error occurs.
73
 
74
@findex bfd_hash_newfunc
75
	The function <> take as an argument a
76
	function to use to create new entries.  For a basic hash
77
	table, use the function <>.  @xref{Deriving
78
	a New Hash Table Type}, for why you would want to use a
79
	different value for this argument.
80
 
81
@findex bfd_hash_allocate
82
	<> will create an objalloc which will be
83
	used to allocate new entries.  You may allocate memory on this
84
	objalloc using <>.
85
 
86
@findex bfd_hash_table_free
87
	Use <> to free up all the memory that has
88
	been allocated for a hash table.  This will not free up the
89
	<> itself, which you must provide.
90
 
91
@findex bfd_hash_set_default_size
92
	Use <> to set the default size of
93
	hash table to use.
94
 
95
INODE
96
Looking Up or Entering a String, Traversing a Hash Table, Creating and Freeing a Hash Table, Hash Tables
97
SUBSECTION
98
	Looking up or entering a string
99
 
100
@findex bfd_hash_lookup
101
	The function <> is used both to look up a
102
	string in the hash table and to create a new entry.
103
 
104
	If the @var{create} argument is <>, <>
105
	will look up a string.  If the string is found, it will
106
	returns a pointer to a <>.  If the
107
	string is not found in the table <> will
108
	return <>.  You should not modify any of the fields in
109
	the returns <>.
110
 
111
	If the @var{create} argument is <>, the string will be
112
	entered into the hash table if it is not already there.
113
	Either way a pointer to a <> will be
114
	returned, either to the existing structure or to a newly
115
	created one.  In this case, a <> return means that an
116
	error occurred.
117
 
118
	If the @var{create} argument is <>, and a new entry is
119
	created, the @var{copy} argument is used to decide whether to
120
	copy the string onto the hash table objalloc or not.  If
121
	@var{copy} is passed as <>, you must be careful not to
122
	deallocate or modify the string as long as the hash table
123
	exists.
124
 
125
INODE
126
Traversing a Hash Table, Deriving a New Hash Table Type, Looking Up or Entering a String, Hash Tables
127
SUBSECTION
128
	Traversing a hash table
129
 
130
@findex bfd_hash_traverse
131
	The function <> may be used to traverse a
132
	hash table, calling a function on each element.  The traversal
133
	is done in a random order.
134
 
135
	<> takes as arguments a function and a
136
	generic <> pointer.  The function is called with a
137
	hash table entry (a <>) and the
138
	generic pointer passed to <>.  The function
139
	must return a <> value, which indicates whether to
140
	continue traversing the hash table.  If the function returns
141
	<>, <> will stop the traversal and
142
	return immediately.
143
 
144
INODE
145
Deriving a New Hash Table Type, , Traversing a Hash Table, Hash Tables
146
SUBSECTION
147
	Deriving a new hash table type
148
 
149
	Many uses of hash tables want to store additional information
150
	which each entry in the hash table.  Some also find it
151
	convenient to store additional information with the hash table
152
	itself.  This may be done using a derived hash table.
153
 
154
	Since C is not an object oriented language, creating a derived
155
	hash table requires sticking together some boilerplate
156
	routines with a few differences specific to the type of hash
157
	table you want to create.
158
 
159
	An example of a derived hash table is the linker hash table.
160
	The structures for this are defined in <>.  The
161
	functions are in <>.
162
 
163
	You may also derive a hash table from an already derived hash
164
	table.  For example, the a.out linker backend code uses a hash
165
	table derived from the linker hash table.
166
 
167
@menu
168
@* Define the Derived Structures::
169
@* Write the Derived Creation Routine::
170
@* Write Other Derived Routines::
171
@end menu
172
 
173
INODE
174
Define the Derived Structures, Write the Derived Creation Routine, Deriving a New Hash Table Type, Deriving a New Hash Table Type
175
SUBSUBSECTION
176
	Define the derived structures
177
 
178
	You must define a structure for an entry in the hash table,
179
	and a structure for the hash table itself.
180
 
181
	The first field in the structure for an entry in the hash
182
	table must be of the type used for an entry in the hash table
183
	you are deriving from.  If you are deriving from a basic hash
184
	table this is <>, which is defined in
185
	<>.  The first field in the structure for the hash
186
	table itself must be of the type of the hash table you are
187
	deriving from itself.  If you are deriving from a basic hash
188
	table, this is <>.
189
 
190
	For example, the linker hash table defines <
191
	bfd_link_hash_entry>> (in <>).  The first field,
192
	<>, is of type <>.  Similarly,
193
	the first field in <>, <>,
194
	is of type <>.
195
 
196
INODE
197
Write the Derived Creation Routine, Write Other Derived Routines, Define the Derived Structures, Deriving a New Hash Table Type
198
SUBSUBSECTION
199
	Write the derived creation routine
200
 
201
	You must write a routine which will create and initialize an
202
	entry in the hash table.  This routine is passed as the
203
	function argument to <>.
204
 
205
	In order to permit other hash tables to be derived from the
206
	hash table you are creating, this routine must be written in a
207
	standard way.
208
 
209
	The first argument to the creation routine is a pointer to a
210
	hash table entry.  This may be <>, in which case the
211
	routine should allocate the right amount of space.  Otherwise
212
	the space has already been allocated by a hash table type
213
	derived from this one.
214
 
215
	After allocating space, the creation routine must call the
216
	creation routine of the hash table type it is derived from,
217
	passing in a pointer to the space it just allocated.  This
218
	will initialize any fields used by the base hash table.
219
 
220
	Finally the creation routine must initialize any local fields
221
	for the new hash table type.
222
 
223
	Here is a boilerplate example of a creation routine.
224
	@var{function_name} is the name of the routine.
225
	@var{entry_type} is the type of an entry in the hash table you
226
	are creating.  @var{base_newfunc} is the name of the creation
227
	routine of the hash table type your hash table is derived
228
	from.
229
 
230
EXAMPLE
231
 
232
.struct bfd_hash_entry *
233
.@var{function_name} (struct bfd_hash_entry *entry,
234
.                     struct bfd_hash_table *table,
235
.                     const char *string)
236
.{
237
.  struct @var{entry_type} *ret = (@var{entry_type} *) entry;
238
.
239
. {* Allocate the structure if it has not already been allocated by a
240
.    derived class.  *}
241
.  if (ret == NULL)
242
.    {
243
.      ret = bfd_hash_allocate (table, sizeof (* ret));
244
.      if (ret == NULL)
245
.        return NULL;
246
.    }
247
.
248
. {* Call the allocation method of the base class.  *}
249
.  ret = ((@var{entry_type} *)
250
.	 @var{base_newfunc} ((struct bfd_hash_entry *) ret, table, string));
251
.
252
. {* Initialize the local fields here.  *}
253
.
254
.  return (struct bfd_hash_entry *) ret;
255
.}
256
 
257
DESCRIPTION
258
	The creation routine for the linker hash table, which is in
259
	<>, looks just like this example.
260
	@var{function_name} is <<_bfd_link_hash_newfunc>>.
261
	@var{entry_type} is <>.
262
	@var{base_newfunc} is <>, the creation
263
	routine for a basic hash table.
264
 
265
	<<_bfd_link_hash_newfunc>> also initializes the local fields
266
	in a linker hash table entry: <>, <> and
267
	<>.
268
 
269
INODE
270
Write Other Derived Routines, , Write the Derived Creation Routine, Deriving a New Hash Table Type
271
SUBSUBSECTION
272
	Write other derived routines
273
 
274
	You will want to write other routines for your new hash table,
275
	as well.
276
 
277
	You will want an initialization routine which calls the
278
	initialization routine of the hash table you are deriving from
279
	and initializes any other local fields.  For the linker hash
280
	table, this is <<_bfd_link_hash_table_init>> in <>.
281
 
282
	You will want a lookup routine which calls the lookup routine
283
	of the hash table you are deriving from and casts the result.
284
	The linker hash table uses <> in
285
	<> (this actually takes an additional argument which
286
	it uses to decide how to return the looked up value).
287
 
288
	You may want a traversal routine.  This should just call the
289
	traversal routine of the hash table you are deriving from with
290
	appropriate casts.  The linker hash table uses
291
	<> in <>.
292
 
293
	These routines may simply be defined as macros.  For example,
294
	the a.out backend linker hash table, which is derived from the
295
	linker hash table, uses macros for the lookup and traversal
296
	routines.  These are <> and
297
	<> in aoutx.h.
298
*/
299
 
300
/* The default number of entries to use when creating a hash table.  */
301
#define DEFAULT_SIZE 4051
302
 
303
/* The following function returns a nearest prime number which is
304
   greater than N, and near a power of two.  Copied from libiberty.
305
   Returns zero for ridiculously large N to signify an error.  */
306
 
307
static unsigned long
308
higher_prime_number (unsigned long n)
309
{
310
  /* These are primes that are near, but slightly smaller than, a
311
     power of two.  */
312
  static const unsigned long primes[] =
313
    {
314
      (unsigned long) 31,
315
      (unsigned long) 61,
316
      (unsigned long) 127,
317
      (unsigned long) 251,
318
      (unsigned long) 509,
319
      (unsigned long) 1021,
320
      (unsigned long) 2039,
321
      (unsigned long) 4093,
322
      (unsigned long) 8191,
323
      (unsigned long) 16381,
324
      (unsigned long) 32749,
325
      (unsigned long) 65521,
326
      (unsigned long) 131071,
327
      (unsigned long) 262139,
328
      (unsigned long) 524287,
329
      (unsigned long) 1048573,
330
      (unsigned long) 2097143,
331
      (unsigned long) 4194301,
332
      (unsigned long) 8388593,
333
      (unsigned long) 16777213,
334
      (unsigned long) 33554393,
335
      (unsigned long) 67108859,
336
      (unsigned long) 134217689,
337
      (unsigned long) 268435399,
338
      (unsigned long) 536870909,
339
      (unsigned long) 1073741789,
340
      (unsigned long) 2147483647,
341
					/* 4294967291L */
342
      ((unsigned long) 2147483647) + ((unsigned long) 2147483644),
343
  };
344
 
345
  const unsigned long *low = &primes[0];
346
  const unsigned long *high = &primes[sizeof (primes) / sizeof (primes[0])];
347
 
348
  while (low != high)
349
    {
350
      const unsigned long *mid = low + (high - low) / 2;
351
      if (n >= *mid)
352
	low = mid + 1;
353
      else
354
	high = mid;
355
    }
356
 
357
  if (n >= *low)
358
    return 0;
359
 
360
  return *low;
361
}
362
 
363
static unsigned long bfd_default_hash_table_size = DEFAULT_SIZE;
364
 
365
/* Create a new hash table, given a number of entries.  */
366
 
367
bfd_boolean
368
bfd_hash_table_init_n (struct bfd_hash_table *table,
369
		       struct bfd_hash_entry *(*newfunc) (struct bfd_hash_entry *,
370
							  struct bfd_hash_table *,
371
							  const char *),
372
		       unsigned int entsize,
373
		       unsigned int size)
374
{
375
  unsigned long alloc;
376
 
377
  alloc = size;
378
  alloc *= sizeof (struct bfd_hash_entry *);
379
  if (alloc / sizeof (struct bfd_hash_entry *) != size)
380
    {
381
      bfd_set_error (bfd_error_no_memory);
382
      return FALSE;
383
    }
384
 
385
  table->memory = (void *) objalloc_create ();
386
  if (table->memory == NULL)
387
    {
388
      bfd_set_error (bfd_error_no_memory);
389
      return FALSE;
390
    }
391
  table->table = (struct bfd_hash_entry **)
392
      objalloc_alloc ((struct objalloc *) table->memory, alloc);
393
  if (table->table == NULL)
394
    {
6324 serge 395
      bfd_hash_table_free (table);
5197 serge 396
      bfd_set_error (bfd_error_no_memory);
397
      return FALSE;
398
    }
399
  memset ((void *) table->table, 0, alloc);
400
  table->size = size;
401
  table->entsize = entsize;
402
  table->count = 0;
403
  table->frozen = 0;
404
  table->newfunc = newfunc;
405
  return TRUE;
406
}
407
 
408
/* Create a new hash table with the default number of entries.  */
409
 
410
bfd_boolean
411
bfd_hash_table_init (struct bfd_hash_table *table,
412
		     struct bfd_hash_entry *(*newfunc) (struct bfd_hash_entry *,
413
							struct bfd_hash_table *,
414
							const char *),
415
		     unsigned int entsize)
416
{
417
  return bfd_hash_table_init_n (table, newfunc, entsize,
418
				bfd_default_hash_table_size);
419
}
420
 
421
/* Free a hash table.  */
422
 
423
void
424
bfd_hash_table_free (struct bfd_hash_table *table)
425
{
426
  objalloc_free ((struct objalloc *) table->memory);
427
  table->memory = NULL;
428
}
429
 
430
static inline unsigned long
431
bfd_hash_hash (const char *string, unsigned int *lenp)
432
{
433
  const unsigned char *s;
434
  unsigned long hash;
435
  unsigned int len;
436
  unsigned int c;
437
 
438
  hash = 0;
439
  len = 0;
440
  s = (const unsigned char *) string;
441
  while ((c = *s++) != '\0')
442
    {
443
      hash += c + (c << 17);
444
      hash ^= hash >> 2;
445
    }
446
  len = (s - (const unsigned char *) string) - 1;
447
  hash += len + (len << 17);
448
  hash ^= hash >> 2;
449
  if (lenp != NULL)
450
    *lenp = len;
451
  return hash;
452
}
453
 
454
/* Look up a string in a hash table.  */
455
 
456
struct bfd_hash_entry *
457
bfd_hash_lookup (struct bfd_hash_table *table,
458
		 const char *string,
459
		 bfd_boolean create,
460
		 bfd_boolean copy)
461
{
462
  unsigned long hash;
463
  struct bfd_hash_entry *hashp;
464
  unsigned int len;
465
  unsigned int _index;
466
 
467
  hash = bfd_hash_hash (string, &len);
468
  _index = hash % table->size;
469
  for (hashp = table->table[_index];
470
       hashp != NULL;
471
       hashp = hashp->next)
472
    {
473
      if (hashp->hash == hash
474
	  && strcmp (hashp->string, string) == 0)
475
	return hashp;
476
    }
477
 
478
  if (! create)
479
    return NULL;
480
 
481
  if (copy)
482
    {
483
      char *new_string;
484
 
485
      new_string = (char *) objalloc_alloc ((struct objalloc *) table->memory,
486
                                            len + 1);
487
      if (!new_string)
488
	{
489
	  bfd_set_error (bfd_error_no_memory);
490
	  return NULL;
491
	}
492
      memcpy (new_string, string, len + 1);
493
      string = new_string;
494
    }
495
 
496
  return bfd_hash_insert (table, string, hash);
497
}
498
 
499
/* Insert an entry in a hash table.  */
500
 
501
struct bfd_hash_entry *
502
bfd_hash_insert (struct bfd_hash_table *table,
503
		 const char *string,
504
		 unsigned long hash)
505
{
506
  struct bfd_hash_entry *hashp;
507
  unsigned int _index;
508
 
509
  hashp = (*table->newfunc) (NULL, table, string);
510
  if (hashp == NULL)
511
    return NULL;
512
  hashp->string = string;
513
  hashp->hash = hash;
514
  _index = hash % table->size;
515
  hashp->next = table->table[_index];
516
  table->table[_index] = hashp;
517
  table->count++;
518
 
519
  if (!table->frozen && table->count > table->size * 3 / 4)
520
    {
521
      unsigned long newsize = higher_prime_number (table->size);
522
      struct bfd_hash_entry **newtable;
523
      unsigned int hi;
524
      unsigned long alloc = newsize * sizeof (struct bfd_hash_entry *);
525
 
526
      /* If we can't find a higher prime, or we can't possibly alloc
527
	 that much memory, don't try to grow the table.  */
528
      if (newsize == 0 || alloc / sizeof (struct bfd_hash_entry *) != newsize)
529
	{
530
	  table->frozen = 1;
531
	  return hashp;
532
	}
533
 
534
      newtable = ((struct bfd_hash_entry **)
535
		  objalloc_alloc ((struct objalloc *) table->memory, alloc));
536
      if (newtable == NULL)
537
	{
538
	  table->frozen = 1;
539
	  return hashp;
540
	}
541
      memset (newtable, 0, alloc);
542
 
543
      for (hi = 0; hi < table->size; hi ++)
544
	while (table->table[hi])
545
	  {
546
	    struct bfd_hash_entry *chain = table->table[hi];
547
	    struct bfd_hash_entry *chain_end = chain;
548
 
549
	    while (chain_end->next && chain_end->next->hash == chain->hash)
550
	      chain_end = chain_end->next;
551
 
552
	    table->table[hi] = chain_end->next;
553
	    _index = chain->hash % newsize;
554
	    chain_end->next = newtable[_index];
555
	    newtable[_index] = chain;
556
	  }
557
      table->table = newtable;
558
      table->size = newsize;
559
    }
560
 
561
  return hashp;
562
}
563
 
564
/* Rename an entry in a hash table.  */
565
 
566
void
567
bfd_hash_rename (struct bfd_hash_table *table,
568
		 const char *string,
569
		 struct bfd_hash_entry *ent)
570
{
571
  unsigned int _index;
572
  struct bfd_hash_entry **pph;
573
 
574
  _index = ent->hash % table->size;
575
  for (pph = &table->table[_index]; *pph != NULL; pph = &(*pph)->next)
576
    if (*pph == ent)
577
      break;
578
  if (*pph == NULL)
579
    abort ();
580
 
581
  *pph = ent->next;
582
  ent->string = string;
583
  ent->hash = bfd_hash_hash (string, NULL);
584
  _index = ent->hash % table->size;
585
  ent->next = table->table[_index];
586
  table->table[_index] = ent;
587
}
588
 
589
/* Replace an entry in a hash table.  */
590
 
591
void
592
bfd_hash_replace (struct bfd_hash_table *table,
593
		  struct bfd_hash_entry *old,
594
		  struct bfd_hash_entry *nw)
595
{
596
  unsigned int _index;
597
  struct bfd_hash_entry **pph;
598
 
599
  _index = old->hash % table->size;
600
  for (pph = &table->table[_index];
601
       (*pph) != NULL;
602
       pph = &(*pph)->next)
603
    {
604
      if (*pph == old)
605
	{
606
	  *pph = nw;
607
	  return;
608
	}
609
    }
610
 
611
  abort ();
612
}
613
 
614
/* Allocate space in a hash table.  */
615
 
616
void *
617
bfd_hash_allocate (struct bfd_hash_table *table,
618
		   unsigned int size)
619
{
620
  void * ret;
621
 
622
  ret = objalloc_alloc ((struct objalloc *) table->memory, size);
623
  if (ret == NULL && size != 0)
624
    bfd_set_error (bfd_error_no_memory);
625
  return ret;
626
}
627
 
628
/* Base method for creating a new hash table entry.  */
629
 
630
struct bfd_hash_entry *
631
bfd_hash_newfunc (struct bfd_hash_entry *entry,
632
		  struct bfd_hash_table *table,
633
		  const char *string ATTRIBUTE_UNUSED)
634
{
635
  if (entry == NULL)
636
    entry = (struct bfd_hash_entry *) bfd_hash_allocate (table,
637
                                                         sizeof (* entry));
638
  return entry;
639
}
640
 
641
/* Traverse a hash table.  */
642
 
643
void
644
bfd_hash_traverse (struct bfd_hash_table *table,
645
		   bfd_boolean (*func) (struct bfd_hash_entry *, void *),
646
		   void * info)
647
{
648
  unsigned int i;
649
 
650
  table->frozen = 1;
651
  for (i = 0; i < table->size; i++)
652
    {
653
      struct bfd_hash_entry *p;
654
 
655
      for (p = table->table[i]; p != NULL; p = p->next)
656
	if (! (*func) (p, info))
657
	  goto out;
658
    }
659
 out:
660
  table->frozen = 0;
661
}
662
 
663
unsigned long
664
bfd_hash_set_default_size (unsigned long hash_size)
665
{
666
  /* Extend this prime list if you want more granularity of hash table size.  */
667
  static const unsigned long hash_size_primes[] =
668
    {
669
      31, 61, 127, 251, 509, 1021, 2039, 4091, 8191, 16381, 32749, 65537
670
    };
671
  unsigned int _index;
672
 
673
  /* Work out best prime number near the hash_size.  */
674
  for (_index = 0; _index < ARRAY_SIZE (hash_size_primes) - 1; ++_index)
675
    if (hash_size <= hash_size_primes[_index])
676
      break;
677
 
678
  bfd_default_hash_table_size = hash_size_primes[_index];
679
  return bfd_default_hash_table_size;
680
}
681
 
682
/* A few different object file formats (a.out, COFF, ELF) use a string
683
   table.  These functions support adding strings to a string table,
684
   returning the byte offset, and writing out the table.
685
 
686
   Possible improvements:
687
   + look for strings matching trailing substrings of other strings
688
   + better data structures?  balanced trees?
689
   + look at reducing memory use elsewhere -- maybe if we didn't have
690
     to construct the entire symbol table at once, we could get by
691
     with smaller amounts of VM?  (What effect does that have on the
692
     string table reductions?)  */
693
 
694
/* An entry in the strtab hash table.  */
695
 
696
struct strtab_hash_entry
697
{
698
  struct bfd_hash_entry root;
699
  /* Index in string table.  */
700
  bfd_size_type index;
701
  /* Next string in strtab.  */
702
  struct strtab_hash_entry *next;
703
};
704
 
705
/* The strtab hash table.  */
706
 
707
struct bfd_strtab_hash
708
{
709
  struct bfd_hash_table table;
710
  /* Size of strtab--also next available index.  */
711
  bfd_size_type size;
712
  /* First string in strtab.  */
713
  struct strtab_hash_entry *first;
714
  /* Last string in strtab.  */
715
  struct strtab_hash_entry *last;
716
  /* Whether to precede strings with a two byte length, as in the
717
     XCOFF .debug section.  */
718
  bfd_boolean xcoff;
719
};
720
 
721
/* Routine to create an entry in a strtab.  */
722
 
723
static struct bfd_hash_entry *
724
strtab_hash_newfunc (struct bfd_hash_entry *entry,
725
		     struct bfd_hash_table *table,
726
		     const char *string)
727
{
728
  struct strtab_hash_entry *ret = (struct strtab_hash_entry *) entry;
729
 
730
  /* Allocate the structure if it has not already been allocated by a
731
     subclass.  */
732
  if (ret == NULL)
733
    ret = (struct strtab_hash_entry *) bfd_hash_allocate (table,
734
                                                          sizeof (* ret));
735
  if (ret == NULL)
736
    return NULL;
737
 
738
  /* Call the allocation method of the superclass.  */
739
  ret = (struct strtab_hash_entry *)
740
	 bfd_hash_newfunc ((struct bfd_hash_entry *) ret, table, string);
741
 
742
  if (ret)
743
    {
744
      /* Initialize the local fields.  */
745
      ret->index = (bfd_size_type) -1;
746
      ret->next = NULL;
747
    }
748
 
749
  return (struct bfd_hash_entry *) ret;
750
}
751
 
752
/* Look up an entry in an strtab.  */
753
 
754
#define strtab_hash_lookup(t, string, create, copy) \
755
  ((struct strtab_hash_entry *) \
756
   bfd_hash_lookup (&(t)->table, (string), (create), (copy)))
757
 
758
/* Create a new strtab.  */
759
 
760
struct bfd_strtab_hash *
761
_bfd_stringtab_init (void)
762
{
763
  struct bfd_strtab_hash *table;
764
  bfd_size_type amt = sizeof (* table);
765
 
766
  table = (struct bfd_strtab_hash *) bfd_malloc (amt);
767
  if (table == NULL)
768
    return NULL;
769
 
770
  if (!bfd_hash_table_init (&table->table, strtab_hash_newfunc,
771
			    sizeof (struct strtab_hash_entry)))
772
    {
773
      free (table);
774
      return NULL;
775
    }
776
 
777
  table->size = 0;
778
  table->first = NULL;
779
  table->last = NULL;
780
  table->xcoff = FALSE;
781
 
782
  return table;
783
}
784
 
785
/* Create a new strtab in which the strings are output in the format
786
   used in the XCOFF .debug section: a two byte length precedes each
787
   string.  */
788
 
789
struct bfd_strtab_hash *
790
_bfd_xcoff_stringtab_init (void)
791
{
792
  struct bfd_strtab_hash *ret;
793
 
794
  ret = _bfd_stringtab_init ();
795
  if (ret != NULL)
796
    ret->xcoff = TRUE;
797
  return ret;
798
}
799
 
800
/* Free a strtab.  */
801
 
802
void
803
_bfd_stringtab_free (struct bfd_strtab_hash *table)
804
{
805
  bfd_hash_table_free (&table->table);
806
  free (table);
807
}
808
 
809
/* Get the index of a string in a strtab, adding it if it is not
810
   already present.  If HASH is FALSE, we don't really use the hash
811
   table, and we don't eliminate duplicate strings.  If COPY is true
812
   then store a copy of STR if creating a new entry.  */
813
 
814
bfd_size_type
815
_bfd_stringtab_add (struct bfd_strtab_hash *tab,
816
		    const char *str,
817
		    bfd_boolean hash,
818
		    bfd_boolean copy)
819
{
820
  struct strtab_hash_entry *entry;
821
 
822
  if (hash)
823
    {
824
      entry = strtab_hash_lookup (tab, str, TRUE, copy);
825
      if (entry == NULL)
826
	return (bfd_size_type) -1;
827
    }
828
  else
829
    {
830
      entry = (struct strtab_hash_entry *) bfd_hash_allocate (&tab->table,
831
                                                              sizeof (* entry));
832
      if (entry == NULL)
833
	return (bfd_size_type) -1;
834
      if (! copy)
835
	entry->root.string = str;
836
      else
837
	{
838
	  size_t len = strlen (str) + 1;
839
	  char *n;
840
 
841
	  n = (char *) bfd_hash_allocate (&tab->table, len);
842
	  if (n == NULL)
843
	    return (bfd_size_type) -1;
844
          memcpy (n, str, len);
845
	  entry->root.string = n;
846
	}
847
      entry->index = (bfd_size_type) -1;
848
      entry->next = NULL;
849
    }
850
 
851
  if (entry->index == (bfd_size_type) -1)
852
    {
853
      entry->index = tab->size;
854
      tab->size += strlen (str) + 1;
855
      if (tab->xcoff)
856
	{
857
	  entry->index += 2;
858
	  tab->size += 2;
859
	}
860
      if (tab->first == NULL)
861
	tab->first = entry;
862
      else
863
	tab->last->next = entry;
864
      tab->last = entry;
865
    }
866
 
867
  return entry->index;
868
}
869
 
870
/* Get the number of bytes in a strtab.  */
871
 
872
bfd_size_type
873
_bfd_stringtab_size (struct bfd_strtab_hash *tab)
874
{
875
  return tab->size;
876
}
877
 
878
/* Write out a strtab.  ABFD must already be at the right location in
879
   the file.  */
880
 
881
bfd_boolean
882
_bfd_stringtab_emit (bfd *abfd, struct bfd_strtab_hash *tab)
883
{
884
  bfd_boolean xcoff;
885
  struct strtab_hash_entry *entry;
886
 
887
  xcoff = tab->xcoff;
888
 
889
  for (entry = tab->first; entry != NULL; entry = entry->next)
890
    {
891
      const char *str;
892
      size_t len;
893
 
894
      str = entry->root.string;
895
      len = strlen (str) + 1;
896
 
897
      if (xcoff)
898
	{
899
	  bfd_byte buf[2];
900
 
901
	  /* The output length includes the null byte.  */
902
	  bfd_put_16 (abfd, (bfd_vma) len, buf);
903
	  if (bfd_bwrite ((void *) buf, (bfd_size_type) 2, abfd) != 2)
904
	    return FALSE;
905
	}
906
 
907
      if (bfd_bwrite ((void *) str, (bfd_size_type) len, abfd) != len)
908
	return FALSE;
909
    }
910
 
911
  return TRUE;
912
}