タグ

gccに関するmogwaingのブックマーク (23)

  • GCC memory barrier __sync_synchronize vs asm volatile("": : :"memory")

  • CPUクロックに基づく相対時刻の計測

    [ C++で開発 ] CPUクロックに基づく相対時刻の計測 CPUのクロックに基づき電源ONからの相対時刻を取得する方法を調査し記述します。最近のCPUは、クロックに従ってカウントアップするレジスタを保持しているので、このレジスタの値を読み出すことでCPUが起動してからのクロック数を取得することができます。例えば1GHzの動作周波数のCPUであれば、分解能は1ns(ナノ秒)となります。非常に高精度な分解能です。 2012-09-22 TSCの種類について追記 RDTSCP命令について追記 VisualC++のコンパイラ組み込み関数__rdtsc/__rdtscpについて追記 Intel x86系CPU RDTSC CPU命令を直接利用 Intel x86系のCPUAMDのAthlon等も含む)では、CPUクロックごとに加算される64bitのタイムスタンプカウンタ(IA32_TIME_ST

  • gccにおけるatomic操作命令の個別関数

     gccとVC x86/x64環境で開発する上で, gccとVCはどちらも非常に優れたC/C++コンパイラです. ただLinuxWindowsのどちらの環境でも動作するようなC/C++コードを書くためには, gccとVC, およびそれらが動作するOSの違いが問題になることがあります. ここではそれらの違いについてまとめていきたいと思います. なお説明を簡単にするためにマクロを多用していますが実際には可能なら別の手段をとるか, 名前がぶつからないような命名規則に則ったマクロ名をつけることをお薦めします. 対象 定義済みマクロ 有用なマクロ コンパイルオプション 演算子の代替表現の抑制 日語のコメント 型 pragma attributeとdeclspec ファイル入出力 テキストとバイナリ 巨大なファイル static変数の初期化 snprintf 例外ハンドラ intrinsic関数

  • largefile problems - converting to largefile

    mogwaing
    mogwaing 2008/11/11
    largefile
  • gcc の -Wall 以外の警告オプション - ひげぽん OSとか作っちゃうかMona-

    以前同僚の光成さんが、以下の warning オプションを使っていると書かれていたのが気になったので調べてみました。 -Wall -W -Wformat=2 -Wcast-qual -Wcast-align -Wwrite-strings -Wconversion -Wfloat-equal -Wpointer-arith もし上記以外にも良さげなオプションがありましたら教えてください<(_ _)> 情報源 man と info と http://sugarpot.sakura.ne.jp/yuno/?gcc%2Fwarning 。 最初は日語版の man だけを見ていたのですが、id:kazuhooku に info を見るべしと教わりました。 man も info もそうですが、日語版は情報が少なかったりするので注意。 LANG=C man gccなどとしましょう。 -Wforma

    gcc の -Wall 以外の警告オプション - ひげぽん OSとか作っちゃうかMona-
    mogwaing
    mogwaing 2008/05/10
  • gcc4 と TR1 | d.y.d. 01:29 06/11/16

    23:41 06/11/30 べくたー GreenPad - 新着ソフトレビュー だそうです。 ソフト作者からひとこと、という欄を書きました。 今時のエディタなら GreenPad でできてる程度の多言語混在はできるんじゃないかと思うので、 ポイントというほどポイントかなーとかちょっと思ってしまったりもしつつ。 ひとことに書いたように、あれは 「既存のエディタコンポーネントを一切使わずに『テキストエディタ』を作るのって、 どうやるんだろう?」 が自分的には全てですね。作ってて、エディタの作り方という よりは、"この機能のこの実装って実は死ぬほど重くない?だいじょぶ?でも あとはこれを定数倍のチューニングするしか思いつかないんだけど" と行き詰まったときは 大抵その実装で十分うまく回るのでどんどん作っちゃえばOK、ということを経験的に 学びました。特に車輪の再実装をしてる時は。今の自分ならな

  • Wataru's Japanese repository

    ようこそ PC-UNIX上でのシステムプログラミングや、ハードウェアとの対話を楽しむページです。 テーマは「理解 (understanding)」。 西 田  亙 (NISHIDA Wataru) 主な著作 GCCプログラミング工房 (UNIX USER 連載) Linuxから目覚めるぼくらのゲームボーイ (ソフトバンクパブリッシング) Interface 2002年7月号特集 Linux 徹底詳解 -- ブート&ルートファイルシステム Linuxシステム縮小計画 (Embedded UNIX 連載) GNU開発ツール (Oversea Publishing) -- Computer Architecture Series の第一作 Linux/GNU開発環境入門? (Web 連載) -- 近日公開予定 関連リンク http://memo.wnishida.com/ -- Wataru

  • GCC Inline Assembler

    "asm"と"__asm__"は、基的には同じであるが、"__asm__"は使用している言語の予約語/関数等とぶつかる場合使用します。またはANSI C互換のコードをつくっている場合、"asm"キーワードが使用できなくなるので"__asm__"を使います。 /* keyword asm と同じ関数*/ function asm(void){ } /* asmが使用できないので__asm__を使用 */ function inline(){ __asm__("asm code"); }

  • asmlinkage - とぅるるるるるるるるるる 五明君からの電話だッ!

    LilyVMのコード読んでいるとき、asmlinkageのマクロが出てきたが定義がされていない。Linuxカーネルなどにも使用されているので調べてみた。 asmlinkageマクロとは Linuxカーネルなどによく見かけるマクロの一つとして、asmlinkageマクロがある。このマクロは関数の整数引数を確実に、スタックに渡すことを保証するマクロである。Linuxではシステムコールなどに使われる。システムコールの引数の渡しかたは次の様になる。 システムコールの引数を各レジスタに代入 ソフトウェア割り込み(int0x80)を行う。 カーネル権限に移行後、レジスタから各引数を取り出す。 システムコールの引数は、スタックから各レジスタに代入を行う実装なので、asmlinkageマクロを使用する。 GCC拡張 regparm (number) asmlinkageのコードは以下の様になっている。 #

    asmlinkage - とぅるるるるるるるるるる 五明君からの電話だッ!
  • main() の前に関数を呼ぶ - bkブログ

    main() の前に関数を呼ぶ C/C++ のプログラムで、main() の前に関数を暗黙的に呼びたいときがあります。ここでは GCC の拡張を使った方法と、C++ のコンストラクタを使った方法を紹介したいと思います。 GCC では main() の前に呼ばれる関数を __attribute__((constructor)) という拡張機能を使って定義できます。たとえば、次のプログラムでは main() の前に foo() が呼び出されます。 #include <stdio.h> __attribute__((constructor)) void foo() { printf("hello, before main\n"); } int main (int argc, char **argv) { printf("hello, world\n"); return 0; } 実行結果は以下の

    mogwaing
    mogwaing 2007/08/28
    mainの前に関数を呼ぶ。gccの拡張を使う方法とc++のコンストラクタを使う方法
  • introduction to x86-asm

    x86アセンブリ言語入門 昔に書いたのを発掘し, 若干手直しして出しました. 内容の古いところや間違ってるところがあればご指摘ください. 64bit環境についてはx64 アセンブリ言語プログラミングを参照してください. なおこのページではごく簡単なコードを書けるようになること, デバッグ時に知っておけばよいこともあるだろう程度の知識の取得を目指します. 高速化手法自体については触れません. レジスタについて 基用語 最初の一歩 Cとの連係 Cとの連係 その2 Cとの連係 その3 Windows DLL 少し応用 gasの場合は 実際に書くならこんなことも 簡易命令一覧

  • かそくそうち - __attribute__の括弧

    Binary 2.0カンファレンス2006 に動画とIRCで参加してきました。 http://0xcc.net/blog/archives/000149.html 動画をキャプチャしながら見ていたので、IRCとのタイムラグが結構ありました。 技術的にはブログなどで既知のものが多かったんですが、PS3 LinuxでのプレゼンにWiiリモコン使うなど、ネタとしては面白かったです。 最初の質問で「gccの__attribute__はなぜ括弧が二重になっているのか?」というのがあって、そのときには思いつかなかったのですが、休憩中にひらめいてIRCにちょっと書き込みました。 19:32 >hamigaki< 多分、gcc以外でマクロで代用するためですよ>括弧 19:32 >hamigaki< 二重でないと、コンマがかけない これだけだと、分からない人もいたと思うのでちょっと解説しておきます。 そもそ

    かそくそうち - __attribute__の括弧
  • Using GNU C __attribute__

    One of the best (but little known) features of GNU C is the __attribute__ mechanism, which allows a developer to attach characteristics to function declarations to allow the compiler to perform more error checking. It was designed in a way to be compatible with non-GNU implementations, and we've been using this for years in highly portable code with very good results. Note that __attribute__ spell

  • gccのfastcall関数呼び出しについて : no hacking, no life

    背景 最近、前職の友達や後輩、またその後輩の会社の方々などで「Linuxカーネル勉強会」なるものをはじめました。勉強会といっても読書会に近く、「Linuxカーネル解読室」というを使っての勉強会で、この前早速第1回があり、第1章の「プロセススケジューリング」について行いました。 みんなで議論などをして、書かれてることは大体理解できましたが、やはり前提知識がたくさん必要などの理由から不明な所が何点かあったので、その一つについて調べてみました。 (以降の説明はlinux kernel 2.6.15(x86)を元にしています。) わからなかった事 そのわからなかった事について説明します。 以下は、Linuxカーネルが行うコンテキススイッチの部分の核となるswitch_to というマクロです。 include/asm-i386/system.h #define switch_to(prev,n

  • ひげぽん OSとか作っちゃうかMona- - [gcc] ライブラリ開発者は gccの「Declaring Attributes of Functions」を読むべし

    gcc を使う人は info gcc をくまなく読むべきだと言われたらそれでおしまいなのですが、info gcc の中で「Declaring Attributes of Functions」が面白かったので紹介します。 実は Mona のカーネル内で GDT(Global Descriptor Table) 関連のコードが最適化オプション -O2 では動くけど -O3では動かないという現象に出くわしました。 /* TSS. Mona has only one TSS */ setSegDesc(&g_gdt[4], (dword)g_tss, 0x00000067, SEGMENT_PRESENT | SEGMENT_DPL0 | 0x00 | 0x09);のように TSS を設定したあとに /* prepare dpl0 stack */ memset(g_tss, 0, sizeof(

    ひげぽん OSとか作っちゃうかMona- - [gcc] ライブラリ開発者は gccの「Declaring Attributes of Functions」を読むべし
    mogwaing
    mogwaing 2007/08/19
    拡張について
  • yunoの雑記帳 - gcc/attribute

    gcc4.1の__attribute__のメモ。 関数属性 † __attribute__((alias("name"))) 関数を他の関数のエイリアスにする。 void foo() __attribute__((alias("bar"))); __attribute__((always_inline)) 最適化がオフのときでも、関数をインライン展開する。 __attribute__((flatten)) 関数のサイズやインライン化パラメータを無視して、常にインライン展開する。 __attribute__((cdecl)) 386専用。 __attribute__((const)) 関数に副作用がなく、戻り値が引数のみに依存すると仮定する。 __attribute__((constructor)) 関数がmainに入る前に自動的に呼ばれるようにする。 __attribute__((dest

    mogwaing
    mogwaing 2007/08/12
    gcc拡張の関数属性
  • 関数呼び出し規約(on IA-32)について

    Written by Yashiro Takeshi <yashiromann@nifty.com> 2004/1/14 IA-32(x86)上のgccでの関数呼び出し規約について、まとまっている文書がgoogleで検索してもなかなか見つからず苦労したので、他のものと一緒についでにまとめておくことにします。私もよく分かっていないので、何か間違いがありましたら(掲示板でもメールでも)教えてください。 確認の際、抜けがないようにここにも書いておくと、関数呼び出し規約とは、 関数呼び出しの前後で保存されなければならないレジスタ 引数渡しの方法 (ex. レジスタ渡し・スタック渡し・共有メモリ渡し) 引数渡しの順序 関数呼び出し前後でのスタックポインタの保存方法 返り値の戻し方 の全てをあわせたものであって、どれか一つでも曖昧にしてミスしてしまうと思わぬところでエラーが発生してしまいます。(私の

  • GCC-インラインアセンブリ-HOWTO (日本語訳)

    Sandeep.Sv0.1, 01 March 2003. この HOWTO では、GCC により提供されるインラインアセンブリの機能の目的と、その使用法について説明します。前提とされる知識は、x86 アセンブリと C 言語の 2 つだけです。 1. イントロダクション. 1.1 著作権およびライセンス. 1.2 フィードバックと訂正. 1.3 謝辞. 2. 全体の概要. 3. GCC アセンブリ構文. 4. 基的なインライン構文. 5. 拡張アセンブリ構文. 5.1 アセンブリテンプレート. 5.2 オペランド. 5.3 破壊されるレジスタのリスト. 5.4 Volatile ...? 6. オペランド制約の詳細. 6.1 よく使われる制約. 6.2 制約修飾子. 7. 有用なレシピ集. 8. 最後に. 9. 参考文献. 1. イントロダクション. 1.1 著作権およびライセンス. C

    mogwaing
    mogwaing 2007/08/05
    inline assembler howto
  • インラインアセンブラと \n\t - memologue

    小ネタ2。 GCCで複数行からなるインラインアセンブラを書くとき、 __asm__ ("movl %0,r9\n\t" "movl %1,r10\n\t" "call _foo" :: "g" (from), "g" (to) : "r9", "r10");のように \n\t 区切りで書くひとと、\n\t のかわりにセミコロン区切りで書く*1ひとがいます。GCCのマニュアル上は、どちらでもOKよん、ということになってるんですが、世間では \n\t 派が多いです。...で、 ; の方が読みやすいだろうに、なぜ世間では\n\t派が多いのか、ちょっと前まで疑問でした。というわけで、\n\tの利点説明です。 gccコマンドが.cをって一時ファイル(/tmp/ランダム文字列.s)を生成するとき、前者(\n\t)の書き方だと.sは ラベル: #APP movl %0,r9 movl %1,r10 c

    インラインアセンブラと \n\t - memologue
    mogwaing
    mogwaing 2007/08/05
    inline記述時に¥n¥tと;とで区切る場合の違いについて
  • GCC x86インラインアセンブラ

    ○GCC x86インラインアセンブラ asm ("命令 source,dest"); ■グローバル変数 --------------------------------------------------------- そのまま使えます #include <stdio.h> int i; int j; main(){ i=10; asm ("movl i,%eax"); asm ("add $10,%eax");  //数値は先頭に$マークを付ける asm ("movl %eax,j"); printf("%d %d\n",i,j); } ▼上のプログラムの書き方を変えたもの #include <stdio.h> int i; int j; main(){ i=10; asm (  "movl i,%eax  \n\t" "add $10,%eax  \n\t" "movl %eax,j"

    mogwaing
    mogwaing 2007/08/05
    inline assembler