1 | //===-- RISCVELFStreamer.h - RISC-V ELF 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 | |
9 | #ifndef LLVM_LIB_TARGET_RISCV_MCTARGETDESC_RISCVELFSTREAMER_H |
10 | #define LLVM_LIB_TARGET_RISCV_MCTARGETDESC_RISCVELFSTREAMER_H |
11 | |
12 | #include "RISCVTargetStreamer.h" |
13 | #include "llvm/MC/MCELFStreamer.h" |
14 | |
15 | using namespace llvm; |
16 | |
17 | class RISCVELFStreamer : public MCELFStreamer { |
18 | void reset() override; |
19 | void emitDataMappingSymbol(); |
20 | void emitInstructionsMappingSymbol(); |
21 | void emitMappingSymbol(StringRef Name); |
22 | |
23 | enum ElfMappingSymbol { EMS_None, EMS_Instructions, EMS_Data }; |
24 | |
25 | DenseMap<const MCSection *, ElfMappingSymbol> LastMappingSymbols; |
26 | ElfMappingSymbol LastEMS = EMS_None; |
27 | |
28 | public: |
29 | RISCVELFStreamer(MCContext &C, std::unique_ptr<MCAsmBackend> MAB, |
30 | std::unique_ptr<MCObjectWriter> MOW, |
31 | std::unique_ptr<MCCodeEmitter> MCE) |
32 | : MCELFStreamer(C, std::move(MAB), std::move(MOW), std::move(MCE)) {} |
33 | |
34 | void changeSection(MCSection *Section, uint32_t Subsection) override; |
35 | void emitInstruction(const MCInst &Inst, const MCSubtargetInfo &STI) override; |
36 | void emitBytes(StringRef Data) override; |
37 | void emitFill(const MCExpr &NumBytes, uint64_t FillValue, SMLoc Loc) override; |
38 | void emitValueImpl(const MCExpr *Value, unsigned Size, SMLoc Loc) override; |
39 | }; |
40 | |
41 | namespace llvm { |
42 | |
43 | class RISCVTargetELFStreamer : public RISCVTargetStreamer { |
44 | private: |
45 | StringRef CurrentVendor; |
46 | |
47 | MCSection *AttributeSection = nullptr; |
48 | |
49 | void emitAttribute(unsigned Attribute, unsigned Value) override; |
50 | void emitTextAttribute(unsigned Attribute, StringRef String) override; |
51 | void emitIntTextAttribute(unsigned Attribute, unsigned IntValue, |
52 | StringRef StringValue) override; |
53 | void finishAttributeSection() override; |
54 | |
55 | void reset() override; |
56 | |
57 | public: |
58 | RISCVELFStreamer &getStreamer(); |
59 | RISCVTargetELFStreamer(MCStreamer &S, const MCSubtargetInfo &STI); |
60 | |
61 | void emitDirectiveOptionPush() override; |
62 | void emitDirectiveOptionPop() override; |
63 | void emitDirectiveOptionPIC() override; |
64 | void emitDirectiveOptionNoPIC() override; |
65 | void emitDirectiveOptionRVC() override; |
66 | void emitDirectiveOptionNoRVC() override; |
67 | void emitDirectiveOptionRelax() override; |
68 | void emitDirectiveOptionNoRelax() override; |
69 | void emitDirectiveVariantCC(MCSymbol &Symbol) override; |
70 | |
71 | void finish() override; |
72 | }; |
73 | |
74 | MCELFStreamer *createRISCVELFStreamer(MCContext &C, |
75 | std::unique_ptr<MCAsmBackend> MAB, |
76 | std::unique_ptr<MCObjectWriter> MOW, |
77 | std::unique_ptr<MCCodeEmitter> MCE); |
78 | } |
79 | #endif |
80 | |