[WinEH] Fill out CatchHigh in the TryBlockMap
authorDavid Majnemer <david.majnemer@gmail.com>
Fri, 3 Apr 2015 23:37:34 +0000 (23:37 +0000)
committerDavid Majnemer <david.majnemer@gmail.com>
Fri, 3 Apr 2015 23:37:34 +0000 (23:37 +0000)
Now all fields in the WinEH xdata have been filled out.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@234067 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/CodeGen/WinEHFuncInfo.h
lib/CodeGen/AsmPrinter/Win64Exception.cpp
lib/CodeGen/SelectionDAG/FunctionLoweringInfo.cpp
test/CodeGen/WinEH/cppeh-prepared-catch.ll

index 732b5d249523b41c0b2210b3f5161f48b78eb3f4..9b826754015f1dd33ac9ab3464143553705ddcc1 100644 (file)
@@ -128,7 +128,6 @@ struct WinEHHandlerType {
 struct WinEHTryBlockMapEntry {
   int TryLow;
   int TryHigh;
-  int CatchHigh;
   SmallVector<WinEHHandlerType, 1> HandlerArray;
 };
 
@@ -136,6 +135,7 @@ struct WinEHFuncInfo {
   DenseMap<const LandingPadInst *, int> LandingPadStateMap;
   DenseMap<const Function *, int> CatchHandlerParentFrameObjIdx;
   DenseMap<const Function *, int> CatchHandlerParentFrameObjOffset;
+  DenseMap<const Function *, int> CatchHandlerMaxState;
   SmallVector<WinEHUnwindMapEntry, 4> UnwindMap;
   SmallVector<WinEHTryBlockMapEntry, 4> TryBlockMap;
   SmallVector<std::pair<MCSymbol *, int>, 4> IPToStateList;
index 676ce65dedb1ffb0087e1533ea27500a3bb56850..3bfcaa96593dac666f3b440dcec01380c680c2e7 100644 (file)
@@ -421,11 +421,16 @@ void Win64Exception::emitCXXFrameHandler3Table(const MachineFunction *MF) {
 
       HandlerMaps.push_back(HandlerMapXData);
 
+      int CatchHigh = -1;
+      for (WinEHHandlerType &HT : TBME.HandlerArray)
+        CatchHigh =
+            std::max(CatchHigh, FuncInfo.CatchHandlerMaxState[HT.Handler]);
+
       assert(TBME.TryLow <= TBME.TryHigh);
-      assert(TBME.CatchHigh > TBME.TryHigh);
+      assert(CatchHigh > TBME.TryHigh);
       OS.EmitIntValue(TBME.TryLow, 4);                    // TryLow
       OS.EmitIntValue(TBME.TryHigh, 4);                   // TryHigh
-      OS.EmitIntValue(TBME.CatchHigh, 4);                 // CatchHigh
+      OS.EmitIntValue(CatchHigh, 4);                      // CatchHigh
       OS.EmitIntValue(TBME.HandlerArray.size(), 4);       // NumCatches
       OS.EmitValue(createImageRel32(HandlerMapXData), 4); // HandlerArray
     }
index bfaab9e6b6b68123c440afc3ec8c185d94a1e8f2..4547906c275522e94eda97cee3d9c3a5c171e548 100644 (file)
@@ -300,11 +300,7 @@ void WinEHNumbering::createTryBlockMapEntry(int TryLow, int TryHigh,
   WinEHTryBlockMapEntry TBME;
   TBME.TryLow = TryLow;
   TBME.TryHigh = TryHigh;
-  // FIXME: This should be revisited when we want to throw inside a catch
-  // handler.
-  TBME.CatchHigh = INT_MAX;
   assert(TBME.TryLow <= TBME.TryHigh);
-  assert(TBME.CatchHigh > TBME.TryHigh);
   for (CatchHandler *CH : Handlers) {
     WinEHHandlerType HT;
     if (CH->getSelector()->isNullValue()) {
@@ -444,6 +440,8 @@ void WinEHNumbering::calculateStateNumbers(const Function &F) {
     ActionList.clear();
     FuncInfo.LandingPadStateMap[LPI] = currentEHNumber();
   }
+
+  FuncInfo.CatchHandlerMaxState[&F] = NextState - 1;
 }
 
 /// clear - Clear out all the function-specific state. This returns this
index 937b216edbdfaa771472f583157f1ef610b44f6d..7c53085edc55746a059a2db3b691bc02a2eca8c7 100644 (file)
@@ -137,12 +137,12 @@ try.cont8:                                        ; preds = %lpad2, %try.cont
 ; CHECK-NEXT:"$tryMap$?f@@YAXXZ":
 ; CHECK-NEXT:        .long   1
 ; CHECK-NEXT:        .long   1
-; CHECK-NEXT:        .long   2147483647
+; CHECK-NEXT:        .long   2
 ; CHECK-NEXT:        .long   1
 ; CHECK-NEXT:        .long   ("$handlerMap$0$?f@@YAXXZ")@IMGREL
 ; CHECK-NEXT:        .long   0
 ; CHECK-NEXT:        .long   2
-; CHECK-NEXT:        .long   2147483647
+; CHECK-NEXT:        .long   3
 ; CHECK-NEXT:        .long   1
 ; CHECK-NEXT:        .long   ("$handlerMap$1$?f@@YAXXZ")@IMGREL
 ; CHECK-NEXT:"$handlerMap$0$?f@@YAXXZ":