【问题标题】:Replace all uses of an instruction to delete with an Undef value at llvm?用 llvm 的 Undef 值替换删除指令的所有用途?
【发布时间】:2015-12-15 18:17:04
【问题描述】:

我想用 Undef 值替换对指令的所有使用,这是我要删除的函数调用。

首先,我这样声明我的 undef 值

UndefValue *undefval;

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

currentInst->replaceAllUsesWith(undefval);

currentInst 是一个

Instruction* currentInst; 

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

opt: /home/troulakis/D​​ocuments/LLVM_Project/llvm/llvm/lib/IR/Value.cpp:332: void llvm::Value::replaceAllUsesWith(llvm::Value *): 断言`New->getType () == getType() && "replaceAllUses of value with new value of different type!"' 失败。

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::Function&) (../../../Release+Asserts/lib/PassRAF.so+0x6da7) 9 0x15a1ab4 llvm::FPPassManager::runOnFunction(llvm::Function&) (/usr/local/bin/opt+0x15a1ab4) 10 0x15a1d3b llvm::FPPassManager::runOnModule(llvm::Module&) (/usr/local/bin/opt+0x15a1d3b) 11 0x15a22d7 llvm::legacy::PassManagerImpl::run(llvm::Module&) (/usr/local/bin/opt+0x15a22d7) 12 0x5af6db 主 (/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. 在函数“@main”上运行传递“R A F”

./PassRAF: line 15: 7227 Aborted (core dumped)

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

【问题讨论】:

    标签: c++ clang llvm llvm-ir


    【解决方案1】:

    当你写这个时:

    UndefValue *undefval;
    

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多