mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2026-04-26 12:20:42 +00:00
[SEH] Reimplement x64 SEH using WinEHPrepare
This now emits simple, unoptimized xdata tables for __C_specific_handler based on the handlers listed in @llvm.eh.actions calls produced by WinEHPrepare. This adds support for running __finally blocks when exceptions are thrown, and removes the old landingpad fan-in codepath. I ran some manual execution tests on small basic test cases with and without optimization, as well as on Chrome base_unittests, which uses a small amount of SEH. I'm sure there are bugs, and we may need to revert. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@235154 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -51,6 +51,7 @@ namespace llvm {
|
||||
// Forward declarations.
|
||||
class Constant;
|
||||
class GlobalVariable;
|
||||
class BlockAddress;
|
||||
class MDNode;
|
||||
class MMIAddrLabelMap;
|
||||
class MachineBasicBlock;
|
||||
@@ -60,6 +61,14 @@ class PointerType;
|
||||
class StructType;
|
||||
struct WinEHFuncInfo;
|
||||
|
||||
struct SEHHandler {
|
||||
// Filter or finally function. Null indicates a catch-all.
|
||||
const Function *FilterOrFinally;
|
||||
|
||||
// Address of block to recover at. Null for a finally handler.
|
||||
const BlockAddress *RecoverBA;
|
||||
};
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
/// LandingPadInfo - This structure is used to retain landing pad info for
|
||||
/// the current function.
|
||||
@@ -68,7 +77,7 @@ struct LandingPadInfo {
|
||||
MachineBasicBlock *LandingPadBlock; // Landing pad block.
|
||||
SmallVector<MCSymbol *, 1> BeginLabels; // Labels prior to invoke.
|
||||
SmallVector<MCSymbol *, 1> EndLabels; // Labels after invoke.
|
||||
SmallVector<MCSymbol *, 1> ClauseLabels; // Labels for each clause.
|
||||
SmallVector<SEHHandler, 1> SEHHandlers; // SEH handlers active at this lpad.
|
||||
MCSymbol *LandingPadLabel; // Label at beginning of landing pad.
|
||||
const Function *Personality; // Personality function.
|
||||
std::vector<int> TypeIds; // List of type ids (filters negative).
|
||||
@@ -351,10 +360,11 @@ public:
|
||||
///
|
||||
void addCleanup(MachineBasicBlock *LandingPad);
|
||||
|
||||
/// Add a clause for a landing pad. Returns a new label for the clause. This
|
||||
/// is used by EH schemes that have more than one landing pad. In this case,
|
||||
/// each clause gets its own basic block.
|
||||
MCSymbol *addClauseForLandingPad(MachineBasicBlock *LandingPad);
|
||||
void addSEHCatchHandler(MachineBasicBlock *LandingPad, const Function *Filter,
|
||||
const BlockAddress *RecoverLabel);
|
||||
|
||||
void addSEHCleanupHandler(MachineBasicBlock *LandingPad,
|
||||
const Function *Cleanup);
|
||||
|
||||
/// getTypeIDFor - Return the type id for the specified typeinfo. This is
|
||||
/// function wide.
|
||||
|
||||
Reference in New Issue
Block a user