[LLVMdev] Nested exception handlers

Talin viridia at gmail.com
Wed May 27 23:56:15 PDT 2009


Now that I've got exceptions working, I'm kind of wondering how to 
handle the case of nested "try" blocks. Say I have some code that looks 
like this:

  try {
    try {
      if (test) {
        // throw something
      } else {
        return;
      }
    } catch e:Except1 {
    } catch e:Except2 {
    } finally {
    }

    // more code...
  } catch e:Except3 {
  } finally {
  }

Turning this into a list of basic blocks is starting to get rather 
complex. In particular:

    * For the innermost try block, there will be 4 possible selectors,
      corresponding to Except1, Except2, Except3 and "other".
          o The first two selectors jump directly to the catch blocks
            for their respective exceptions.
          o The third selector needs to execute the inner 'finally'
            block first.
          o The fourth selector (0 which is a cleanup handler) needs to
            execute both finally blocks and then re-throw the exception.
    * The return statement also needs to execute both finally blocks and
      then return.
    * Then in the outer try block, there will be another exception
      selector with two entries, Except3 and "other" (0).
    * The "fall through" for the outer try block also needs to execute
      the outer finally block.

In addition, the exception object for Except3 can come from two 
different llvm.eh.selector instructions, which means that it either 
needs to be a phi node or it needs to be a memory variable.

I'm wondering if anyone has dealt with this sort of thing and has or  
has advice on how to approach the problem. It seems like I almost need 
to have my higher-level CFG include a "Local JSR" and "Local Return" 
operator which is lowered into code that sets a state variable and then 
does a switch at the end of the finally block to determine where to jump 
back to.

-- Talin




More information about the llvm-dev mailing list