問題タブ [llvm-ir]
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.
llvm - LLVM パスで環境変数にアクセスする方法はありますか
LLVM パスの作成中に環境変数にアクセスする方法があるかどうか疑問に思っていました。私のソースファイルでは、実行が促進される値に応じて、特定の環境変数を読み取ります。パスでそれを再作成し、そこにいくつかのチェックを追加する必要があります。
これらの詳細を例の形でレイアウトするチュートリアルがあれば、本当に感謝しています。
llvm - IR Pass を使用した LLVM 後処理バイナリ ファイル
バイナリ コードの一部の整合性をチェックする関数を作成しました。
関数は llvm パスで追加されます。
開始アドレスと終了アドレスに加えてチェック値が必要です。
チェック値は、バイナリ コードの計算結果です。
悲しいことに、IR パスは llvm の中間部分にあり、この部分はバイナリではなく IR で機能します。
バイナリコードとアドレスはまだわかりません。
今のところ、パスでできることはすべて作成し、pyelftoolを使用してバイナリ ファイルにアクセスし、狂ったように 16 進値を変更します ;-)
私の最初の質問は、このアドレスを事前に知ることは可能です.
ブロックアドレスが表示されますが、もっと柔軟なもの (命令のアドレス) が必要です。
私の 2 番目の質問: 誰かがチェック値を変更するためのより良いアイデアを持っています。私のソリューションはあまりエレガントではなく、プラットフォームに依存しています -.-
理解できたと思います。
ありがとう、
llvm - パスの作成に関する洞察が必要
私のソース コードには、次の IR があります。
passを作成するつもりです。これは、( LLVMを使用して) コンパイルすると、strcpy(dest,src) への呼び出しが strncpy(dest,src,n) に置き換えられるビットコードを生成します。
これまでに次のコードを作成しました。
- ---1: llvm::StringRef を Value* に変換する方法
- ---2より:char*をValue*に変換する方法
Constant::getNullValue(Value)
NULL 値を取得するために使用できますか?
llvm - 最適化せずにllvmで「phi」命令を取得する方法
コマンドを使用するclang -emit-llvm -S test.c -o test.ll
と、IR ファイルに「phi」命令がありません。どうすれば入手できますか?
パス「-mem2reg」または「-gvn」を使用して「phi」命令を取得できることを知っています。しかし、彼らはいくつかの最適化を行います。最適化せずに「ファイ」を取得したいだけです。
clang - LLVM IRでC++関数を呼び出す方法は?
私は LLVM IR を初めて使用します。LLVM IR ソース コードがあり、いくつかの extern 宣言関数を使用しています。これらの関数は C++ ファイルに実装されています。
だから私の質問は:
LLVM IR でこれらの c++ 関数を呼び出す方法は?
c++ ファイルを LLVM IR にコンパイルし、それらをリンクするのは正しい方法ですか?
scala - SLEM ライブラリが使用可能かどうかわかりません
コンパイラーが Scala で書かれている玩具言語用の LLVM IR を生成したいと考えています。
SLEMはまさに私が必要としているもののようですが、現在の状態で使用できるかどうかはわかりません。ソースをダウンロードしようとしましたが、コンパイルできません。
誰かがそれをうまく使った、またはそれが使えるかどうか知っていますか?
vim - Vim の LLVM-IR 構文の折りたたみ
私はLLVM-IRコードで作業しており、によって生成されclang -emit-llvm
、コードの折りたたみを機能させたいと考えています。
これまでのところ、私は と を使用foldmethod=expr
してfoldexpr=LLVMFold()
います。foldmethod=syntax
llvm リポジトリの構文ファイルを使用して、構文ベースの折りたたみ (つまり) を使用したいと考えています。こちらから入手できます。
最初の正規表現は、ラベルの構文ファイルからのものであることに注意してください。
Which gobbles the closing braces into the level 2 folds.
Also tried have been foldmethod=indent
which didn't fold enough and foldmethod=marker
with foldmark="{,}"
Ideally for this sample incomplete LLVM-IR code:
I would like folds to be from the {
of the define
to the }
and in each labelled section, i.e. from the entry:
to the clear line.
opencl - OpenCL ローカル配列アクセス用の LLVM-IR GEP
llvm を介して OpenCL カーネルにローカル配列を作成し、サイズ [256 x i32] のルックアップテーブルと呼びます。後で、llvm を介してコードを挿入し、配列に値を入力します。私の問題は、配列にアクセスするコードを生成しようとすると、必要な要素へのポインターを正しく分離できないように見えることです。flattened と呼ばれるあいまいなローカル変数を使用すると、要素に誤ってインデックスを付けることができます。
これは、次元的に平坦化されたローカル ワークグループ ID になります。それは関係ありませんが。
GEP は次のように作成されます (ビルダーは IRBuilder のインスタンスです)。
この場合の M は Module オブジェクトです。生成される table_addr は次のとおりです。
ただし、LLVM のインデックスを for ループでウォークスルーして正しく入力したい場合は、私のコード (ループ構造を省略し、「インデックス」は i32 ループ カウンター):
その場合の table_addr の dump() は (index==0 の場合):
これは、ストアを実行するときにさらに下にあることを意味します。
私はこの出力を得る:
これは正しく見えませんが、さらに重要なことは、「インデックス」> 0 の場合にアサートで SIGABRT を取得することです。
私は少し立ち往生しています。配列にインデックスを付ける明示的な値を与えることと、実行時に計算されるあいまいな値を与えることの違いがわかりません。どんな洞察も大歓迎です。
更新:私がやったことはこれです(allocは1回だけ行われます。視覚的な目的でこのコードブロックに含めているだけです。実際にはforループの外にあります):
このコードを発行したもの (インデックス == 0 および 1 の場合):
今は正しいように見えますが、保存してからすぐにロードするので、コードをエミする奇妙な方法のように思えますが、最適化されると思います。または、その mem2reg を使用してみます。助けてくれてありがとう@オーク。