@@ -26,15 +26,12 @@ bool preproc_match;
26
26
*/
27
27
int macro_return_idx ;
28
28
29
- /* Global objects */
30
-
31
- macro_t * MACROS ;
32
- int macros_idx = 0 ;
33
-
34
29
/* FUNC_MAP is used to integrate function storing and boost lookup
35
30
* performance, currently it uses FNV-1a hash function to hash function
36
31
* name.
37
32
*/
33
+
34
+ hashmap_t * MACROS_MAP ;
38
35
hashmap_t * FUNC_MAP ;
39
36
hashmap_t * ALIASES_MAP ;
40
37
hashmap_t * CONSTANTS_MAP ;
@@ -557,28 +554,34 @@ bool remove_alias(char *alias)
557
554
558
555
macro_t * add_macro (char * name )
559
556
{
560
- macro_t * ma = & MACROS [macros_idx ++ ];
561
- strcpy (ma -> name , name );
557
+ macro_t * ma = hashmap_get (MACROS_MAP , name );
558
+ if (!ma ) {
559
+ ma = malloc (sizeof (macro_t ));
560
+ if (!ma ) {
561
+ printf ("Failed to allocate macro_t\n" );
562
+ return NULL ;
563
+ }
564
+ strcpy (ma -> name , name );
565
+ hashmap_put (MACROS_MAP , name , ma );
566
+ }
562
567
ma -> disabled = false;
563
568
return ma ;
564
569
}
565
570
566
571
macro_t * find_macro (char * name )
567
572
{
568
- for (int i = 0 ; i < macros_idx ; i ++ ) {
569
- if (!MACROS [i ].disabled && !strcmp (name , MACROS [i ].name ))
570
- return & MACROS [i ];
571
- }
573
+ macro_t * ma = hashmap_get (MACROS_MAP , name );
574
+ if (ma && !ma -> disabled )
575
+ return ma ;
572
576
return NULL ;
573
577
}
574
578
575
579
bool remove_macro (char * name )
576
580
{
577
- for (int i = 0 ; i < macros_idx ; i ++ ) {
578
- if (!MACROS [i ].disabled && !strcmp (name , MACROS [i ].name )) {
579
- MACROS [i ].disabled = true;
580
- return true;
581
- }
581
+ macro_t * ma = hashmap_get (MACROS_MAP , name );
582
+ if (ma && !ma -> disabled ) {
583
+ ma -> disabled = true;
584
+ return true;
582
585
}
583
586
return false;
584
587
}
@@ -974,7 +977,7 @@ void global_init(void)
974
977
{
975
978
elf_code_start = ELF_START + elf_header_len ;
976
979
977
- MACROS = malloc (MAX_ALIASES * sizeof ( macro_t ) );
980
+ MACROS_MAP = hashmap_create (MAX_ALIASES );
978
981
TYPES = malloc (MAX_TYPES * sizeof (type_t ));
979
982
BLOCK_ARENA = arena_init (DEFAULT_ARENA_SIZE );
980
983
INSN_ARENA = arena_init (DEFAULT_ARENA_SIZE );
@@ -996,7 +999,7 @@ void global_init(void)
996
999
997
1000
void global_release (void )
998
1001
{
999
- free ( MACROS );
1002
+ hashmap_free ( MACROS_MAP );
1000
1003
free (TYPES );
1001
1004
arena_free (BLOCK_ARENA );
1002
1005
arena_free (INSN_ARENA );
0 commit comments