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 | |