問題タブ [gcc-plugins]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 他のファイルを使用して gcc プラグインをビルドする
この問題を理解するために、gcc プラグインについて詳しく知る必要はないでしょう。
こんにちは、私は他のファイルを使用する gcc プラグインを作成しようとしてclassTree.cpp
いfield.cpp
ます.
これと一緒に使用します:
gcc plugins Docに示されているように、他のファイルを使用している場合は、次のようにファイルの名前を追加するだけでよいとも言われています。
これを使用するplugin.so
と作成されますが、以前のように実行しようとすると、次のエラーが発生します。
エラーの意味は何ですか? 特にsymbol: _ZTV5field
?
gcc - バイナリからソース ファイルをリストするための GCC プラグイン
この質問をしたいのですが、gcc には、バイナリ ファイルからソース ファイルを一覧表示できる「プラグイン」がありますか (バイナリは削除されません)?? プラグインが利用できない場合は、「gcc 機能と同じものを実装する方法を教えてください。
c++ - gcc プラグインを使用してクラス アノテーションを取得する
解析後に C++ ファイルを解析するgcc プラグインを作成しています。プラグインはクラスをウォークスルーし、それらに関する情報を生成します。プラグインは機能しています。これがクラスをウォークスルーする方法です。
彼が分析できるクラスと分析できないクラスを選択したいと思います。私の最初のアイデアは、クラスを解析するときに読み取る何らかの注釈を追加し、それを分析するかどうかを決定することです。
私は C++ で何らかの注釈を使用したことがないので、これが可能かどうかはわかりません。もしそうなら、どのようにそれらを使用し、プラグイン内で注釈を取得することをお勧めしますか? そうでない場合、必要なことを行う良い方法はありますか?
c++ - gcc 5.1.0 に GIMPLE パスを登録する
こんにちは、gcc 4.8 および 4.9 用の gcc プラグインを使用していますが、gcc 5.1.0 で問題が発生しています。問題は、この新しい gcc バージョンで GIMPLE パスを登録できないことです。
プラグイン コードの例を次に示します。
このプラグインを使用してファイルをコンパイルすると、いくつかの B と C が出力されるはずですが、何も出力されません。
gcc 4.9 との違いは、型「pass_data」のフィールドが以前よりも 2 つ少ないことです (has_gate と has_execute)。それ以外は以前と同じようです。誰かが私が間違っていることや欠けていることを知っていれば、助けていただければ幸いです。
gcc - 動的にリンクされた GCC プラグインを使用した Valgrind
私はしばらくの間、プロファイリング ツール valgrind を使用しています。実行するには実行可能ファイルが必要です。つまり、
動的にリンクされた GCC プラグインで使用し、プラグインで使用される各関数の所要時間と呼び出し回数をリストします。次のように GCC プラグインを実行しています。
次のコマンドを実行すると、valgrind は gcc のメモリ リークのみを報告し、plugin.so のメモリ リークは報告しません。私のプラグイン (.so ファイル) でのみ valgrind を実行する方法が必要です。
それは可能ですか?私はこれについてたくさん検索しましたが、具体的な答えは見つかりませんでした。
gcc - gcc中間表現でツリーを保存するには? 出来ますか?
ツリー (具体的にはツリーの種類) をバイナリ形式でファイルに保存したいのですが、このツリーを他のコンパイル ユニットにロードする必要があります。例えば:
私は2つの機能を持つmain.cを持っています:
構造体の型 ( myTypeStruct ) を保存し、test.c を含む別のコンパイル ユニットに次のようにロードします。
gcc プラグインを使用して、型をロードし、その型の変数を作成して、test.c を次のように変換します。
ツリーは tree_node へのポインターであり、tree_node は構造の結合であることを知っています。問題は、ツリーがそれと関係を持ち、一連の理解できない構造を持っていることです。特定の型の変数を作成するときに、どのデータにツリーが必要かを知る必要があります。
PD: LTO がそのようなことを行う方法についてのドキュメントが不十分です。PD2: 私の英語でごめんなさい
c++ - 現在のコンパイル単位に列挙型宣言を挿入する GCC プラグイン
GCC で現在のコンパイル単位に enum 宣言を挿入する最良の方法はどれですか? たとえば、enum global_ids を挿入します。
免責事項: GCC の内部構造について学習しようとしており、プロジェクトで GCC プラグインを直接使用したいと考えています。GCC の内部構造を十分に理解したら、MELT/GCC Python プラグインをチェックアウトします。
gcc - GCC プラグインからオブジェクト ファイルにメタデータを埋め込む方法
コンパイルするプログラムのドメイン固有の分析を行う GCC プラグインを作成しようとしています。生成されたオブジェクト ファイルに、分析結果をある種のメタデータ (デバッグ情報など) として埋め込む最善の方法を考えています。
理想的には、いくつかのメタデータ (私の場合はテキスト) を各オブジェクト ファイルに埋め込む必要があり、リンカーはリンクするすべてのオブジェクトからのデータを保持する必要がありますobjdump
。readelf
または類似。
私の現在のアイデアは、GIMPLE AST に追加することによって、一意の名前のグローバル文字列変数を各コンパイル ユニットに追加しようとすることです。ただし、より「規律ある」方法があるかどうかは疑問です。プラグインはどのようにデバッグ情報やその他のメタデータを生成できますか?
c - GCC プラグインに組み込み関数を追加するには?
GCC プラグインが新しい組み込み関数を追加することは可能ですか? もしそうなら、それを正しく行う方法は?
GCC のバージョンは 5.3 (またはそれ以降) です。コードは、C で記述されたプラグインによってコンパイルおよび処理されます。
gcc-melt.org の GCC プラグインの理論的根拠で、これは実行可能であると述べられていますが、方法がわかりません。
GCC のソースを見る限り、ビルトインはgcc/langhooks.cadd_builtin_function()
を使用して作成されています。
function_code
関数の一意の数値 ID を除いて、この関数の引数が持つべき値は多かれ少なかれ明確です。
( を参照) のように見えますが、そこにはadd_builtin_function_common()
値enum built_in_function
が期待されていますが、GCC プラグインはその列挙型を変更できません。
いずれかより大きいランダムな値を渡すことはできないEND_BUILTINS
ようfunction_code
です。その場合、アサーションは失敗しますbuiltin_decl_implicit()
。builtin_decl_explicit()
では、GCC プラグインにビルトインを追加する適切な方法は何ですか (MELT などを使用せず、GCC プラグイン API のみ)。
更新add_builtin_function_common()
とlanghooks.builtin_function()
for C の実装と、これらが GCC でどのように使用されているか
をもう一度調べました。場合によっては 0 も許容されるようですfunction_code
。thenは使用できませんbuiltin_decl_implicit()
が、返された DECL を保存してadd_builtin_function()
後で使用できます。
そのようにビルトインを作成しようとすることができる唯一のイベントのように見えます PLUGIN_START_UNIT (そうしないと、external_scope
変数が NULL であるために GCC がクラッシュする可能性があります)。
その段階で次のことを試しました(fntype
以前に作成されました):
my_helper
コンパイルされ、メイン ソース ファイルとリンクされた別の C ソース ファイルで定義されました。gimple_build_call
次に、GIMPLE パス中にdecl を使用して、その関数の呼び出しを他の関数 ( ) に挿入しました。
GCC はエラーを出力せず、実際にmy_helper
通常の関数への呼び出しとして but への呼び出しを挿入しました。実際には、呼び出しを回避するためにビルトインが必要でしたが、関数の本体を挿入しました。
一方、tsan0
私のパスの直後に実行される pass は、期待どおりに組み込み関数の呼び出しを挿入します。結果として明示的な呼び出しはなく、関数の本体のみが挿入されます。ただし、そのビルトインは、プラグインではなく GCC 自体によって定義されます。
したがって、ビルトインが有効なビルトインであるためにはまだ何かが必要だと思いますが、それが何であるかはわかりません。それは何でしょうか?