This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug c++/20004] New: G++ disregards __attribute__((regparm(3))) when calling through a const pointer
- From: "jjk at acm dot org" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: 16 Feb 2005 09:37:41 -0000
- Subject: [Bug c++/20004] New: G++ disregards __attribute__((regparm(3))) when calling through a const pointer
- Reply-to: gcc-bugzilla at gcc dot gnu dot org
Output from "g++ -v":
Reading specs from /usr/lib/gcc-lib/i386-redhat-linux/3.2.3/specs
Configured with: ../configure --prefix=/usr --mandir=/usr/share/man
--infodir=/usr/share/info --enable-shared --enable-threads=posix
--disable-checking --with-system-zlib --enable-__cxa_atexit --host=i386-redhat-linux
Thread model: posix
gcc version 3.2.3 20030502 (Red Hat Linux 3.2.3-20)
Compile the following code using "g++ -S bug.c":
---8<---bug.c------------------------------------------8<---
struct Foo
{
int __attribute__((regparm(3)))
(*p)(int);
};
extern struct Foo *foo;
extern const struct Foo *bar;
int
baz(int i)
{
return (foo->p)(i);
}
int
zip(int i)
{
return (bar->p)(i);
}
---8<--------------------------------------------------8<---
The only difference between baz() and zip() is that baz() uses a "struct Foo *"
while zip() uses a "const struct Foo *". However, in the generated assembler
code, baz() passes parameters in registers as requested, and zip() doesn't.
_Z3bazi:
[...]
movl foo, %eax
movl (%eax), %edx
movl 8(%ebp), %eax
call *%edx
_Z3zipi:
[...]
movl bar, %eax
pushl 8(%ebp)
movl (%eax), %eax
call *%eax
Note: This bug is specific to the C++ compiler; the C compiler does the right
thing.
--
Summary: G++ disregards __attribute__((regparm(3))) when calling
through a const pointer
Product: gcc
Version: 3.2.3
Status: UNCONFIRMED
Severity: normal
Priority: P2
Component: c++
AssignedTo: unassigned at gcc dot gnu dot org
ReportedBy: jjk at acm dot org
CC: gcc-bugs at gcc dot gnu dot org
GCC host triplet: i386-redhat-linux
GCC target triplet: i386-redhat-linux
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=20004