* macro.c (macro_end): New function.
	* macro.h (macro_end): Declare.
	* read.c (read_end, poend): New functions.
	* read.h (read_end): Declare.
	* symbols.c (symbol_end): New function.
	* symbols.h (symbol_end): Declare.
	* output-file.c (output_file_close): Call new *_end functions.
   macro_expr = exp;
 }
 
+void
+macro_end (void)
+{
+  htab_delete (macro_hash);
+}
+
 /* Switch in and out of alternate mode on the fly.  */
 
 void
 
                            size_t (*) (sb *));
 extern void macro_init (int, int, int,
                        size_t (*) (const char *, size_t, sb *, offsetT *));
+extern void macro_end (void);
 extern void macro_set_alternate (int);
 extern void macro_mri_mode (int);
 extern const char *define_macro (size_t, sb *, sb *, size_t (*) (sb *),
 
 
 #include "as.h"
 #include "subsegs.h"
+#include "sb.h"
+#include "macro.h"
 #include "output-file.h"
 
 #ifndef TARGET_MACH
   if (!keep_it && filename)
     unlink_if_ordinary (filename);
 
+  macro_end ();
+  read_end ();
+  symbol_end ();
   subsegs_end (obs);
 
   if (!res)
 
 static int hex_float (int, char *);
 static segT get_known_segmented_expression (expressionS * expP);
 static void pobegin (void);
+static void poend (void);
 static size_t get_non_macro_line_sb (sb *);
 static void generate_file_debug (void);
 static char *_find_end_of_line (char *, int, int, int);
   if (flag_mri)
     lex_type['?'] = 3;
 }
+
+void
+read_end (void)
+{
+  poend ();
+}
 \f
 #ifndef TC_ADDRESS_BYTES
 #define TC_ADDRESS_BYTES address_bytes
   pop_override_ok = 1;
   cfi_pop_insert ();
 }
+
+static void
+poend (void)
+{
+  htab_delete (po_hash);
+}
 \f
 #define HANDLE_CONDITIONAL_ASSEMBLY(num_read)                          \
   if (ignore_input ())                                                 \
 
 extern void pseudo_set (symbolS * symbolP);
 extern void read_a_source_file (const char *name);
 extern void read_begin (void);
+extern void read_end (void);
 extern void read_print_statistics (FILE *);
 extern char *read_symbol_name (void);
 extern unsigned sizeof_leb128 (valueT, int);
 
     fb_label_init ();
 }
 
+void
+symbol_end (void)
+{
+  htab_delete (sy_hash);
+}
+
 void
 dot_symbol_init (void)
 {
 
 symbolS *colon (const char *sym_name);
 void local_colon (int n);
 void symbol_begin (void);
+void symbol_end (void);
 void dot_symbol_init (void);
 void symbol_print_statistics (FILE *);
 void symbol_table_insert (symbolS * symbolP);