問題タブ [libclang]
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++ - libclang を使用してメモリ内の C コードからアセンブリを生成する
LLVM/Clang をバックエンドとして使用して、C コードを eBPF バイトコードにコンパイルするライブラリを実装する必要があります。コードはメモリから読み取られるため、結果のアセンブリ コードもメモリに取得する必要があります。
これまで、次のコードを使用して LLVM IR にコンパイルできました。
コンパイルするには、次の CMakeLists.txt を使用します。
私の理解が正しければ、コンパイラ アクションを EmitAssemblyAction() に変更すればアセンブリ コードを生成できるはずですが、llvm::TargetPassConfig::addPassesToHandleExceptions (この=this@entry=0x6d8d30) /tmp/llvm-3.7.1.src/lib/CodeGen/Passes.cpp:419
この行のコードは次のとおりです。
誰かが例を持っているか、私が欠けているものを知っていますか?
python - libclang を使用した匿名列挙型の検索
スペル名のテキストに依存せずに libclang を使用して匿名の列挙を検出する方法はありますか?
libclangへの python バインディングには、 clang.cindex.Cursor.is_anonymousを使用して C/C++ 構造体または共用体が匿名であるかどうかを検出する機能が含まれており、これは最終的にclang_Cursor_isAnonymousを呼び出します。
次のサンプルは、この問題を示しています。
sample.cpp で実行した場合
与えます:
c++ - libclang の c++ バインディング
libclang で書かれたオリジナルの c lang だけでなく、Python バインディングも認識していますが、教室で使用しようとしており、c++ を教えています。したがって、誰かが C++ バインディングを認識している場合は、それを手に入れることが非常に役立ちます。
java - Java -> JNA -> libclang: clang_visitChildren 呼び出しでの致命的なエラー
LibClang API の Java ラッパーを作成しました。clang_visitChildren のラッパーは、比較的小さな C ソース ファイル (第 1 レベルの子ファイルが 200 未満) に適しています。しかし、550 から 560 の第 1 レベルの子の領域で、より大きなソース ファイルに対してクラッシュしました。私のコールバックは 1 を返します (つまり、1 レベルのループで、再帰的ではありません)。メッセージは次のとおりです。
問題解決の可能な方法について誰かが私に良いアドバイスをくれませんか?
clang - libclang が特定の AST ノードを発行しない
go-clangライブラリを使用して、次の C ファイルを解析しています: aac.c。ファイルを clang で実行して AST をダンプすると、何らかの理由で、特定の関数の AST 出力が得られません。たとえば、C ファイルには、前方宣言aac_ioctl_send_raw_srb
と実際の定義が含まれています。
これを考えると、出力に 2 つの AST ノードが表示されることを期待していましたが、1 つだけFuncDecl
(前方宣言) がダンプされます。
(エラー無視)
go-clang ライブラリを使用して、自分のアプリケーション内から C ファイルを解析しても同じ結果が得られます。定義がダンプされない理由について何か説明はありますか?
python - libclang を使用した名前空間関数の解析
libclang を使用して C++ の名前空間関数の本体を解析できません。
次のような名前空間にクラスがあります。
libclang の Python ラッパーを使用すると、再帰によって各ノードを見つけることができます。
myMethod
およびで NTOHS の使用を検出し、myFunction
それらのノードに関する情報を出力できますが、 では検出できませんMyClass::anotherMethod
。
他の誰かが同様の問題に遭遇しましたが、解決されていないようです。
ここでの NTOHS は、ネットワークをホストの順序に変換するための linux/unix コマンドです。
libclang を使用して名前空間関数で NTOHS を検出するにはどうすればよいですか?
python - テンプレート化されたコンストラクター カーソルとテンプレート化されたメンバー カーソルには、libclang の種類 FUNCTION_TEMPLATE があります。
いくつかのコンテキスト
私はlibclangに精通していません。libclang への python バインディングを使用する vim プラグインを変更しています。
カーソルパラメータを受け取るpython関数があります。これは、現在の C++ バッファーの AST 内のほぼすべてのノードに対して呼び出されます。
問題
cursor.kind
カーソルの種類を取得するために使用されます。それ以外はすべて問題ありません
- テンプレート化された無料の関数宣言、
- テンプレート化されたコンストラクタ宣言と
- テンプレート化されたメソッド宣言
すべて同じ種類: FUNCTION_TEMPLATE
. それらを区別する必要があります。
さらなる洞察
たとえば、上記のテンプレート化されていないバージョンには次の種類があります。
FUNCTION_DECL
CXX_METHOD
とCONSTRUCTOR
.
cindex.pyのソースを検索しましたが、CXX_METHOD_TEMPLATE
またはCONSTRUCTOR_TEMPLATE
類似のものはありません。
私は何とかして必要な情報を取得しようとしましたが、成功しませんでしcursor.get_definition()
たcursor.underlying_typedef_type.get_declaration()
。
私が得た唯一の部分的な成功は、メソッドとコンストラクターのセマンティックおよびレキシカルな親がSTRUCT_DECL
.
テンプレート化されているかどうかはあまり気にしません。それがコンストラクター、メンバー、またはフリー関数であるかどうかは気にしません。
要約すると
カーソルが与えられた場合、それがメソッド (テンプレートであっても)、コンストラクター (テンプレートであっても)、または自由な関数宣言であるかどうかをどのように判断できますか?