Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在LLVM中的两个块之间插入块_C++_C_Compiler Construction_Llvm - Fatal编程技术网

C++ 在LLVM中的两个块之间插入块

C++ 在LLVM中的两个块之间插入块,c++,c,compiler-construction,llvm,C++,C,Compiler Construction,Llvm,我想在LLVM中的两个基本块之间插入一个块。例如,如果一个基本块a跳到基本块B,我想在它们之间插入一个基本块C,这样a跳到C,C跳到B。我怎么做?我的基本想法是,我需要更改基本块A的终止指令,这样目标B就会被C替换,但我如何在这两者之间添加新的基本块C?是的,您需要更改(或替换)基本块A的终止指令-例如,如果它是一个分支,您可以使用BranchInst::setSuccessor()。然后创建基本块C,并确保其终止指令跳转到B,这将使其介于两者之间 你所需要做的就是改变终结者的目标-你不需要重新

我想在LLVM中的两个基本块之间插入一个块。例如,如果一个基本块a跳到基本块B,我想在它们之间插入一个基本块C,这样a跳到C,C跳到B。我怎么做?我的基本想法是,我需要更改基本块A的终止指令,这样目标B就会被C替换,但我如何在这两者之间添加新的基本块C?

是的,您需要更改(或替换)基本块A的终止指令-例如,如果它是一个分支,您可以使用
BranchInst::setSuccessor()
。然后创建基本块C,并确保其终止指令跳转到B,这将使其介于两者之间

你所需要做的就是改变终结者的目标-你不需要重新排列内存中的块顺序或类似的事情

但是,您必须知道,您需要担心两个特殊说明-phi节点和着陆垫

  • Phi节点仅指块的直接前置节点。这意味着,如果在A和B之间插入C,则必须通过移除或使它们引用C而不是A来修复B中的所有phi节点

  • 如果B是landingpad块(包含landingpad指令),则只能从invoke指令的展开目标直接跳入该块。如果从A跳转到B是通过展开目标,则不能在中间添加基本块,除非将C自身放入着陆垫并从B移除着陆垫


有一个函数名为
llvm::splitEdge
。它完全符合问题的要求。

您知道如何删除跳转到后续对象吗。@user1018562只需更改终止符即可,您无需执行任何其他操作(例如,更改
分支的一个目标的目标标签