localalias.c: New testcase.

* gcc.dg/localalias.c: New testcase.
	* gcc.dg/localalias-2.c: New testcase.
	* gcc.dg/globalalias.c: New testcase.
	* gcc.dg/globalalias-2.c: New testcase.
	* ipa-visibility.c (function_and_variable_visibility): Disable
	temporarily local aliases for some targets.

From-SVN: r211864
This commit is contained in:
Jan Hubicka 2014-06-21 04:39:49 +02:00 committed by Jan Hubicka
parent d9ff14ea9b
commit b48972129f
7 changed files with 140 additions and 1 deletions

View File

@ -1,3 +1,8 @@
2014-06-20 Jan Hubicka <hubicka@ucw.cz>
* ipa-visibility.c (function_and_variable_visibility): Disable
temporarily local aliases for some targets.
2014-06-20 Marek Polacek <polacek@redhat.com>
* asan.c (pass_sanopt::execute): Handle IFN_UBSAN_BOUNDS.

View File

@ -566,7 +566,11 @@ function_and_variable_visibility (bool whole_program)
cheaper and enable more optimization.
TODO: We can also update virtual tables. */
if (node->callers && can_replace_by_local_alias (node))
if (node->callers
/* FIXME: currently this optimization breaks on AIX. Disable it for targets
without comdat support for now. */
&& SUPPORTS_ONE_ONLY
&& can_replace_by_local_alias (node))
{
struct cgraph_node *alias = cgraph (symtab_nonoverwritable_alias (node));

View File

@ -1,3 +1,10 @@
2014-06-20 Jan Hubicka <hubicka@ucw.cz>
* gcc.dg/localalias.c: New testcase.
* gcc.dg/localalias-2.c: New testcase.
* gcc.dg/globalalias.c: New testcase.
* gcc.dg/globalalias-2.c: New testcase.
2014-06-20 Jakub Jelinek <jakub@redhat.com>
* gcc.target/arm/lto/lto.exp: Exit immediately if not arm*-*-* target.

View File

@ -0,0 +1,20 @@
int test2count;
extern void abort (void);
static
void test(void)
{
test2count++;
}
__attribute__ ((weak,noinline))
__attribute ((alias("test")))
void test2(void);
void tt()
{
int prev = test2count;
/* This call must bind locally. */
test();
if (test2count == prev)
abort();
test2();
}

View File

@ -0,0 +1,42 @@
/* This test checks that local aliases behave sanely. This is necessary for code correctness
of aliases introduced by ipa-visibility pass.
This test expose weird behaviour of AIX's .set pseudo-op where the global symbol is created,
but all uses of the alias are syntactically replaced by uses of the target. This means that
both counters are increased to 2. */
/* { dg-do run }
{ dg-options "-O2" }
{ dg-require-alias "" }
{ dg-xfail-if "" { powerpc-ibm-aix* } { "*" } { "" } }
{ dg-additional-sources "globalalias-2.c" } */
extern int test2count;
extern void abort (void);
int testcount;
static
void test(void)
{
testcount++;
}
__attribute__ ((weak,noinline))
__attribute ((alias("test")))
void test2(void);
void main()
{
test();
/* This call must bind locally. */
if (!testcount)
abort ();
test2();
/* Depending on linker choice, this one may bind locally
or to the other unit. */
if (!testcount && !test2count)
abort();
tt();
if ((testcount != 1 || test2count != 3)
&& (testcount != 3 || test2count != 1))
abort ();
return 0;
}

View File

@ -0,0 +1,19 @@
extern void abort (void);
int test2count;
__attribute__ ((weak,noinline))
void test(void)
{
test2count++;
}
__attribute ((alias("test")))
static void test2(void);
void tt()
{
int prev = test2count;
/* This call must bind locally. */
test2();
if (test2count == prev)
abort();
test();
}

View File

@ -0,0 +1,42 @@
/* This test checks that local aliases behave sanely. This is necessary for code correctness
of aliases introduced by ipa-visibility pass.
If this test fails either aliases needs to be disabled on given target on aliases with
proper semantic needs to be implemented. This is problem with e.g. AIX .set pseudo-op
that implementes alias syntactically (by substituting in assembler) rather as alternative
symbol defined on a target's location. */
/* { dg-do run }
{ dg-options "-Wstrict-aliasing=2 -fstrict-aliasing" }
{ dg-require-alias "" }
{ dg-xfail-if "" { powerpc-ibm-aix* } { "*" } { "" } }
{ dg-additional-sources "localalias-2.c" } */
extern void abort (void);
extern int test2count;
int testcount;
__attribute__ ((weak,noinline))
void test(void)
{
testcount++;
}
__attribute ((alias("test")))
static void test2(void);
void main()
{
test2();
/* This call must bind locally. */
if (!testcount)
abort ();
test();
/* Depending on linker choice, this one may bind locally
or to the other unit. */
if (!testcount && !test2count)
abort();
tt();
if ((testcount != 1 || test2count != 3)
&& (testcount != 3 || test2count != 1))
abort ();
reutrn 0;
}