タグ

ブックマーク / blog.kmckk.com (7)

  • KMC Staff Blog

    2023年12月06日 GNU ldとLLVM lldのロケーションカウンタの扱いの違い 従来は LinuxApple などのリッチ OS のアプリ向けというイメージだった LLVM の高速リンカ lld ですが、LLVM 17 で GNU ld との互換性がほぼ完璧になり、AArch64/ARM/RISC-V のベアメタルツールチェーンでも GNU ld を置き換えできることが確認できました。そこで弊社の SOLID もリンクの高速化や Clang での LTO などを期待して lld 対応を進めているのですが、その時に 1 点だけ非常にわかりにくい非互換性に悩まされたのでメモしておきます。 続きを読む kmckk at 20:24│コメント(0)│LLVM|若槻 2023年10月26日 MSYS2のバグ?(Bad address) 業務でシェルスクリプトを書いていて、非常に不可解

  • KMC Staff Blog:#include_nextの疑問メモ

    2014年09月18日 #include_nextの疑問メモ 前回の記事で、GNU CPP の独自拡張 #include_next 指令を紹介しました。 「GNU CPP(GCC)の独自拡張#include_next指令」 このドキュメントは簡単な概要と例だけなので、ちょっと複雑なケースになると、この挙動は仕様なのか?バグなのか?という判断が難しくなります。 この間、私が悩んだ疑問は、過去に以下の ML で取り上げられた疑問とほぼ同じものでした。 gcc-help ML: #include_next: wrong search order? この疑問を単純化して解説した後、私なりの解釈を説明します。 まず、GNU CPP は、#include や #include_next 指令を見つけると、gcc-include-dir(GCC 独自のインクルードファイルが含まれるディレクトリ)、sys

  • KMC Staff Blog:GNU CPP(GCC)の独自拡張#include_next指令

    2014年09月11日 GNU CPP(GCC)の独自拡張#include_next指令 Warp の挙動を調べている時に、GCC のプリプロセッサの #include_next 指令の挙動にかなり悩んだので、備忘録も兼ねてドキュメントの日語訳をアップロードします。 厳密な仕様が無く、あまり有名でもない(?)独自拡張なので(ARM CC や IBM XL C/C++ など、一応 GCC 以外のコンパイラのプリプロセッサにも取り入れられているようですが)、情報が少なく、実際にいろいろ動かして実験してみないと挙動がよくわからず、かなり混乱しました。以下の翻訳もあまり自信が無いので、何かお気づきの点があれば、コメント欄にてご指摘いただけると幸いです。(ただし、現在スパムコメントがあまりにも多いため、半角英数字のみのコメント、国外の IP アドレスからのコメント、改行が 10 個以上あるコメント

  • KMC Staff Blog:環境変数でLinuxのglibc動的リンカにログを出力させる

    2014年09月05日 環境変数でLinuxのglibc動的リンカにログを出力させる たまには役に立ちそうなネタも書かないとということで、この間社内で話題※になった、glibc 環境の Linux の動的リンカに共有ライブラリのデバッグ時に有益な情報を出力させる方法を紹介します。 ※ この Tips は、弊社の PARTNER-AP(JTAG-ICE デバッガではなく、Linux アプリをデバッグするためのアプリデバッガ)案件で役に立った実績のある Tips なので、glibc と共有ライブラリを使用するような、比較的リッチな Linux 環境において有効です。(デバッガとは無関係で、純粋に Linux 環境でのデバッグ機能の紹介となります。) Linux のアプリが大規模になってくると、非常に大量の共有ライブラリを動的ロードすることとなり、実際にどの共有ライブラリがどんな風にロードされて

  • KMC Staff Blog:C/C++プリプロセッサの挙動の違い(defined編)

    2014年08月21日 C/C++プリプロセッサの挙動の違い(defined編) 前回の記事でビルドした Facebook 社の Warp の挙動を調べていた所、#if や #elif 指令中でのみ使用可能な defined 単項演算子の挙動が GCC のプリプロセッサと異なり、GCC 用のヘッダを前処理できない事例を発見したので、その時のメモです。 以下のような、現象が再現する最小コード片を用意しました。 $ cat defined_test.c #define FOO defined (BAR) #define BAR #if FOO #endif これは warp.exe ではエラーになります。FOO の最初のマクロ展開の時に defined 演算子の引数の BAR も一緒に #if defined() のように展開(削除)され、エラーになっているように思われます。 $ ./warp

  • KMC Staff Blog:GCCのトランザクションメモリサポート

    2014年01月23日 GCCのトランザクションメモリサポート GCC のリリースノートを眺めていたら、4.7 からトランザクションメモリのサポートが入っていたことに気付いたので、少し調べてみました。 ・トランザクションメモリとは? トランザクションメモリは、マルチスレッドプログラムにおいて、複数のスレッドからアクセスされる共有変数(メモリ)を保護するためのしくみのようです。 共有変数の保護には、従来は mutex などのロックが使用されてきました。しかし、ロックを使用したプログラム片(関数など)は、ロックの取得と解放の順番が重要なので、基的には入れ子にできないという問題があります。常にプログラム全体に散らばるロックを意識する必要があるので、プログラムの部品化や再利用が困難になりますし、デッドロックのデバッグや品質保証は非常に高コストになりがちです。 一方トランザクションメモリは、原理的

  • KMC Staff Blog:Android 4.0で利用されているLLVM

    2011年12月05日 Android 4.0で利用されているLLVM Android4.0(Ice Cream Sandwich)のソースコードを見て、RenderScriptにLLVMの技術が使われているのがわかりました。(正確には3.xからですが、ソースが公開されていなかったので詳細を確認できませんでした。) 技術的な興味で少し調べたのでここにメモを残します。 Android RenderScript on LLVM この資料から図を拝借して。 ホスト側で .rsファイルから.bc(bitcode: LLVMの中間言語フォーマット)にコンパイルするとともに、関数の呼び出しのためのラッパーメソッドや変数のgetter/setterメソッドのJavaソースコードが自動生成される。このためJavaとRenderscript間でのやりとりは簡単。JNIは不要。 ターゲット側で (図中ではJa

  • 1