• Kevin Modzelewski's avatar
    Change how the llvm jit passes exceptions between blocks · 2f7d52be
    Kevin Modzelewski authored
    Our IR doesn't explicitly represent the data transfer between an Invoke
    statement and its corresponding LandingPad.  We use a couple different
    techniques to pass it through: in the ast interpreter/bjit, we stash it
    into an interpreter-local variable and then pull it back out.  Previous
    to this change, in the LLVM tier we would pass it directly through
    an exception, using either the C++ or CAPI exception-passing mechanism.
    
    This works but is a pain, since it requires coordination between the invoke
    and the landingpad.  These live in different basic blocks, so we ended up
    having this other code that lives separate from the normal irgen that has
    to decide which exception style to use, and it has to respect certain
    restrictions within irgen (ie it has to be careful to not request CAPI
    exceptions for cases that we haven't added support for yet).
    
    This commit changes the approach so that the exception data is passed
    directly as LLVM Values, and its up to the Invoke to figure out how
    to get it into that form.  This adds a bit more complexity to the invoke,
    but it should make the interface easier to extend (such as in the next commit).
    2f7d52be
irgen.h 6.51 KB