問題タブ [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 - 関数からデバッグ情報を取得するにはどうすればよいですか?
Clang を使用して、デバッグ情報を有効にして関数をコンパイルしました。Instruction
s には便利ながありますが、s にはそのgetDebugLoc()
ようなものはありませんFunction
。インスタンスが与えられたFunction
場合、デバッグ情報を取得するにはどうすればよいDISubProgram
ですか (フォームで推測しています)。
デバッグ情報がどのように表現されるかを説明するガイド エントリを見たことがあります。メタデータには関数へのリンクが含まれていますが、明らかにリンクはありません。モジュール内のすべてのメタデータを反復処理する必要がありますか?
c++ - 複数の LLVM C++ モジュールをリンクすると、lli で segfaults が発生する
LLVM/clang で非常に単純な例を試していますが、失敗しているようです。
私は次のことを試します:
- clang++ -emit-llvm -c -x c++ -o main.bc -isystem include/ main.cc
- clang++ -emit-llvm -c -x c++ -o test_class.bc -isystem include/ test_class.cc
- llvm-link main.bc test_class.bc -o all.bc
- lli all.bc
ただし、 4. 失敗 (セグメンテーション違反):
これがどのように機能するかについて根本的な誤解がありますか? 私の最終的な目標は、libclang API を使用してコンパイルの部分を行うことですが、今のところ、ここで何が間違っているかを理解することは素晴らしいことです! ありがとう!
以下の例のソースコードを添付しました。
インクルード/test_class.h:
test_class.cc:
main.cc:
llvm - LLVM の SelectInst の利点
LLVM には、 のSelectInst
ような式を表すために使用される がありsomething = cond ? true-part : false-part
ます。
コンパイラによって?:
常に a に下げられる可能性があるため、IR でのこの命令の利点は何ですか? BranchInst
そのような命令をサポートする CPU はありますか? とにかくCodeGeneratorselect
によってジャンプに下げられますか?
select
は暗黙の 2 つの「分岐」を保証するため、分析パスには利点があると思いますif
。しかし一方で、コンパイラは命令をまったく使用する必要がないため、これらのパスはいずれにbr
せよ s を処理できなければなりません。
c - LLVM IR 構造体の関数ポインタ フィールドが {}* に置き換えられるのはなぜですか?
Clang 3.3 を使用して MUSL C ライブラリをコンパイルし、生成された LLVM IR ファイルをダンプしました。FILE 構造体であることがわかりました
としてコンパイルされました
いくつかのIRファイルに含まれていますが、次のようにコンパイルされました
他のソース ファイルで。これら 2 つの IR 構造体の唯一の違いは、最初の形式の関数ポインター型フィールドが完全な型ではなく {}* に置き換えられていることです。なぜこれが起こるのか、また {}* 置換を無効にする方法を誰か教えてもらえますか?
c - LLVM-IR を C のような言語に変換する
私は、LLVM-IR を C のような言語に変換するためのコードを書かなければならないプロジェクトに取り組んでいます。この言語は、C と非常によく似た構造を持っています。少し調べてみたところ、LLVM のバージョン 3.0 までは、LLVM-IR から C コードへの変換を担当する CBackend.cpp という名前のファイルが存在することがわかりました。確認したいのは、LLVM-IR の入力ファイルに対してこの CBackend.cpp ファイルを実行し、C コードを生成することです。
このコマンドは次のとおりです: llc -march=c -o code.c code.ll
ここで、code.ll ファイルは入力 llvm-ir を含む入力ファイルであり、code.c は結果の C コードを含む出力ファイルです。
私が直面しているのは、ubuntu システムに LLVM バージョン 3.4svn がインストールされており、ファイルが CppBackend.cpp (LLVM-IR を C++ に変換する) にアップグレードされているため、このバージョンには CBackend.cpp ファイルがありません。この CBackend.cpp ファイルを LLVM-IR 入力ファイルで実行して、LLVM のバージョン 3.4svn で対応する C コードを取得するには、どのコマンドを使用できますか?
前もって感謝します。
llvm - LLVM による変換
最初にLLVM IRに変換してから別の言語に変換することにより、C + ACSL言語を別の言語に変換するプロジェクトに取り組んでいました。開示したくない一部の人々のグループに関連しているため、それについては言えません。それについては触れませんが、C に非常に近いものです。私は LLVM IR までの作業を完了し、 CBackend の助けを借りて、それを元に戻すように書かれていますが、私はそれを使用する方法を本当に知りません。それを行うためのLLVMのコマンド、または私を助けることができるものはありますか?
更新 1 私の入力は LLVM IR であり、出力は C とは異なる構文に従うため、C ではなく C のようなコードになります。