2020-01-30 Jakub Jelinek <jakub@redhat.com>
+ PR lto/93384
+ * symtab.c (symtab_node::noninterposable_alias): If localalias
+ already exists, but is not usable, append numbers after it until
+ a unique name is found. Formatting fix.
+
PR middle-end/93505
* combine.c (simplify_comparison) <case ROTATE>: Punt on out of range
rotate counts.
symtab_node *node = ultimate_alias_target ();
gcc_assert (!node->alias && !node->weakref);
node->call_for_symbol_and_aliases (symtab_node::noninterposable_alias,
- (void *)&new_node, true);
+ (void *)&new_node, true);
if (new_node)
return new_node;
/* Otherwise create a new one. */
new_decl = copy_node (node->decl);
DECL_DLLIMPORT_P (new_decl) = 0;
- DECL_NAME (new_decl) = clone_function_name (node->decl, "localalias");
+ tree name = clone_function_name (node->decl, "localalias");
+ if (!flag_wpa)
+ {
+ unsigned long num = 0;
+ /* In the rare case we already have a localalias, but the above
+ node->call_for_symbol_and_aliases call didn't find any suitable,
+ iterate until we find one not used yet. */
+ while (symtab_node::get_for_asmname (name))
+ name = clone_function_name (node->decl, "localalias", num++);
+ }
+ DECL_NAME (new_decl) = name;
if (TREE_CODE (new_decl) == FUNCTION_DECL)
DECL_STRUCT_FUNCTION (new_decl) = NULL;
DECL_INITIAL (new_decl) = NULL;
2020-01-30 Jakub Jelinek <jakub@redhat.com>
+ PR lto/93384
+ * gcc.dg/lto/pr93384_0.c: New test.
+ * gcc.dg/lto/pr93384_1.c: New file.
+
PR middle-end/93505
* gcc.c-torture/compile/pr93505.c: New test.
--- /dev/null
+/* PR lto/93384 */
+/* { dg-lto-do link } */
+/* { dg-require-effective-target fpic } */
+/* { dg-require-effective-target shared } */
+/* { dg-lto-options { { -O2 -flto -ffat-lto-objects -fpic -fno-semantic-interposition } } } */
+/* { dg-extra-ld-options { -shared -flto-partition=none } } */
+
+void bar (void);
+__attribute__((noipa)) void quux (int x) { if (x == 5) bar (); }
+__attribute__((noipa, noreturn)) void foo (void) { while (1) ; }
+__attribute__((noinline)) void bar (void) { asm (""); quux (7); foo (); }
+void baz (int x) { if (x) bar (); }