議論/fastcall


Top / 議論 / fastcall

このページは何か? (by Tino)

fastcallを使ってもいいのか?を考える。

経緯

関連ページ

クロスコンパイラ構築手順

  1. binutilsを./configure --target=i386-mingw32 && make && make installする。
    • /usr/local/bin/i386-mingw32-as等がインストールされる。
  2. MinGWのサイトから以下のヘッダとライブラリを取って来て、/usr/local/i386-mingw32内で展開する。/usr/local/i386-mingw32/include, /usr/local/i386-mingw32/libに収まる。
  3. gccを./configure --target=i386-mingw32 && make && make installする。
    • /usr/local/bin/i386-mingw32-gcc等がインストールされる。

以上。

概要

引数やスタックをどう扱うかという関数の呼び出し規約。Microsoftの規約ではシンボル名で区別されている。

cdecl

【例】void abc(int a, int b);に対してabc(3, 4);

push dword 4
push dword 3
call _abc
add esp, 8

stdcall

【例】void __stdcall abc(int a, int b);に対してabc(3, 4);

push dword 4
push dword 3
call _abc@8

fastcall

【例】void __fastcall abc(int a, int b);に対してabc(3, 4);

mov ecx, 3
mov edx, 4
call @abc@8

検証手順

$ uname -srm
$ gcc --version
$ echo "int __fastcall test(int a,int b){return a+b;}" > test.c
$ gcc -masm=intel -S test.c

[OK] MSYS(セルフ), gcc-3.4.2

$ uname -srm
MINGW32_NT-5.1 1.0.10(0.46/3/2) i686
$ gcc --version
gcc.exe (GCC) 3.4.2 (mingw-special)
(以下略)

[OK] Cygwin(セルフ), gcc-3.4.4

$ uname -srm
CYGWIN_NT-5.1 1.5.21(0.156/4/2) i686
$ gcc --version
gcc (GCC) 3.4.4 (cygming special) (gdc 0.12, using dmd 0.125)
(以下略)

[NG] FreeBSD(クロス), gcc-3.3.3

# uname -srm
FreeBSD 5.1-RELEASE i386
# i386-mingw32-gcc --version
i386-mingw32-gcc (GCC) 3.3.3
(略)
# echo "int __fastcall test(int a,int b){return a+b;}" > test.c
# gcc -masm=intel -S test.c
test.c:1: error: parse error before "test"

[OK] FreeBSD(クロス), gcc-3.4.6

# uname -srm
FreeBSD 6.1-RELEASE i386
# i386-mingw32-gcc --version
i386-mingw32-gcc (GCC) 3.4.6
(以下略)

[OK] FreeBSD(クロス), gcc-4.1.1

# uname -srm
FreeBSD 6.1-RELEASE i386
# i386-mingw32-gcc --version
i386-mingw32-gcc (GCC) 4.1.1
(以下略)

[OK] Darwin x86(クロス), gcc-4.1.1

# uname -srm
Darwin 7.0.0 x86
# i386-mingw32-gcc --version
i386-mingw32-gcc (GCC) 4.1.1
(以下略)

バイナリ:gcc-4.1.1-Darwin-7.0.1-x86.tar.bz2
テスト結果:filetest.zip

コメント

最新の1000件を表示しています。 コメントページを参照

お名前:
  • 多分ホストがppcなのが悪いのか、D front end for gccなんか入れてるのが悪いのかのだな -- Yume 2006-10-27 (金) 18:10:28
    • もう一回gccを入れ直したらコンパイル出来るようになりました。 -- Yume 2006-10-29 (日) 18:53:53
  • Darwinでビルドしたgccを最小構成にしてアップしておきました。これ単体でアセンブリを出力させることは可能で、実際にやってみたものも一緒にアップしておきました。 -- Tino 2006-10-26 (木) 10:37:48
  • gcc-3.3系では__fastcallがparse errorになるのでサポートされていないようですが、それ以降ではサポートされているみたいです。エラーメッセージを見ないと何ともいえないのですが、クロスコンパイラなのにホストによって挙動が変わるのは奇妙です。少なくともFreeBSD(i386)とDarwin(x86)では挙動は変わりませんでした。 -- Tino 2006-10-26 (木) 00:04:04
  • Darwin 7.9.0のクロス、gcc-3.3及びgcc-4.1.1でキーワードが認識されてないようです。 -- Yume 2006-10-25 (水) 16:34:12
    • gcc-3.4.6でもエラーです… -- Yume 2006-10-25 (水) 17:57:02
    • Darwin 7.0.1(x86)でgcc-4.1.1のクロスコンパイラを構築したところ、fastcallがきちんと処理できていることを確認しました。 -- Tino 2006-10-25 (水) 23:58:30
  • どの環境(gccのバージョン、ホスト等)でしょうか?セルフ環境のMinGWではサポートされていることを確認しました。 -- Tino 2006-10-24 (火) 21:51:20
    • gcc-3.3および4.1.1のクロスです… __attribute__((__fastcall))で無視されるっていう警告が出た… -- Yume 2006-10-24 (火) 22:37:39
    • 私のところでテストしたクロスの4.1.1ではfastcallを処理することができました。もしお手数でなければ、上の手順のログを見せていただければ幸いです。 -- Tino 2006-10-25 (水) 16:12:05
  • FreeBSDでgcc-3.3.3のクロスコンパイラを構築したところ、キーワード自体が認識されていないことを確認しました。後でgccのバージョンを変えてテストしてみます。 -- Tino 2006-10-25 (水) 07:25:16
    • FreeBSDでgcc-3.4.6のクロスコンパイラを構築したところ、fastcallがきちんと処理できていることを確認しました。 -- Tino 2006-10-25 (水) 12:22:15
    • FreeBSDでgcc-4.1.1のクロスコンパイラを構築したところ、fastcallがきちんと処理できていることを確認しました。 -- Tino 2006-10-25 (水) 16:10:28

MENU

now: 6

リンク


最新の20件
2018-10-07 2018-09-20 2018-09-03 2018-05-09 2017-09-29 2017-01-10 2016-12-11 2016-10-04 2016-08-14 2016-05-29 2015-12-28 2013-02-25 2013-02-21 2013-02-20 2013-02-12 2013-02-11 2013-02-10
最新の20件
2010-02-01 2010-01-31 2010-01-30 2010-01-29 2010-01-16

Counter: 3207, today: 1, yesterday: 0

添付ファイル: filetest.zip 501件 [詳細]

リロード   新規 編集 凍結 差分 添付 複製 改名   トップ 一覧 検索 最終更新 バックアップ   ヘルプ   最終更新のRSS

Last-modified: 2008-03-28 (金) 15:48:02 (3887d);  Modified by mona
PukiWiki 1.4.6 Copyright © 2001-2005 PukiWiki Developers Team. License is GPL.
Based on "PukiWiki" 1.3 by yu-ji
Powered by PHP 5.2.17
HTML convert time to 0.047 sec.