1 | //===- MipsELFStreamer.h - ELF Object Output --------------------*- 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 | // This is a custom MCELFStreamer which allows us to insert some hooks before |
10 | // emitting data into an actual object file. |
11 | // |
12 | //===----------------------------------------------------------------------===// |
13 | |
14 | #ifndef LLVM_LIB_TARGET_MIPS_MCTARGETDESC_MIPSELFSTREAMER_H |
15 | #define LLVM_LIB_TARGET_MIPS_MCTARGETDESC_MIPSELFSTREAMER_H |
16 | |
17 | #include "MipsOptionRecord.h" |
18 | #include "llvm/ADT/SmallVector.h" |
19 | #include "llvm/MC/MCELFStreamer.h" |
20 | #include <memory> |
21 | |
22 | namespace llvm { |
23 | |
24 | class MCAsmBackend; |
25 | class MCCodeEmitter; |
26 | class MCContext; |
27 | class MCSubtargetInfo; |
28 | struct MCDwarfFrameInfo; |
29 | |
30 | class MipsELFStreamer : public MCELFStreamer { |
31 | SmallVector<std::unique_ptr<MipsOptionRecord>, 8> MipsOptionRecords; |
32 | MipsRegInfoRecord *RegInfoRecord; |
33 | SmallVector<MCSymbol*, 4> Labels; |
34 | |
35 | public: |
36 | MipsELFStreamer(MCContext &Context, std::unique_ptr<MCAsmBackend> MAB, |
37 | std::unique_ptr<MCObjectWriter> OW, |
38 | std::unique_ptr<MCCodeEmitter> Emitter); |
39 | |
40 | /// Overriding this function allows us to add arbitrary behaviour before the |
41 | /// \p Inst is actually emitted. For example, we can inspect the operands and |
42 | /// gather sufficient information that allows us to reason about the register |
43 | /// usage for the translation unit. |
44 | void emitInstruction(const MCInst &Inst, const MCSubtargetInfo &STI) override; |
45 | |
46 | /// Overriding this function allows us to record all labels that should be |
47 | /// marked as microMIPS. Based on this data marking is done in |
48 | /// EmitInstruction. |
49 | void emitLabel(MCSymbol *Symbol, SMLoc Loc = SMLoc()) override; |
50 | |
51 | /// Overriding this function allows us to dismiss all labels that are |
52 | /// candidates for marking as microMIPS when .section directive is processed. |
53 | void switchSection(MCSection *Section, uint32_t Subsection = 0) override; |
54 | |
55 | /// Overriding these functions allows us to dismiss all labels that are |
56 | /// candidates for marking as microMIPS when .word/.long/.4byte etc |
57 | /// directives are emitted. |
58 | void emitValueImpl(const MCExpr *Value, unsigned Size, SMLoc Loc) override; |
59 | void emitIntValue(uint64_t Value, unsigned Size) override; |
60 | |
61 | // Overriding these functions allows us to avoid recording of these labels |
62 | // in EmitLabel and later marking them as microMIPS. |
63 | void emitCFIStartProcImpl(MCDwarfFrameInfo &Frame) override; |
64 | void emitCFIEndProcImpl(MCDwarfFrameInfo &Frame) override; |
65 | MCSymbol *emitCFILabel() override; |
66 | |
67 | /// Emits all the option records stored up until the point it's called. |
68 | void EmitMipsOptionRecords(); |
69 | |
70 | /// Mark labels as microMIPS, if necessary for the subtarget. |
71 | void createPendingLabelRelocs(); |
72 | }; |
73 | |
74 | MCELFStreamer *createMipsELFStreamer(MCContext &Context, |
75 | std::unique_ptr<MCAsmBackend> MAB, |
76 | std::unique_ptr<MCObjectWriter> OW, |
77 | std::unique_ptr<MCCodeEmitter> Emitter); |
78 | } // end namespace llvm |
79 | |
80 | #endif // LLVM_LIB_TARGET_MIPS_MCTARGETDESC_MIPSELFSTREAMER_H |
81 | |