Coverage Report

Created: 2019-07-24 05:18

/Users/buildslave/jenkins/workspace/clang-stage2-coverage-R/llvm/lib/Target/Mips/MipsAsmPrinter.h
Line
Count
Source
1
//===- MipsAsmPrinter.h - Mips LLVM Assembly Printer -----------*- 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
// Mips Assembly printer class.
10
//
11
//===----------------------------------------------------------------------===//
12
13
#ifndef LLVM_LIB_TARGET_MIPS_MIPSASMPRINTER_H
14
#define LLVM_LIB_TARGET_MIPS_MIPSASMPRINTER_H
15
16
#include "Mips16HardFloatInfo.h"
17
#include "MipsMCInstLower.h"
18
#include "MipsSubtarget.h"
19
#include "llvm/CodeGen/AsmPrinter.h"
20
#include "llvm/MC/MCStreamer.h"
21
#include "llvm/Support/Compiler.h"
22
#include <algorithm>
23
#include <map>
24
#include <memory>
25
26
namespace llvm {
27
28
class MCOperand;
29
class MCSubtargetInfo;
30
class MCSymbol;
31
class MachineBasicBlock;
32
class MachineConstantPool;
33
class MachineFunction;
34
class MachineInstr;
35
class MachineOperand;
36
class MipsFunctionInfo;
37
class MipsTargetStreamer;
38
class Module;
39
class raw_ostream;
40
class TargetMachine;
41
42
class LLVM_LIBRARY_VISIBILITY MipsAsmPrinter : public AsmPrinter {
43
  MipsTargetStreamer &getTargetStreamer() const;
44
45
  void EmitInstrWithMacroNoAT(const MachineInstr *MI);
46
47
  //===------------------------------------------------------------------===//
48
  // XRay implementation
49
  //===------------------------------------------------------------------===//
50
51
public:
52
  // XRay-specific lowering for Mips.
53
  void LowerPATCHABLE_FUNCTION_ENTER(const MachineInstr &MI);
54
  void LowerPATCHABLE_FUNCTION_EXIT(const MachineInstr &MI);
55
  void LowerPATCHABLE_TAIL_CALL(const MachineInstr &MI);
56
57
private:
58
  /// MCP - Keep a pointer to constantpool entries of the current
59
  /// MachineFunction.
60
  const MachineConstantPool *MCP = nullptr;
61
62
  /// InConstantPool - Maintain state when emitting a sequence of constant
63
  /// pool entries so we can properly mark them as data regions.
64
  bool InConstantPool = false;
65
66
  std::map<const char *, const Mips16HardFloatInfo::FuncSignature *>
67
      StubsNeeded;
68
69
  void EmitSled(const MachineInstr &MI, SledKind Kind);
70
71
  // tblgen'erated function.
72
  bool emitPseudoExpansionLowering(MCStreamer &OutStreamer,
73
                                   const MachineInstr *MI);
74
75
  // Emit PseudoReturn, PseudoReturn64, PseudoIndirectBranch,
76
  // and PseudoIndirectBranch64 as a JR, JR_MM, JALR, or JALR64 as appropriate
77
  // for the target.
78
  void emitPseudoIndirectBranch(MCStreamer &OutStreamer,
79
                                const MachineInstr *MI);
80
81
  // lowerOperand - Convert a MachineOperand into the equivalent MCOperand.
82
  bool lowerOperand(const MachineOperand &MO, MCOperand &MCOp);
83
84
  void emitInlineAsmStart() const override;
85
86
  void emitInlineAsmEnd(const MCSubtargetInfo &StartInfo,
87
                        const MCSubtargetInfo *EndInfo) const override;
88
89
  void EmitJal(const MCSubtargetInfo &STI, MCSymbol *Symbol);
90
91
  void EmitInstrReg(const MCSubtargetInfo &STI, unsigned Opcode, unsigned Reg);
92
93
  void EmitInstrRegReg(const MCSubtargetInfo &STI, unsigned Opcode,
94
                       unsigned Reg1, unsigned Reg2);
95
96
  void EmitInstrRegRegReg(const MCSubtargetInfo &STI, unsigned Opcode,
97
                          unsigned Reg1, unsigned Reg2, unsigned Reg3);
98
99
  void EmitMovFPIntPair(const MCSubtargetInfo &STI, unsigned MovOpc,
100
                        unsigned Reg1, unsigned Reg2, unsigned FPReg1,
101
                        unsigned FPReg2, bool LE);
102
103
  void EmitSwapFPIntParams(const MCSubtargetInfo &STI,
104
                           Mips16HardFloatInfo::FPParamVariant, bool LE,
105
                           bool ToFP);
106
107
  void EmitSwapFPIntRetval(const MCSubtargetInfo &STI,
108
                           Mips16HardFloatInfo::FPReturnVariant, bool LE);
109
110
  void EmitFPCallStub(const char *, const Mips16HardFloatInfo::FuncSignature *);
111
112
  void NaClAlignIndirectJumpTargets(MachineFunction &MF);
113
114
  bool isLongBranchPseudo(int Opcode) const;
115
116
public:
117
  const MipsSubtarget *Subtarget;
118
  const MipsFunctionInfo *MipsFI;
119
  MipsMCInstLower MCInstLowering;
120
121
  explicit MipsAsmPrinter(TargetMachine &TM,
122
                          std::unique_ptr<MCStreamer> Streamer)
123
2.01k
      : AsmPrinter(TM, std::move(Streamer)), MCInstLowering(*this) {}
124
125
13.2k
  StringRef getPassName() const override { return "Mips Assembly Printer"; }
126
127
  bool runOnMachineFunction(MachineFunction &MF) override;
128
129
13.2k
  void EmitConstantPool() override {
130
13.2k
    bool UsingConstantPools =
131
13.2k
      (Subtarget->inMips16Mode() && 
Subtarget->useConstantIslands()380
);
132
13.2k
    if (!UsingConstantPools)
133
12.8k
      AsmPrinter::EmitConstantPool();
134
13.2k
    // we emit constant pools customly!
135
13.2k
  }
136
137
  void EmitInstruction(const MachineInstr *MI) override;
138
  void printSavedRegsBitmask();
139
  void emitFrameDirective();
140
  const char *getCurrentABIString() const;
141
  void EmitFunctionEntryLabel() override;
142
  void EmitFunctionBodyStart() override;
143
  void EmitFunctionBodyEnd() override;
144
  void EmitBasicBlockEnd(const MachineBasicBlock &MBB) override;
145
  bool isBlockOnlyReachableByFallthrough(
146
                                   const MachineBasicBlock* MBB) const override;
147
  bool PrintAsmOperand(const MachineInstr *MI, unsigned OpNo,
148
                       const char *ExtraCode, raw_ostream &O) override;
149
  bool PrintAsmMemoryOperand(const MachineInstr *MI, unsigned OpNum,
150
                             const char *ExtraCode, raw_ostream &O) override;
151
  void printOperand(const MachineInstr *MI, int opNum, raw_ostream &O);
152
  void printMemOperand(const MachineInstr *MI, int opNum, raw_ostream &O);
153
  void printMemOperandEA(const MachineInstr *MI, int opNum, raw_ostream &O);
154
  void printFCCOperand(const MachineInstr *MI, int opNum, raw_ostream &O,
155
                       const char *Modifier = nullptr);
156
  void printRegisterList(const MachineInstr *MI, int opNum, raw_ostream &O);
157
  void EmitStartOfAsmFile(Module &M) override;
158
  void EmitEndOfAsmFile(Module &M) override;
159
  void PrintDebugValueComment(const MachineInstr *MI, raw_ostream &OS);
160
  void EmitDebugValue(const MCExpr *Value, unsigned Size) const override;
161
};
162
163
} // end namespace llvm
164
165
#endif // LLVM_LIB_TARGET_MIPS_MIPSASMPRINTER_H