Index: bfd/doc/hash.texi |
diff --git a/bfd/doc/hash.texi b/bfd/doc/hash.texi |
deleted file mode 100644 |
index 88d9585cc405ec5ca820dcf42ab9e8104c50bf45..0000000000000000000000000000000000000000 |
--- a/bfd/doc/hash.texi |
+++ /dev/null |
@@ -1,247 +0,0 @@ |
-@section Hash Tables |
-@cindex Hash tables |
-BFD provides a simple set of hash table functions. Routines |
-are provided to initialize a hash table, to free a hash table, |
-to look up a string in a hash table and optionally create an |
-entry for it, and to traverse a hash table. There is |
-currently no routine to delete an string from a hash table. |
- |
-The basic hash table does not permit any data to be stored |
-with a string. However, a hash table is designed to present a |
-base class from which other types of hash tables may be |
-derived. These derived types may store additional information |
-with the string. Hash tables were implemented in this way, |
-rather than simply providing a data pointer in a hash table |
-entry, because they were designed for use by the linker back |
-ends. The linker may create thousands of hash table entries, |
-and the overhead of allocating private data and storing and |
-following pointers becomes noticeable. |
- |
-The basic hash table code is in @code{hash.c}. |
- |
-@menu |
-* Creating and Freeing a Hash Table:: |
-* Looking Up or Entering a String:: |
-* Traversing a Hash Table:: |
-* Deriving a New Hash Table Type:: |
-@end menu |
- |
-@node Creating and Freeing a Hash Table, Looking Up or Entering a String, Hash Tables, Hash Tables |
-@subsection Creating and freeing a hash table |
-@findex bfd_hash_table_init |
-@findex bfd_hash_table_init_n |
-To create a hash table, create an instance of a @code{struct |
-bfd_hash_table} (defined in @code{bfd.h}) and call |
-@code{bfd_hash_table_init} (if you know approximately how many |
-entries you will need, the function @code{bfd_hash_table_init_n}, |
-which takes a @var{size} argument, may be used). |
-@code{bfd_hash_table_init} returns @code{FALSE} if some sort of |
-error occurs. |
- |
-@findex bfd_hash_newfunc |
-The function @code{bfd_hash_table_init} take as an argument a |
-function to use to create new entries. For a basic hash |
-table, use the function @code{bfd_hash_newfunc}. @xref{Deriving |
-a New Hash Table Type}, for why you would want to use a |
-different value for this argument. |
- |
-@findex bfd_hash_allocate |
-@code{bfd_hash_table_init} will create an objalloc which will be |
-used to allocate new entries. You may allocate memory on this |
-objalloc using @code{bfd_hash_allocate}. |
- |
-@findex bfd_hash_table_free |
-Use @code{bfd_hash_table_free} to free up all the memory that has |
-been allocated for a hash table. This will not free up the |
-@code{struct bfd_hash_table} itself, which you must provide. |
- |
-@findex bfd_hash_set_default_size |
-Use @code{bfd_hash_set_default_size} to set the default size of |
-hash table to use. |
- |
-@node Looking Up or Entering a String, Traversing a Hash Table, Creating and Freeing a Hash Table, Hash Tables |
-@subsection Looking up or entering a string |
-@findex bfd_hash_lookup |
-The function @code{bfd_hash_lookup} is used both to look up a |
-string in the hash table and to create a new entry. |
- |
-If the @var{create} argument is @code{FALSE}, @code{bfd_hash_lookup} |
-will look up a string. If the string is found, it will |
-returns a pointer to a @code{struct bfd_hash_entry}. If the |
-string is not found in the table @code{bfd_hash_lookup} will |
-return @code{NULL}. You should not modify any of the fields in |
-the returns @code{struct bfd_hash_entry}. |
- |
-If the @var{create} argument is @code{TRUE}, the string will be |
-entered into the hash table if it is not already there. |
-Either way a pointer to a @code{struct bfd_hash_entry} will be |
-returned, either to the existing structure or to a newly |
-created one. In this case, a @code{NULL} return means that an |
-error occurred. |
- |
-If the @var{create} argument is @code{TRUE}, and a new entry is |
-created, the @var{copy} argument is used to decide whether to |
-copy the string onto the hash table objalloc or not. If |
-@var{copy} is passed as @code{FALSE}, you must be careful not to |
-deallocate or modify the string as long as the hash table |
-exists. |
- |
-@node Traversing a Hash Table, Deriving a New Hash Table Type, Looking Up or Entering a String, Hash Tables |
-@subsection Traversing a hash table |
-@findex bfd_hash_traverse |
-The function @code{bfd_hash_traverse} may be used to traverse a |
-hash table, calling a function on each element. The traversal |
-is done in a random order. |
- |
-@code{bfd_hash_traverse} takes as arguments a function and a |
-generic @code{void *} pointer. The function is called with a |
-hash table entry (a @code{struct bfd_hash_entry *}) and the |
-generic pointer passed to @code{bfd_hash_traverse}. The function |
-must return a @code{boolean} value, which indicates whether to |
-continue traversing the hash table. If the function returns |
-@code{FALSE}, @code{bfd_hash_traverse} will stop the traversal and |
-return immediately. |
- |
-@node Deriving a New Hash Table Type, , Traversing a Hash Table, Hash Tables |
-@subsection Deriving a new hash table type |
-Many uses of hash tables want to store additional information |
-which each entry in the hash table. Some also find it |
-convenient to store additional information with the hash table |
-itself. This may be done using a derived hash table. |
- |
-Since C is not an object oriented language, creating a derived |
-hash table requires sticking together some boilerplate |
-routines with a few differences specific to the type of hash |
-table you want to create. |
- |
-An example of a derived hash table is the linker hash table. |
-The structures for this are defined in @code{bfdlink.h}. The |
-functions are in @code{linker.c}. |
- |
-You may also derive a hash table from an already derived hash |
-table. For example, the a.out linker backend code uses a hash |
-table derived from the linker hash table. |
- |
-@menu |
-* Define the Derived Structures:: |
-* Write the Derived Creation Routine:: |
-* Write Other Derived Routines:: |
-@end menu |
- |
-@node Define the Derived Structures, Write the Derived Creation Routine, Deriving a New Hash Table Type, Deriving a New Hash Table Type |
-@subsubsection Define the derived structures |
-You must define a structure for an entry in the hash table, |
-and a structure for the hash table itself. |
- |
-The first field in the structure for an entry in the hash |
-table must be of the type used for an entry in the hash table |
-you are deriving from. If you are deriving from a basic hash |
-table this is @code{struct bfd_hash_entry}, which is defined in |
-@code{bfd.h}. The first field in the structure for the hash |
-table itself must be of the type of the hash table you are |
-deriving from itself. If you are deriving from a basic hash |
-table, this is @code{struct bfd_hash_table}. |
- |
-For example, the linker hash table defines @code{struct |
-bfd_link_hash_entry} (in @code{bfdlink.h}). The first field, |
-@code{root}, is of type @code{struct bfd_hash_entry}. Similarly, |
-the first field in @code{struct bfd_link_hash_table}, @code{table}, |
-is of type @code{struct bfd_hash_table}. |
- |
-@node Write the Derived Creation Routine, Write Other Derived Routines, Define the Derived Structures, Deriving a New Hash Table Type |
-@subsubsection Write the derived creation routine |
-You must write a routine which will create and initialize an |
-entry in the hash table. This routine is passed as the |
-function argument to @code{bfd_hash_table_init}. |
- |
-In order to permit other hash tables to be derived from the |
-hash table you are creating, this routine must be written in a |
-standard way. |
- |
-The first argument to the creation routine is a pointer to a |
-hash table entry. This may be @code{NULL}, in which case the |
-routine should allocate the right amount of space. Otherwise |
-the space has already been allocated by a hash table type |
-derived from this one. |
- |
-After allocating space, the creation routine must call the |
-creation routine of the hash table type it is derived from, |
-passing in a pointer to the space it just allocated. This |
-will initialize any fields used by the base hash table. |
- |
-Finally the creation routine must initialize any local fields |
-for the new hash table type. |
- |
-Here is a boilerplate example of a creation routine. |
-@var{function_name} is the name of the routine. |
-@var{entry_type} is the type of an entry in the hash table you |
-are creating. @var{base_newfunc} is the name of the creation |
-routine of the hash table type your hash table is derived |
-from. |
- |
- |
-@example |
-struct bfd_hash_entry * |
-@var{function_name} (struct bfd_hash_entry *entry, |
- struct bfd_hash_table *table, |
- const char *string) |
-@{ |
- struct @var{entry_type} *ret = (@var{entry_type} *) entry; |
- |
- /* Allocate the structure if it has not already been allocated by a |
- derived class. */ |
- if (ret == NULL) |
- @{ |
- ret = bfd_hash_allocate (table, sizeof (* ret)); |
- if (ret == NULL) |
- return NULL; |
- @} |
- |
- /* Call the allocation method of the base class. */ |
- ret = ((@var{entry_type} *) |
- @var{base_newfunc} ((struct bfd_hash_entry *) ret, table, string)); |
- |
- /* Initialize the local fields here. */ |
- |
- return (struct bfd_hash_entry *) ret; |
-@} |
-@end example |
-@strong{Description}@* |
-The creation routine for the linker hash table, which is in |
-@code{linker.c}, looks just like this example. |
-@var{function_name} is @code{_bfd_link_hash_newfunc}. |
-@var{entry_type} is @code{struct bfd_link_hash_entry}. |
-@var{base_newfunc} is @code{bfd_hash_newfunc}, the creation |
-routine for a basic hash table. |
- |
-@code{_bfd_link_hash_newfunc} also initializes the local fields |
-in a linker hash table entry: @code{type}, @code{written} and |
-@code{next}. |
- |
-@node Write Other Derived Routines, , Write the Derived Creation Routine, Deriving a New Hash Table Type |
-@subsubsection Write other derived routines |
-You will want to write other routines for your new hash table, |
-as well. |
- |
-You will want an initialization routine which calls the |
-initialization routine of the hash table you are deriving from |
-and initializes any other local fields. For the linker hash |
-table, this is @code{_bfd_link_hash_table_init} in @code{linker.c}. |
- |
-You will want a lookup routine which calls the lookup routine |
-of the hash table you are deriving from and casts the result. |
-The linker hash table uses @code{bfd_link_hash_lookup} in |
-@code{linker.c} (this actually takes an additional argument which |
-it uses to decide how to return the looked up value). |
- |
-You may want a traversal routine. This should just call the |
-traversal routine of the hash table you are deriving from with |
-appropriate casts. The linker hash table uses |
-@code{bfd_link_hash_traverse} in @code{linker.c}. |
- |
-These routines may simply be defined as macros. For example, |
-the a.out backend linker hash table, which is derived from the |
-linker hash table, uses macros for the lookup and traversal |
-routines. These are @code{aout_link_hash_lookup} and |
-@code{aout_link_hash_traverse} in aoutx.h. |
- |