[LLVMdev] LLVM Exception Handling

Lang Hames lhames at gmail.com
Tue Apr 28 14:06:29 PDT 2015


In r234975 I fixed an issue where we were failing to emit the eh_frame for
JIT'd code on MacOS. It may have fixed this problem.

- Lang.

On Tue, Mar 24, 2015 at 10:16 AM, Jonathan Roelofs <
jonathan at codesourcery.com> wrote:

>
>
> On 3/24/15 10:32 AM, Reid Kleckner wrote:
>
>> I haven't dug into your example, but I would say exceptions don't work
>> on Windows yet.
>>
>> I don't know why it doesn't work on Mac.
>>
>
> The symptoms look like what happens when you have two copies of the rtti
> each in different SOs. If that's the problem, then throwing from one SO and
> trying to catch in the other will terminate this way when the first's
> typeinfos don't match against any in the second.
>
> I don't know the JIT well at all, but I'd suggest printing out the address
> of the type info for int, _ZTIi, and check that they're the same in both
> the JIT-ee and the JIT-er.
>
>
> Jon
>
>
>> On Fri, Mar 20, 2015 at 9:33 AM, Anil Can Akay <anilck at gmail.com
>> <mailto:anilck at gmail.com>> wrote:
>>
>>     Hi,
>>
>>     I am trying to implement a scenario similar to running
>>     ExceptionDemo.cpp with parameter -1 (where the JITed code calls the
>>     C++ function which throws an exception)
>>
>>     Different from the given example I am using IRParser instead of
>>     IRBuilder. I can successfully catch the exception in Linux but the
>>     program crashes in Mac and Windows.
>>
>>     The code is similar to as follows:
>>
>>     ### The test.cpp : (clang++ -O0 -S -emit-llvm test.cpp –c)
>>
>>     extern void test() ;
>>
>>     extern "C" void exec(void*) {
>>
>>     test();
>>
>>     }
>>
>>     ### main.cpp
>>
>>     // necessary includes here....
>>
>>     static void test() {
>>
>>     throw 1;
>>
>>     }
>>
>>     int main(int, const char **) {
>>
>>     llvm::InitializeNativeTarget();
>>
>>     llvm::InitializeNativeTargetAsmPrinter();
>>
>>     llvm::InitializeNativeTargetAsmParser();
>>
>>     llvm::LLVMContext &Context = llvm::getGlobalContext();
>>
>>     llvm::SMDiagnostic Err;
>>
>>     std::unique_ptr<llvm::Module> Mod = llvm::parseIRFile("test.ll",
>>     Err, Context);
>>
>>          std::string triple = llvm::sys::getProcessTriple();
>>
>>          Mod->setTargetTriple(triple);
>>
>>     llvm::Function* f = Mod->getFunction("exec");
>>
>>     llvm::TargetOptions Opts;
>>
>>          Opts.NoFramePointerElim = true;
>>
>>     // Build engine with JIT
>>
>>     std::unique_ptr<llvm::RTDyldMemoryManager> MemMgr(new
>>     llvm::SectionMemoryManager());
>>
>>     std::string err;
>>
>>     llvm::EngineBuilder factory(std::move(Mod));
>>
>>     factory.setErrorStr(&err);
>>
>>     factory.setEngineKind(llvm::EngineKind::JIT);
>>
>>     factory.setTargetOptions(Opts);
>>
>>     factory.setMCJITMemoryManager(std::move(MemMgr));
>>
>>     llvm::ExecutionEngine* EE = factory.create();
>>
>>     llvm::sys::DynamicLibrary::AddSymbol("_Z4testv",
>>     reinterpret_cast<void*>(test));
>>
>>     EE->finalizeObject();
>>
>>     void* poi = EE->getPointerToFunction(f);
>>
>>     void (*exec)(void*) = reinterpret_cast<void (*)(void*)>(poi);
>>
>>     try {
>>
>>     exec(NULL);
>>
>>     } catch (int e) {
>>
>>     std::cout << "catched " << e << std::endl;
>>
>>     }
>>
>>     return 0;
>>
>>     }
>>
>>     ###
>>
>>     Crash like below:
>>
>>     libc++abi.dylib: terminating with uncaught exception of type int
>>
>>     [1] 15639 abort (core dumped)  ./main
>>
>>     What can be the reason for the different behaviour in different
>>     platforms? In order to make it work, do I need to wrap the
>>     llvm::Function* f with the unwindResume and externalException blocks
>>     ? Any other suggestions ? By the way I use LLVM 3.6.0 compiled with
>>     LLVM_ENABLE_EH and RTTI enabled.
>>
>>     Thanks in advance for your help.
>>
>>
>>     _______________________________________________
>>     LLVM Developers mailing list
>>     LLVMdev at cs.uiuc.edu <mailto:LLVMdev at cs.uiuc.edu>
>> http://llvm.cs.uiuc.edu
>>     http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
>>
>>
>>
>>
>> _______________________________________________
>> LLVM Developers mailing list
>> LLVMdev at cs.uiuc.edu         http://llvm.cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
>>
>>
> --
> Jon Roelofs
> jonathan at codesourcery.com
> CodeSourcery / Mentor Embedded
>
>
> _______________________________________________
> LLVM Developers mailing list
> LLVMdev at cs.uiuc.edu         http://llvm.cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20150428/02bf288f/attachment.html>


More information about the llvm-dev mailing list