2015-04-27 95 views
1

我想問一下如何以正確的方式將自己的C++函數調用到LLVM中。如何在LLVM中調用函數

我已經編寫簡單的函數:

void writeSomething() { 
    std::cout << "Awesome" << std::endl; 
} 

在LLVM我試圖註冊該功能。我創建了它的外部鏈接。只是調用該函數

 // Void type 
llvm::FunctionType* fccType = 
     llvm::FunctionType::get(
      llvm::Type::getVoidTy(getGlobalContext()), false 
     ); 

// External - c++ 
Function *fcc = (Function*) module->getOrInsertFunction("writeSomething", 
     fccType 
     ); 

// Call 
std::vector<Value*> emptyArgs; 
CallInst::Create(fcc, makeArrayRef(emptyArgs)); 

LLVM輸出是 (//註釋是我輸入我該如何理解輸出)

// External linkage 
declare void @writeSomething() 

define internal void @main() { 
entry: 
    // Call my function 
    call void @writeSomething() 
    ret void 
} 

程序與消息結束:LLVM錯誤:計劃使用的外部函數'writeSomething'無法解決!

回答

4

由於C++ name mangling,該函數的名稱實際上是一樣的東西_Z14writeSomethingv - C++支持通過在功能名稱的編碼類型的信息過載。

您可以通過聲明函數extern "C" void writeSomething() { ... }來禁用此功能,或者在您的編譯器的名稱修改方案下找出它應該調用的內容並使用它。

+0

我添加了extern「C」,它確實有效!非常感謝你。 –