This is the mail archive of the gcc-bugs@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[Bug target/39477] New: Incorrect document for regparm attribute


extend.texi has

---
@item regparm (@var{number})
@cindex @code{regparm} attribute
@cindex functions that are passed arguments in registers on the 386
On the Intel 386, the @code{regparm} attribute causes the compiler to
pass arguments number one to @var{number} if they are of integral type
in registers EAX, EDX, and ECX instead of on the stack.  Functions that
take a variable number of arguments will continue to be passed all of their
arguments on the stack.

Beware that on some ELF systems this attribute is unsuitable for
global functions in shared libraries with lazy binding (which is the
default).  Lazy binding will send the first call via resolving code in
the loader, which might assume EAX, EDX and ECX can be clobbered, as
per the standard calling conventions.  Solaris 8 is affected by this. 
GNU systems with GLIBC 2.1 or higher, and FreeBSD, are believed to be 
safe since the loaders there save all registers.  (Lazy binding can be
disabled with the linker or the loader if desired, to avoid the
problem.)
---

Although glibc is safe since it preserves EAX, EDX and ECX:

_dl_runtime_resolve:
        cfi_adjust_cfa_offset (8) 
        pushl %eax              # Preserve registers otherwise clobbered.
        cfi_adjust_cfa_offset (4) 
        pushl %ecx
        cfi_adjust_cfa_offset (4) 
        pushl %edx
        cfi_adjust_cfa_offset (4) 
        movl 16(%esp), %edx     # Copy args pushed by PLT in register.  Note
        movl 12(%esp), %eax     # that `fixup' takes its parameters in regs.
        call _dl_fixup          # Call resolver.

it doesn't save all registers.


-- 
           Summary: Incorrect document for regparm attribute
           Product: gcc
           Version: 4.4.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: target
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: hjl dot tools at gmail dot com


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=39477


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]