From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 3734 invoked by alias); 21 Jan 2015 02:37:08 -0000 Mailing-List: contact gcc-bugs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-bugs-owner@gcc.gnu.org Received: (qmail 1193 invoked by uid 48); 21 Jan 2015 02:36:33 -0000 From: "amodra at gmail dot com" To: gcc-bugs@gcc.gnu.org Subject: [Bug tree-optimization/64703] New: glibc sysdeps/powerpc/powerpc64/dl-machine.h miscompile Date: Wed, 21 Jan 2015 02:37:00 -0000 X-Bugzilla-Reason: CC X-Bugzilla-Type: new X-Bugzilla-Watch-Reason: None X-Bugzilla-Product: gcc X-Bugzilla-Component: tree-optimization X-Bugzilla-Version: 5.0 X-Bugzilla-Keywords: X-Bugzilla-Severity: normal X-Bugzilla-Who: amodra at gmail dot com X-Bugzilla-Status: UNCONFIRMED X-Bugzilla-Priority: P3 X-Bugzilla-Assigned-To: unassigned at gcc dot gnu.org X-Bugzilla-Target-Milestone: --- X-Bugzilla-Flags: X-Bugzilla-Changed-Fields: bug_id short_desc product version bug_status bug_severity priority component assigned_to reporter Message-ID: Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: 7bit X-Bugzilla-URL: http://gcc.gnu.org/bugzilla/ Auto-Submitted: auto-generated MIME-Version: 1.0 X-SW-Source: 2015-01/txt/msg02146.txt.bz2 https://gcc.gnu.org/bugzilla/show_bug.cgi?id=64703 Bug ID: 64703 Summary: glibc sysdeps/powerpc/powerpc64/dl-machine.h miscompile Product: gcc Version: 5.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: tree-optimization Assignee: unassigned at gcc dot gnu.org Reporter: amodra at gmail dot com This testcase, extracted from glibc sysdeps/powerpc/powerpc64/dl-machine.h shows gcc optimising away the "opd" initialisation at -O1. ie. it's as if the indirect call doesn't cause gcc to see that "value" is used. Adding the asm cures the problem, as does passing the function pointer to another function rather than calling via function pointer in resolve_ifunc. struct link_map { unsigned long l_addr; int l_relocated; }; typedef struct { unsigned long fd_func; unsigned long fd_toc; unsigned long fd_aux; } Elf64_FuncDesc; extern const struct link_map *dl_rtld_map; extern unsigned long dl_hwcap; unsigned long resolve_ifunc (unsigned long value, const struct link_map *map, const struct link_map *sym_map) { Elf64_FuncDesc opd; if (map != sym_map && sym_map != dl_rtld_map && !sym_map->l_relocated) { Elf64_FuncDesc *func = (Elf64_FuncDesc *) value; opd.fd_func = func->fd_func + sym_map->l_addr; opd.fd_toc = func->fd_toc + sym_map->l_addr; opd.fd_aux = func->fd_aux; value = (unsigned long) &opd; } #if 0 __asm__ ("#%0" : : "r" (value)); #endif return ((unsigned long (*) (unsigned long)) value) (dl_hwcap); }