mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-25 20:23:11 +01:00
00daa6cd20
Summary: Now that there is a one-to-one mapping from MachineFunction to WinEHFuncInfo, we don't need to use a DenseMap to select the right WinEHFuncInfo for the current funclet. The main challenge here is that X86WinEHStatePass is an IR pass that doesn't have access to the MachineFunction. I gave it its own WinEHFuncInfo object that it uses to calculate state numbers, which it then throws away. As long as nobody creates or removes EH pads between this pass and SDAG construction, we will get the same state numbers. The other thing X86WinEHStatePass does is to mark the EH registration node. Instead of communicating which alloca was the registration through WinEHFuncInfo, I added the llvm.x86.seh.ehregnode intrinsic. This intrinsic generates no code and simply marks the alloca in use. Reviewers: JCTremoulet Subscribers: llvm-commits Differential Revision: http://reviews.llvm.org/D14668 llvm-svn: 253378
107 lines
3.9 KiB
C++
107 lines
3.9 KiB
C++
//===-- WinException.h - Windows Exception Handling ----------*- C++ -*--===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// This file contains support for writing windows exception info into asm files.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef LLVM_LIB_CODEGEN_ASMPRINTER_WIN64EXCEPTION_H
|
|
#define LLVM_LIB_CODEGEN_ASMPRINTER_WIN64EXCEPTION_H
|
|
|
|
#include "EHStreamer.h"
|
|
|
|
namespace llvm {
|
|
class Function;
|
|
class GlobalValue;
|
|
class MachineFunction;
|
|
class MCExpr;
|
|
class Value;
|
|
struct WinEHFuncInfo;
|
|
|
|
class LLVM_LIBRARY_VISIBILITY WinException : public EHStreamer {
|
|
/// Per-function flag to indicate if personality info should be emitted.
|
|
bool shouldEmitPersonality = false;
|
|
|
|
/// Per-function flag to indicate if the LSDA should be emitted.
|
|
bool shouldEmitLSDA = false;
|
|
|
|
/// Per-function flag to indicate if frame moves info should be emitted.
|
|
bool shouldEmitMoves = false;
|
|
|
|
/// True if this is a 64-bit target and we should use image relative offsets.
|
|
bool useImageRel32 = false;
|
|
|
|
/// Pointer to the current funclet entry BB.
|
|
const MachineBasicBlock *CurrentFuncletEntry = nullptr;
|
|
|
|
void emitCSpecificHandlerTable(const MachineFunction *MF);
|
|
|
|
void emitSEHActionsForRange(const WinEHFuncInfo &FuncInfo,
|
|
const MCSymbol *BeginLabel,
|
|
const MCSymbol *EndLabel, int State);
|
|
|
|
/// Emit the EH table data for 32-bit and 64-bit functions using
|
|
/// the __CxxFrameHandler3 personality.
|
|
void emitCXXFrameHandler3Table(const MachineFunction *MF);
|
|
|
|
/// Emit the EH table data for _except_handler3 and _except_handler4
|
|
/// personality functions. These are only used on 32-bit and do not use CFI
|
|
/// tables.
|
|
void emitExceptHandlerTable(const MachineFunction *MF);
|
|
|
|
void emitCLRExceptionTable(const MachineFunction *MF);
|
|
|
|
void computeIP2StateTable(
|
|
const MachineFunction *MF, const WinEHFuncInfo &FuncInfo,
|
|
SmallVectorImpl<std::pair<const MCExpr *, int>> &IPToStateTable);
|
|
|
|
/// Emits the label used with llvm.x86.seh.recoverfp, which is used by
|
|
/// outlined funclets.
|
|
void emitEHRegistrationOffsetLabel(const WinEHFuncInfo &FuncInfo,
|
|
StringRef FLinkageName);
|
|
|
|
const MCExpr *create32bitRef(const MCSymbol *Value);
|
|
const MCExpr *create32bitRef(const GlobalValue *GV);
|
|
const MCExpr *getLabelPlusOne(const MCSymbol *Label);
|
|
const MCExpr *getOffset(const MCSymbol *OffsetOf, const MCSymbol *OffsetFrom);
|
|
const MCExpr *getOffsetPlusOne(const MCSymbol *OffsetOf,
|
|
const MCSymbol *OffsetFrom);
|
|
|
|
/// Gets the offset that we should use in a table for a stack object with the
|
|
/// given index. For targets using CFI (Win64, etc), this is relative to the
|
|
/// established SP at the end of the prologue. For targets without CFI (Win32
|
|
/// only), it is relative to the frame pointer.
|
|
int getFrameIndexOffset(int FrameIndex, const WinEHFuncInfo &FuncInfo);
|
|
|
|
public:
|
|
//===--------------------------------------------------------------------===//
|
|
// Main entry points.
|
|
//
|
|
WinException(AsmPrinter *A);
|
|
~WinException() override;
|
|
|
|
/// Emit all exception information that should come after the content.
|
|
void endModule() override;
|
|
|
|
/// Gather pre-function exception information. Assumes being emitted
|
|
/// immediately after the function entry point.
|
|
void beginFunction(const MachineFunction *MF) override;
|
|
|
|
/// Gather and emit post-function exception information.
|
|
void endFunction(const MachineFunction *) override;
|
|
|
|
/// \brief Emit target-specific EH funclet machinery.
|
|
void beginFunclet(const MachineBasicBlock &MBB, MCSymbol *Sym) override;
|
|
void endFunclet() override;
|
|
};
|
|
}
|
|
|
|
#endif
|
|
|