2011-03-20 73 views
1

我想實現以下功能之前;改變LLVM ::代碼生成功能後簽字,最後CreateRet

  • 沒有明確的返回功能將默認返回最後的評估,在過去執行的塊

所以,我目前在做的過程是

1)創建功能

llvm::Function* result = llvm::Function::Create(Compiler::Detail::getAnonymousFunctionSignature(llvmContext), 
          llvm::GlobalValue::ExternalLinkage, 
          name, 
          module()); 
        result->setCallingConv(llvm::CallingConv::C); 

2)添加塊的d評估,以塊

builder.createFoo..... 

然而,僅在第二階段我有LLVM ::值*(和編譯時類型),我想用默認的返回值來使用。問題是,我需要使用此類型來確定創建的函數的簽名

問:

我如何解決這個問題?

  • 是否可以在創建函數後更改簽名?這是合法的嗎?
  • 我是否需要創建一個新的功能與更新的簽名和複製/第一函數的入口塊分配給它,這就是它?還是我需要重新評估所有的表達式?
  • 可能無法創建代碼生成前的功能?如果是這樣,我應該在什麼時候創建函數?

如何實現,這將是真棒的代碼示例。謝謝!

回答

4

你不能改變函數簽名,因爲這將意味着它將有不同的類型(這樣的話你就需要更新所有用戶等;在大多數情況下,這個過程不能自動地完成)。

有多種可能的解決方案,例如,您可以使用更新後的簽名創建函數,然後使用lib/Transforms/Utils/CloneFunction.cpp中的函數複製函數體,然後使用返回類型。

+0

謝謝,我想這是將要變成作爲最終的答案,但我想是肯定 – lurscher 2011-03-21 00:59:32

0

更好的解決方案存在比CloneFunctionInto(),根據https://stackoverflow.com/a/18751365/2024042

NF-> getBasicBlockList()拼接(NF->開始(),F-> getBasicBlockList());

其中NF是您正在克隆的新功能,F是您剛剛克隆的舊功能。