3

Clangを使ってツールを書こうと思っています。詳細はかなり重要ではありませんが、私が探しているのは、Clangからllvmタイプを取得することです。llvm::Function*たとえば、「printf」から「」に、「size_t」を「 」に変更したいと思いllvm::Type*ます。しかし、これらの関数を提供する関数をClangで見つけることができません。Clangに名前をマングルしてから、データを要求することを決定しましたが、Clangの呼び出しに対応するllvm::Module*を取得する方法が見つかりません。llvm::Module*

Clangから内部LLVMデータを取得するにはどうすればよいですか?

4

2 に答える 2

2

最終的に、コード生成 API は Clang のパブリック API の一部ではありません。彼らはひどいので、これには正当な理由があります。

ただし、 を作成することはできますclang::CodeGen::CodeGenModule。これを使用して、特定の TU を提供された にコード生成できますllvm::ModulegetMangledName次に、 の関数を使用して、シンボルのマングル名を取得できますCodeGenModule

clang::QualTypeただし、提供されている関数を使用して aから anに変換しようとしないでください。これらの関数は使用できないllvm::Type*ほど壊れています。この変換を確実に実行するために私が見つけた唯一の実行可能な戦略は、メンバー関数などのシグネチャを持つ関数を見つけてから、そのパラメーターの型 ( this. しかし、これはかなり ABI 固有の厄介なハックです。Clang が特定の型に対して生成する LLVM 型名を計算し、モジュール内で検索することもできますが、これは常に成功するとは限りません。

于 2013-10-18T19:01:09.683 に答える
0

一般的にはできません。clang 内部も同様にレイヤーで作成されます。したがって、単純に AST の一部をつかんで「ねえ、関数をくれ」と言うわけにはいきません。AST は、IR 生成ステップ モジュールで一度に LLVM IR に変換されます。このようにして、すべてが解析され、意味的に正しく、完全であることを確認できます。

したがって、本当にこの種のものがすべて必要な場合は、IR の生成後、本当に遅い時間に clang に接続し、その時点で疎結合の AST と LLVM IR を操作する必要があります。

于 2012-12-09T09:23:41.703 に答える