2013-05-29 39 views
1

我試圖將函數中的CFG複製到一個新函數中,以便對舊函數執行一些操作。 我用CloneFunctionInto通過下面的代碼CloneFunctioninto()中的錯誤LLVM

 std::vector<Type*> ArgTypes; 
     ValueToValueMapTy VMap; 
     FunctionType *FTy = FunctionType::get(F.getFunctionType()->getReturnType(), ArgTypes, F.getFunctionType()->isVarArg()); 
     Function *NewF = Function::Create(FTy, F.getLinkage(), F.getName()); 
     SmallVector<ReturnInst*, 8> Returns; 
     CloneFunctionInto(NewF, (Function*) &F, VMap, false, Returns, "_", 0, 0); 

我在新老功能打印每個基本塊後得到的錯誤:雖然刪除

:123-132%

使用後仍然四處卡住DEF被破壞:%cmp1_ = ICMP SGT I32%4,20

選擇:Value.cpp:75:虛擬LLVM ::值::〜值():斷言`use_empty()& &「使用時保持一價值被破壞!「'失敗。

0 opt    0x0000000000fc7fe2 

1 opt    0x0000000000fc8473 

2 libpthread.so.0 0x00007f2b28876cb0 

3 libc.so.6  0x00007f2b27ac8425 gsignal + 53 

4 libc.so.6  0x00007f2b27acbb8b abort + 379 

5 libc.so.6  0x00007f2b27ac10ee 

6 libc.so.6  0x00007f2b27ac1192 

7 opt    0x0000000000f7cd7d 

8 opt    0x0000000000ee3c52 

9 opt    0x0000000000f5bddf llvm::LLVMContextImpl::~LLVMContextImpl() + 1999 

10 opt    0x0000000000f5ad1c 

11 opt    0x0000000000fb9d69 llvm::llvm_shutdown() + 41 

12 opt    0x00000000005285b3 main + 7251 

13 libc.so.6  0x00007f2b27ab376d __libc_start_main + 237 

14 opt    0x0000000000521f91 

堆棧轉儲:

0. Program arguments: opt -load ../../../Release+Asserts/lib/Blocks.so -blocks 

中止(核心轉儲)

爲了澄清:它讓我與它的正確接班人正確的基本塊,但它也不能很好地工作由於這個錯誤

回答

1

它看起來不像你正在適當地複製參數。看看llvm::CloneModule函數(lib/Transforms/Utils/CloneModule.cpp),看看如何正確使用CloneFunction