mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-25 12:12:47 +01:00
0f20d48a09
This reapplies 36c64af9d7f97414d48681b74352c9684077259b in updated form. Emit the xdata for each function at .seh_endproc. This keeps the exact same output header order for most code generated by the LLVM CodeGen layer. (Sections still change order for code built from assembly where functions lack an explicit .seh_handlerdata directive, and functions with chained unwind info.) The practical effect should be that assembly output lacks superfluous ".seh_handlerdata; .text" pairs at the end of functions that don't handle exceptions, which allows such functions to use the AArch64 packed unwind format again. Differential Revision: https://reviews.llvm.org/D87448
71 lines
2.5 KiB
C++
71 lines
2.5 KiB
C++
//===- MCWin64EH.h - Machine Code Win64 EH support --------------*- C++ -*-===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// This file contains declarations to support the Win64 Exception Handling
|
|
// scheme in MC.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef LLVM_MC_MCWIN64EH_H
|
|
#define LLVM_MC_MCWIN64EH_H
|
|
|
|
#include "llvm/MC/MCWinEH.h"
|
|
#include "llvm/Support/Win64EH.h"
|
|
|
|
namespace llvm {
|
|
class MCStreamer;
|
|
class MCSymbol;
|
|
|
|
namespace Win64EH {
|
|
struct Instruction {
|
|
static WinEH::Instruction PushNonVol(MCSymbol *L, unsigned Reg) {
|
|
return WinEH::Instruction(Win64EH::UOP_PushNonVol, L, Reg, -1);
|
|
}
|
|
static WinEH::Instruction Alloc(MCSymbol *L, unsigned Size) {
|
|
return WinEH::Instruction(Size > 128 ? UOP_AllocLarge : UOP_AllocSmall, L,
|
|
-1, Size);
|
|
}
|
|
static WinEH::Instruction PushMachFrame(MCSymbol *L, bool Code) {
|
|
return WinEH::Instruction(UOP_PushMachFrame, L, -1, Code ? 1 : 0);
|
|
}
|
|
static WinEH::Instruction SaveNonVol(MCSymbol *L, unsigned Reg,
|
|
unsigned Offset) {
|
|
return WinEH::Instruction(Offset > 512 * 1024 - 8 ? UOP_SaveNonVolBig
|
|
: UOP_SaveNonVol,
|
|
L, Reg, Offset);
|
|
}
|
|
static WinEH::Instruction SaveXMM(MCSymbol *L, unsigned Reg,
|
|
unsigned Offset) {
|
|
return WinEH::Instruction(Offset > 512 * 1024 - 8 ? UOP_SaveXMM128Big
|
|
: UOP_SaveXMM128,
|
|
L, Reg, Offset);
|
|
}
|
|
static WinEH::Instruction SetFPReg(MCSymbol *L, unsigned Reg, unsigned Off) {
|
|
return WinEH::Instruction(UOP_SetFPReg, L, Reg, Off);
|
|
}
|
|
};
|
|
|
|
class UnwindEmitter : public WinEH::UnwindEmitter {
|
|
public:
|
|
void Emit(MCStreamer &Streamer) const override;
|
|
void EmitUnwindInfo(MCStreamer &Streamer, WinEH::FrameInfo *FI,
|
|
bool HandlerData) const override;
|
|
};
|
|
|
|
class ARM64UnwindEmitter : public WinEH::UnwindEmitter {
|
|
public:
|
|
void Emit(MCStreamer &Streamer) const override;
|
|
void EmitUnwindInfo(MCStreamer &Streamer, WinEH::FrameInfo *FI,
|
|
bool HandlerData) const override;
|
|
};
|
|
|
|
}
|
|
} // end namespace llvm
|
|
|
|
#endif
|