2012-03-23 2 views
3

LLVMにはストレージの単位であるLLVMContextがあり、新しいシンボル(関数とタイプ)が作成される場所はllvm::Moduleです。LLVMのコンパイル単位の正しい抽象概念は何ですか?

私の質問は、コンパイル単位に使用する正しいllvm抽象は何ですか? Moduleはありますか?これは実際にはより広い範囲でのものですか?つまり、共有ライブラリのターゲットです。

コンパイル単位はすべての結果を満たす必要があります。エラーなしですべてのコンテンツをコンパイルするか、またはエラーがあり、CU内のシンボルが使用可能になる前に修正して再構築する必要があります。私の頭では、これはコンパイル単位が表すべきものの定義です。

モジュールがCUのための適切な抽象化であれば、他の(正確にコンパイルされた)Moduleのオブジェクトを新しいモジュールに提示するにはどうすればよいですか?それを見つけることができるように、ビルドされていますか?私は宣言を追加する必要がありますか?またはこれにいくつかの他の迅速な方法がありますか? clangで該当する行に

点が大きな助けになるでしょう

+0

コンパイラの問題ではなく、リンカの問題について説明しています。それとは関係のない「clang」自体には何もありません。 LLVMのリンクビットを調べる必要があります。 –

+0

すべてのシンボル解決がリンクフェーズに遅れることはありません。いずれにしても私はllvmに懸念しています - 標準クライアントの例であるので、clangにしか言及しません – lurscher

+0

理想的には、コンパイラの一部としてコンパイル単位を実行することは決してありません。そういうわけで、私はそれらのための適切な抽象化がないと主張するでしょう。 – Puppy

答えて

4

モジュールは、コンパイル単位の正しい抽象化です。モジュールをリンクすると、そこからプログラム全体の分析を行うことができます。

2

これは自分の質問に答えるために、進行中の試みです:

クラスllvm::Linkerは、複数のモジュールを取って戻って既存のモジュール内のすべてのシンボルを含む単一の、複合モジュールを返却する能力を持っています。リンクが完了し、複合モジュールが作成された後も、入力モジュールの所有権に関するルールは何であるかはまだ分かりません。

いずれにしても、クラスによってモジュールを増やすために増分的なパスを取ることができます。あなたはグローバル名前空間に新しいシンボルを追加することを意味しREPLを実装しようとしていると言う:

REPLの概要は以下のように動作します:

  • コンパイルREPL
  • をいくつかの関数を書きます単一のモジュールとしての機能は、
  • 新しい機能モジュールのコンパイルが成功した場合、新しいモジュール
  • に新しい機能をコンパイルし、L「ベース」
  • はREPLにいくつかのより多くの機能を書き、それを呼び出しますインク「ベース」と、新しいモジュールで新しいモジュール、「base.2」
  • すすぎ、それを呼び出すと、あなたは名前で記号や機能を交換する場合、古いシンボルがオーバーライドされたバージョンを見ることを望ん

    繰り返しあなたのシンボルの。したがって、新しい関数を定義するときは、既存の「ベース」モジュールと新しいモジュールでgetOrInsertFunctionが呼び出されていることを確認する必要があります。

関連する問題