From 4326ea401acdfac5fcda58f891efe8c9b3ed4e6e Mon Sep 17 00:00:00 2001 From: Olivier Hainque Date: Sat, 26 Jul 2008 14:26:45 +0000 Subject: [PATCH] collect2.c (symkind): New enum. * collect2.c (symkind): New enum. Symbol kinds we care about. (is_ctor_dtor): Return symkind instead of int. Adjust prototype, code and head comment accordingly. (scan_prog_file): Use symkind names instead of bare integers. From-SVN: r138179 --- gcc/ChangeLog | 7 +++++++ gcc/collect2.c | 66 +++++++++++++++++++++++++++++++++------------------------- 2 files changed, 45 insertions(+), 28 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index a461d7b..6870a42 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2008-07-26 Olivier Hainque + + * collect2.c (symkind): New enum. Symbol kinds we care about. + (is_ctor_dtor): Return symkind instead of int. Adjust prototype, + code and head comment accordingly. + (scan_prog_file): Use symkind names instead of bare integers. + 2008-07-25 Jan Hubicka * cgraph.c (cgraph_function_possibly_inlined_p): Do not rely on DECL_INLINE. diff --git a/gcc/collect2.c b/gcc/collect2.c index 713c8f2..cdfe4e6 100644 --- a/gcc/collect2.c +++ b/gcc/collect2.c @@ -236,8 +236,21 @@ static struct path_prefix *libpaths[3] = {&cmdline_lib_dirs, &libpath_lib_dirs, NULL}; #endif +/* Special kinds of symbols that a name may denote. */ + +typedef enum { + SYM_REGULAR = 0, /* nothing special */ + + SYM_CTOR = 1, /* constructor */ + SYM_DTOR = 2, /* destructor */ + SYM_INIT = 3, /* shared object routine that calls all the ctors */ + SYM_FINI = 4, /* shared object routine that calls all the dtors */ + SYM_DWEH = 5 /* DWARF exception handling table */ +} symkind; + +static symkind is_ctor_dtor (const char *); + static void handler (int); -static int is_ctor_dtor (const char *); static char *find_a_file (struct path_prefix *, const char *); static void add_prefix (struct path_prefix *, const char *); static void prefix_from_env (const char *, struct path_prefix *); @@ -519,12 +532,9 @@ dump_file (const char *name, FILE *to) fclose (stream); } -/* Decide whether the given symbol is: a constructor (1), a destructor - (2), a routine in a shared object that calls all the constructors - (3) or destructors (4), a DWARF exception-handling table (5), or - nothing special (0). */ +/* Return the kind of symbol denoted by name S. */ -static int +static symkind is_ctor_dtor (const char *s) { struct names { const char *const name; const int len; const int ret; @@ -536,27 +546,27 @@ is_ctor_dtor (const char *s) static const struct names special[] = { #ifndef NO_DOLLAR_IN_LABEL - { "GLOBAL__I$", sizeof ("GLOBAL__I$")-1, 1, 0 }, - { "GLOBAL__D$", sizeof ("GLOBAL__D$")-1, 2, 0 }, + { "GLOBAL__I$", sizeof ("GLOBAL__I$")-1, SYM_CTOR, 0 }, + { "GLOBAL__D$", sizeof ("GLOBAL__D$")-1, SYM_DTOR, 0 }, #else #ifndef NO_DOT_IN_LABEL - { "GLOBAL__I.", sizeof ("GLOBAL__I.")-1, 1, 0 }, - { "GLOBAL__D.", sizeof ("GLOBAL__D.")-1, 2, 0 }, + { "GLOBAL__I.", sizeof ("GLOBAL__I.")-1, SYM_CTOR, 0 }, + { "GLOBAL__D.", sizeof ("GLOBAL__D.")-1, SYM_DTOR, 0 }, #endif /* NO_DOT_IN_LABEL */ #endif /* NO_DOLLAR_IN_LABEL */ - { "GLOBAL__I_", sizeof ("GLOBAL__I_")-1, 1, 0 }, - { "GLOBAL__D_", sizeof ("GLOBAL__D_")-1, 2, 0 }, - { "GLOBAL__F_", sizeof ("GLOBAL__F_")-1, 5, 0 }, - { "GLOBAL__FI_", sizeof ("GLOBAL__FI_")-1, 3, 0 }, - { "GLOBAL__FD_", sizeof ("GLOBAL__FD_")-1, 4, 0 }, - { NULL, 0, 0, 0 } + { "GLOBAL__I_", sizeof ("GLOBAL__I_")-1, SYM_CTOR, 0 }, + { "GLOBAL__D_", sizeof ("GLOBAL__D_")-1, SYM_DTOR, 0 }, + { "GLOBAL__F_", sizeof ("GLOBAL__F_")-1, SYM_DWEH, 0 }, + { "GLOBAL__FI_", sizeof ("GLOBAL__FI_")-1, SYM_INIT, 0 }, + { "GLOBAL__FD_", sizeof ("GLOBAL__FD_")-1, SYM_FINI, 0 }, + { NULL, 0, SYM_REGULAR, 0 } }; while ((ch = *s) == '_') ++s; if (s == orig_s) - return 0; + return SYM_REGULAR; for (p = &special[0]; p->len > 0; p++) { @@ -567,7 +577,7 @@ is_ctor_dtor (const char *s) return p->ret; } } - return 0; + return SYM_REGULAR; } /* We maintain two prefix lists: one from COMPILER_PATH environment variable @@ -2171,17 +2181,17 @@ scan_prog_file (const char *prog_name, enum pass which_pass) *end = '\0'; switch (is_ctor_dtor (name)) { - case 1: + case SYM_CTOR: if (which_pass != PASS_LIB) add_to_list (&constructors, name); break; - case 2: + case SYM_DTOR: if (which_pass != PASS_LIB) add_to_list (&destructors, name); break; - case 3: + case SYM_INIT: if (which_pass != PASS_LIB) fatal ("init function found in object %s", prog_name); #ifndef LD_INIT_SWITCH @@ -2189,7 +2199,7 @@ scan_prog_file (const char *prog_name, enum pass which_pass) #endif break; - case 4: + case SYM_FINI: if (which_pass != PASS_LIB) fatal ("fini function found in object %s", prog_name); #ifndef LD_FINI_SWITCH @@ -2197,7 +2207,7 @@ scan_prog_file (const char *prog_name, enum pass which_pass) #endif break; - case 5: + case SYM_DWEH: if (which_pass != PASS_LIB) add_to_list (&frame_tables, name); break; @@ -2516,7 +2526,7 @@ scan_prog_file (const char *prog_name, enum pass which_pass) switch (is_ctor_dtor (name)) { - case 1: + case SYM_CTOR: if (! is_shared) add_to_list (&constructors, name); #if defined (COLLECT_EXPORT_LIST) && !defined (LD_INIT_SWITCH) @@ -2525,7 +2535,7 @@ scan_prog_file (const char *prog_name, enum pass which_pass) #endif break; - case 2: + case SYM_DTOR: if (! is_shared) add_to_list (&destructors, name); #if defined (COLLECT_EXPORT_LIST) && !defined (LD_INIT_SWITCH) @@ -2535,14 +2545,14 @@ scan_prog_file (const char *prog_name, enum pass which_pass) break; #ifdef COLLECT_EXPORT_LIST - case 3: + case SYM_INIT: #ifndef LD_INIT_SWITCH if (is_shared) add_to_list (&constructors, name); #endif break; - case 4: + case SYM_FINI: #ifndef LD_INIT_SWITCH if (is_shared) add_to_list (&destructors, name); @@ -2550,7 +2560,7 @@ scan_prog_file (const char *prog_name, enum pass which_pass) break; #endif - case 5: + case SYM_DWEH: if (! is_shared) add_to_list (&frame_tables, name); #if defined (COLLECT_EXPORT_LIST) && !defined (LD_INIT_SWITCH) -- 2.7.4