@@ -1708,15 +1708,32 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
1708
1708
let mut cs_bx = Bx :: build ( self . cx , llbb) ;
1709
1709
let cs = cs_bx. catch_switch ( None , None , & [ cp_llbb] ) ;
1710
1710
1711
- // The "null" here is actually a RTTI type descriptor for the
1712
- // C++ personality function, but `catch (...)` has no type so
1713
- // it's null. The 64 here is actually a bitfield which
1714
- // represents that this is a catch-all block.
1715
1711
bx = Bx :: build ( self . cx , cp_llbb) ;
1716
1712
let null =
1717
1713
bx. const_null ( bx. type_ptr_ext ( bx. cx ( ) . data_layout ( ) . instruction_address_space ) ) ;
1718
- let sixty_four = bx. const_i32 ( 64 ) ;
1719
- funclet = Some ( bx. catch_pad ( cs, & [ null, sixty_four, null] ) ) ;
1714
+
1715
+ // The `null` in first argument here is actually a RTTI type
1716
+ // descriptor for the C++ personality function, but `catch (...)`
1717
+ // has no type so it's null.
1718
+ let args = if base:: wants_msvc_seh ( self . cx . sess ( ) ) {
1719
+ // This bitmask is a single `HT_IsStdDotDot` flag, which
1720
+ // represents that this is a C++-style `catch (...)` block that
1721
+ // only captures programmatic exceptions, not all SEH
1722
+ // exceptions. The second `null` points to a non-existent
1723
+ // `alloca` instruction, which an LLVM pass would inline into
1724
+ // the initial SEH frame allocation.
1725
+ let adjectives = bx. const_i32 ( 0x40 ) ;
1726
+ & [ null, adjectives, null] as & [ _ ]
1727
+ } else {
1728
+ // Specifying more arguments than necessary usually doesn't
1729
+ // hurt, but the `WasmEHPrepare` LLVM pass does not recognize
1730
+ // anything other than a single `null` as a `catch (...)` block,
1731
+ // leading to problems down the line during instruction
1732
+ // selection.
1733
+ & [ null] as & [ _ ]
1734
+ } ;
1735
+
1736
+ funclet = Some ( bx. catch_pad ( cs, args) ) ;
1720
1737
} else {
1721
1738
llbb = Bx :: append_block ( self . cx , self . llfn , "terminate" ) ;
1722
1739
bx = Bx :: build ( self . cx , llbb) ;
0 commit comments