diff options
author | Alexandre Oliva <aoliva@redhat.com> | 2005-10-20 19:30:23 +0000 |
---|---|---|
committer | Alexandre Oliva <aoliva@gcc.gnu.org> | 2005-10-20 19:30:23 +0000 |
commit | cdcba1ea35704e2e6e9197eb8ed2f211ddccb0f3 (patch) | |
tree | 371eace32311ca26ea6a068562168710b5a04b4e /gcc/testsuite/gcc.dg/weak/weak-14.c | |
parent | 94c813b4572f371dcdb8aca1ed4bf0d37cde47a6 (diff) | |
download | gcc-cdcba1ea35704e2e6e9197eb8ed2f211ddccb0f3.zip gcc-cdcba1ea35704e2e6e9197eb8ed2f211ddccb0f3.tar.gz gcc-cdcba1ea35704e2e6e9197eb8ed2f211ddccb0f3.tar.bz2 |
re PR middle-end/24295 (Xorg broken, #pragma weak foo = bar no longer causes bar to be referenced)
gcc/ChangeLog:
PR middle-end/24295
* cgraphunit.c (cgraph_varpool_remove_unreferenced_decls): Mark
alias targets.
* varasm.c (find_decl_and_mark_needed): After cgraph global info
is ready, stop marking functions, but still mark variables.
gcc/testsuite/ChangeLog:
PR middle-end/24295
* g++.old-deja/g++.abi/vtable2.C: Do not introduce external
declarations with the same names as thunks' alias targets, use
aliases instead.
* gcc.dg/attr-alias-3.c: New test.
* gcc.dg/weak/weak-14.c, gcc.dg/weak/weak-14a.c: New test.
From-SVN: r105688
Diffstat (limited to 'gcc/testsuite/gcc.dg/weak/weak-14.c')
-rw-r--r-- | gcc/testsuite/gcc.dg/weak/weak-14.c | 33 |
1 files changed, 33 insertions, 0 deletions
diff --git a/gcc/testsuite/gcc.dg/weak/weak-14.c b/gcc/testsuite/gcc.dg/weak/weak-14.c new file mode 100644 index 0000000..fa15624 --- /dev/null +++ b/gcc/testsuite/gcc.dg/weak/weak-14.c @@ -0,0 +1,33 @@ +// { dg-do run } +// { dg-require-weak "" } +// { dg-options "-O2 -fno-common" } + +// Copyright 2005 Free Software Foundation, Inc. +// Contributed by Alexandre Oliva <aoliva@redhat.com> + +// PR middle-end/24295 + +// The unit-at-a-time call graph code used to fail to emit variables +// without external linkage that were only used indirectly, through +// aliases. We might then get linker failures because the static +// variable was not defined, or run-time errors because the weak alias +// ended up pointing somewhere random. + +#include <stdlib.h> + +static unsigned long lv1 = 0xdeadbeefUL; +#pragma weak Av1a = lv1 +extern unsigned long Av1a; + +static unsigned long lf1(void) { return 0x510bea7UL; } +#pragma weak Af1a = lf1 +extern unsigned long Af1a(void); + +int main (void) { + if (! &Av1a + || ! &Af1a + || Av1a != 0xdeadbeefUL + || Af1a() != 0x510bea7UL) + abort (); + exit (0); +} |