llvm / llvm-project

The LLVM Project is a collection of modular and reusable compiler and toolchain technologies.
http://llvm.org
Other
27.32k stars 11.21k forks source link

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

Closed DimitryAndric closed 13 years ago

DimitryAndric commented 13 years ago
Bugzilla Link 10591
Resolution FIXED
Resolved on Aug 05, 2011 11:37
Version trunk
OS All
CC @efriedma-quic,@pwo

Extended Description

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.

llvmbot commented 13 years ago

fixed in r136971.