問題タブ [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.

0 投票する
2 に答える
993 参照

gcc - GCC コンパイラの AST ツリーの変更

GCC 用プラグインを使用して翻訳単位に関する必要な情報を収集し、そのベースで AST を変更する必要があります。情報収集の仕方はもうわかった。しかし、CRT に渡される前に AST を変更する方法をまだ理解していません。この件に関する情報はほとんどありません。このテーマについて何を読むべきか教えてください。考えやリンクを共有します。

ありがとう。

PS私はすでにこれらのリンクのすべてを読んでいます:

http://en.wikibooks.org/wiki/GNU_C_Compiler_Internals/Print_version http://developer.apple.com/library/mac/#documentation/DeveloperTools/gcc-4.2.1/gccint/index.html#Top

0 投票する
1 に答える
216 参照

c++ - メソッドを持つGCCプラグインがクラス内で宣言されました

ASTをSSA形式で処理するためのGCCプラグインを開発しています。SSA形式の関数がコンパイルされた後、毎回コールバック実行を作成します。

これが私のコードです

しかし、上記のコードは、クラス宣言内で宣言されたクラスのメソッドに対して実行されません。たとえば、このコードでは

私のプラグインはmethod1でのみ実行されますが、method2では実行されません

最初は、この問題はmethod2()がインライン関数と見なされるためだと思います。そのため、プラグインを実行するときにオプション-fno-inlineを追加します。しかし、それは機能しません

誰か助けてもらえますか?

0 投票する
1 に答える
366 参照

gcc - GCCプラグイン:passs.cの「内部コンパイラエラー」

プログラムの特定のポイントにGIMPLEステートメントを挿入する必要があるGCCインタープロシージャプラグインを作成しています。この後、プログラム全体でデータフロー分析を実行します。分析が終了したら、新しく挿入されたGIMPLEステートメントを削除します。

私の分析は完了していますが、分析を終了する直前に次のメッセージが生成されます。

内部コンパイラエラー:execute_ipa_pass_list、passs.c:1817

これは確かにGIMPLEステートメントの挿入によるものです。これを行わないと、このエラーメッセージは表示されません。

誰かが私を助けて、問題とは何か、そしてそれを修正する方法を説明できますか?

0 投票する
2 に答える
5159 参照

gcc - GCC プラグインの概要

それで、しばらくウェブを検索した後、私は議論のための良いフォーラムのように見えるので、ここで試してみることにしました. シンプルな gcc プラグインを作成しようとしています。プログラムコードはこのメールの最後に添付されていますが、平易な英語でプラグインを登録し、プラグマが登録されたときに pragma_init 関数が呼び出されるようにします。ここで、c_register_pragma を使用していくつかのプラグマをインターセプトします。

http://gcc.gnu.org/onlinedocs/gccint/Plugins-building.html#Plugins-buildingの例を使用してコンパイルします。コンパイルとリンクは正常に機能します。ただし、プラグインをロードすると、次のようになります。

私は何を間違っていますか?さらに、いくつかのヘッダー ファイル (後で必要になります) をインクルードすると、多くのエラーが発生します。たとえば、「tree.h」を含めると (50 の他のエラーの中で):

誰が私が間違っているのかについての手がかりを持っていますか?

ありがとうございました

0 投票する
1 に答える
340 参照

c++ - gcc プラグイン c c++ グローバル非静的変数を検索

私はgcc 4.6プラグインAPIで遊んでいます。便宜上、API に Python ラッパー/プラグインを使用します。

私の目標は、次のようにすべての変数の宣言を見つけることです。

  • グローバル スコープ
  • constではなく
  • 静的ではない (エクスポートまたは可視を意味する)

コンパイル単位で警告を発します。例:

「グロブ」を生成する必要があります

「関数/クラスの外側」と「const」は簡単ですが、「静的」修飾子を取得できません。

グローバル名前空間サブツリーをクロールして、const フラグを持たない VAR_DECL ノードを監視しています。

しかし、「static」キーワードはどのように処理されるのでしょうか? ビットフィールド フラグの 1 つではないようです。また、ノードの「静的述語」は誤解を招く可能性があります。これは、変数が静的ストレージに格納されると単純に言っているためです(glob は格納されますが、moduleGlob と inner も格納されます)。私の質問はむしろ「.soでエクスポートされますか」です

「extern」宣言はどうですか?それはASTでどのようにマッピングされていますか?

現在、* free_lang_data パスでこれを実行しようとしています (これは遅すぎますか?)

私がこれまでに持っている唯一のヒントはこれです: -fdump-tree-all スイッチを介してツリーをダンプすると、.tu ダンプにグローバル変数のマングルされた名前を持つ追加のノードがあります (非静的な場合)。

これを解決する方法はありますか?

0 投票する
2 に答える
905 参照

gcc - gcc プラグインのビルドに関する問題

シンプルな gcc プラグインをビルドしようとしています。私は初心者ですが、将来的にはより複雑なプラグインを実装したいと考えています。たくさんのマニュアルを読んで、すべて正しく行ったように見えますが、何かが間違っています。私はそれを構築することはできません。プラグインをビルドしようとするたびに、エラーが発生します。

何が悪いのかわかりません。見つけたすべてのマニュアルに記載されているのと同じ手順を実行しました。

gcc-4.6.3 コンパイラを搭載した Ubuntu 12.04 を使用しています。

gcc-4.6-plugin-dev をインストールしました。

gcc_4.6.4 に基づいてプラグインをビルドしようとさえしましたが、これは慎重にダウンロードして自分でビルドしました。しかし、結果は同じです。

私のメイクファイル:

プラグインのソース コード:

コメント化されたソース コードには、リンカーに対しても未定義の関数呼び出しが含まれています。私が理解しているように、問題は関数と同じregister_callbackです。

誰かがこの問題に対処するのを手伝ってくれませんか? gcc プラグインの作成に関する適切で詳細な、時代遅れではないマニュアルも非常に役立ちます。どんな助けでも大歓迎です。

0 投票する
2 に答える
759 参照

windows - GCC プラグインをサポートする mingw-w64 ビルドはありますか?

Windows でmingw-builds のビルドを長い間使用してきましたが、mingw-builds プロジェクトでサポートされていないGCC プラグインを試してみたいと思います。そのため、それをサポートする他のビルドを検索しようとしましたが、見つかりませんでした。GCC のプラグイン機能は、Windows などで根本的に壊れていますか? プラグイン サポート (--enable-plugin) を使用して mingw-w64 をビルドする人がいるかどうか知っていますか? gcc-melt や gcc-python-plugin のようなものは、Windows でも非常に興味深いものになると思います。

PS: いいえ、私は本当に自分でビルドしたくありません。ありがとう!

0 投票する
1 に答える
1180 参照

c++ - GCC プラグイン、新しい最適化プラグマを追加

GCC プラグインを作成しています。

特定のループ変換用のプラグインを作成しようとしています - ループを正確に N (指定されたパラメーター) 回展開します。プラグインを正しくインストールし、コンパイル プロセスでプラグマを正常に登録できました。function で pragma を登録するとc_register_pragma、( function を使用して) 字句解析で処理できhandle_my_pragmaますが、どうすればそれを見つけることができますか?

独自のパスを定義して GIMPLE をトラバースすることもできますが、プラグマの痕跡はありません。私の質問は次のとおりです。プラグマはどこにあり、それを使用してコードにどのように影響を与えることができますか? または、私の目標を達成するために何を提案しますか? プラグマである必要はありませんが、良いアイデアのようです。また、MELTについては知っていますが、GCCの研究の中で、Cの純粋なプラグインを好む.

私のコード

PS: GCC プラグインの開発に精通していて、良心的な人がいる場合:)、私 (mbukovy gmail com) に連絡してください。私は最終論文(自分の選択)のためにこれを行っており、ソウルメイトを歓迎します.

0 投票する
1 に答える
589 参照

c - GCC プラグイン: 関数の引数をコピーする

コンパイル中のアプリケーションを計測する GCC プラグインを開発しています。アプリケーションは C で記述されており、x86 Linux システム上で GCC 4.7 (4.8 および 4.9 もオプション) でビルドされています。

私のプラグインは、「ssa」標準パスの後に配置され、GIMPLE 表現で動作するコンパイル パスを実装しています。とりわけ、私は以下を実装する必要がありますが、現在それを正しく行う方法を理解できません。

C 関数を処理するとき、将来の処理のために、作成したローカル変数に引数をコピーするコードを先頭に挿入する必要があります。

私の最初の単純な実装は次のようになりました。

ただし、この方法では、変数へのパラメーター宣言の無効な割り当てがダンプに従って作成されます。

D.2206_11私が作成したローカル変数に対応しますpar- コピーしたい関数の引数。

その結果、GCC は後のパスでクラッシュし、この追加されたステートメントを処理しようとします。これは、それぞれの引数の値を保持する変数pではなく、その変数の宣言であるためだと思います。この通りですか?そして、その変数を取得する方法は?

gimple_build_assign_with_ops(NOP_EXPR, copy_par, p, NULL_TREE)代わりに使ってみgimple_build_assign()ましたが、どちらもしませんでした。GCC は依然として同じ場所でクラッシュします。バックトレースを提供することはできますが、基本的なものが欠けているように感じます。

また、ツリーのトラバーサルから始まりTYPE_ARG_TYPES (TREE_TYPE (current_function_decl))、さらに経由することも調べましTREE_CHAIN(...)たが、それぞれの変数ではなく、引数の型を示しているようです。

したがって、問題は、関数の引数のコピーを適切に追加する方法です。

おそらく、これは MELT または GCC Python プラグインの助けを借りて行うことができますが、このプロジェクトでは、GCC 自体が提供するもののみを使用してコードのすべての変換を実行する必要があります。