IMA: backward-compatible behavior from lhd_set_decl_assembler_name

Geoffrey Keating geoffk@geoffk.org
Mon Jul 5 19:39:00 GMT 2004


Zack Weinberg <zack@codesourcery.com> writes:

> One of the biggest stumbling blocks to re-enabling IMA has been the C
> front end's special set_decl_assembler_name hook.  It exists because
> the generic hook isn't aware of the special significance of having
> DECL_CONTEXT point to a TRANSLATION_UNIT_DECL.

No, there was no accident here and no lack of knowledge.  The entire
purpose of a TRANSLATION_UNIT_DECL is to invoke this behaviour in
the generic code.

> The new behavior is: Declarations with internal linkage at file scope in
> the first input file get DECL_ASSEMBLER_NAME set equal to DECL_NAME.
> This is what the aforementioned scripts expect.  Declarations with
> internal linkage at file scope in the second and successive input files
> get DECL_NAME + "." + a number; the number chosen is the DECL_UID of the
> containing TRANSLATION_UNIT_DECL.  This number will always be in the
> range 1 ... num_in_fnames-1; make_node and so on are adjusted such that
> DECL_UIDs 0 through num_in_fnames are reserved for TRANSLATION_UNIT_DECLs.

I considered implementing something like this, but I rejected it,
because of:

---a.c---
static int x = 5;
int y(void) { return x++; }
---b.c---
extern int x;
int z(void) { return x++; }
---c.c---
int x = 2;
extern int y(void);
extern int z(void);
int main(void)
{
  if (y() + z() != 7)
    abort();
  exit(0);

$ gcc a.c b.c c.c -c -o a.o
$ gcc a.o -o a
$ ./a

$ gcc a.c b.c -c -o a2.o
$ gcc a2.o c.c -o a2
$ ./a2

I really think it would be better for you to send your designs to the list
for review before you start coding.  That way, things like this can be
caught early.

I presume you'll now back your patch out.

...
> Internal linkage declarations with null DECL_CONTEXT also get no numeric
> suffix.  For C, this should only happen for synthetic declarations
> created by language-independent code (e.g. cgraph_build_static_cdtor).
> I believe this to be harmless wrt IMA - these things tend to be created
> just once in the entire object file, anyway.

This is what has always been done, so it should work as well as it
always did.

> The only wart is that reserving the first few DECL_UIDs for
> TRANSLATION_UNIT_DECLs places a new constraint on front ends: they must
> not create any DECL nodes prior to calling build_common_tree_nodes.  The
> only front end that did that was C++ and it didn't have to; I just moved
> the call to build_common_tree_nodes a few lines up in cxx_init.  The
> *proper* fix here would be to call build_common_tree_nodes from
> language-independent code, just before lang_hooks.init, but that would
> require me to untangle flag_signed_char which is too tangential.

Why are you insisting that the DECL_UIDs for TRANSLATION_UNIT_DECLs
(past the first) must be small?  Is it just for convenience of someone
reading the assembly?

> Bootstrapped i686-linux (all languages but Ada); committed.



More information about the Gcc-patches mailing list