@@ -38,6 +38,8 @@ int macros_idx = 0;
3838 * we have to initially create large amount of buckets.
3939 */
4040hashmap_t * FUNCS_MAP ;
41+ hashmap_t * ALIASES_MAP ;
42+ hashmap_t * CONSTANTS_MAP ;
4143
4244type_t * TYPES ;
4345int types_idx = 0 ;
@@ -66,12 +68,6 @@ int elf_offset = 0;
6668
6769regfile_t REGS [REG_CNT ];
6870
69- alias_t * ALIASES ;
70- int aliases_idx = 0 ;
71-
72- constant_t * CONSTANTS ;
73- int constants_idx = 0 ;
74-
7571source_t * SOURCE ;
7672
7773hashmap_t * INCLUSION_MAP ;
@@ -563,28 +559,36 @@ block_t *add_block(block_t *parent, func_t *func, macro_t *macro)
563559
564560void add_alias (char * alias , char * value )
565561{
566- alias_t * al = & ALIASES [aliases_idx ++ ];
562+ alias_t * old_al = hashmap_get (ALIASES_MAP , alias );
563+
564+ if (old_al ) {
565+ old_al -> disabled = true;
566+ free (old_al );
567+ }
568+
569+ alias_t * al = malloc (sizeof (alias_t ));
567570 strcpy (al -> alias , alias );
568571 strcpy (al -> value , value );
569572 al -> disabled = false;
573+ hashmap_put (ALIASES_MAP , alias , al );
570574}
571575
572576char * find_alias (char alias [])
573577{
574- for ( int i = 0 ; i < aliases_idx ; i ++ ) {
575- if (! ALIASES [ i ]. disabled && ! strcmp ( alias , ALIASES [ i ]. alias ))
576- return ALIASES [ i ]. value ;
577- }
578+ alias_t * al = hashmap_get ( ALIASES_MAP , alias );
579+
580+ if ( al && ! al -> disabled )
581+ return al -> value ;
578582 return NULL ;
579583}
580584
581585bool remove_alias (char * alias )
582586{
583- for ( int i = 0 ; i < aliases_idx ; i ++ ) {
584- if (! ALIASES [ i ]. disabled && ! strcmp ( alias , ALIASES [ i ]. alias )) {
585- ALIASES [ i ]. disabled = true;
586- return true;
587- }
587+ alias_t * al = hashmap_get ( ALIASES_MAP , alias );
588+
589+ if ( al && ! al -> disabled ) {
590+ al -> disabled = true;
591+ return true;
588592 }
589593 return false;
590594}
@@ -669,18 +673,21 @@ type_t *add_named_type(char *name)
669673
670674void add_constant (char alias [], int value )
671675{
672- constant_t * constant = & CONSTANTS [constants_idx ++ ];
676+ constant_t * constant = malloc (sizeof (constant_t ));
677+
678+ if (!constant ) {
679+ printf ("Failed to allocate constant_t\n" );
680+ return ;
681+ }
682+
673683 strcpy (constant -> alias , alias );
674684 constant -> value = value ;
685+ hashmap_put (CONSTANTS_MAP , alias , constant );
675686}
676687
677688constant_t * find_constant (char alias [])
678689{
679- for (int i = 0 ; i < constants_idx ; i ++ ) {
680- if (!strcmp (CONSTANTS [i ].alias , alias ))
681- return & CONSTANTS [i ];
682- }
683- return NULL ;
690+ return hashmap_get (CONSTANTS_MAP , alias );
684691}
685692
686693func_t * find_func (char func_name [])
@@ -987,8 +994,8 @@ void global_init()
987994 LABEL_LUT = malloc (MAX_LABEL * sizeof (label_lut_t ));
988995 SOURCE = create_source (MAX_SOURCE );
989996 INCLUSION_MAP = hashmap_create (MAX_INCLUSIONS );
990- ALIASES = malloc (MAX_ALIASES * sizeof ( alias_t ) );
991- CONSTANTS = malloc (MAX_CONSTANTS * sizeof ( constant_t ) );
997+ ALIASES_MAP = hashmap_create (MAX_ALIASES );
998+ CONSTANTS_MAP = hashmap_create (MAX_CONSTANTS );
992999
9931000 elf_code = malloc (MAX_CODE );
9941001 elf_data = malloc (MAX_DATA );
@@ -1020,8 +1027,8 @@ void global_release()
10201027 free (LABEL_LUT );
10211028 source_release (SOURCE );
10221029 hashmap_free (INCLUSION_MAP );
1023- free ( ALIASES );
1024- free ( CONSTANTS );
1030+ hashmap_free ( ALIASES_MAP );
1031+ hashmap_free ( CONSTANTS_MAP );
10251032
10261033 free (elf_code );
10271034 free (elf_data );
0 commit comments