2010-12-13 11 views
15

मैं एक एलएलवीएम स्क्रिप्टिंग इंजन लिख रहा हूं कि जेआईटी एक कस्टम भाषा में स्क्रिप्टिंग कोड संकलित करता है। मेरी समस्या यह है कि मैं बाहरी कार्यों को कॉल करने में असमर्थ हूं (यहां तक ​​कि C99 erf() फ़ंक्शन विफल हो रहा है)।बाहरी सी ++ कार्यों में एलएलवीएम जेआईटी कोड को जोड़ने

उदाहरण के लिए अगर मैं 'सी' ERF समारोह extern,

extern "C" double erft(double x){ 
return erf(x); 
} 

और बाह्य संबंध के साथ एक समारोह बनाने

std::vector<const Type*> Double1(1,Type::getDoubleTy(getGlobalContext())); 
FunctionType *FT = FunctionType::get(Type::getDoubleTy(getGlobalContext()),Double1,false); 
Function *erft = Function::Create(FT,Function::ExternalLinkage,"erft",TheModule); 

जब Erft साथ मेरी स्क्रिप्ट (0.0 चल रहा है निम्न त्रुटि संदेश मिलता है):

LLVM ERROR: Program used external function 'erft' which could not be resolved!

मैन्युअल

०१२३५१६४१० मानचित्रण कर

declaration of `void llvm::ExecutionEngine::addGlobalMapping(const llvm::GlobalValue*, void*)' outside of class is not definition

जाहिर है मैं कुछ बहुत गलत कर रहा हूँ:

void ExecutionEngine::addGlobalMapping(const GlobalValue * erfF, void * erft); 

मुझे निम्नलिखित त्रुटि मिल जाएगा। किसी भी मदद की बहुत सराहना जाएगा

+1

भावी आगंतुकों के लिए एक चेतावनी: उत्तर पदावनत तरीकों के referering कर रहे हैं .. – antipattern

+0

का जवाब [इस] (https://stackoverflow.com/questions/48105342/llvm-jit-add-library-to-module) प्रश्न दिखाता है कि इसे गैर-बहिष्कृत तरीकों से कैसे किया जाए। –

उत्तर

0

मैं LLVM पता नहीं है, लेकिन यह कोई अर्थ नहीं:

void ExecutionEngine::addGlobalMapping(const GlobalValue * erfF, void * erft); 

सी में एक नया कार्य को परिभाषित करता है कि ++। आपको क्या करना है किसी भी तरह से अपने काम को एलएलवीएम के साथ पंजीकृत करना है। उस फ़ंक्शन को परिभाषित करना एलएलवीएम कक्षाओं में नए तरीकों को जोड़ने की कोशिश करना है, न कि आप क्या करना चाहते हैं।

2

यह हो रहा हो सकता है कि आप "libm" depedency जोड़ने के लिए भूल गया, का उपयोग करके देखें:

[your module]->addLibrary("m"); 

Module::addLibrary() बारे में अधिक जानकारी के लिए here देखें।

13

मान लें कि आपने इसे अक्षम नहीं किया है (EE->DisableSymbolSearching() पर कॉल करके) तो एलएलवीएम जेआईटी कार्यक्रम में प्रतीकों को खोजने के लिए dlsym() का उपयोग करेगा। आपके प्लेटफ़ॉर्म के आधार पर, इसका अर्थ यह हो सकता है कि आपको -fPIC के साथ अपना JIT बनाने की आवश्यकता है, या यह संभवतः उपलब्ध नहीं हो सकता है (जैसे कि विंडोज़ पर)।

स्वचालित प्रतीक खोज के अलावा, आप हमेशा EE->addGlobalMapping(GV, &function) का उपयोग करके व्यक्तिगत कार्यों को स्वयं पंजीकृत कर सकते हैं, जहां जीवी = llvm :: फ़ंक्शन * फ़ंक्शन घोषणा जो आपके द्वारा कॉल किए जा रहे मूल फ़ंक्शन से मेल खाती है। ertf के साथ अपने मामले में() है कि है:

EE->addGlobalMapping(erft, &::erft); 

ध्यान दें कि आप वैश्विक समारोह erft() और स्थानीय चर erft नाम है, इसलिए "::"। अगली बार कृपया अलग-अलग नाम चुनें!