LLVM 23.0.0git
MCWin64EH.cpp File Reference

Go to the source code of this file.

Namespaces

namespace  llvm
 This is an optimization pass for GlobalISel generic memory operations.

Functions

static uint8_t CountOfUnwindCodes (std::vector< WinEH::Instruction > &Insns)
static void EmitAbsDifference (MCStreamer &Streamer, const MCSymbol *LHS, const MCSymbol *RHS)
static void EmitAbsDifference16 (MCStreamer &Streamer, const MCSymbol *LHS, const MCSymbol *RHS)
 Emit a 16-bit (2-byte LE) label difference.
static void EmitUnwindCode (MCStreamer &streamer, const MCSymbol *begin, WinEH::Instruction &inst)
static void EmitSymbolRefWithOfs (MCStreamer &streamer, const MCSymbol *Base, int64_t Offset)
static void EmitSymbolRefWithOfs (MCStreamer &streamer, const MCSymbol *Base, const MCSymbol *Other)
static void EmitRuntimeFunction (MCStreamer &streamer, const WinEH::FrameInfo *info)
static std::optional< int64_t > GetOptionalAbsDifference (const MCAssembler &Assembler, const MCSymbol *LHS, const MCSymbol *RHS)
static std::optional< uint16_tFindInPool (ArrayRef< uint8_t > Haystack, ArrayRef< uint8_t > Needle)
 Try to find Needle as a contiguous subsequence within Haystack.
static bool EpilogIpOffsetsMatch (const WinEH::FrameInfo::Epilog &A, const WinEH::FrameInfo::Epilog &B, const MCAssembler &Asm)
 Compare the relative IP offset arrays of two epilogs.
static void EmitUnwindInfoV3 (MCStreamer &Streamer, WinEH::FrameInfo *Info)
 Emit V3 UNWIND_INFO for a single frame.
static void EmitUnwindInfo (MCStreamer &streamer, WinEH::FrameInfo *info)
static const MCExprGetSubDivExpr (MCStreamer &Streamer, const MCSymbol *LHS, const MCSymbol *RHS, int Div)
static std::optional< int64_t > GetOptionalAbsDifference (MCStreamer &Streamer, const MCSymbol *LHS, const MCSymbol *RHS)
static int64_t GetAbsDifference (MCStreamer &Streamer, const MCSymbol *LHS, const MCSymbol *RHS)
static void checkARM64Instructions (MCStreamer &Streamer, ArrayRef< WinEH::Instruction > Insns, const MCSymbol *Begin, const MCSymbol *End, StringRef Name, StringRef Type)
static uint32_t ARM64CountOfUnwindCodes (ArrayRef< WinEH::Instruction > Insns)
static void ARM64EmitUnwindCode (MCStreamer &streamer, const WinEH::Instruction &inst)
static MCSymbolFindMatchingEpilog (const std::vector< WinEH::Instruction > &EpilogInstrs, const std::vector< MCSymbol * > &Epilogs, const WinEH::FrameInfo *info)
static void simplifyARM64Opcodes (std::vector< WinEH::Instruction > &Instructions, bool Reverse)
static int getARM64OffsetInProlog (const std::vector< WinEH::Instruction > &Prolog, const std::vector< WinEH::Instruction > &Epilog)
static int checkARM64PackedEpilog (MCStreamer &streamer, WinEH::FrameInfo *info, WinEH::FrameInfo::Segment *Seg, int PrologCodeBytes)
static bool tryARM64PackedUnwind (WinEH::FrameInfo *info, uint32_t FuncLength, int PackedEpilogOffset)
static void ARM64ProcessEpilogs (WinEH::FrameInfo *info, WinEH::FrameInfo::Segment *Seg, uint32_t &TotalCodeBytes, MapVector< MCSymbol *, uint32_t > &EpilogInfo)
static void ARM64FindSegmentsInFunction (MCStreamer &streamer, WinEH::FrameInfo *info, int64_t RawFuncLength)
static void ARM64EmitUnwindInfoForSegment (MCStreamer &streamer, WinEH::FrameInfo *info, WinEH::FrameInfo::Segment &Seg, bool TryPacked=true)
static void ARM64EmitUnwindInfo (MCStreamer &streamer, WinEH::FrameInfo *info, bool TryPacked=true)
static uint32_t ARMCountOfUnwindCodes (ArrayRef< WinEH::Instruction > Insns)
static uint32_t ARMCountOfInstructionBytes (ArrayRef< WinEH::Instruction > Insns, bool *HasCustom=nullptr)
static void checkARMInstructions (MCStreamer &Streamer, ArrayRef< WinEH::Instruction > Insns, const MCSymbol *Begin, const MCSymbol *End, StringRef Name, StringRef Type)
static bool isARMTerminator (const WinEH::Instruction &inst)
static void ARMEmitUnwindCode (MCStreamer &streamer, const WinEH::Instruction &inst)
static int getARMOffsetInProlog (const std::vector< WinEH::Instruction > &Prolog, const std::vector< WinEH::Instruction > &Epilog, bool CanTweakProlog)
static int checkARMPackedEpilog (MCStreamer &streamer, WinEH::FrameInfo *info, int PrologCodeBytes)
static bool parseRegMask (unsigned Mask, bool &HasLR, bool &HasR11, unsigned &Folded, int &IntRegs)
static bool tryARMPackedUnwind (MCStreamer &streamer, WinEH::FrameInfo *info, uint32_t FuncLength)
static void ARMEmitUnwindInfo (MCStreamer &streamer, WinEH::FrameInfo *info, bool TryPacked=true)
static void ARM64EmitRuntimeFunction (MCStreamer &streamer, const WinEH::FrameInfo *info)
static void ARMEmitRuntimeFunction (MCStreamer &streamer, const WinEH::FrameInfo *info)

Function Documentation

◆ ARM64CountOfUnwindCodes()

uint32_t ARM64CountOfUnwindCodes ( ArrayRef< WinEH::Instruction > Insns)
static

◆ ARM64EmitRuntimeFunction()

◆ ARM64EmitUnwindCode()

void ARM64EmitUnwindCode ( MCStreamer & streamer,
const WinEH::Instruction & inst )
static

Definition at line 1228 of file MCWin64EH.cpp.

References assert(), llvm::MCStreamer::emitInt8(), llvm_unreachable, Mode, llvm::Offset, llvm::WinEH::Instruction::Offset, llvm::WinEH::Instruction::Operation, llvm::WinEH::Instruction::Register, llvm::Win64EH::UOP_AddFP, llvm::Win64EH::UOP_AllocLarge, llvm::Win64EH::UOP_AllocMedium, llvm::Win64EH::UOP_AllocSmall, llvm::Win64EH::UOP_AllocZ, llvm::Win64EH::UOP_ClearUnwoundToCall, llvm::Win64EH::UOP_Context, llvm::Win64EH::UOP_ECContext, llvm::Win64EH::UOP_End, llvm::Win64EH::UOP_Nop, llvm::Win64EH::UOP_PACSignLR, llvm::Win64EH::UOP_PushMachFrame, llvm::Win64EH::UOP_SaveAnyRegD, llvm::Win64EH::UOP_SaveAnyRegDP, llvm::Win64EH::UOP_SaveAnyRegDPX, llvm::Win64EH::UOP_SaveAnyRegDX, llvm::Win64EH::UOP_SaveAnyRegI, llvm::Win64EH::UOP_SaveAnyRegIP, llvm::Win64EH::UOP_SaveAnyRegIPX, llvm::Win64EH::UOP_SaveAnyRegIX, llvm::Win64EH::UOP_SaveAnyRegQ, llvm::Win64EH::UOP_SaveAnyRegQP, llvm::Win64EH::UOP_SaveAnyRegQPX, llvm::Win64EH::UOP_SaveAnyRegQX, llvm::Win64EH::UOP_SaveFPLR, llvm::Win64EH::UOP_SaveFPLRX, llvm::Win64EH::UOP_SaveFReg, llvm::Win64EH::UOP_SaveFRegP, llvm::Win64EH::UOP_SaveFRegPX, llvm::Win64EH::UOP_SaveFRegX, llvm::Win64EH::UOP_SaveLRPair, llvm::Win64EH::UOP_SaveNext, llvm::Win64EH::UOP_SavePReg, llvm::Win64EH::UOP_SaveR19R20X, llvm::Win64EH::UOP_SaveReg, llvm::Win64EH::UOP_SaveRegP, llvm::Win64EH::UOP_SaveRegPX, llvm::Win64EH::UOP_SaveRegX, llvm::Win64EH::UOP_SaveZReg, llvm::Win64EH::UOP_SetFP, and llvm::Win64EH::UOP_TrapFrame.

Referenced by ARM64EmitUnwindInfoForSegment().

◆ ARM64EmitUnwindInfo()

◆ ARM64EmitUnwindInfoForSegment()

◆ ARM64FindSegmentsInFunction()

◆ ARM64ProcessEpilogs()

◆ ARMCountOfInstructionBytes()

◆ ARMCountOfUnwindCodes()

◆ ARMEmitRuntimeFunction()

◆ ARMEmitUnwindCode()

◆ ARMEmitUnwindInfo()

◆ checkARM64Instructions()

◆ checkARM64PackedEpilog()

◆ checkARMInstructions()

void checkARMInstructions ( MCStreamer & Streamer,
ArrayRef< WinEH::Instruction > Insns,
const MCSymbol * Begin,
const MCSymbol * End,
StringRef Name,
StringRef Type )
static

◆ checkARMPackedEpilog()

int checkARMPackedEpilog ( MCStreamer & streamer,
WinEH::FrameInfo * info,
int PrologCodeBytes )
static

◆ CountOfUnwindCodes()

◆ EmitAbsDifference()

◆ EmitAbsDifference16()

void EmitAbsDifference16 ( MCStreamer & Streamer,
const MCSymbol * LHS,
const MCSymbol * RHS )
static

Emit a 16-bit (2-byte LE) label difference.

If the difference is evaluatable at this point, validate that it fits in [0, UINT16_MAX] and emit it as a constant; otherwise emit a 16-bit fixup.

Definition at line 113 of file MCWin64EH.cpp.

References llvm::MCSymbolRefExpr::create(), llvm::MCBinaryExpr::createSub(), llvm::MCStreamer::emitValue(), llvm::MCObjectStreamer::getAssembler(), llvm::MCStreamer::getContext(), LHS, RHS, and llvm::Value.

Referenced by EmitUnwindInfoV3().

◆ EmitRuntimeFunction()

◆ EmitSymbolRefWithOfs() [1/2]

◆ EmitSymbolRefWithOfs() [2/2]

◆ EmitUnwindCode()

◆ EmitUnwindInfo()

◆ EmitUnwindInfoV3()

◆ EpilogIpOffsetsMatch()

bool EpilogIpOffsetsMatch ( const WinEH::FrameInfo::Epilog & A,
const WinEH::FrameInfo::Epilog & B,
const MCAssembler & Asm )
static

Compare the relative IP offset arrays of two epilogs.

Definition at line 413 of file MCWin64EH.cpp.

References A(), B(), GetOptionalAbsDifference(), and I.

Referenced by EmitUnwindInfoV3().

◆ FindInPool()

std::optional< uint16_t > FindInPool ( ArrayRef< uint8_t > Haystack,
ArrayRef< uint8_t > Needle )
static

Try to find Needle as a contiguous subsequence within Haystack.

Returns the byte offset if found, or std::nullopt.

Definition at line 402 of file MCWin64EH.cpp.

References assert(), llvm::ArrayRef< T >::begin(), llvm::ArrayRef< T >::empty(), and llvm::ArrayRef< T >::end().

Referenced by EmitUnwindInfoV3().

◆ FindMatchingEpilog()

MCSymbol * FindMatchingEpilog ( const std::vector< WinEH::Instruction > & EpilogInstrs,
const std::vector< MCSymbol * > & Epilogs,
const WinEH::FrameInfo * info )
static

Definition at line 1465 of file MCWin64EH.cpp.

References assert(), and info.

Referenced by ARM64ProcessEpilogs(), and ARMEmitUnwindInfo().

◆ GetAbsDifference()

int64_t GetAbsDifference ( MCStreamer & Streamer,
const MCSymbol * LHS,
const MCSymbol * RHS )
static

◆ getARM64OffsetInProlog()

int getARM64OffsetInProlog ( const std::vector< WinEH::Instruction > & Prolog,
const std::vector< WinEH::Instruction > & Epilog )
static

Definition at line 1547 of file MCWin64EH.cpp.

References ARM64CountOfUnwindCodes(), Epilog, I, and Prolog.

Referenced by ARM64ProcessEpilogs(), and checkARM64PackedEpilog().

◆ getARMOffsetInProlog()

int getARMOffsetInProlog ( const std::vector< WinEH::Instruction > & Prolog,
const std::vector< WinEH::Instruction > & Epilog,
bool CanTweakProlog )
static

◆ GetOptionalAbsDifference() [1/2]

◆ GetOptionalAbsDifference() [2/2]

std::optional< int64_t > GetOptionalAbsDifference ( MCStreamer & Streamer,
const MCSymbol * LHS,
const MCSymbol * RHS )
static

◆ GetSubDivExpr()

◆ isARMTerminator()

◆ parseRegMask()

bool parseRegMask ( unsigned Mask,
bool & HasLR,
bool & HasR11,
unsigned & Folded,
int & IntRegs )
static

Definition at line 2680 of file MCWin64EH.cpp.

References llvm::First, IntRegs, and N.

Referenced by tryARMPackedUnwind().

◆ simplifyARM64Opcodes()

◆ tryARM64PackedUnwind()

bool tryARM64PackedUnwind ( WinEH::FrameInfo * info,
uint32_t FuncLength,
int PackedEpilogOffset )
static

Definition at line 1611 of file MCWin64EH.cpp.

References assert(), H, info, IntRegs, llvm::WinEH::Instruction::Offset, llvm::WinEH::Instruction::Operation, llvm::WinEH::Instruction::Register, llvm::report_fatal_error(), llvm::Win64EH::UOP_AddFP, llvm::Win64EH::UOP_AllocLarge, llvm::Win64EH::UOP_AllocMedium, llvm::Win64EH::UOP_AllocSmall, llvm::Win64EH::UOP_AllocZ, llvm::Win64EH::UOP_ClearUnwoundToCall, llvm::Win64EH::UOP_Context, llvm::Win64EH::UOP_ECContext, llvm::Win64EH::UOP_End, llvm::Win64EH::UOP_Nop, llvm::Win64EH::UOP_PACSignLR, llvm::Win64EH::UOP_PushMachFrame, llvm::Win64EH::UOP_SaveAnyRegD, llvm::Win64EH::UOP_SaveAnyRegDP, llvm::Win64EH::UOP_SaveAnyRegDPX, llvm::Win64EH::UOP_SaveAnyRegDX, llvm::Win64EH::UOP_SaveAnyRegI, llvm::Win64EH::UOP_SaveAnyRegIP, llvm::Win64EH::UOP_SaveAnyRegIPX, llvm::Win64EH::UOP_SaveAnyRegIX, llvm::Win64EH::UOP_SaveAnyRegQ, llvm::Win64EH::UOP_SaveAnyRegQP, llvm::Win64EH::UOP_SaveAnyRegQPX, llvm::Win64EH::UOP_SaveAnyRegQX, llvm::Win64EH::UOP_SaveFPLR, llvm::Win64EH::UOP_SaveFPLRX, llvm::Win64EH::UOP_SaveFReg, llvm::Win64EH::UOP_SaveFRegP, llvm::Win64EH::UOP_SaveFRegPX, llvm::Win64EH::UOP_SaveFRegX, llvm::Win64EH::UOP_SaveLRPair, llvm::Win64EH::UOP_SaveNext, llvm::Win64EH::UOP_SavePReg, llvm::Win64EH::UOP_SaveR19R20X, llvm::Win64EH::UOP_SaveReg, llvm::Win64EH::UOP_SaveRegP, llvm::Win64EH::UOP_SaveRegPX, llvm::Win64EH::UOP_SaveRegX, llvm::Win64EH::UOP_SaveZReg, llvm::Win64EH::UOP_SetFP, and llvm::Win64EH::UOP_TrapFrame.

Referenced by ARM64EmitUnwindInfoForSegment().

◆ tryARMPackedUnwind()