是否有可能说服GCC模仿fastcall调用约定?

时间:2008-10-03 02:51:57

标签: gcc visual-c++

所以我有一个程序集需要在windows上使用fastcall调用约定来调用函数,但是gcc没有(afaict)支持它。 GCC确实提供了regparm属性,但是期望前三个参数在eax,edx和ecx中传递,而fastcall期望前两个参数在ecx和edx中传递。

我只是试图避免有效地复制一些代码路径,所以这并不是非常重要,但如果它是可以避免的话会很棒。

3 个答案:

答案 0 :(得分:11)

GCC通过fastcall支持__attribute__((fastcall))。它似乎已在GCC 3.4中引入。

答案 1 :(得分:4)

我知道我在派对上迟到了,但是如果你们中的任何一个偶然发现,请记住你可以定义一个宏来模仿它。例如:

#if defined(__GNUC__)
    #define MSFASTCALL __fastcall
    #define GCCFASTCALL 
#elif defined(_MSC_VER)
    #define MSFASTCALL
    #define GCCFASTCALL __attribute__((fastcall))
#endif

int MSFASTCALL magic() GCCFASTCALL;

显然,这看起来很丑陋,所以你可以定义2个原型(这就是我所做的),使它更容易阅读,但有些人更喜欢需要较少打字的路线。除了特殊情况,我通常不使用调用约定。我只是让编译器优化休息。

现在,有一些要记住的怪癖。例如,当您的目标是64位平台时,所有函数都使用fastcall约定,以便利用额外的寄存器并提高速度并降低间接成本。同样,fastcall由不同的平台实现,因为它不是标准化的。还有其他一些,但这就是我所能解决的问题。

答案 2 :(得分:1)

如果您从asm调用该函数,那么您肯定可以完全控制调用该函数的方式。是什么阻止你加载寄存器并发出CALL