如何在LLVM的MachineFunctionPass中正确使用BuildMI插入机器指令?

如何解决如何在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::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,RISCV::X1)
            .addReg(RISCV::X31)
            .addImm(0);
        return true;
      }
    }
  }

解决方法

您正在使用MBBI在尚未初始化的位置上将位置赋予buildMI。
据我了解,您想在调用之前添加一条指令,因此应该使用MI而不是MBBI作为第二个参数。
目标指令信息(XII)也未初始化。
你可以在这里看看:
https://llvm.org/docs/CodeGenerator.html#id23

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-