Quuxplusone / LLVMBugzillaTest

0 stars 0 forks source link

Unable to override calling convention for individual functions when using -mrtd #10850

Closed Quuxplusone closed 13 years ago

Quuxplusone commented 13 years ago
Bugzilla Link PR10591
Status RESOLVED FIXED
Importance P normal
Reported by Dimitry Andric (dimitry@andric.com)
Reported on 2011-08-04 17:33:50 -0700
Last modified on 2011-08-05 11:37:45 -0700
Version trunk
Hardware PC All
CC efriedma@quicinc.com, geek4civic@gmail.com, llvm-bugs@lists.llvm.org, pawel.worach@gmail.com, rdivacky@freebsd.org
Fixed by commit(s)
Attachments
Blocks
Blocked by
See also
When you compile a program with -mrtd, the default calling convention
will be switched to stdcall.  However, you should be able to override
this for individual functions, as stated here:

http://gcc.gnu.org/onlinedocs/gcc-4.6.1/gcc/Function-Attributes.html#index-mrtd-2410

"cdecl -- On the Intel 386, the cdecl attribute causes the compiler to
assume that the calling function will pop off the stack space used to
pass arguments. This is useful to override the effects of the -mrtd
switch."

However, it looks like clang forces every function to have the stdcall
convention, and then errors out whenever you attempt to override it for
a particular function:

  void __attribute__((cdecl)) foo(int i) {}
  void bar(int i) {}

This compiles fine using 'gcc -mrtd -c', but 'clang -mrtd -c' complains:

  convtest.c:1:21: error: cdecl and stdcall attributes are not compatible
  void __attribute__((cdecl)) foo(int i) {}
              ^
  1 error generated.

It would be nice if we could get similar behaviour from clang.
Quuxplusone commented 13 years ago

fixed in r136971.