LLVMのMachineFunctionPass内にBuildMI()を使用して機械語命令を正しく挿入する方法は?

イブンディア:

このブログに続いて、MachineFunctionPassを作成しました。https://www.kharghoshal.xyz/blog/writing-machinefunctionpass

次に、RISCVターゲット用に移植しました。うまくいきました。Call命令をチェックするために、各命令の反復も追加します。命令を書こうとするまで、それはまだ機能しています。

これは私のMachineFunctionPassです。

#include "RISCV.h"
#include "RISCVInstrInfo.h"
#include "llvm/CodeGen/MachineFunctionPass.h"
#include "llvm/CodeGen/MachineInstrBuilder.h"
#include "llvm/CodeGen/TargetRegisterInfo.h"

using namespace llvm;

#define RISCV_MACHINEINSTR_PRINTER_PASS_NAME                                   \
  "Dummy RISCV machineinstr printer pass"

namespace {

class RISCVMachineInstrPrinter : public MachineFunctionPass {
public:
  static char ID;

  RISCVMachineInstrPrinter() : MachineFunctionPass(ID) {
    initializeRISCVMachineInstrPrinterPass(*PassRegistry::getPassRegistry());
  }

  bool runOnMachineFunction(MachineFunction &MF) override;

  StringRef getPassName() const override {
    return RISCV_MACHINEINSTR_PRINTER_PASS_NAME;
  }
};

char RISCVMachineInstrPrinter::ID = 0;

bool RISCVMachineInstrPrinter::runOnMachineFunction(MachineFunction &MF) {

  for (auto &MBB : MF) {
    
    for (auto &MI : MBB) {

      if (MI.isCall()) {
        outs() << "Found Call\n";

        outs() << MI.getOpcode() << "\n";

        RISCVInstrInfo *XII; // target instruction info
        DebugLoc DL;
        MachineBasicBlock::iterator MBBI = BuildMI(MBB, MI ,DL, XII->get(RISCV::SW), RISCV::X1)
            .addReg(RISCV::X31)
            .addImm(0);
        return true;
      }
    }
  }

  return false;
}

} // end of anonymous namespace

INITIALIZE_PASS(RISCVMachineInstrPrinter, "RISCV-machineinstr-printer",
                RISCV_MACHINEINSTR_PRINTER_PASS_NAME,
                true, // is CFG only?
                true  // is analysis?
)

namespace llvm {

FunctionPass *createRISCVMachineInstrPrinterPass() {
  return new RISCVMachineInstrPrinter();
}

} // namespace llvm

私が使用してコードをコンパイルしようとしたとき

clang hi.c -o hi -march=rv32g --target=riscv32

出力は私が理解できないエラーメッセージでした:

Found Call
202
PLEASE submit a bug report to https://bugs.llvm.org/ and include the crash backtrace, preprocessed source, and associated run script.
Stack dump:
0.  Program arguments: /home/ibndias/riscv32/bin/clang-12 -cc1 -triple riscv32-- -emit-obj -mrelax-all -disable-free -disable-llvm-verifier -discard-value-names -main-file-name hi.c -mrelocation-model static -mframe-pointer=all -fmath-errno -fno-rounding-math -mconstructor-aliases -nostdsysteminc -target-feature +m -target-feature +a -target-feature +f -target-feature +d -target-feature +relax -target-feature -save-restore -target-abi ilp32d -msmall-data-limit 8 -fno-split-dwarf-inlining -debugger-tuning=gdb -resource-dir /home/ibndias/riscv32/lib/clang/12.0.0 -isysroot /home/ibndias/riscv32/riscv32-unknown-elf -internal-isystem /home/ibndias/riscv32/riscv32-unknown-elf/include -fdebug-compilation-dir /home/ibndias/Documents/Projects -ferror-limit 19 -fno-signed-char -fgnuc-version=4.2.1 -fcolor-diagnostics -faddrsig -o /tmp/hi-047c57.o -x c hi.c 
1.  <eof> parser at end of file
2.  Code generation
3.  Running pass 'Function Pass Manager' on module 'hi.c'.
4.  Running pass 'Dummy RISCV machineinstr printer pass' on function '@main'
 #0 0x000055c4c194489e llvm::sys::PrintStackTrace(llvm::raw_ostream&) (/home/ibndias/riscv32/bin/clang-12+0x185589e)
 #1 0x000055c4c1942734 llvm::sys::RunSignalHandlers() (/home/ibndias/riscv32/bin/clang-12+0x1853734)
 #2 0x000055c4c1942878 SignalHandler(int) (/home/ibndias/riscv32/bin/clang-12+0x1853878)
 #3 0x00007f3f492a23c0 __restore_rt (/lib/x86_64-linux-gnu/libpthread.so.0+0x153c0)
 #4 0x000055c4c0b72ae2 (anonymous namespace)::RISCVMachineInstrPrinter::runOnMachineFunction(llvm::MachineFunction&) (/home/ibndias/riscv32/bin/clang-12+0xa83ae2)
 #5 0x000055c4c0e8901c llvm::MachineFunctionPass::runOnFunction(llvm::Function&) (/home/ibndias/riscv32/bin/clang-12+0xd9a01c)
 #6 0x000055c4c12ca770 llvm::FPPassManager::runOnFunction(llvm::Function&) (/home/ibndias/riscv32/bin/clang-12+0x11db770)
 #7 0x000055c4c12cbd79 llvm::FPPassManager::runOnModule(llvm::Module&) (/home/ibndias/riscv32/bin/clang-12+0x11dcd79)
 #8 0x000055c4c12c9980 llvm::legacy::PassManagerImpl::run(llvm::Module&) (/home/ibndias/riscv32/bin/clang-12+0x11da980)
 #9 0x000055c4c1be7b26 (anonymous namespace)::EmitAssemblyHelper::EmitAssembly(clang::BackendAction, std::unique_ptr<llvm::raw_pwrite_stream, std::default_delete<llvm::raw_pwrite_stream> >) (/home/ibndias/riscv32/bin/clang-12+0x1af8b26)
#10 0x000055c4c1be94ce clang::EmitBackendOutput(clang::DiagnosticsEngine&, clang::HeaderSearchOptions const&, clang::CodeGenOptions const&, clang::TargetOptions const&, clang::LangOptions const&, llvm::DataLayout const&, llvm::Module*, clang::BackendAction, std::unique_ptr<llvm::raw_pwrite_stream, std::default_delete<llvm::raw_pwrite_stream> >) (/home/ibndias/riscv32/bin/clang-12+0x1afa4ce)
#11 0x000055c4c2863fd1 clang::BackendConsumer::HandleTranslationUnit(clang::ASTContext&) (/home/ibndias/riscv32/bin/clang-12+0x2774fd1)
#12 0x000055c4c360db39 clang::ParseAST(clang::Sema&, bool, bool) (/home/ibndias/riscv32/bin/clang-12+0x351eb39)
#13 0x000055c4c21fb239 clang::FrontendAction::Execute() (/home/ibndias/riscv32/bin/clang-12+0x210c239)
#14 0x000055c4c21af54b clang::CompilerInstance::ExecuteAction(clang::FrontendAction&) (/home/ibndias/riscv32/bin/clang-12+0x20c054b)
#15 0x000055c4c22cd800 clang::ExecuteCompilerInvocation(clang::CompilerInstance*) (/home/ibndias/riscv32/bin/clang-12+0x21de800)
#16 0x000055c4c0b1ca57 cc1_main(llvm::ArrayRef<char const*>, char const*, void*) (/home/ibndias/riscv32/bin/clang-12+0xa2da57)
#17 0x000055c4c0b1a60b ExecuteCC1Tool(llvm::SmallVectorImpl<char const*>&) (/home/ibndias/riscv32/bin/clang-12+0xa2b60b)
#18 0x000055c4c0ab1cde main (/home/ibndias/riscv32/bin/clang-12+0x9c2cde)
#19 0x00007f3f48d530b3 __libc_start_main /build/glibc-YYA7BZ/glibc-2.31/csu/../csu/libc-start.c:342:3
#20 0x000055c4c0b1a19e _start (/home/ibndias/riscv32/bin/clang-12+0xa2b19e)
clang-12: error: unable to execute command: Segmentation fault (core dumped)
clang-12: error: clang frontend command failed due to signal (use -v to see invocation)
clang version 12.0.0 (https://github.com/llvm/llvm-project.git 99ad956fdaee5398fdcf46fa49cb433cf52dc461)
Target: riscv32--
Thread model: posix
InstalledDir: /home/ibndias/riscv32/bin
clang-12: note: diagnostic msg: 
********************

PLEASE ATTACH THE FOLLOWING FILES TO THE BUG REPORT:
Preprocessed source(s) and associated run script(s) are located at:
clang-12: note: diagnostic msg: /tmp/hi-5c6fca.c
clang-12: note: diagnostic msg: /tmp/hi-5c6fca.sh
clang-12: note: diagnostic msg: 

********************

そしてこれは私のコードです:

#include<stdio.h>

int foo(int a, int b)
{
        return a + b;
}

int main()
{
        int a, b, c;

        a = 0x10;
        b = 0x20;

        c = foo(a,b);
        return c;
}

これは命令を挿入する正しい方法ですか?

  for (auto &MBB : MF) {

    for (auto &MI : MBB) {

      if (MI.isCall()) {
        outs() << "Found Call\n";

        outs() << MI.getOpcode() << "\n";

        RISCVInstrInfo *XII; // target instruction info
        DebugLoc DL;
        MachineBasicBlock::iterator MBBI = BuildMI(MBB, MI ,DL, XII->get(RISCV::SW), RISCV::X1)
            .addReg(RISCV::X31)
            .addImm(0);
        return true;
      }
    }
  }
yflelion:

MBBIを使用して、まだ初期化されていないときにbuildMIに位置を指定しています。
私が理解していることは、呼び出しの前に命令を追加したいので、2番目のパラメーターとしてMBBIではなくMIを使用する必要があるということです。
ターゲット命令情報(XII)も初期化されません。
こちらをご覧くださいhttps :
//llvm.org/docs/CodeGenerator.html#id23

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

複数のforeachを使用してMYSQLに正しく挿入する方法

分類Dev

Flumeを使用してHDFSにJSONを正しく挿入する方法

分類Dev

拡張機能を使用してxsd:sequenceの前に挿入する方法は?

分類Dev

Node.jsを使用してMongodbに多くのレコードを挿入する正しい方法

分類Dev

lmdbに重複キーを正しく挿入する方法は?

分類Dev

jsonを使用してjsonの配列要素の配列内に値を挿入する方法または以下のjson文字列に値を挿入する方法

分類Dev

マシュマロを正しく使用してMysqlに新しいデータを挿入する方法

分類Dev

Go langを使用して別の文字列内に文字列を挿入する方法

分類Dev

Python mysqldbを使用して一度に多くの行を挿入する方法

分類Dev

Python mysqldbを使用して一度に多くの行を挿入する方法

分類Dev

VBAスクリプトを使用して特定の文字を含む数式を正しく挿入する方法

分類Dev

機械学習モデルを正しく検証する方法は?

分類Dev

c言語を使用してmysqlにレコードを接続して挿入する方法は?

分類Dev

nodejsでasyncを使用して正しく待機する方法は?

分類Dev

TYPE OBJECTのVARRAYに正しく挿入する方法は?

分類Dev

xmlstarletを使用して要素をxmlに挿入する方法は?

分類Dev

innerHtmlでhtmlを正しく挿入する方法は?

分類Dev

nvarcharに改行を正しく挿入する方法

分類Dev

Pythonのreを使用して整数を挿入する方法は?

分類Dev

ListIteratorを使用してLinkedListの中央に要素を挿入する方法

分類Dev

CSSを使用して要素の前に改行を挿入する方法

分類Dev

Javascriptを使用して特定のdivにHTMLを挿入する方法

分類Dev

dplyrを使用して列の値に文字を挿入する方法は?

分類Dev

PHPを使用して10進型の列にNULLを挿入する方法は?

分類Dev

stdInからの入力を待機しているスレッドを正しく停止する方法は?

分類Dev

sedを使用して数字と単語の間に空白を挿入する

分類Dev

Bash:変数の内容を引数としてコマンド置換に挿入します-正しく引用する方法は?

分類Dev

jqueryを使用して前の要素の前に挿入する方法は?

分類Dev

正規表現を使用して中国語入力を検証する方法は?

Related 関連記事

  1. 1

    複数のforeachを使用してMYSQLに正しく挿入する方法

  2. 2

    Flumeを使用してHDFSにJSONを正しく挿入する方法

  3. 3

    拡張機能を使用してxsd:sequenceの前に挿入する方法は?

  4. 4

    Node.jsを使用してMongodbに多くのレコードを挿入する正しい方法

  5. 5

    lmdbに重複キーを正しく挿入する方法は?

  6. 6

    jsonを使用してjsonの配列要素の配列内に値を挿入する方法または以下のjson文字列に値を挿入する方法

  7. 7

    マシュマロを正しく使用してMysqlに新しいデータを挿入する方法

  8. 8

    Go langを使用して別の文字列内に文字列を挿入する方法

  9. 9

    Python mysqldbを使用して一度に多くの行を挿入する方法

  10. 10

    Python mysqldbを使用して一度に多くの行を挿入する方法

  11. 11

    VBAスクリプトを使用して特定の文字を含む数式を正しく挿入する方法

  12. 12

    機械学習モデルを正しく検証する方法は?

  13. 13

    c言語を使用してmysqlにレコードを接続して挿入する方法は?

  14. 14

    nodejsでasyncを使用して正しく待機する方法は?

  15. 15

    TYPE OBJECTのVARRAYに正しく挿入する方法は?

  16. 16

    xmlstarletを使用して要素をxmlに挿入する方法は?

  17. 17

    innerHtmlでhtmlを正しく挿入する方法は?

  18. 18

    nvarcharに改行を正しく挿入する方法

  19. 19

    Pythonのreを使用して整数を挿入する方法は?

  20. 20

    ListIteratorを使用してLinkedListの中央に要素を挿入する方法

  21. 21

    CSSを使用して要素の前に改行を挿入する方法

  22. 22

    Javascriptを使用して特定のdivにHTMLを挿入する方法

  23. 23

    dplyrを使用して列の値に文字を挿入する方法は?

  24. 24

    PHPを使用して10進型の列にNULLを挿入する方法は?

  25. 25

    stdInからの入力を待機しているスレッドを正しく停止する方法は?

  26. 26

    sedを使用して数字と単語の間に空白を挿入する

  27. 27

    Bash:変数の内容を引数としてコマンド置換に挿入します-正しく引用する方法は?

  28. 28

    jqueryを使用して前の要素の前に挿入する方法は?

  29. 29

    正規表現を使用して中国語入力を検証する方法は?

ホットタグ

アーカイブ