問題タブ [machine-instruction]
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 で MachineInstr を MCInst に変換するにはどうすればよいですか?
この変換 ( からMachineInstr
へMCInst
) が で必要MachineFunctionPass
です。
X86MCInstLower
を に変換するMachineInstr
ことはわかっていMCInst
ます。ただし、初期化X86MCInstLower
には のインスタンスが必要ですX86AsmPrinter
。X86AsmPrinter
それ自体MachineFunctionPass
が必要TargetMachine &
であり、std::unique_ptr<MCStreamer>
開始する必要があります。のみを返すためTargetMachine
、 a から取得できません。コンストラクターには、 からのコピー コンストラクターもありません。MachineFunction
MachineFunction
const TargetMachine &
TargetMachine
const TargetMachine
したがって、私は変換のこの時点で立ち往生しています。登録されたパスを実行してその出力を取得する方法はありますMachineFunctionPass
か? X86AsmPrinter
で に登録されTargetRegistry
ていRegisterAsmPrinter
ます。それを活用できないかと。
これに関するメーリングリストのスレッドがあります。ただし、それで問題が最終的に解決されるわけではありません。
c++ - C++ はグローバル スコープでコードを持つことができますか?
コード (C++ ソース ファイルのグローバル スコープでアセンブリ命令にコンパイルするコード) を使用することは合法ですか? 以前は、Ch プログラミング言語(C/C++ のインタープリター) を除いて、コードをコードに含めることはできないという印象を受けていました。 C++ プログラムのグローバル スコープ コード/命令は、関数の本体内にのみ存在できます [ピリオド]!
しかし、C++ では、関数をグローバル変数に代入することで、メイン関数の前に関数を呼び出すことができることがわかりました。これにはcall
、アセンブリ コード内の命令が含まれます。また、アセンブリ コードの外で、2 つの変数の合計を別のグローバル変数に割り当てることもできます。これにはほぼ確実にadd
andmov
命令が含まれます。そして、そのコードが関数の外のグローバル スコープにある場合、いつ実行されるのでしょうか? がクラス型のオーバーロードされた演算子である場合、その+
中に print ステートメントがある場合、それはいつ実行されますか?
また、C++ プログラムのグローバル スコープにループと制御構造を含めることはできますか? もしそうなら、それらはいつ実行されますか? 他のプログラム構造についてはどうですか? それらはグローバル スコープで許可されていますか? また、どのような状況で、いつ実行されますか?
この質問は、私が投稿した以前の質問への回答です: Why can't I assign values to global variables outside a function in C?
元の質問に対する回答者は、関数の範囲外にコードを含めることはできないと主張しています。私はこれに関するルールを完全には理解していないと思います。正確には何が「コード」であるかどうかを理解していません。
c - (アセンブリ) 命令シーケンスから C コードへのマッピング
私の教科書から 1 つの演習があります。
は、引数 a と b の一般的な比較を示しています。ここでは、typedef 宣言で data_t を宣言することによって引数のデータ型を設定でき、#define 宣言で COMP を定義することによって比較を設定できます。a が %edx にあり、b が %eax にあるとします。次の各命令シーケンスについて、data_t のデータ型を特定します (複数の正解がある可能性があります。すべてをリストする必要があります)。
そして、教科書からの答えは次のとおりです。
サフィックス 'l' とレジスタ識別子は 32 ビット オペランドを示しますが、比較は 2 の補数 '<' です。data_t は int でなければならないと推測できます。
だから私の質問は次のとおりです。考えられるすべての回答をリストするように求めているので、なぜ data_t も 'long int' および 32 ビットのポインターにすることはできませんか?
llvm - 分岐命令から MachineBasicBlock を抽出する
分岐命令には、ジャンプ先の基本ブロックの名前であるラベルが含まれています。それを考えると、分岐命令から MachineBasicBlock オブジェクトを抽出する方法はありますか? 例えば: