AArch64TargetStreamer.h 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. //===-- AArch64TargetStreamer.h - AArch64 Target Streamer ------*- C++ -*--===//
  2. //
  3. // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
  4. // See https://llvm.org/LICENSE.txt for license information.
  5. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  6. //
  7. //===----------------------------------------------------------------------===//
  8. #ifndef LLVM_LIB_TARGET_AARCH64_MCTARGETDESC_AARCH64TARGETSTREAMER_H
  9. #define LLVM_LIB_TARGET_AARCH64_MCTARGETDESC_AARCH64TARGETSTREAMER_H
  10. #include "llvm/MC/MCStreamer.h"
  11. namespace {
  12. class AArch64ELFStreamer;
  13. }
  14. namespace llvm {
  15. class AArch64TargetStreamer : public MCTargetStreamer {
  16. public:
  17. AArch64TargetStreamer(MCStreamer &S);
  18. ~AArch64TargetStreamer() override;
  19. void finish() override;
  20. void emitConstantPools() override;
  21. /// Callback used to implement the ldr= pseudo.
  22. /// Add a new entry to the constant pool for the current section and return an
  23. /// MCExpr that can be used to refer to the constant pool location.
  24. const MCExpr *addConstantPoolEntry(const MCExpr *, unsigned Size, SMLoc Loc);
  25. /// Callback used to implemnt the .ltorg directive.
  26. /// Emit contents of constant pool for the current section.
  27. void emitCurrentConstantPool();
  28. /// Callback used to implement the .note.gnu.property section.
  29. void emitNoteSection(unsigned Flags);
  30. /// Callback used to implement the .inst directive.
  31. virtual void emitInst(uint32_t Inst);
  32. /// Callback used to implement the .variant_pcs directive.
  33. virtual void emitDirectiveVariantPCS(MCSymbol *Symbol) {};
  34. virtual void emitARM64WinCFIAllocStack(unsigned Size) {}
  35. virtual void emitARM64WinCFISaveR19R20X(int Offset) {}
  36. virtual void emitARM64WinCFISaveFPLR(int Offset) {}
  37. virtual void emitARM64WinCFISaveFPLRX(int Offset) {}
  38. virtual void emitARM64WinCFISaveReg(unsigned Reg, int Offset) {}
  39. virtual void emitARM64WinCFISaveRegX(unsigned Reg, int Offset) {}
  40. virtual void emitARM64WinCFISaveRegP(unsigned Reg, int Offset) {}
  41. virtual void emitARM64WinCFISaveRegPX(unsigned Reg, int Offset) {}
  42. virtual void emitARM64WinCFISaveLRPair(unsigned Reg, int Offset) {}
  43. virtual void emitARM64WinCFISaveFReg(unsigned Reg, int Offset) {}
  44. virtual void emitARM64WinCFISaveFRegX(unsigned Reg, int Offset) {}
  45. virtual void emitARM64WinCFISaveFRegP(unsigned Reg, int Offset) {}
  46. virtual void emitARM64WinCFISaveFRegPX(unsigned Reg, int Offset) {}
  47. virtual void emitARM64WinCFISetFP() {}
  48. virtual void emitARM64WinCFIAddFP(unsigned Size) {}
  49. virtual void emitARM64WinCFINop() {}
  50. virtual void emitARM64WinCFISaveNext() {}
  51. virtual void emitARM64WinCFIPrologEnd() {}
  52. virtual void emitARM64WinCFIEpilogStart() {}
  53. virtual void emitARM64WinCFIEpilogEnd() {}
  54. virtual void emitARM64WinCFITrapFrame() {}
  55. virtual void emitARM64WinCFIMachineFrame() {}
  56. virtual void emitARM64WinCFIContext() {}
  57. virtual void emitARM64WinCFIClearUnwoundToCall() {}
  58. private:
  59. std::unique_ptr<AssemblerConstantPools> ConstantPools;
  60. };
  61. class AArch64TargetELFStreamer : public AArch64TargetStreamer {
  62. private:
  63. AArch64ELFStreamer &getStreamer();
  64. void emitInst(uint32_t Inst) override;
  65. void emitDirectiveVariantPCS(MCSymbol *Symbol) override;
  66. public:
  67. AArch64TargetELFStreamer(MCStreamer &S) : AArch64TargetStreamer(S) {}
  68. };
  69. class AArch64TargetWinCOFFStreamer : public llvm::AArch64TargetStreamer {
  70. private:
  71. // True if we are processing SEH directives in an epilogue.
  72. bool InEpilogCFI = false;
  73. // Symbol of the current epilog for which we are processing SEH directives.
  74. MCSymbol *CurrentEpilog = nullptr;
  75. public:
  76. AArch64TargetWinCOFFStreamer(llvm::MCStreamer &S)
  77. : AArch64TargetStreamer(S) {}
  78. // The unwind codes on ARM64 Windows are documented at
  79. // https://docs.microsoft.com/en-us/cpp/build/arm64-exception-handling
  80. void emitARM64WinCFIAllocStack(unsigned Size) override;
  81. void emitARM64WinCFISaveR19R20X(int Offset) override;
  82. void emitARM64WinCFISaveFPLR(int Offset) override;
  83. void emitARM64WinCFISaveFPLRX(int Offset) override;
  84. void emitARM64WinCFISaveReg(unsigned Reg, int Offset) override;
  85. void emitARM64WinCFISaveRegX(unsigned Reg, int Offset) override;
  86. void emitARM64WinCFISaveRegP(unsigned Reg, int Offset) override;
  87. void emitARM64WinCFISaveRegPX(unsigned Reg, int Offset) override;
  88. void emitARM64WinCFISaveLRPair(unsigned Reg, int Offset) override;
  89. void emitARM64WinCFISaveFReg(unsigned Reg, int Offset) override;
  90. void emitARM64WinCFISaveFRegX(unsigned Reg, int Offset) override;
  91. void emitARM64WinCFISaveFRegP(unsigned Reg, int Offset) override;
  92. void emitARM64WinCFISaveFRegPX(unsigned Reg, int Offset) override;
  93. void emitARM64WinCFISetFP() override;
  94. void emitARM64WinCFIAddFP(unsigned Size) override;
  95. void emitARM64WinCFINop() override;
  96. void emitARM64WinCFISaveNext() override;
  97. void emitARM64WinCFIPrologEnd() override;
  98. void emitARM64WinCFIEpilogStart() override;
  99. void emitARM64WinCFIEpilogEnd() override;
  100. void emitARM64WinCFITrapFrame() override;
  101. void emitARM64WinCFIMachineFrame() override;
  102. void emitARM64WinCFIContext() override;
  103. void emitARM64WinCFIClearUnwoundToCall() override;
  104. private:
  105. void emitARM64WinUnwindCode(unsigned UnwindCode, int Reg, int Offset);
  106. };
  107. MCTargetStreamer *
  108. createAArch64ObjectTargetStreamer(MCStreamer &S, const MCSubtargetInfo &STI);
  109. } // end namespace llvm
  110. #endif