|  | Date: Sat, 19 May 2001 19:09:13 -0500 (CDT) | 
|  | From: Chris Lattner <sabre@nondot.org> | 
|  | To: Vikram S. Adve <vadve@cs.uiuc.edu> | 
|  | Subject: RE: Meeting writeup | 
|  |  | 
|  | > I read it through and it looks great! | 
|  |  | 
|  | Thanks! | 
|  |  | 
|  | > The finally clause in Java may need more thought.  The code for this clause | 
|  | > is like a subroutine because it needs to be entered from many points (end of | 
|  | > try block and beginning of each catch block), and then needs to *return to | 
|  | > the place from where the code was entered*.  That's why JVM has the | 
|  | > jsr/jsr_w instruction. | 
|  |  | 
|  | Hrm... I guess that is an implementation decision.  It can either be | 
|  | modelled as a subroutine (as java bytecodes do), which is really | 
|  | gross... or it can be modelled as code duplication (emitted once inline, | 
|  | then once in the exception path).  Because this could, at worst, | 
|  | slightly less than double the amount of code in a function (it is | 
|  | bounded) I don't think this is a big deal.  One of the really nice things | 
|  | about the LLVM representation is that it still allows for runtime code | 
|  | generation for exception paths (exceptions paths are not compiled until | 
|  | needed).  Obviously a static compiler couldn't do this though.  :) | 
|  |  | 
|  | In this case, only one copy of the code would be compiled... until the | 
|  | other one is needed on demand.  Also this strategy fits with the "zero | 
|  | cost" exception model... the standard case is not burdened with extra | 
|  | branches or "call"s. | 
|  |  | 
|  | > I suppose you could save the return address in a particular register | 
|  | > (specific to this finally block), jump to the finally block, and then at the | 
|  | > end of the finally block, jump back indirectly through this register.  It | 
|  | > will complicate building the CFG but I suppose that can be handled.  It is | 
|  | > also unsafe in terms of checking where control returns (which is I suppose | 
|  | > why the JVM doesn't use this). | 
|  |  | 
|  | I think that a code duplication method would be cleaner, and would avoid | 
|  | the caveats that you mention.  Also, it does not slow down the normal case | 
|  | with an indirect branch... | 
|  |  | 
|  | Like everything, we can probably defer a final decision until later.  :) | 
|  |  | 
|  | -Chris | 
|  |  |