25 ARMWinCOFFStreamer(
MCContext &
C, std::unique_ptr<MCAsmBackend> AB,
26 std::unique_ptr<MCCodeEmitter> CE,
27 std::unique_ptr<MCObjectWriter> OW)
38void ARMWinCOFFStreamer::emitWinEHHandlerData(
SMLoc Loc) {
43 EHStreamer.EmitUnwindInfo(*
this, getCurrentWinFrameInfo(),
48 EHStreamer.EmitUnwindInfo(*
this, Frame,
false);
51void ARMWinCOFFStreamer::emitWindowsUnwindTables() {
52 if (!getNumWinFrameInfos())
57void ARMWinCOFFStreamer::emitThumbFunc(
MCSymbol *Symbol) {
58 getAssembler().setIsThumbFunc(Symbol);
61void ARMWinCOFFStreamer::finishImpl() {
63 emitWindowsUnwindTables();
70 MCContext &Context, std::unique_ptr<MCAsmBackend> &&MAB,
71 std::unique_ptr<MCObjectWriter> &&OW,
72 std::unique_ptr<MCCodeEmitter> &&
Emitter,
bool RelaxAll,
73 bool IncrementalLinkerCompatible) {
74 auto *S =
new ARMWinCOFFStreamer(
Context, std::move(MAB), std::move(
Emitter),
76 S->getAssembler().setIncrementalLinkerCompatible(IncrementalLinkerCompatible);
84 bool InEpilogCFI =
false;
106 void emitARMWinUnwindCode(
unsigned UnwindCode,
int Reg,
int Offset);
111void ARMTargetWinCOFFStreamer::emitARMWinUnwindCode(
unsigned UnwindCode,
113 auto &S = getStreamer();
120 CurFrame->
EpilogMap[CurrentEpilog].Instructions.push_back(Inst);
125void ARMTargetWinCOFFStreamer::emitARMWinCFIAllocStack(
unsigned Size,
129 if (
Size / 4 > 0xffff)
131 else if (
Size / 4 > 0x7f)
135 if (
Size / 4 > 0xffff)
137 else if (
Size / 4 > 0x3ff)
140 emitARMWinUnwindCode(Op, -1,
Size);
143void ARMTargetWinCOFFStreamer::emitARMWinCFISaveRegMask(
unsigned Mask,
146 int Lr = (
Mask & 0x4000) ? 1 : 0;
149 assert((Mask & ~0x1fff) == 0);
151 assert((Mask & ~0x00ff) == 0);
152 if (Mask && ((Mask + (1 << 4)) & Mask) == 0) {
153 if (Wide && (Mask & 0x1000) == 0 && (Mask & 0xff) == 0xf0) {
155 for (
int I = 11;
I >= 8;
I--) {
156 if (Mask & (1 <<
I)) {
164 for (
int I = 7;
I >= 4;
I--) {
165 if (Mask & (1 <<
I)) {
180void ARMTargetWinCOFFStreamer::emitARMWinCFISaveSP(
unsigned Reg) {
184void ARMTargetWinCOFFStreamer::emitARMWinCFISaveFRegs(
unsigned First,
191 else if (First <= 15)
197void ARMTargetWinCOFFStreamer::emitARMWinCFISaveLR(
unsigned Offset) {
201void ARMTargetWinCOFFStreamer::emitARMWinCFINop(
bool Wide) {
208void ARMTargetWinCOFFStreamer::emitARMWinCFIPrologEnd(
bool Fragment) {
209 auto &S = getStreamer();
223void ARMTargetWinCOFFStreamer::emitARMWinCFIEpilogStart(
unsigned Condition) {
224 auto &S = getStreamer();
230 CurrentEpilog = S.emitCFILabel();
231 CurFrame->
EpilogMap[CurrentEpilog].Condition = Condition;
234void ARMTargetWinCOFFStreamer::emitARMWinCFIEpilogEnd() {
235 auto &S = getStreamer();
240 if (!CurrentEpilog) {
241 S.getContext().reportError(
SMLoc(),
"Stray .seh_endepilogue in " +
246 std::vector<WinEH::Instruction> &
Epilog =
247 CurFrame->
EpilogMap[CurrentEpilog].Instructions;
263 CurFrame->
EpilogMap[CurrentEpilog].Instructions.push_back(Inst);
266 CurrentEpilog =
nullptr;
269void ARMTargetWinCOFFStreamer::emitARMWinCFICustom(
unsigned Opcode) {
276 return new ARMTargetWinCOFFStreamer(S);
dxil DXContainer Global Emitter
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
virtual void emitARMWinCFISaveSP(unsigned Reg)
virtual void emitARMWinCFISaveLR(unsigned Offset)
virtual void emitARMWinCFIAllocStack(unsigned Size, bool Wide)
virtual void emitARMWinCFICustom(unsigned Opcode)
virtual void emitARMWinCFISaveRegMask(unsigned Mask, bool Wide)
virtual void emitARMWinCFIEpilogEnd()
virtual void emitARMWinCFIPrologEnd(bool Fragment)
virtual void emitARMWinCFISaveFRegs(unsigned First, unsigned Last)
virtual void emitARMWinCFIEpilogStart(unsigned Condition)
virtual void emitARMWinCFINop(bool Wide)
Emits exception handling directives.
Context object for machine code objects.
Streaming machine code generation interface.
virtual void emitWindowsUnwindTables()
virtual void emitWinEHHandlerData(SMLoc Loc=SMLoc())
MCSymbol - Instances of this class represent a symbol name in the MC file, and MCSymbols are created ...
StringRef getName() const
getName - Get the symbol name.
Target specific streamer interface.
void emitThumbFunc(MCSymbol *Func) override
Note in the output that the specified Func is a Thumb mode function (ARM target only).
void finishImpl() override
Streamer specific finalization.
void emitWinEHHandlerData(SMLoc Loc) override
Represents a location in source code.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
constexpr std::underlying_type_t< E > Mask()
Get a bitmask with 1s in all places up to the high-order bit of E's largest value.
@ C
The default llvm calling convention, compatible with C.
@ UOP_WideSaveRegsR4R11LR
@ CE
Windows NT (Windows on ARM)
This is an optimization pass for GlobalISel generic memory operations.
MCStreamer * createARMWinCOFFStreamer(MCContext &Context, std::unique_ptr< MCAsmBackend > &&MAB, std::unique_ptr< MCObjectWriter > &&OW, std::unique_ptr< MCCodeEmitter > &&Emitter, bool RelaxAll, bool IncrementalLinkerCompatible)
OutputIt move(R &&Range, OutputIt Out)
Provide wrappers to std::move which take ranges instead of having to pass begin/end explicitly.
MCTargetStreamer * createARMObjectTargetWinCOFFStreamer(MCStreamer &S)
std::vector< Instruction > Instructions
const MCSymbol * Function
const MCSymbol * PrologEnd
MapVector< MCSymbol *, Epilog > EpilogMap