207 lines · c
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-exception6//7//===----------------------------------------------------------------------===//8 9#ifndef LLVM_LIB_TARGET_AARCH64_MCTARGETDESC_AARCH64TARGETSTREAMER_H10#define LLVM_LIB_TARGET_AARCH64_MCTARGETDESC_AARCH64TARGETSTREAMER_H11 12#include "AArch64MCAsmInfo.h"13#include "llvm/ADT/StringRef.h"14#include "llvm/IR/Instructions.h"15#include "llvm/MC/MCELFStreamer.h"16#include "llvm/MC/MCStreamer.h"17#include "llvm/Support/AArch64BuildAttributes.h"18#include <cstdint>19 20namespace {21class AArch64ELFStreamer;22}23 24namespace llvm {25 26class AArch64TargetStreamer : public MCTargetStreamer {27public:28 AArch64TargetStreamer(MCStreamer &S);29 ~AArch64TargetStreamer() override;30 31 void finish() override;32 void emitConstantPools() override;33 34 /// Callback used to implement the ldr= pseudo.35 /// Add a new entry to the constant pool for the current section and return an36 /// MCExpr that can be used to refer to the constant pool location.37 const MCExpr *addConstantPoolEntry(const MCExpr *, unsigned Size, SMLoc Loc);38 39 /// Callback used to implement the .ltorg directive.40 /// Emit contents of constant pool for the current section.41 void emitCurrentConstantPool();42 43 /// Callback used to implement the .note.gnu.property section.44 void emitNoteSection(unsigned Flags, uint64_t PAuthABIPlatform = -1,45 uint64_t PAuthABIVersion = -1);46 47 /// Callback used to emit AUTH expressions (e.g. signed48 /// personality function pointer).49 void emitAuthValue(const MCExpr *Expr, uint16_t Discriminator,50 AArch64PACKey::ID Key, bool HasAddressDiversity);51 52 /// Callback used to implement the .inst directive.53 virtual void emitInst(uint32_t Inst);54 55 /// Callback used to implement the .variant_pcs directive.56 virtual void emitDirectiveVariantPCS(MCSymbol *Symbol) {};57 58 virtual void emitDirectiveArch(StringRef Name) {};59 virtual void emitDirectiveArchExtension(StringRef Name) {};60 61 virtual void emitARM64WinCFIAllocStack(unsigned Size) {}62 virtual void emitARM64WinCFISaveR19R20X(int Offset) {}63 virtual void emitARM64WinCFISaveFPLR(int Offset) {}64 virtual void emitARM64WinCFISaveFPLRX(int Offset) {}65 virtual void emitARM64WinCFISaveReg(unsigned Reg, int Offset) {}66 virtual void emitARM64WinCFISaveRegX(unsigned Reg, int Offset) {}67 virtual void emitARM64WinCFISaveRegP(unsigned Reg, int Offset) {}68 virtual void emitARM64WinCFISaveRegPX(unsigned Reg, int Offset) {}69 virtual void emitARM64WinCFISaveLRPair(unsigned Reg, int Offset) {}70 virtual void emitARM64WinCFISaveFReg(unsigned Reg, int Offset) {}71 virtual void emitARM64WinCFISaveFRegX(unsigned Reg, int Offset) {}72 virtual void emitARM64WinCFISaveFRegP(unsigned Reg, int Offset) {}73 virtual void emitARM64WinCFISaveFRegPX(unsigned Reg, int Offset) {}74 virtual void emitARM64WinCFISetFP() {}75 virtual void emitARM64WinCFIAddFP(unsigned Size) {}76 virtual void emitARM64WinCFINop() {}77 virtual void emitARM64WinCFISaveNext() {}78 virtual void emitARM64WinCFIPrologEnd() {}79 virtual void emitARM64WinCFIEpilogStart() {}80 virtual void emitARM64WinCFIEpilogEnd() {}81 virtual void emitARM64WinCFITrapFrame() {}82 virtual void emitARM64WinCFIMachineFrame() {}83 virtual void emitARM64WinCFIContext() {}84 virtual void emitARM64WinCFIECContext() {}85 virtual void emitARM64WinCFIClearUnwoundToCall() {}86 virtual void emitARM64WinCFIPACSignLR() {}87 virtual void emitARM64WinCFISaveAnyRegI(unsigned Reg, int Offset) {}88 virtual void emitARM64WinCFISaveAnyRegIP(unsigned Reg, int Offset) {}89 virtual void emitARM64WinCFISaveAnyRegD(unsigned Reg, int Offset) {}90 virtual void emitARM64WinCFISaveAnyRegDP(unsigned Reg, int Offset) {}91 virtual void emitARM64WinCFISaveAnyRegQ(unsigned Reg, int Offset) {}92 virtual void emitARM64WinCFISaveAnyRegQP(unsigned Reg, int Offset) {}93 virtual void emitARM64WinCFISaveAnyRegIX(unsigned Reg, int Offset) {}94 virtual void emitARM64WinCFISaveAnyRegIPX(unsigned Reg, int Offset) {}95 virtual void emitARM64WinCFISaveAnyRegDX(unsigned Reg, int Offset) {}96 virtual void emitARM64WinCFISaveAnyRegDPX(unsigned Reg, int Offset) {}97 virtual void emitARM64WinCFISaveAnyRegQX(unsigned Reg, int Offset) {}98 virtual void emitARM64WinCFISaveAnyRegQPX(unsigned Reg, int Offset) {}99 virtual void emitARM64WinCFIAllocZ(int Offset) {}100 virtual void emitARM64WinCFISaveZReg(unsigned Reg, int Offset) {}101 virtual void emitARM64WinCFISavePReg(unsigned Reg, int Offset) {}102 103 /// Build attributes implementation104 virtual void105 emitAttributesSubsection(StringRef VendorName,106 AArch64BuildAttributes::SubsectionOptional IsOptional,107 AArch64BuildAttributes::SubsectionType ParameterType);108 virtual void emitAttribute(StringRef VendorName, unsigned Tag, unsigned Value,109 std::string String);110 void activateAttributesSubsection(StringRef VendorName);111 std::unique_ptr<MCELFStreamer::AttributeSubSection>112 getActiveAttributesSubsection();113 std::unique_ptr<MCELFStreamer::AttributeSubSection>114 getAttributesSubsectionByName(StringRef Name);115 void116 insertAttributeInPlace(const MCELFStreamer::AttributeItem &Attr,117 MCELFStreamer::AttributeSubSection &AttSubSection);118 119 SmallVector<MCELFStreamer::AttributeSubSection, 64> AttributeSubSections;120 121private:122 std::unique_ptr<AssemblerConstantPools> ConstantPools;123};124 125class AArch64TargetELFStreamer : public AArch64TargetStreamer {126private:127 AArch64ELFStreamer &getStreamer();128 129 MCSection *AttributeSection = nullptr;130 131 /// Build attributes implementation132 void emitAttributesSubsection(133 StringRef VendorName,134 AArch64BuildAttributes::SubsectionOptional IsOptional,135 AArch64BuildAttributes::SubsectionType ParameterType) override;136 void emitAttribute(StringRef VendorName, unsigned Tag, unsigned Value,137 std::string String) override;138 void emitInst(uint32_t Inst) override;139 void emitDirectiveVariantPCS(MCSymbol *Symbol) override;140 void finish() override;141 142public:143 AArch64TargetELFStreamer(MCStreamer &S) : AArch64TargetStreamer(S) {}144};145 146class AArch64TargetWinCOFFStreamer : public llvm::AArch64TargetStreamer {147public:148 AArch64TargetWinCOFFStreamer(llvm::MCStreamer &S)149 : AArch64TargetStreamer(S) {}150 151 // The unwind codes on ARM64 Windows are documented at152 // https://docs.microsoft.com/en-us/cpp/build/arm64-exception-handling153 void emitARM64WinCFIAllocStack(unsigned Size) override;154 void emitARM64WinCFISaveR19R20X(int Offset) override;155 void emitARM64WinCFISaveFPLR(int Offset) override;156 void emitARM64WinCFISaveFPLRX(int Offset) override;157 void emitARM64WinCFISaveReg(unsigned Reg, int Offset) override;158 void emitARM64WinCFISaveRegX(unsigned Reg, int Offset) override;159 void emitARM64WinCFISaveRegP(unsigned Reg, int Offset) override;160 void emitARM64WinCFISaveRegPX(unsigned Reg, int Offset) override;161 void emitARM64WinCFISaveLRPair(unsigned Reg, int Offset) override;162 void emitARM64WinCFISaveFReg(unsigned Reg, int Offset) override;163 void emitARM64WinCFISaveFRegX(unsigned Reg, int Offset) override;164 void emitARM64WinCFISaveFRegP(unsigned Reg, int Offset) override;165 void emitARM64WinCFISaveFRegPX(unsigned Reg, int Offset) override;166 void emitARM64WinCFISetFP() override;167 void emitARM64WinCFIAddFP(unsigned Size) override;168 void emitARM64WinCFINop() override;169 void emitARM64WinCFISaveNext() override;170 void emitARM64WinCFIPrologEnd() override;171 void emitARM64WinCFIEpilogStart() override;172 void emitARM64WinCFIEpilogEnd() override;173 void emitARM64WinCFITrapFrame() override;174 void emitARM64WinCFIMachineFrame() override;175 void emitARM64WinCFIContext() override;176 void emitARM64WinCFIECContext() override;177 void emitARM64WinCFIClearUnwoundToCall() override;178 void emitARM64WinCFIPACSignLR() override;179 void emitARM64WinCFISaveAnyRegI(unsigned Reg, int Offset) override;180 void emitARM64WinCFISaveAnyRegIP(unsigned Reg, int Offset) override;181 void emitARM64WinCFISaveAnyRegD(unsigned Reg, int Offset) override;182 void emitARM64WinCFISaveAnyRegDP(unsigned Reg, int Offset) override;183 void emitARM64WinCFISaveAnyRegQ(unsigned Reg, int Offset) override;184 void emitARM64WinCFISaveAnyRegQP(unsigned Reg, int Offset) override;185 void emitARM64WinCFISaveAnyRegIX(unsigned Reg, int Offset) override;186 void emitARM64WinCFISaveAnyRegIPX(unsigned Reg, int Offset) override;187 void emitARM64WinCFISaveAnyRegDX(unsigned Reg, int Offset) override;188 void emitARM64WinCFISaveAnyRegDPX(unsigned Reg, int Offset) override;189 void emitARM64WinCFISaveAnyRegQX(unsigned Reg, int Offset) override;190 void emitARM64WinCFISaveAnyRegQPX(unsigned Reg, int Offset) override;191 void emitARM64WinCFIAllocZ(int Offset) override;192 void emitARM64WinCFISaveZReg(unsigned Reg, int Offset) override;193 void emitARM64WinCFISavePReg(unsigned Reg, int Offset) override;194 195private:196 void emitARM64WinUnwindCode(unsigned UnwindCode, int Reg, int Offset);197};198 199MCTargetStreamer *200createAArch64ObjectTargetStreamer(MCStreamer &S, const MCSubtargetInfo &STI);201 202MCTargetStreamer *createAArch64NullTargetStreamer(MCStreamer &S);203 204} // end namespace llvm205 206#endif207