LLVM IR:将功能从一个LLVM IR文件复制到另一个

时间:2019-05-17 06:48:19

标签: c++ llvm llvm-ir

我正在尝试将功能从一个文件复制到另一个文件。我要将功能复制到的文件包含一个具有相同名称和相同指令数的功能。我决定只用其他功能的说明代替。我正在通过函数传递进行所有这些操作。

  1. 我创建了一个函数通道,其中使用了“ llvm-extract”从该通道内提取函数。

  2. 然后,我使用以下方法读取了由“ llvm-extract”工具创建的(.ll)文件:

SMDiagnostic Err;
LLVMContext Context;

std::unique_ptr<Module> ParsedMod(parseIRFile("add.ll", Err, Context));
Module &M = dynamic_cast<Module&>(*ParsedMod);
Module* Mod_ptr = &M;
  1. 然后,我使用以下命令读取了要将函数复制到的(.ll)文件:
std::unique_ptr<Module> ParsedMod2(parseIRFile("server.ll", Err, Context));
Module &M2 = dynamic_cast<Module&>(*ParsedMod2);
Module* Mod_ptr2 = &M2;
  1. 我保留了两个迭代器来保存必须开始替换指令的点:
Module::iterator F1;
Module::iterator F2;
  1. 分配它们的值,以使F1指向第一个函数,F2指向第二个函数:
    for(Module::iterator func = Mod_ptr->begin(), Lfunc = Mod_ptr->end(); func!=Lfunc; ++func)
        {
          F1 = func;
        }

    for(Module::iterator func2 = Mod_ptr2->begin(), Lfunc2 = Mod_ptr2->end(); func2!=Lfunc2; ++func2)
        {
          if(func2->getName() == F.getName()) //F.getName() gives the same name as the function that was extracted
          {
            F2 = func2;
          }
        }
  1. 使用以下命令将F2的每条指令替换为F1的指令:
    for(Function::iterator bb = F1->begin(), Lbb = F1->end(), bb2 = F2->begin(), Lbb2 = F2->end(); bb2!=Lbb2; ++bb, ++bb2)
        {
          for(BasicBlock::iterator inst = bb->begin(), Linst = bb->end(), inst2 = bb2->begin(), Linst2 = bb2->end(); inst2 != Linst2; ++inst, ++inst2)
          {
            Instruction* I = &*inst;
            Instruction* I2 = &*inst2;

            //errs() << "F1's instruction: " << *I << "\n";
            //errs() << "F2's instruction: " << *I2 << "\n";

            ReplaceInstWithInst(I, I2);
          }
        }

如果我注释了ReplaceInstWithInst指令,然后取消注释了打印两个功能中的指令的指令,则会打印正确的指令。

如果使用ReplaceInstWithInst指令,则会出现分段错误

1 个答案:

答案 0 :(得分:0)

我可以猜测发生了什么,答案是verify early and often。验证程序将检测许多琐碎的错误,例如在一个函数中有一条指令引用了另一个模块中的函数或全局变量。 Verify every function you change,它将尽早发现错误。

(您可能还希望查看llvm / lib / Transforms / Utils / CloneFunction.cpp及其调用者;也许那里的函数或调用者可以为您提供帮助。)