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();
71 std::unique_ptr<MCAsmBackend> &&MAB,
72 std::unique_ptr<MCObjectWriter> &&OW,
73 std::unique_ptr<MCCodeEmitter> &&
Emitter,
74 bool IncrementalLinkerCompatible) {
75 auto *S =
new ARMWinCOFFStreamer(
Context, std::move(MAB), std::move(
Emitter),
77 S->getAssembler().setIncrementalLinkerCompatible(IncrementalLinkerCompatible);
85 bool InEpilogCFI =
false;
107 void emitARMWinUnwindCode(
unsigned UnwindCode,
int Reg,
int Offset);
112void ARMTargetWinCOFFStreamer::emitARMWinUnwindCode(
unsigned UnwindCode,
114 auto &S = getStreamer();
121 CurFrame->
EpilogMap[CurrentEpilog].Instructions.push_back(Inst);
126void ARMTargetWinCOFFStreamer::emitARMWinCFIAllocStack(
unsigned Size,
130 if (
Size / 4 > 0xffff)
132 else if (
Size / 4 > 0x7f)
136 if (
Size / 4 > 0xffff)
138 else if (
Size / 4 > 0x3ff)
141 emitARMWinUnwindCode(
Op, -1,
Size);
144void ARMTargetWinCOFFStreamer::emitARMWinCFISaveRegMask(
unsigned Mask,
147 int Lr = (
Mask & 0x4000) ? 1 : 0;
150 assert((Mask & ~0x1fff) == 0);
152 assert((Mask & ~0x00ff) == 0);
153 if (Mask && ((Mask + (1 << 4)) & Mask) == 0) {
154 if (Wide && (Mask & 0x1000) == 0 && (Mask & 0xff) == 0xf0) {
156 for (
int I = 11;
I >= 8;
I--) {
157 if (Mask & (1 <<
I)) {
165 for (
int I = 7;
I >= 4;
I--) {
166 if (Mask & (1 <<
I)) {
181void ARMTargetWinCOFFStreamer::emitARMWinCFISaveSP(
unsigned Reg) {
185void ARMTargetWinCOFFStreamer::emitARMWinCFISaveFRegs(
unsigned First,
192 else if (
First <= 15)
198void ARMTargetWinCOFFStreamer::emitARMWinCFISaveLR(
unsigned Offset) {
202void ARMTargetWinCOFFStreamer::emitARMWinCFINop(
bool Wide) {
209void ARMTargetWinCOFFStreamer::emitARMWinCFIPrologEnd(
bool Fragment) {
210 auto &S = getStreamer();
224void ARMTargetWinCOFFStreamer::emitARMWinCFIEpilogStart(
unsigned Condition) {
225 auto &S = getStreamer();
231 CurrentEpilog = S.emitCFILabel();
232 CurFrame->
EpilogMap[CurrentEpilog].Condition = Condition;
235void ARMTargetWinCOFFStreamer::emitARMWinCFIEpilogEnd() {
236 auto &S = getStreamer();
241 if (!CurrentEpilog) {
242 S.getContext().reportError(
SMLoc(),
"Stray .seh_endepilogue in " +
247 std::vector<WinEH::Instruction> &
Epilog =
248 CurFrame->
EpilogMap[CurrentEpilog].Instructions;
264 CurFrame->
EpilogMap[CurrentEpilog].Instructions.push_back(Inst);
267 CurrentEpilog =
nullptr;
270void ARMTargetWinCOFFStreamer::emitARMWinCFICustom(
unsigned Opcode) {
277 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)
This class represents an Operation in the Expression.
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.
@ First
Helpers to iterate all locations in the MemoryEffectsBase class.
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)
MCStreamer * createARMWinCOFFStreamer(MCContext &Context, std::unique_ptr< MCAsmBackend > &&MAB, std::unique_ptr< MCObjectWriter > &&OW, std::unique_ptr< MCCodeEmitter > &&Emitter, bool IncrementalLinkerCompatible)
Implement std::hash so that hash_code can be used in STL containers.
std::vector< Instruction > Instructions
const MCSymbol * Function
const MCSymbol * PrologEnd
MapVector< MCSymbol *, Epilog > EpilogMap