38 useImageRel32 = (
A->getDataLayout().getPointerSizeInBits() == 64);
39 isAArch64 =
Asm->TM.getTargetTriple().isAArch64();
40 isThumb =
Asm->TM.getTargetTriple().isThumb();
48 auto &OS = *
Asm->OutStreamer;
51 if (
F.hasFnAttribute(
"safeseh"))
52 OS.emitCOFFSafeSEH(
Asm->getSymbol(&
F));
54 if (M->getModuleFlag(
"ehcontguard") && !EHContTargets.empty()) {
56 OS.switchSection(
Asm->OutContext.getObjectFileInfo()->getGEHContSection());
57 for (
const MCSymbol *S : EHContTargets) {
58 OS.emitCOFFSymbolIndex(S);
64 shouldEmitMoves = shouldEmitPersonality = shouldEmitLSDA =
false;
72 shouldEmitMoves =
Asm->needsSEHMoves() && MF->
hasWinCFI();
79 if (
F.hasPersonalityFn()) {
84 bool forceEmitPersonality =
F.hasPersonalityFn() &&
86 F.needsUnwindTableEntry();
88 shouldEmitPersonality =
89 forceEmitPersonality || ((hasLandingPads || hasEHFunclets) &&
93 shouldEmitLSDA = shouldEmitPersonality &&
98 if (!
Asm->MAI->usesWindowsCFI()) {
106 emitEHRegistrationOffsetLabel(FuncInfo, FLinkageName);
108 shouldEmitLSDA = hasEHFunclets;
109 shouldEmitPersonality =
false;
117 if (isAArch64 && CurrentFuncletEntry &&
118 (shouldEmitMoves || shouldEmitPersonality))
119 Asm->OutStreamer->emitWinCFIFuncletOrFuncEnd();
125 if (!shouldEmitPersonality && !shouldEmitMoves && !shouldEmitLSDA)
130 if (
F.hasPersonalityFn())
139 if (shouldEmitPersonality || shouldEmitLSDA) {
140 Asm->OutStreamer->pushSection();
143 MCSection *XData =
Asm->OutStreamer->getAssociatedXDataSection(
144 Asm->OutStreamer->getCurrentSectionOnly());
145 Asm->OutStreamer->switchSection(XData);
150 emitCSpecificHandlerTable(MF);
152 emitExceptHandlerTable(MF);
154 emitCXXFrameHandler3Table(MF);
156 emitCLRExceptionTable(MF);
160 Asm->OutStreamer->popSection();
183 StringRef HandlerPrefix =
MBB->isCleanupFuncletEntry() ?
"dtor" :
"catch";
184 return Ctx.getOrCreateSymbol(
"?" + HandlerPrefix +
"$" +
186 FuncLinkageName +
"@4HA");
191 CurrentFuncletEntry = &
MBB;
199 Asm->OutStreamer->beginCOFFSymbolDef(Sym);
203 Asm->OutStreamer->endCOFFSymbolDef();
207 Asm->emitAlignment(std::max(
Asm->MF->getAlignment(),
MBB.getAlignment()),
211 Asm->OutStreamer->emitLabel(Sym);
215 if (shouldEmitMoves || shouldEmitPersonality) {
216 CurrentFuncletTextSection =
Asm->OutStreamer->getCurrentSectionOnly();
217 Asm->OutStreamer->emitWinCFIStartProc(Sym);
220 if (shouldEmitPersonality) {
225 if (
F.hasPersonalityFn())
235 if (!CurrentFuncletEntry->isCleanupFuncletEntry())
236 Asm->OutStreamer->emitWinEHHandler(PersHandlerSym,
true,
true);
241 if (isAArch64 && CurrentFuncletEntry &&
242 (shouldEmitMoves || shouldEmitPersonality)) {
243 Asm->OutStreamer->switchSection(CurrentFuncletTextSection);
244 Asm->OutStreamer->emitWinCFIFuncletOrFuncEnd();
249void WinException::endFuncletImpl() {
251 if (!CurrentFuncletEntry)
255 if (shouldEmitMoves || shouldEmitPersonality) {
258 if (
F.hasPersonalityFn())
270 Twine(
"$cppxdata$", FuncLinkageName));
279 emitCSpecificHandlerTable(MF);
280 }
else if (shouldEmitPersonality || shouldEmitLSDA) {
282 Asm->OutStreamer->emitWinEHHandlerData();
300 Asm->OutStreamer->switchSection(CurrentFuncletTextSection);
301 Asm->OutStreamer->emitWinCFIEndProc();
305 CurrentFuncletEntry =
nullptr;
318 return create32bitRef(
Asm->getSymbol(GV));
333const MCExpr *WinException::getOffsetPlusOne(
const MCSymbol *OffsetOf,
340int WinException::getFrameIndexOffset(
int FrameIndex,
342 const TargetFrameLowering &TFI = *
Asm->MF->getSubtarget().getFrameLowering();
344 if (
Asm->MAI->usesWindowsCFI()) {
349 Asm->MF->getSubtarget()
351 ->getStackPointerRegisterToSaveRestore());
361 "Frame offsets with a scalable component are not supported");
368const int NullState = -1;
370struct InvokeStateChange {
392class InvokeStateChangeIterator {
393 InvokeStateChangeIterator(
const WinEHFuncInfo &EHInfo,
398 : EHInfo(EHInfo), MFI(MFI), MFE(MFE),
MBBI(
MBBI), BaseState(BaseState) {
399 LastStateChange.PreviousEndLabel =
nullptr;
400 LastStateChange.NewStartLabel =
nullptr;
401 LastStateChange.NewState = BaseState;
412 auto BlockBegin = Begin->begin();
413 auto BlockEnd = std::prev(End)->end();
415 InvokeStateChangeIterator(EHInfo, Begin, End, BlockBegin, BaseState),
416 InvokeStateChangeIterator(EHInfo, End, End, BlockEnd, BaseState));
420 bool operator==(
const InvokeStateChangeIterator &O)
const {
421 assert(BaseState ==
O.BaseState);
432 return CurrentEndLabel ==
O.CurrentEndLabel;
435 bool operator!=(
const InvokeStateChangeIterator &O)
const {
438 InvokeStateChange &
operator*() {
return LastStateChange; }
439 InvokeStateChange *operator->() {
return &LastStateChange; }
440 InvokeStateChangeIterator &operator++() {
return scan(); }
443 InvokeStateChangeIterator &scan();
445 const WinEHFuncInfo &EHInfo;
446 const MCSymbol *CurrentEndLabel =
nullptr;
450 InvokeStateChange LastStateChange;
451 bool VisitingInvoke =
false;
457InvokeStateChangeIterator &InvokeStateChangeIterator::scan() {
458 bool IsNewBlock =
false;
459 for (; MFI != MFE; ++MFI, IsNewBlock =
true) {
462 for (
auto MBBE = MFI->end();
MBBI != MBBE; ++
MBBI) {
464 if (!VisitingInvoke && LastStateChange.NewState != BaseState &&
469 LastStateChange.PreviousEndLabel = CurrentEndLabel;
470 LastStateChange.NewStartLabel =
nullptr;
471 LastStateChange.NewState = BaseState;
472 CurrentEndLabel =
nullptr;
482 if (Label == CurrentEndLabel) {
483 VisitingInvoke =
false;
490 auto &StateAndEnd = InvokeMapIter->second;
491 int NewState = StateAndEnd.first;
494 VisitingInvoke =
true;
495 if (NewState == LastStateChange.NewState) {
498 CurrentEndLabel = StateAndEnd.second;
502 LastStateChange.PreviousEndLabel = CurrentEndLabel;
503 LastStateChange.NewStartLabel =
Label;
504 LastStateChange.NewState = NewState;
506 CurrentEndLabel = StateAndEnd.second;
513 if (LastStateChange.NewState != BaseState) {
515 LastStateChange.PreviousEndLabel = CurrentEndLabel;
516 LastStateChange.NewStartLabel =
nullptr;
517 LastStateChange.NewState = BaseState;
519 assert(CurrentEndLabel !=
nullptr);
523 CurrentEndLabel =
nullptr;
555void WinException::emitCSpecificHandlerTable(
const MachineFunction *MF) {
556 auto &OS = *
Asm->OutStreamer;
557 MCContext &Ctx =
Asm->OutContext;
560 bool VerboseAsm = OS.isVerboseAsm();
561 auto AddComment = [&](
const Twine &
Comment) {
563 OS.AddComment(Comment);
569 StringRef FLinkageName =
573 const MCExpr *MCOffset =
575 Asm->OutStreamer->emitAssignment(ParentFrameOffset, MCOffset);
584 const MCExpr *LabelDiff = getOffset(TableEnd, TableBegin);
587 AddComment(
"Number of call sites");
588 OS.emitValue(EntryCount, 4);
590 OS.emitLabel(TableBegin);
599 const MCSymbol *LastStartLabel =
nullptr;
600 int LastEHState = -1;
605 while (Stop != End && !Stop->isEHFuncletEntry())
607 for (
const auto &StateChange :
608 InvokeStateChangeIterator::range(FuncInfo, MF->
begin(), Stop)) {
611 if (LastEHState != -1)
612 emitSEHActionsForRange(FuncInfo, LastStartLabel,
613 StateChange.PreviousEndLabel, LastEHState);
614 LastStartLabel = StateChange.NewStartLabel;
615 LastEHState = StateChange.NewState;
618 OS.emitLabel(TableEnd);
621void WinException::emitSEHActionsForRange(
const WinEHFuncInfo &FuncInfo,
623 const MCSymbol *EndLabel,
int State) {
624 auto &OS = *
Asm->OutStreamer;
625 MCContext &Ctx =
Asm->OutContext;
626 bool VerboseAsm = OS.isVerboseAsm();
627 auto AddComment = [&](
const Twine &
Comment) {
629 OS.AddComment(Comment);
632 assert(BeginLabel && EndLabel);
633 while (State != -1) {
634 const SEHUnwindMapEntry &UME = FuncInfo.
SEHUnwindMap[State];
635 const MCExpr *FilterOrFinally;
636 const MCExpr *ExceptOrNull;
644 FilterOrFinally = UME.
Filter ? create32bitRef(UME.
Filter)
645 : MCConstantExpr::create(1, Ctx);
646 ExceptOrNull = create32bitRef(Handler->getSymbol());
649 AddComment(
"LabelStart");
650 OS.emitValue(getLabel(BeginLabel), 4);
651 AddComment(
"LabelEnd");
652 OS.emitValue(getLabel(EndLabel), 4);
653 AddComment(UME.
IsFinally ?
"FinallyFunclet" : UME.
Filter ?
"FilterFunction"
655 OS.emitValue(FilterOrFinally, 4);
656 AddComment(UME.
IsFinally ?
"Null" :
"ExceptionHandler");
657 OS.emitValue(ExceptOrNull, 4);
664void WinException::emitCXXFrameHandler3Table(
const MachineFunction *MF) {
666 auto &OS = *
Asm->OutStreamer;
673 if (shouldEmitPersonality) {
677 Asm->OutContext.getOrCreateSymbol(Twine(
"$cppxdata$", FuncLinkageName));
678 computeIP2StateTable(MF, FuncInfo, IPToStateTable);
680 FuncInfoXData =
Asm->OutContext.getOrCreateLSDASymbol(FuncLinkageName);
683 int UnwindHelpOffset = 0;
688 if (
Asm->MAI->usesWindowsCFI() &&
694 MCSymbol *TryBlockMapXData =
nullptr;
697 UnwindMapXData =
Asm->OutContext.getOrCreateSymbol(
698 Twine(
"$stateUnwindMap$", FuncLinkageName));
701 Asm->OutContext.getOrCreateSymbol(Twine(
"$tryMap$", FuncLinkageName));
702 if (!IPToStateTable.
empty())
704 Asm->OutContext.getOrCreateSymbol(Twine(
"$ip2state$", FuncLinkageName));
706 bool VerboseAsm = OS.isVerboseAsm();
707 auto AddComment = [&](
const Twine &
Comment) {
709 OS.AddComment(Comment);
727 OS.emitValueToAlignment(
Align(4));
728 OS.emitLabel(FuncInfoXData);
730 AddComment(
"MagicNumber");
731 OS.emitInt32(0x19930522);
733 AddComment(
"MaxState");
736 AddComment(
"UnwindMap");
737 OS.emitValue(create32bitRef(UnwindMapXData), 4);
739 AddComment(
"NumTryBlocks");
742 AddComment(
"TryBlockMap");
743 OS.emitValue(create32bitRef(TryBlockMapXData), 4);
745 AddComment(
"IPMapEntries");
746 OS.emitInt32(IPToStateTable.
size());
748 AddComment(
"IPToStateXData");
749 OS.emitValue(create32bitRef(IPToStateXData), 4);
751 if (
Asm->MAI->usesWindowsCFI() &&
753 AddComment(
"UnwindHelp");
754 OS.emitInt32(UnwindHelpOffset);
757 AddComment(
"ESTypeList");
760 AddComment(
"EHFlags");
761 if (
MMI->getModule()->getModuleFlag(
"eh-asynch")) {
771 if (UnwindMapXData) {
772 OS.emitLabel(UnwindMapXData);
773 for (
const CxxUnwindMapEntry &UME : FuncInfo.
CxxUnwindMap) {
776 AddComment(
"ToState");
779 AddComment(
"Action");
780 OS.emitValue(create32bitRef(CleanupSym), 4);
791 if (TryBlockMapXData) {
792 OS.emitLabel(TryBlockMapXData);
795 const WinEHTryBlockMapEntry &TBME = FuncInfo.
TryBlockMap[
I];
797 MCSymbol *HandlerMapXData =
nullptr;
800 Asm->OutContext.getOrCreateSymbol(Twine(
"$handlerMap$")
803 .
concat(FuncLinkageName));
811 "bad trymap interval");
813 AddComment(
"TryLow");
814 OS.emitInt32(TBME.
TryLow);
816 AddComment(
"TryHigh");
819 AddComment(
"CatchHigh");
822 AddComment(
"NumCatches");
825 AddComment(
"HandlerArray");
826 OS.emitValue(create32bitRef(HandlerMapXData), 4);
830 unsigned ParentFrameOffset = 0;
831 if (shouldEmitPersonality) {
837 const WinEHTryBlockMapEntry &TBME = FuncInfo.
TryBlockMap[
I];
838 MCSymbol *HandlerMapXData = HandlerMaps[
I];
839 if (!HandlerMapXData)
848 OS.emitLabel(HandlerMapXData);
853 const MCExpr *FrameAllocOffsetRef =
nullptr;
856 assert(
Offset != 0 &&
"Illegal offset for catch object!");
865 AddComment(
"Adjectives");
871 AddComment(
"CatchObjOffset");
872 OS.emitValue(FrameAllocOffsetRef, 4);
874 AddComment(
"Handler");
875 OS.emitValue(create32bitRef(HandlerSym), 4);
877 if (shouldEmitPersonality) {
878 AddComment(
"ParentFrameOffset");
879 OS.emitInt32(ParentFrameOffset);
889 if (IPToStateXData) {
890 OS.emitLabel(IPToStateXData);
891 for (
auto &IPStatePair : IPToStateTable) {
893 OS.emitValue(IPStatePair.first, 4);
894 AddComment(
"ToState");
895 OS.emitInt32(IPStatePair.second);
900void WinException::computeIP2StateTable(
905 FuncletEnd = MF->
begin(),
907 FuncletStart != End; FuncletStart = FuncletEnd) {
909 while (++FuncletEnd != End) {
910 if (FuncletEnd->isEHFuncletEntry()) {
918 if (FuncletStart->isCleanupFuncletEntry())
923 if (FuncletStart == MF->
begin()) {
924 BaseState = NullState;
925 StartLabel =
Asm->getFunctionBegin();
928 FuncletStart->getBasicBlock()->getFirstNonPHIIt());
933 assert(StartLabel &&
"need local function start label");
934 IPToStateTable.push_back(
935 std::make_pair(create32bitRef(StartLabel), BaseState));
937 for (
const auto &StateChange : InvokeStateChangeIterator::range(
938 FuncInfo, FuncletStart, FuncletEnd, BaseState)) {
943 const MCSymbol *ChangeLabel = StateChange.NewStartLabel;
945 ChangeLabel = StateChange.PreviousEndLabel;
947 const MCExpr *LabelExpression = getLabel(ChangeLabel);
948 IPToStateTable.push_back(
949 std::make_pair(LabelExpression, StateChange.NewState));
955void WinException::emitEHRegistrationOffsetLabel(
const WinEHFuncInfo &FuncInfo,
969 const TargetFrameLowering *TFI =
Asm->MF->getSubtarget().getFrameLowering();
973 MCContext &Ctx =
Asm->OutContext;
976 Asm->OutStreamer->emitAssignment(ParentFrameOffset,
984 MCStreamer &OS = *
Asm->OutStreamer;
989 auto AddComment = [&](
const Twine &
Comment) {
995 emitEHRegistrationOffsetLabel(FuncInfo, FLinkageName);
998 MCSymbol *LSDALabel =
Asm->OutContext.getOrCreateLSDASymbol(FLinkageName);
1002 const auto *Per =
cast<Function>(
F.getPersonalityFn()->stripPointerCasts());
1003 StringRef PerName = Per->getName();
1005 if (PerName ==
"_except_handler4") {
1028 int GSCookieOffset = -2;
1040 int EHCookieOffset = 9999;
1049 AddComment(
"GSCookieOffset");
1051 AddComment(
"GSCookieXOROffset");
1053 AddComment(
"EHCookieOffset");
1055 AddComment(
"EHCookieXOROffset");
1061 for (
const SEHUnwindMapEntry &UME : FuncInfo.
SEHUnwindMap) {
1068 AddComment(
"ToState");
1070 AddComment(UME.
IsFinally ?
"Null" :
"FilterFunction");
1072 AddComment(UME.
IsFinally ?
"FinallyFunclet" :
"ExceptionHandler");
1073 OS.
emitValue(create32bitRef(ExceptOrFinally), 4);
1079 while (State != -1) {
1090 while (LeftRank < RightRank) {
1095 while (RightRank < LeftRank) {
1112 MCStreamer &OS = *
Asm->OutStreamer;
1129 assert(NumStates > 0 &&
"Don't need exception table!");
1130 DenseMap<const MachineBasicBlock *, int> HandlerStates;
1131 for (
int State = 0; State < NumStates; ++State) {
1132 MachineBasicBlock *HandlerBlock =
1134 HandlerStates[HandlerBlock] = State;
1139 "ill-formed state numbering");
1142 HandlerStates[&MF->
front()] = NullState;
1167 std::unique_ptr<MCSymbol *[]> EndSymbolMap(
new MCSymbol *[NumStates]);
1168 SmallVector<int, 4> MinClauseMap((
size_t)NumStates, NumStates);
1172 FuncletEnd = MF->
begin(),
1174 FuncletStart != End; FuncletStart = FuncletEnd) {
1175 int FuncletState = HandlerStates[&*FuncletStart];
1178 while (++FuncletEnd != End) {
1179 if (FuncletEnd->isEHFuncletEntry()) {
1186 OS.
emitValue(getOffset(EndSymbol, FuncBeginSym), 4);
1187 if (FuncletState != NullState) {
1189 EndSymbolMap[FuncletState] = EndSymbol;
1194 const MCSymbol *CurrentStartLabel =
nullptr;
1195 int CurrentState = NullState;
1197 for (
const auto &StateChange :
1198 InvokeStateChangeIterator::range(FuncInfo, FuncletStart, FuncletEnd)) {
1200 int StillPendingState =
1202 while (CurrentState != StillPendingState) {
1203 assert(CurrentState != NullState &&
1204 "Failed to find still-pending state!");
1206 Clauses.
push_back({CurrentStartLabel, StateChange.PreviousEndLabel,
1207 CurrentState, FuncletState});
1209 CurrentState = FuncInfo.
ClrEHUnwindMap[CurrentState].TryParentState;
1212 if (HandlerStack.
back().second == CurrentState)
1216 if (StateChange.NewState != CurrentState) {
1220 for (
int EnteredState = StateChange.NewState;
1221 EnteredState != CurrentState;
1224 int &MinEnclosingState = MinClauseMap[EnteredState];
1225 if (FuncletState < MinEnclosingState)
1226 MinEnclosingState = FuncletState;
1230 HandlerStack.
emplace_back(CurrentStartLabel, CurrentState);
1231 CurrentStartLabel = StateChange.NewStartLabel;
1232 CurrentState = StateChange.NewState;
1240 for (ClrClause &Clause : Clauses) {
1289 const MCExpr *ClauseBegin =
1290 getOffsetPlusOne(Clause.StartLabel, FuncBeginSym);
1291 const MCExpr *ClauseEnd = getOffsetPlusOne(Clause.EndLabel, FuncBeginSym);
1296 const MCExpr *HandlerBegin = getOffset(BeginSym, FuncBeginSym);
1297 MCSymbol *EndSym = EndSymbolMap[Clause.State];
1298 const MCExpr *HandlerEnd = getOffset(EndSym, FuncBeginSym);
1301 switch (
Entry.HandlerType) {
1315 if (Clause.EnclosingState != MinClauseMap[Clause.State]) {
1318 assert(Clause.EnclosingState > MinClauseMap[Clause.State]);
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
MachineBasicBlock MachineBasicBlock::iterator MBBI
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
This file contains constants used for implementing Dwarf debug support.
Module.h This file contains the declarations for the Module class.
Promote Memory to Register
This file describes how to lower LLVM code to machine code.
static int getTryAncestor(const WinEHFuncInfo &FuncInfo, int Left, int Right)
static int getTryRank(const WinEHFuncInfo &FuncInfo, int State)
static MCSymbol * getMCSymbolForMBB(AsmPrinter *Asm, const MachineBasicBlock *MBB)
Retrieve the MCSymbol for a GlobalValue or MachineBasicBlock.
This class is intended to be used as a driving class for all asm writers.
MachineFunction * MF
The current machine function.
MCContext & OutContext
This is the context for the output file that we are streaming.
std::unique_ptr< MCStreamer > OutStreamer
This is the MCStreamer object for the file we are generating.
static bool callToNoUnwindFunction(const MachineInstr *MI)
Return ‘true’ if this is a call to a function marked ‘nounwind’.
AsmPrinter * Asm
Target of directive emission.
MCSymbol * emitExceptionTable()
Emit landing pads and actions.
MachineModuleInfo * MMI
Collected machine module information.
EHStreamer(AsmPrinter *A)
static StringRef dropLLVMManglingEscape(StringRef Name)
If the given string begins with the GlobalValue name mangling escape character '\1',...
static const MCBinaryExpr * createAdd(const MCExpr *LHS, const MCExpr *RHS, MCContext &Ctx, SMLoc Loc=SMLoc())
static const MCBinaryExpr * createDiv(const MCExpr *LHS, const MCExpr *RHS, MCContext &Ctx)
static const MCBinaryExpr * createSub(const MCExpr *LHS, const MCExpr *RHS, MCContext &Ctx)
static LLVM_ABI const MCConstantExpr * create(int64_t Value, MCContext &Ctx, bool PrintInHex=false, unsigned SizeInBytes=0)
Context object for machine code objects.
LLVM_ABI MCSymbol * createTempSymbol()
Create a temporary symbol with a unique name.
LLVM_ABI MCSymbol * getOrCreateParentFrameOffsetSymbol(const Twine &FuncName)
LLVM_ABI MCSymbol * getOrCreateSymbol(const Twine &Name)
Lookup the symbol inside with the specified Name.
Base class for the full range of assembler expressions which are needed for parsing.
Instances of this class represent a uniqued identifier for a section in the current translation unit.
virtual bool isVerboseAsm() const
Return true if this streamer supports verbose assembly and if it is enabled.
virtual void AddComment(const Twine &T, bool EOL=true)
Add a textual comment.
void emitValue(const MCExpr *Value, unsigned Size, SMLoc Loc=SMLoc())
virtual void emitLabel(MCSymbol *Symbol, SMLoc Loc=SMLoc())
Emit a label for Symbol into the current section.
virtual void emitValueToAlignment(Align Alignment, int64_t Fill=0, uint8_t FillLen=1, unsigned MaxBytesToEmit=0)
Emit some number of copies of Value until the byte alignment ByteAlignment is reached.
void emitInt32(uint64_t Value)
static const MCSymbolRefExpr * create(const MCSymbol *Symbol, MCContext &Ctx, SMLoc Loc=SMLoc())
MCSymbol - Instances of this class represent a symbol name in the MC file, and MCSymbols are created ...
MachineInstrBundleIterator< const MachineInstr > const_iterator
bool isEHFuncletEntry() const
Returns true if this is the entry block of an EH funclet.
bool isCleanupFuncletEntry() const
Returns true if this is the entry block of a cleanup funclet.
int getStackProtectorIndex() const
Return the index for the stack protector object.
bool hasStackProtectorIndex() const
const WinEHFuncInfo * getWinEHFuncInfo() const
getWinEHFuncInfo - Return information about how the current function uses Windows exception handling.
const TargetSubtargetInfo & getSubtarget() const
getSubtarget - Return the subtarget for which this machine code is being compiled.
MachineFrameInfo & getFrameInfo()
getFrameInfo - Return the frame info object for the current function.
const std::vector< MCSymbol * > & getEHContTargets() const
Returns a reference to a list of symbols that are targets for Windows EH Continuation Guard.
MCContext & getContext() const
Function & getFunction()
Return the LLVM function that this machine code represents.
const std::vector< LandingPadInfo > & getLandingPads() const
Return a reference to the landing pad info for the current function.
const MachineBasicBlock & front() const
bool hasEHFunclets() const
BasicBlockListType::const_iterator const_iterator
Representation of each machine instruction.
A Module instance is used to store all the information related to an LLVM module.
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
reference emplace_back(ArgTypes &&... Args)
void push_back(const T &Elt)
int64_t getFixed() const
Returns the fixed component of the stack.
static StackOffset getFixed(int64_t Fixed)
StringRef - Represent a constant reference to a string, i.e.
virtual StackOffset getNonLocalFrameIndexReference(const MachineFunction &MF, int FI) const
getNonLocalFrameIndexReference - This method returns the offset used to reference a frame index locat...
virtual StackOffset getFrameIndexReferencePreferSP(const MachineFunction &MF, int FI, Register &FrameReg, bool IgnoreSPUpdates) const
Same as getFrameIndexReference, except that the stack pointer (as opposed to the frame pointer) will ...
virtual unsigned getWinEHParentFrameOffset(const MachineFunction &MF) const
virtual StackOffset getFrameIndexReference(const MachineFunction &MF, int FI, Register &FrameReg) const
getFrameIndexReference - This method should return the base register and offset used to reference a f...
unsigned getLSDAEncoding() const
virtual MCSymbol * getCFIPersonalitySymbol(const GlobalValue *GV, const TargetMachine &TM, MachineModuleInfo *MMI) const
unsigned getPersonalityEncoding() const
virtual const TargetFrameLowering * getFrameLowering() const
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
LLVM Value Representation.
LLVM_ABI StringRef getName() const
Return a constant reference to the value's name.
void endFunction(const MachineFunction *) override
Gather and emit post-function exception information.
void markFunctionEnd() override
void beginFunclet(const MachineBasicBlock &MBB, MCSymbol *Sym) override
Emit target-specific EH funclet machinery.
void endModule() override
Emit all exception information that should come after the content.
WinException(AsmPrinter *A)
void endFunclet() override
void beginFunction(const MachineFunction *MF) override
Gather pre-function exception information.
constexpr char Align[]
Key for Kernel::Arg::Metadata::mAlign.
@ IMAGE_SYM_CLASS_STATIC
Static.
@ IMAGE_SYM_DTYPE_FUNCTION
A function that returns a base type.
@ SCT_COMPLEX_TYPE_SHIFT
Type is formed as (base + (derived << SCT_COMPLEX_TYPE_SHIFT))
This is an optimization pass for GlobalISel generic memory operations.
FunctionAddr VTableAddr Value
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
APInt operator*(APInt a, uint64_t RHS)
bool operator!=(uint64_t V1, const APInt &V2)
auto dyn_cast_if_present(const Y &Val)
dyn_cast_if_present<X> - Functionally identical to dyn_cast, except that a null (or none in the case ...
iterator_range< T > make_range(T x, T y)
Convenience function for iterating over sub-ranges.
void append_range(Container &C, Range &&R)
Wrapper function to append range R to container C.
bool operator==(const AddressRangeValuePair &LHS, const AddressRangeValuePair &RHS)
detail::concat_range< ValueT, RangeTs... > concat(RangeTs &&...Ranges)
Returns a concatenated range across two or more ranges.
bool isNoOpWithoutInvoke(EHPersonality Pers)
Return true if this personality may be safely removed if there are no invoke instructions remaining i...
LLVM_ABI EHPersonality classifyEHPersonality(const Value *Pers)
See if the given exception handling personality function is one that we understand.
class LLVM_GSL_OWNER SmallVector
Forward declaration of SmallVector so that calculateSmallVectorDefaultInlinedElements can reference s...
iterator_range(Container &&) -> iterator_range< llvm::detail::IterOfRange< Container > >
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
int ToState
If unwinding continues through this handler, transition to the handler at this state.
MBBOrBasicBlock Handler
Holds the __except or __finally basic block.
const Function * Filter
Holds the filter expression function.
SmallVector< SEHUnwindMapEntry, 4 > SEHUnwindMap
SmallVector< ClrEHUnwindMapEntry, 4 > ClrEHUnwindMap
DenseMap< const FuncletPadInst *, int > FuncletBaseStateMap
SmallVector< WinEHTryBlockMapEntry, 4 > TryBlockMap
DenseMap< MCSymbol *, std::pair< int, MCSymbol * > > LabelToStateMap
SmallVector< CxxUnwindMapEntry, 4 > CxxUnwindMap
GlobalVariable * TypeDescriptor
union llvm::WinEHHandlerType::@246205307012256373115155017221207221353102114334 CatchObj
The CatchObj starts out life as an LLVM alloca and is eventually turned frame index.
SmallVector< WinEHHandlerType, 1 > HandlerArray