[llvm-commits] [llvm] r49006 - in /llvm/trunk/lib: CodeGen/DwarfWriter.cpp CodeGen/LLVMTargetMachine.cpp CodeGen/SelectionDAG/SelectionDAGISel.cpp Target/PowerPC/PPCAsmPrinter.cpp Target/PowerPC/PPCRegisterInfo.cpp Target/X86/X86AsmPrinter.cpp Target/X86/X86RegisterInfo.cpp Transforms/Utils/LowerInvoke.cpp

Dale Johannesen dalej at apple.com
Tue Apr 1 11:05:47 PDT 2008


On Apr 1, 2008, at 4:49 AM, Duncan Sands wrote:

> Hi Dale,
>
>> Emit exception handling info for functions which are
>> not marked nounwind,
>
> that doesn't sound right.  As I had already explained to you
> in a private email, the dwarf info has two parts related to
> exception handling: the eh table, and frame moves info.  If
> a function is nounwind then there is no need to generate the
> frame moves info.  If a function has no invokes then there
> is no need to generate the eh table.  These are independent.
> A nounwind function can have invokes (indeed this is quite
> common after optimization - see prune-eh), I see that Anton
> sent you an example.

His example doesn't work.  If it did, quite a few things would be  
wrong, as you say.

>  For such a function you should generate an EH table but no frame  
> moves.

I have not tried to prune the frame moves yet, that isn't needed for  
correctness.

> If a nounwind function has no invokes then you can just not
> generate dwarf info at all (I'm ignoring debug intrinsics
> here, which in general require dwarf info).
> And if a not-nounwind function has no invokes then you don't
> have to generate an EH table.  I think this is already the
> case (hopefully Anton will correct me if I'm wrong): we only
> generate an EH table if there is a personality function, and
> the only way to have a personality function is if there are
> invokes (it is also possible to have invokes without a personality,
> but since we don't know how to codegen those you can just
> ignore this).
>
> So I think all you need to do is this: make generation of
> frame moves optional.  Generate frame moves for a function
> if and only if it is not-nounwind (or has debug intrinsics).
> If the function doesn't require frame moves or an EH table
> then don't generate a dwarf frame for it at all.
>
>> or for all functions when -enable-eh
>> is set, provided the target supports Dwarf EH.
>
> Presumably this is for debugging purposes?  If so, how about
> making this a hidden option and renaming it to -debug-eh ?
> Otherwise people are going to think they need this for eh
> support.  Which they don't, right?  (If I understand you
> correctly, you've basically turned on eh support
> unconditionally).

I am trying to "turn on" EH support based on the IR information rather  
than a command line flag.

Chris did not want to remove -enable-eh yet.  It and ExceptionHandling  
should go away eventually.

>> llvm-gcc generates nounwind in the right places; other FEs
>> will need to do so also.  Given such a FE, -enable-eh should
>> no longer be needed.
>
>> +  /// shouldEmit - Per-function flag to indicate if EH information  
>> should
>> +  /// be emitted.
>>   bool shouldEmit;
>
> This is too crude.  I think you need to distinguish between frame  
> moves
> (= locating the values of variables) and the EH table (matching  
> exceptions
> to actions).  So you need two variables here.
>
>> +    if ((ExceptionHandling || !MF->getFunction()->doesNotThrow()) &&
>>         TAI->doesSupportExceptionHandling()) {
>>       shouldEmit = true;
>
> This looks badly wrong: you just broke nounwind functions that  
> contain invokes.

If such exist, that is true.

>> -  if (!ExceptionHandling)
>> -    PM.add(createLowerInvokePass(getTargetLowering()));
>> +  PM.add(createLowerInvokePass(getTargetLowering()));
>
> Does this mean that you just lowered all exception handling to  
> setjmp/longjmp?

No.  The idea was to postpone deciding to do LowerInvoke until  
LowerInvoke is actually executed, when we have a function to look at.   
But probably this should look at  getTargetAsmInfo()- 
 >doesSupportExceptionHandling() instead.  I think we want to do this  
lowering whenever the target doesn't support Dwarf EH.

> Hopefully not, but I vaguely recall from the last time I looked at  
> this stuff
> that it is surprisingly easy to make a mistake here.

That is true, but I did test it.

>> -  if (!ExceptionHandling)
>> -    PM.add(createLowerInvokePass(getTargetLowering()));
>> +  PM.add(createLowerInvokePass(getTargetLowering()));
>
> Likewise.
>
>> +  // Figure out whether we need to generate EH info.  Currently we  
>> do this for
>> +  // all functions not marked no-unwind, or if requested via - 
>> enable-eh.
>> +  needsExceptionHandling = ExceptionHandling || !Fn.doesNotThrow();
>
> This is wrong, see above.  There's already a test somewhere that  
> only outputs
> the EH table if there is a personality function.
>
>>   case Intrinsic::eh_exception: {
>> -    if (ExceptionHandling) {
>> +    if (FuncInfo.needsExceptionHandling) {
>
> This is backwards.  If a function has invokes then it requires an EH  
> table.
> The only way to get the eh_exception intrinsic is to have an  
> invoke.  Thus if
> you see eh_exception then the function has an invoke so for sure you  
> want to
> lower it (unless eh has been globally turned off, which is what the  
> previous
> test was for).  There should be no test here.  You should really just
> substitute "true" for ExceptionHandling everywhere...
>
>> -    if (ExceptionHandling && MMI) {
>> +    if (FuncInfo.needsExceptionHandling && MMI) {
>
> Likewise for all the other examples of this.
>
>> -  if (LandingPad && ExceptionHandling && MMI) {
>> +  if (LandingPad && FuncInfo.needsExceptionHandling && MMI) {
>>     // Insert a label before the invoke call to mark the try  
>> range.  This can be
>
> Likewise: you're only getting here if you have an invoke, so no test
> is needed (see below also).
>
>> bool LowerInvoke::runOnFunction(Function &F) {
>> +  // If we will be generating exception info, don't do anything  
>> here.
>> +  if ((ExceptionHandling || !F.doesNotThrow()) &&
>> +      TLI &&
>> +      TLI->getTargetMachine().getTargetAsmInfo()->
>> +                              doesSupportExceptionHandling())
>> +    return false;
>
> The !F.doesNotThrow() test is bogus.  Also, what is  
> ExceptionHandling doing
> here?  Shouldn't the test be: do this if -enable-correct-eh-support  
> was
> specified and the target does not support exception handling?


Currently, if -enable-correct-eh-support is not on here, we simply  
change invokes to calls.  I could be persuaded that an error is better.




More information about the llvm-commits mailing list