[LLVMdev] Exception Handling Tables Question

Bill Wendling isanbard at gmail.com
Mon Sep 14 11:25:41 PDT 2009


On Mon, Sep 14, 2009 at 6:50 AM, Duncan Sands <baldrick at free.fr> wrote:
> Hi Bill,
>
>> Right now we generate call sites for all of the code in a function,  even
>> for code that cannot (or at least shouldn't) throw an exception.
>
> ...
>>
>> (assume it's all been inlined), the EH handling table for "main" goes
>>  from Leh_func_begin1 to Leh_func_end1, marking off each region whether  it
>> can throw or not. From my reading of the Exception Tables  documentation,
>> this is unnecessary – at least for C++. If a call  throws and it doesn't
>> have an entry in the unwind table, then the  "terminate()" function is
>> called. Is it fair to assume that there is a  similar mechanism for other
>> languages?
>
> in Ada these extra table entries are not needed at all: whether you
> have them or not, an exception will continue to unwind.  There is no
> calling of "terminate".  In short: you only need a table entry for
> invoke calls, i.e. things you want to catch in this function.
>
> The reason to ask this is that
>>
>> it could make the EH tables smaller and less cluttered if we elide  those
>> areas which we know don't throw (the functions called are marked
>>  'nounwind', etc.).
>
> Sure, that's what the SawPotentiallyThrowing boolean is for.  It is
> currently set for any call, but in fact needn't be set for 'nounwind'
> calls.  When I wrote this stuff 'nounwind' information wasn't available
> at the codegen level, which is why this isn't done.  In case you care,
> doing this would not hurt Ada :)
>
Yay! :-) I'm interested in getting the tables smaller. And it will
help debug when things go wrong. Thanks!

-bw




More information about the llvm-dev mailing list