19

llvm::Module既にリンクされているを受け取る C++ 関数を作成し、それを実行可能ファイルに出力したいと考えています。プロセスを fork してコマンドラインの clang を呼び出すのではなく、llvm/clang API を使用する必要があります。

llvm/clang ソース コードを調べた後、私が見つけた最も近いものは、Modulea を .o ファイルに出力することです。たとえば、llc ツール (tools/llc/llc.cpp) は、 を呼び出すことでこれを実現しTargetMachine::addPassesToEmitFile(...)ます。

Module別の方法として、 を .bc ファイルに書き込んでから、 を作成しCompilerInstanceて呼び出しますExecuteCompilerInvocation(tools/clang/tools/driver/cc1_main.cpp のように)。しかし、ファイル I/O のオーバーヘッドがあります。

それで、私は可能なことを求めていますか、それとも別の方法に頼らなければなりませんか?

編集: (もちろん、これは可能です。clang ソース コードのどこかで発生しますが、見つかりません。)

4

2 に答える 2

15

ありえない!clang実行可能ファイル自体は作成しません。を呼び出しますld

tools/clang/lib/Driver/Tools.cpp で見つけました。ConstructJobさまざまなプラットフォーム ( 、 など) の関数ではdarwin::Link::ConstructJobsolaris::Link::ConstructJobこれを行います。

const char *Exec =
    Args.MakeArgString(getToolChain().GetProgramPath("ld"));
  C.addCommand(new Command(JA, *this, Exec, CmdArgs));

( の場合visualstudio::Link::ConstructJobは、代わりに を呼び出しますlink.exe。)

編集:振り返ってみると、 (Mac)または(Linux)clangでのシステムコールをトレースすることでこれを見つける方が速かったでしょう。dtrussstrace

編集:ビルドとリンクにClangドライバーAPIを使用することになりました。私はいくつかのサンプルコードを書きました。

于 2012-07-27T17:11:20.510 に答える
0

llvm-ld-nativeフラグを渡したときに必要なことを行います。

llvm-ldLLVM 3.1 で削除されましたが、clangドライバーはその機能を置き換えることができるはずです。あなたはそこから始めるかもしれません。

于 2012-07-26T15:44:06.053 に答える