用llvm中的Undef值替换要删除的指令的所有用法?

时间:2015-09-18 14:38:54

标签: c++ clang llvm llvm-ir

我想用Undef值替换一条指令的所有用法,这是一个我要删除的函数调用。

首先,我声明我的undef值如此

UndefValue *undefval;

然后我尝试替换我的指令的所有用途

currentInst->replaceAllUsesWith(undefval);

currentInst

Instruction* currentInst; 

值指的是我当前的指令。这会导致LLVM产生以下错误和断言:

  

opt:/home/troulakis/D​​ocuments/LLVM_Project/llvm/llvm/lib/IR/Value.cpp:332:void llvm :: Value :: replaceAllUsesWith(llvm :: Value *):断言`New-> getType()== getType()&& “将所有价值替换为不同类型的新价值!”'失败。

     

0 0x160e678 llvm :: sys :: PrintStackTrace(_IO_FILE *)   (/ usr / local / bin / opt + 0x160e678)1 0x160fbdb   (/ usr / local / bin / opt + 0x160fbdb)2 0x7f7752596340 __restore_rt   (/lib/x86_64-linux-gnu/libpthread.so.0+0x10340)3 0x7f77515aacc9   gsignal(/lib/x86_64-linux-gnu/libc.so.6+0x36cc9)4 0x7f77515ae0d8   中止(/lib/x86_64-linux-gnu/libc.so.6+0x3a0d8)5 0x7f77515a3b86   (/lib/x86_64-linux-gnu/libc.so.6+0x2fb86)6 0x7f77515a3c32   (/lib/x86_64-linux-gnu/libc.so.6+0x2fc32)7 0x15be04f   (/ usr / local / bin / opt + 0x15be04f)8 0x7f775136fda7(匿名   命名空间)::为mypass :: runOnFunction(LLVM ::功能与安培)   (../../../Release+Asserts/lib/PassRAF.so+0x6da7)9 0x15a1ab4   LLVM :: FPPassManager :: runOnFunction(LLVM ::功能与安培)   (/ usr / local / bin / opt + 0x15a1ab4)10 0x15a1d3b   LLVM :: FPPassManager :: runOnModule(LLVM ::模块&安培)   (/ usr / local / bin / opt + 0x15a1d3b)11 0x15a22d7   LLVM ::遗留:: PassManagerImpl ::运行(LLVM ::模块&安培)   (/ usr / local / bin / opt + 0x15a22d7)12 0x5af6db main   (/ usr / local / bin / opt + 0x5af6db)13 0x7f7751595ec5 __libc_start_main   (/lib/x86_64-linux-gnu/libc.so.6+0x21ec5)14 0x59f559 _start   (/ usr / local / bin / opt + 0x59f559)

     

堆栈转储:

     
      
  1. 程序参数:opt -load ../../../Release+Asserts/lib/PassRAF.so -time-passes -instnamer   -PassRAF

  2.   
  3. 在模块''上运行'功能通过管理器'。

  4.   
  5. 在函数'@main'
  6. 上运行'R A F'         

    ./ PassRAF:第15行:7227中止(核心倾销)

任何想法有什么不对?我有错误的undef值声明吗?

1 个答案:

答案 0 :(得分:3)

当你这样写:

UndefValue *undefval;

您只是声明一个类型为UndefValue的指针,而不是在其中存储任何内容。相反,您需要使用UndefValue::get工厂函数为要替换的指令类型获取UndefValue的实例。像这样:

currentInst->replaceAllUsesWith(UndefValue::get(currentInst->getType())