[PATCH] D77936: [Windows SEH] Fix abnormal-exits in _try

Ten Tzen via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Sun Apr 12 14:25:15 PDT 2020


tentzen added a comment.

In D77936#1976938 <https://reviews.llvm.org/D77936#1976938>, @efriedma wrote:

> Instead of asserting there are less than 256 cleanup destinations, can you emit an icmp against zero, or something like that?


I did consider that. but it splits the block and induces one compare and one branch in _try exit sequence for something that will not happen in RWC.  And it's hard for Optimizer to deal with it.  Optimizer can probably can tail-duplicate each path at the expense of code size which I don't think LLVM would do today.  Do you really think it's worth to split the block here? thanks



================
Comment at: clang/lib/CodeGen/CGException.cpp:1651
+      llvm::Value* Load = CGF.Builder.CreateLoad(Addr, "cleanup.dest");
+      IsForEH = CGF.Builder.CreateTrunc(Load, CGM.Int8Ty);
+    }
----------------
efriedma wrote:
> Is just truncating the value really correct?  What's the possible range of values stored in getNormalCleanupDestSlot()?
Good question! 
Usually the number in NormalCleanupDestSlot is single digit (or at most double-digit) , the totoal number of Jump Destinations (return/goto/break/continue/..)  in the function.  
I thought about widening 1st arg from CHAR to unsigned, but dropped the idea as it seems unnecessary.  Yes, someone can write a code to make more than 255 Jumps in a function,  but it’s unlikely to happen in real world code.  What do you think?
I can go either way..
For sure, we can add an assert to catch it.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D77936/new/

https://reviews.llvm.org/D77936





More information about the cfe-commits mailing list