clear out the hash tables for compiling multiple object files

This commit is contained in:
Bill Currie 2002-06-28 16:00:01 +00:00
parent a6d999dfa4
commit 8415db2d84
14 changed files with 148 additions and 35 deletions

View file

@ -96,4 +96,6 @@ void add_protocol (protocollist_t *protocollist, protocol_t *protocol);
int emit_protocol (protocol_t *protocol); int emit_protocol (protocol_t *protocol);
int emit_protocol_list (protocollist_t *protocols, const char *name); int emit_protocol_list (protocollist_t *protocols, const char *name);
void clear_classes (void);
#endif//__class_h #endif//__class_h

View file

@ -111,5 +111,6 @@ void reset_tempdefs ();
void flush_scope (scope_t *scope, int force_used); void flush_scope (scope_t *scope, int force_used);
void def_initialized (def_t *d); void def_initialized (def_t *d);
void clear_defs (void);
#endif//__def_h #endif//__def_h

View file

@ -38,4 +38,6 @@ struct def_s *ReuseConstant (struct expr_s *expr, struct def_s *def);
int CopyString (const char *str); int CopyString (const char *str);
int ReuseString (const char *str); int ReuseString (const char *str);
void clear_immediates (void);
#endif//__immediate_h #endif//__immediate_h

View file

@ -82,4 +82,6 @@ struct def_s *selector_def (const char *sel_id, const char *sel_types);
int emit_methods (methodlist_t *methods, const char *name, int instance); int emit_methods (methodlist_t *methods, const char *name, int instance);
void clear_selectors (void);
#endif//__method_h #endif//__method_h

View file

@ -32,6 +32,7 @@
#ifndef __qfcc_h #ifndef __qfcc_h
#define __qfcc_h #define __qfcc_h
#include <stdio.h>
#include "QF/pr_comp.h" #include "QF/pr_comp.h"
//============================================================================ //============================================================================
@ -93,6 +94,9 @@ extern string_t s_file; // filename for function definition
const char *strip_path (const char *filename); const char *strip_path (const char *filename);
const char *save_string (const char *str); const char *save_string (const char *str);
void clear_frame_macros (void);
extern FILE *yyin;
int yyparse (void);
#define ALLOC(s, t, n, v) \ #define ALLOC(s, t, n, v) \
do { \ do { \

View file

@ -60,4 +60,7 @@ int emit_struct (struct type_s *strct, const char *name);
void process_enum (struct expr_s *enm); void process_enum (struct expr_s *enm);
expr_t *get_enum (const char *name); expr_t *get_enum (const char *name);
void clear_structs (void);
void clear_enums (void);
#endif//__struct_h #endif//__struct_h

View file

@ -89,4 +89,6 @@ int type_size (type_t *type);
void init_types (void); void init_types (void);
void clear_typedefs (void);
#endif//__type_h #endif//__type_h

View file

@ -618,3 +618,14 @@ emit_protocol_list (protocollist_t *protocols, const char *name)
proto_list->list[i] = emit_protocol (protocols->list[i]); proto_list->list[i] = emit_protocol (protocols->list[i]);
return proto_list_def->ofs; return proto_list_def->ofs;
} }
void
clear_classes (void)
{
if (class_hash)
Hash_FlushTable (class_hash);
if (protocol_hash)
Hash_FlushTable (protocol_hash);
if (category_hash)
Hash_FlushTable (category_hash);
}

View file

@ -397,3 +397,10 @@ def_initialized (def_t *d)
d->initialized = 1; d->initialized = 1;
} }
} }
void
clear_defs (void)
{
if (defs_by_name)
Hash_FlushTable (defs_by_name);
}

View file

@ -156,32 +156,7 @@ ReuseConstant (expr_t *expr, def_t *def)
if (!rep) if (!rep)
rep = dstring_newstr (); rep = dstring_newstr ();
if (!string_imm_defs) { if (!string_imm_defs) {
string_imm_defs = Hash_NewTable (16381, string_imm_get_key, 0, 0); clear_immediates ();
float_imm_defs = Hash_NewTable (16381, float_imm_get_key, 0, 0);
vector_imm_defs = Hash_NewTable (16381, vector_imm_get_key, 0, 0);
entity_imm_defs = Hash_NewTable (16381, int_imm_get_key, 0, "entity");
field_imm_defs = Hash_NewTable (16381, int_imm_get_key, 0, "field");
func_imm_defs = Hash_NewTable (16381, int_imm_get_key, 0, "func");
pointer_imm_defs = Hash_NewTable (16381, int_imm_get_key, 0, "pointer");
quaternion_imm_defs =
Hash_NewTable (16381, quaternion_imm_get_key, 0, 0);
integer_imm_defs = Hash_NewTable (16381, int_imm_get_key, 0, "integer");
Hash_Add (string_imm_defs, cn = new_def (&type_string, ".imm",
pr.scope));
cn->initialized = cn->constant = 1;
Hash_Add (float_imm_defs, cn = new_def (&type_float, ".imm",
pr.scope));
cn->initialized = cn->constant = 1;
Hash_Add (entity_imm_defs, cn = new_def (&type_entity, ".imm",
pr.scope));
cn->initialized = cn->constant = 1;
Hash_Add (pointer_imm_defs, cn = new_def (&type_pointer, ".imm",
pr.scope));
cn->initialized = cn->constant = 1;
Hash_Add (integer_imm_defs, cn = new_def (&type_integer, ".imm",
pr.scope));
cn->initialized = cn->constant = 1;
} }
cn = 0; cn = 0;
switch (e.type) { switch (e.type) {
@ -295,3 +270,41 @@ ReuseConstant (expr_t *expr, def_t *def)
return cn; return cn;
} }
void
clear_immediates (void)
{
def_t *cn;
if (string_imm_defs) {
Hash_FlushTable (string_imm_defs);
Hash_FlushTable (float_imm_defs);
Hash_FlushTable (vector_imm_defs);
Hash_FlushTable (entity_imm_defs);
Hash_FlushTable (field_imm_defs);
Hash_FlushTable (func_imm_defs);
Hash_FlushTable (pointer_imm_defs);
Hash_FlushTable (quaternion_imm_defs);
} else {
string_imm_defs = Hash_NewTable (16381, string_imm_get_key, 0, 0);
float_imm_defs = Hash_NewTable (16381, float_imm_get_key, 0, 0);
vector_imm_defs = Hash_NewTable (16381, vector_imm_get_key, 0, 0);
entity_imm_defs = Hash_NewTable (16381, int_imm_get_key, 0, "entity");
field_imm_defs = Hash_NewTable (16381, int_imm_get_key, 0, "field");
func_imm_defs = Hash_NewTable (16381, int_imm_get_key, 0, "func");
pointer_imm_defs = Hash_NewTable (16381, int_imm_get_key, 0, "pointer");
quaternion_imm_defs =
Hash_NewTable (16381, quaternion_imm_get_key, 0, 0);
}
integer_imm_defs = Hash_NewTable (16381, int_imm_get_key, 0, "integer");
Hash_Add (string_imm_defs, cn = new_def (&type_string, ".imm", pr.scope));
cn->initialized = cn->constant = 1;
Hash_Add (float_imm_defs, cn = new_def (&type_float, ".imm", pr.scope));
cn->initialized = cn->constant = 1;
Hash_Add (entity_imm_defs, cn = new_def (&type_entity, ".imm", pr.scope));
cn->initialized = cn->constant = 1;
Hash_Add (pointer_imm_defs, cn = new_def (&type_pointer, ".imm", pr.scope));
cn->initialized = cn->constant = 1;
Hash_Add (integer_imm_defs, cn = new_def (&type_integer, ".imm", pr.scope));
cn->initialized = cn->constant = 1;
}

View file

@ -323,3 +323,10 @@ emit_methods (methodlist_t *_methods, const char *name, int instance)
} }
return methods_def->ofs; return methods_def->ofs;
} }
void
clear_selectors (void)
{
if (sel_def_hash)
Hash_FlushTable (sel_def_hash);
}

View file

@ -71,10 +71,12 @@ static const char rcsid[] =
#include "function.h" #include "function.h"
#include "idstuff.h" #include "idstuff.h"
#include "immediate.h" #include "immediate.h"
#include "method.h"
#include "obj_file.h" #include "obj_file.h"
#include "opcodes.h" #include "opcodes.h"
#include "options.h" #include "options.h"
#include "reloc.h" #include "reloc.h"
#include "struct.h"
#include "type.h" #include "type.h"
options_t options; options_t options;
@ -125,6 +127,12 @@ InitData (void)
{ {
int i; int i;
if (pr.statements) {
free (pr.statements);
memset (&pr, 0, sizeof (pr));
}
pr_source_line = 1;
pr_error_count = 0;
pr.num_statements = 1; pr.num_statements = 1;
pr.strofs = 1; pr.strofs = 1;
pr.num_functions = 1; pr.num_functions = 1;
@ -444,6 +452,37 @@ setup_sym_file (const char *output_file)
} }
} }
static int
compile_to_obj (const char *file, const char *obj)
{
int err;
yyin = preprocess_file (file);
InitData ();
begin_compilation ();
s_file = ReuseString (strip_path (file));
clear_frame_macros ();
clear_classes ();
clear_defs ();
clear_immediates ();
clear_selectors ();
clear_structs ();
clear_enums ();
clear_typedefs ();
err = yyparse () || pr_error_count;
fclose (yyin);
if (cpp_name && (!options.save_temps)) {
if (unlink (tempname->str)) {
perror ("unlink");
exit (1);
}
}
if (!err)
write_obj_file (obj);
return err;
}
static int static int
separate_compile (void) separate_compile (void)
{ {
@ -475,6 +514,9 @@ separate_compile (void)
if (strncmp (*file, "-l", 2) if (strncmp (*file, "-l", 2)
&& (!strcmp (extension->str, ".r") && (!strcmp (extension->str, ".r")
|| !strcmp (extension->str, ".qc"))) { || !strcmp (extension->str, ".qc"))) {
printf ("%s %s\n", *file, output_file->str);
compile_to_obj (*file, output_file->str);
free ((char *)*file); free ((char *)*file);
*file = strdup (output_file->str); *file = strdup (output_file->str);
} else { } else {
@ -522,15 +564,13 @@ progs_src_compile (void)
} }
setup_sym_file (options.output_file); setup_sym_file (options.output_file);
InitData ();
begin_compilation (); begin_compilation ();
// compile all the files // compile all the files
while ((src = Parse (src))) { while ((src = Parse (src))) {
int error; int err;
extern FILE *yyin;
int yyparse (void);
extern void clear_frame_macros (void);
//extern int yydebug; //extern int yydebug;
//yydebug = 1; //yydebug = 1;
@ -548,7 +588,7 @@ progs_src_compile (void)
s_file = ReuseString (strip_path (filename->str)); s_file = ReuseString (strip_path (filename->str));
pr_source_line = 1; pr_source_line = 1;
clear_frame_macros (); clear_frame_macros ();
error = yyparse () || pr_error_count; err = yyparse () || pr_error_count;
fclose (yyin); fclose (yyin);
if (cpp_name && (!options.save_temps)) { if (cpp_name && (!options.save_temps)) {
if (unlink (tempname->str)) { if (unlink (tempname->str)) {
@ -556,7 +596,7 @@ progs_src_compile (void)
exit (1); exit (1);
} }
} }
if (error) if (err)
return 1; return 1;
} }
@ -608,8 +648,6 @@ main (int argc, char **argv)
opcode_init (); opcode_init ();
init_types (); init_types ();
InitData ();
if (source_files) { if (source_files) {
res = separate_compile (); res = separate_compile ();
} else { } else {

View file

@ -246,6 +246,13 @@ emit_struct(type_t *strct, const char *name)
return ivars_def->ofs; return ivars_def->ofs;
} }
void
clear_structs (void)
{
if (structs)
Hash_FlushTable (structs);
}
void void
process_enum (expr_t *enm) process_enum (expr_t *enm)
{ {
@ -302,3 +309,10 @@ get_enum (const char *name)
return 0; return 0;
return &e->value; return &e->value;
} }
void
clear_enums (void)
{
if (enums)
Hash_FlushTable (enums);
}

View file

@ -529,3 +529,10 @@ init_types (void)
type_obj_exec_class.parm_types[0] = pointer_type (type_module); type_obj_exec_class.parm_types[0] = pointer_type (type_module);
chain_type (&type_obj_exec_class); chain_type (&type_obj_exec_class);
} }
void
clear_typedefs (void)
{
if (typedef_hash)
Hash_FlushTable (typedef_hash);
}