2017-08-25 6 views
2

私は次のように伝播する方法に興味があります:この場合LLVMでMCレベルまで伝播する新しい属性をソースコードに追加しますか?

void foo(int __attribute__((aligned(16)))* p) { ... } 

ポインタの「alignednessは、」MCレベルで提供されていますが、明らかに達成するためにLLVM-IRメタデータのアプローチを使用していませんこの。アライメント情報は、この値に依存してコード生成を変更するターゲットによって非常に重要です。私はこの属性にもっと似ていると思っています。

「アライメント」と同じ方法でコンパイラを伝播するように新しい属性を追加するのはどれくらい難しいでしょうか?そこで、LLVM-IRに新しい要素を追加しました。私はまた、LLVMの他の部分が気にしないときにこの新しい要素を無視することが最も難しい部分であることを期待しています。

LLVMには、パーサーからバックエンドにターゲット依存情報を渡す一般的なターゲットに依存しない方法がありません。

「DebugLoc」アプローチは、同様のquestionで提案されましたが、デバッグには関係しないため、ちょっとハックしたと思います。しかし、実装がこのように難しくない場合は、ハックが受け入れられるかもしれません。

更新: 新しい属性を使用する代わりにインラインアセンブリを使用するのはここですか?はいの場合、賛否両論は何ですか?

答えて

2

説明したように、位置合わせはメタデータを使用していません。アライメントは、関連するすべての指示で(暗黙的または明示的に)言及され、問題のその機能はこのような何かにコンパイルされますので、例えば(整列に注意してください):知らない人には

  •  
    define void @foo(i32*) { 
        %2 = alloca i32*, align 16  ; Allocate a 16-aligned pointer 
        store i32* %0, i32** %2, align 16 ; An aligned store to place the arg there 
        ... 
    

さて、あなたは既存の指示にいくつかの情報を添付して持つようにしたい場合は、コンパイラの残りのほとんどはそれらを無視し、メタデータを使用することは良いアイデアです。しかし、メタデータはコンパイラ内部の抽象的なものなので、実際に何かを行う必要があります。通常、それを消費し、それに応じて何かを行うためにあなた自身のパスを追加することによって。

がそれを実装する方法をあなたのパスとを配置するとしては、それは本当にあなたが通過しようとしている実際の情報とその意図する効果に依存します。

+0

btw ...私の他のクエリは、このケースでOpenCLのアドレス空間がどのように動作するかです...私が探しているのはまさにそのようなものかもしれません。 (間違っていませんか?) – eternalStudent

+1

@eternalStudent LLVMには、いくつかの値に独自のaddrspace修飾子があります。 OpenCLのLLVMベースのIRであるSPIRに興味があります(https://www.khronos.org/registry/SPIR/specs/spir_spec-2.0.pdf、セクション2.2)。だから私はあなたの質問に対する答えは、そのようなものが言語に焼き付けられているので、それらを追加することは簡単ではないということです。 – Oak

+0

ありがとう@Oak :)優れた説明! OpenCLのアドレス空間に基づくコード生成の決定をターゲットが行うことは不可能だと私は理解しています。 メタデータは扱いが簡単ですが、メモリオペランド情報で使用できるように、あとでターゲット固有のものに変換する必要があります。 LLVM-IRメタデータを使用するパスを追加することは、まったく受け入れられます。私はそれをスケジューリングまで持続させるために何を変えなければならないかを理解する必要があります。ここにどんなアイデア? :) – eternalStudent

関連する問題