diff options
Diffstat (limited to 'lib/Target/AArch64/MCTargetDesc/AArch64TargetStreamer.h')
-rw-r--r-- | lib/Target/AArch64/MCTargetDesc/AArch64TargetStreamer.h | 69 |
1 files changed, 69 insertions, 0 deletions
diff --git a/lib/Target/AArch64/MCTargetDesc/AArch64TargetStreamer.h b/lib/Target/AArch64/MCTargetDesc/AArch64TargetStreamer.h index 51432830f795..73fb9baea3e3 100644 --- a/lib/Target/AArch64/MCTargetDesc/AArch64TargetStreamer.h +++ b/lib/Target/AArch64/MCTargetDesc/AArch64TargetStreamer.h @@ -12,6 +12,10 @@ #include "llvm/MC/MCStreamer.h" +namespace { +class AArch64ELFStreamer; +} + namespace llvm { class AArch64TargetStreamer : public MCTargetStreamer { @@ -33,10 +37,75 @@ public: /// Callback used to implement the .inst directive. virtual void emitInst(uint32_t Inst); + virtual void EmitARM64WinCFIAllocStack(unsigned Size) {} + virtual void EmitARM64WinCFISaveFPLR(int Offset) {} + virtual void EmitARM64WinCFISaveFPLRX(int Offset) {} + virtual void EmitARM64WinCFISaveReg(unsigned Reg, int Offset) {} + virtual void EmitARM64WinCFISaveRegX(unsigned Reg, int Offset) {} + virtual void EmitARM64WinCFISaveRegP(unsigned Reg, int Offset) {} + virtual void EmitARM64WinCFISaveRegPX(unsigned Reg, int Offset) {} + virtual void EmitARM64WinCFISaveFReg(unsigned Reg, int Offset) {} + virtual void EmitARM64WinCFISaveFRegX(unsigned Reg, int Offset) {} + virtual void EmitARM64WinCFISaveFRegP(unsigned Reg, int Offset) {} + virtual void EmitARM64WinCFISaveFRegPX(unsigned Reg, int Offset) {} + virtual void EmitARM64WinCFISetFP() {} + virtual void EmitARM64WinCFIAddFP(unsigned Size) {} + virtual void EmitARM64WinCFINop() {} + virtual void EmitARM64WinCFIPrologEnd() {} + virtual void EmitARM64WinCFIEpilogStart() {} + virtual void EmitARM64WinCFIEpilogEnd() {} + private: std::unique_ptr<AssemblerConstantPools> ConstantPools; }; +class AArch64TargetELFStreamer : public AArch64TargetStreamer { +private: + AArch64ELFStreamer &getStreamer(); + + void emitInst(uint32_t Inst) override; + +public: + AArch64TargetELFStreamer(MCStreamer &S) : AArch64TargetStreamer(S) {} +}; + +class AArch64TargetWinCOFFStreamer : public llvm::AArch64TargetStreamer { +private: + // True if we are processing SEH directives in an epilogue. + bool InEpilogCFI = false; + + // Symbol of the current epilog for which we are processing SEH directives. + MCSymbol *CurrentEpilog = nullptr; +public: + AArch64TargetWinCOFFStreamer(llvm::MCStreamer &S) + : AArch64TargetStreamer(S) {} + + // The unwind codes on ARM64 Windows are documented at + // https://docs.microsoft.com/en-us/cpp/build/arm64-exception-handling + void EmitARM64WinCFIAllocStack(unsigned Size) override; + void EmitARM64WinCFISaveFPLR(int Offset) override; + void EmitARM64WinCFISaveFPLRX(int Offset) override; + void EmitARM64WinCFISaveReg(unsigned Reg, int Offset) override; + void EmitARM64WinCFISaveRegX(unsigned Reg, int Offset) override; + void EmitARM64WinCFISaveRegP(unsigned Reg, int Offset) override; + void EmitARM64WinCFISaveRegPX(unsigned Reg, int Offset) override; + void EmitARM64WinCFISaveFReg(unsigned Reg, int Offset) override; + void EmitARM64WinCFISaveFRegX(unsigned Reg, int Offset) override; + void EmitARM64WinCFISaveFRegP(unsigned Reg, int Offset) override; + void EmitARM64WinCFISaveFRegPX(unsigned Reg, int Offset) override; + void EmitARM64WinCFISetFP() override; + void EmitARM64WinCFIAddFP(unsigned Size) override; + void EmitARM64WinCFINop() override; + void EmitARM64WinCFIPrologEnd() override; + void EmitARM64WinCFIEpilogStart() override; + void EmitARM64WinCFIEpilogEnd() override; +private: + void EmitARM64WinUnwindCode(unsigned UnwindCode, int Reg, int Offset); +}; + +MCTargetStreamer * +createAArch64ObjectTargetStreamer(MCStreamer &S, const MCSubtargetInfo &STI); + } // end namespace llvm #endif |