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
This commit is contained in:
parent
19f0452d2b
commit
4326ea401a
2 changed files with 45 additions and 28 deletions
|
@ -1,3 +1,10 @@
|
|||
2008-07-26 Olivier Hainque <hainque@adacore.com>
|
||||
|
||||
* 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 <jh@suse.cz>
|
||||
|
||||
* cgraph.c (cgraph_function_possibly_inlined_p): Do not rely on DECL_INLINE.
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Add table
Reference in a new issue