मैं एक ऐसे प्रोजेक्ट पर काम कर रहा हूं जहां मैं कुछ एलएलवीएम आईआर उत्पन्न करने के लिए क्लैंग का उपयोग करता हूं और फिर जेआईटी-संकलन करता हूं और इसे अपने होस्ट एप्लिकेशन के भीतर से चलाता हूं। जेआईटी कोड मेजबान एप्लिकेशन में कुछ फ़ंक्शन कॉल करता है जो अपवाद फेंक सकता है। मैं उम्मीद करता हूं कि अपवाद को जेआईटी कोड के माध्यम से फेंक दिया जाए और मेजबान आवेदन में वापस लाया जाए। AFAIK यह एलएलवीएम के साथ काम करना चाहिए, लेकिन दुर्भाग्य से मेरा परीक्षण आवेदन हमेशा "int 'के उदाहरण को फेंकने के बाद बुलाया जाता है। मुझे कुछ सरल उदाहरण दें।एलएलवीएम जेआईटी: जेआईटी कोड के माध्यम से सी ++ अपवाद को होस्ट करने के लिए वापस
मैं बजना 3.5 का उपयोग LLVM आईआर में निम्नलिखित साधारण प्रोग्राम को संकलित करने के:
extern void test() ;
extern "C" void exec(void*) {
test();
}
साथ
./clang -O0 -S -emit-llvm test.cpp -c
परिणाम test.ll
; ModuleID = 'test.cpp'
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"
; Function Attrs: uwtable
define void @exec(i8*) #0 {
%2 = alloca i8*, align 8
store i8* %0, i8** %2, align 8
call void @_Z4testv()
ret void
}
declare void @_Z4testv() #1
attributes #0 = { uwtable "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" }
attributes #1 = { "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" }
!llvm.ident = !{!0}
!0 = metadata !{metadata !"clang version 3.5.0 (224841)"}
मेरे मेजबान आवेदन दिखता है इस तरह:
static void test() {
throw 1;
}
int main(int, const char **) {
llvm::InitializeNativeTarget();
llvm::InitializeNativeTargetAsmPrinter();
llvm::InitializeNativeTargetAsmParser();
llvm::LLVMContext &Context = llvm::getGlobalContext();
llvm::SMDiagnostic Err;
llvm::Module *Mod = llvm::ParseIRFile("test.ll", Err, Context);
llvm::ExecutionEngine* m_EE = llvm::EngineBuilder(Mod)
.setEngineKind(llvm::EngineKind::JIT)
.create();
llvm::Function* f = Mod->getFunction("_Z4testv");
m_EE->addGlobalMapping(f, reinterpret_cast<void*>(test));
f = Mod->getFunction("exec");
void* poi = m_EE->getPointerToFunction(f);
void (*exec)(void*) = reinterpret_cast<void (*)(void*)>(poi);
try {
exec(NULL);
} catch (...) {
std::cout << "catched exception" << std::endl;
}
return 0;
}
मैं एलएलवीएम 3.5 का उपयोग करता हूं जिसे मैंने सेमेक के साथ संकलित किया है। मैंने LLVM_ENABLE_EH = ON और LLVM_ENABLE_RTTI = चालू सेट किया है। क्या मुझे एलएलवीएम संकलित करते समय कुछ याद आया या मेरा होस्ट एप्लिकेशन कोड गलत है?
धन्यवाद!