mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-11-07 12:07:17 +00:00
2aded1f5c7
The frame information stored in this structure is driven by the requirements for Windows NT unwinding rather than Windows 64 specifically. As a result, this type can be shared across multiple architectures (ARM, AXP, MIPS, PPC, SH). Rename this class in preparation for adding support for supporting unwinding information for Windows on ARM. Take the opportunity to constify the members as everything except the ChainedParent is read-only. This required some adjustment to the label handling. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@214663 91177308-0d34-0410-b5e6-96231b3b80d8
69 lines
2.3 KiB
C++
69 lines
2.3 KiB
C++
//===- MCWin64EH.h - Machine Code Win64 EH support --------------*- 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 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"
|
|
#include <vector>
|
|
|
|
namespace llvm {
|
|
class StringRef;
|
|
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 MCWin64EHUnwindEmitter {
|
|
public:
|
|
static StringRef GetSectionSuffix(const MCSymbol *func);
|
|
//
|
|
// This emits the unwind info sections (.pdata and .xdata in PE/COFF).
|
|
//
|
|
static void Emit(MCStreamer &streamer);
|
|
static void EmitUnwindInfo(MCStreamer &streamer, WinEH::FrameInfo *info);
|
|
};
|
|
} // end namespace llvm
|
|
|
|
#endif
|