Changeset View
Changeset View
Standalone View
Standalone View
llvm/lib/Target/X86/X86FrameLowering.cpp
Show First 20 Lines • Show All 922 Lines • ▼ Show 20 Line(s) | 922 | bool FnHasClrFunclet = | |||
---|---|---|---|---|---|
923 | MMI.hasEHFunclets() && Personality == EHPersonality::CoreCLR; | 923 | MMI.hasEHFunclets() && Personality == EHPersonality::CoreCLR; | ||
924 | bool IsClrFunclet = IsFunclet && FnHasClrFunclet; | 924 | bool IsClrFunclet = IsFunclet && FnHasClrFunclet; | ||
925 | bool HasFP = hasFP(MF); | 925 | bool HasFP = hasFP(MF); | ||
926 | bool IsWin64CC = STI.isCallingConvWin64(Fn->getCallingConv()); | 926 | bool IsWin64CC = STI.isCallingConvWin64(Fn->getCallingConv()); | ||
927 | bool IsWin64Prologue = MF.getTarget().getMCAsmInfo()->usesWindowsCFI(); | 927 | bool IsWin64Prologue = MF.getTarget().getMCAsmInfo()->usesWindowsCFI(); | ||
928 | bool NeedsWinCFI = IsWin64Prologue && Fn->needsUnwindTableEntry(); | 928 | bool NeedsWinCFI = IsWin64Prologue && Fn->needsUnwindTableEntry(); | ||
929 | bool NeedsDwarfCFI = | 929 | bool NeedsDwarfCFI = | ||
930 | !IsWin64Prologue && (MMI.hasDebugInfo() || Fn->needsUnwindTableEntry()); | 930 | !IsWin64Prologue && (MMI.hasDebugInfo() || Fn->needsUnwindTableEntry()); | ||
931 | bool IsMSHotpatch = | ||||
932 | Fn->hasFnAttribute("patchable-function") && | ||||
933 | Fn->getFnAttribute("patchable-function").getValueAsString() == | ||||
934 | "ms-hotpatch"; | ||||
931 | unsigned FramePtr = TRI->getFrameRegister(MF); | 935 | unsigned FramePtr = TRI->getFrameRegister(MF); | ||
932 | const unsigned MachineFramePtr = | 936 | const unsigned MachineFramePtr = | ||
933 | STI.isTarget64BitILP32() | 937 | STI.isTarget64BitILP32() | ||
934 | ? getX86SubSuperRegister(FramePtr, 64) : FramePtr; | 938 | ? getX86SubSuperRegister(FramePtr, 64) : FramePtr; | ||
935 | unsigned BasePtr = TRI->getBaseRegister(); | 939 | unsigned BasePtr = TRI->getBaseRegister(); | ||
936 | 940 | | |||
937 | // Debug location must be unknown since the first debug location is used | 941 | // Debug location must be unknown since the first debug location is used | ||
938 | // to determine the end of the prologue. | 942 | // to determine the end of the prologue. | ||
▲ Show 20 Lines • Show All 125 Lines • ▼ Show 20 Line(s) | 1067 | if (NeedsWinCFI) { | |||
1064 | BuildMI(MBB, MBBI, DL, TII.get(X86::SEH_PushReg)) | 1068 | BuildMI(MBB, MBBI, DL, TII.get(X86::SEH_PushReg)) | ||
1065 | .addImm(FramePtr) | 1069 | .addImm(FramePtr) | ||
1066 | .setMIFlag(MachineInstr::FrameSetup); | 1070 | .setMIFlag(MachineInstr::FrameSetup); | ||
1067 | } | 1071 | } | ||
1068 | 1072 | | |||
1069 | if (!IsWin64Prologue && !IsFunclet) { | 1073 | if (!IsWin64Prologue && !IsFunclet) { | ||
1070 | // Update EBP with the new base value. | 1074 | // Update EBP with the new base value. | ||
1071 | BuildMI(MBB, MBBI, DL, | 1075 | BuildMI(MBB, MBBI, DL, | ||
1072 | TII.get(Uses64BitFramePtr ? X86::MOV64rr : X86::MOV32rr), | 1076 | TII.get(IsMSHotpatch ? | ||
1077 | (Uses64BitFramePtr ? X86::MOV64rr_REV : X86::MOV32rr_REV): | ||||
1078 | (Uses64BitFramePtr ? X86::MOV64rr : X86::MOV32rr)), | ||||
1073 | FramePtr) | 1079 | FramePtr) | ||
1074 | .addReg(StackPtr) | 1080 | .addReg(StackPtr) | ||
1075 | .setMIFlag(MachineInstr::FrameSetup); | 1081 | .setMIFlag(MachineInstr::FrameSetup); | ||
1076 | 1082 | | |||
1077 | if (NeedsDwarfCFI) { | 1083 | if (NeedsDwarfCFI) { | ||
1078 | // Mark effective beginning of when frame pointer becomes valid. | 1084 | // Mark effective beginning of when frame pointer becomes valid. | ||
1079 | // Define the current CFA to use the EBP/RBP register. | 1085 | // Define the current CFA to use the EBP/RBP register. | ||
1080 | unsigned DwarfFramePtr = TRI->getDwarfRegNum(MachineFramePtr, true); | 1086 | unsigned DwarfFramePtr = TRI->getDwarfRegNum(MachineFramePtr, true); | ||
▲ Show 20 Lines • Show All 1907 Lines • Show Last 20 Lines |