Coverage Report

Created: 2023-09-25 06:27

/src/keystone/llvm/lib/Target/Mips/MCTargetDesc/MipsABIFlagsSection.h
Line
Count
Source (jump to first uncovered line)
1
//===-- MipsABIFlagsSection.h - Mips ELF ABI Flags Section -----*- C++ -*--===//
2
//
3
//                     The LLVM Compiler Infrastructure
4
//
5
// This file is distributed under the University of Illinois Open Source
6
// License. See LICENSE.TXT for details.
7
//
8
//===----------------------------------------------------------------------===//
9
10
#ifndef LLVM_LIB_TARGET_MIPS_MCTARGETDESC_MIPSABIFLAGSSECTION_H
11
#define LLVM_LIB_TARGET_MIPS_MCTARGETDESC_MIPSABIFLAGSSECTION_H
12
13
#include "llvm/MC/MCStreamer.h"
14
#include "llvm/Support/ErrorHandling.h"
15
#include "llvm/Support/MipsABIFlags.h"
16
17
namespace llvm_ks {
18
19
class MCStreamer;
20
21
struct MipsABIFlagsSection {
22
  // Internal representation of the fp_abi related values used in .module.
23
  enum class FpABIKind { ANY, XX, S32, S64, SOFT };
24
25
  // Version of flags structure.
26
  uint16_t Version;
27
  // The level of the ISA: 1-5, 32, 64.
28
  uint8_t ISALevel;
29
  // The revision of ISA: 0 for MIPS V and below, 1-n otherwise.
30
  uint8_t ISARevision;
31
  // The size of general purpose registers.
32
  Mips::AFL_REG GPRSize;
33
  // The size of co-processor 1 registers.
34
  Mips::AFL_REG CPR1Size;
35
  // The size of co-processor 2 registers.
36
  Mips::AFL_REG CPR2Size;
37
  // Processor-specific extension.
38
  uint32_t ISAExtensionSet;
39
  // Mask of ASEs used.
40
  uint32_t ASESet;
41
42
  bool OddSPReg;
43
44
  bool Is32BitABI;
45
46
protected:
47
  // The floating-point ABI.
48
  FpABIKind FpABI;
49
50
public:
51
  MipsABIFlagsSection()
52
      : Version(0), ISALevel(0), ISARevision(0), GPRSize(Mips::AFL_REG_NONE),
53
        CPR1Size(Mips::AFL_REG_NONE), CPR2Size(Mips::AFL_REG_NONE),
54
        ISAExtensionSet(0), ASESet(0), OddSPReg(false), Is32BitABI(false),
55
0
        FpABI(FpABIKind::ANY) {}
56
57
0
  uint16_t getVersionValue() { return (uint16_t)Version; }
58
0
  uint8_t getISALevelValue() { return (uint8_t)ISALevel; }
59
0
  uint8_t getISARevisionValue() { return (uint8_t)ISARevision; }
60
0
  uint8_t getGPRSizeValue() { return (uint8_t)GPRSize; }
61
  uint8_t getCPR1SizeValue();
62
0
  uint8_t getCPR2SizeValue() { return (uint8_t)CPR2Size; }
63
  uint8_t getFpABIValue();
64
0
  uint32_t getISAExtensionSetValue() { return (uint32_t)ISAExtensionSet; }
65
0
  uint32_t getASESetValue() { return (uint32_t)ASESet; }
66
67
0
  uint32_t getFlags1Value() {
68
0
    uint32_t Value = 0;
69
0
70
0
    if (OddSPReg)
71
0
      Value |= (uint32_t)Mips::AFL_FLAGS1_ODDSPREG;
72
0
73
0
    return Value;
74
0
  }
75
76
0
  uint32_t getFlags2Value() { return 0; }
77
78
0
  FpABIKind getFpABI() { return FpABI; }
79
0
  void setFpABI(FpABIKind Value, bool IsABI32Bit) {
80
0
    FpABI = Value;
81
0
    Is32BitABI = IsABI32Bit;
82
0
  }
83
  StringRef getFpABIString(FpABIKind Value);
84
85
  template <class PredicateLibrary>
86
  void setISALevelAndRevisionFromPredicates(const PredicateLibrary &P) {
87
    if (P.hasMips64()) {
88
      ISALevel = 64;
89
      if (P.hasMips64r6())
90
        ISARevision = 6;
91
      else if (P.hasMips64r5())
92
        ISARevision = 5;
93
      else if (P.hasMips64r3())
94
        ISARevision = 3;
95
      else if (P.hasMips64r2())
96
        ISARevision = 2;
97
      else
98
        ISARevision = 1;
99
    } else if (P.hasMips32()) {
100
      ISALevel = 32;
101
      if (P.hasMips32r6())
102
        ISARevision = 6;
103
      else if (P.hasMips32r5())
104
        ISARevision = 5;
105
      else if (P.hasMips32r3())
106
        ISARevision = 3;
107
      else if (P.hasMips32r2())
108
        ISARevision = 2;
109
      else
110
        ISARevision = 1;
111
    } else {
112
      ISARevision = 0;
113
      if (P.hasMips5())
114
        ISALevel = 5;
115
      else if (P.hasMips4())
116
        ISALevel = 4;
117
      else if (P.hasMips3())
118
        ISALevel = 3;
119
      else if (P.hasMips2())
120
        ISALevel = 2;
121
      else if (P.hasMips1())
122
        ISALevel = 1;
123
      else
124
        llvm_unreachable("Unknown ISA level!");
125
    }
126
  }
127
128
  template <class PredicateLibrary>
129
  void setGPRSizeFromPredicates(const PredicateLibrary &P) {
130
    GPRSize = P.isGP64bit() ? Mips::AFL_REG_64 : Mips::AFL_REG_32;
131
  }
132
133
  template <class PredicateLibrary>
134
  void setCPR1SizeFromPredicates(const PredicateLibrary &P) {
135
    if (P.useSoftFloat())
136
      CPR1Size = Mips::AFL_REG_NONE;
137
    else if (P.hasMSA())
138
      CPR1Size = Mips::AFL_REG_128;
139
    else
140
      CPR1Size = P.isFP64bit() ? Mips::AFL_REG_64 : Mips::AFL_REG_32;
141
  }
142
143
  template <class PredicateLibrary>
144
  void setASESetFromPredicates(const PredicateLibrary &P) {
145
    ASESet = 0;
146
    if (P.hasDSP())
147
      ASESet |= Mips::AFL_ASE_DSP;
148
    if (P.hasDSPR2())
149
      ASESet |= Mips::AFL_ASE_DSPR2;
150
    if (P.hasMSA())
151
      ASESet |= Mips::AFL_ASE_MSA;
152
    if (P.inMicroMipsMode())
153
      ASESet |= Mips::AFL_ASE_MICROMIPS;
154
    if (P.inMips16Mode())
155
      ASESet |= Mips::AFL_ASE_MIPS16;
156
  }
157
158
  template <class PredicateLibrary>
159
  void setFpAbiFromPredicates(const PredicateLibrary &P) {
160
    Is32BitABI = P.isABI_O32();
161
162
    FpABI = FpABIKind::ANY;
163
    if (P.useSoftFloat())
164
      FpABI = FpABIKind::SOFT;
165
    else if (P.isABI_N32() || P.isABI_N64())
166
      FpABI = FpABIKind::S64;
167
    else if (P.isABI_O32()) {
168
      if (P.isABI_FPXX())
169
        FpABI = FpABIKind::XX;
170
      else if (P.isFP64bit())
171
        FpABI = FpABIKind::S64;
172
      else
173
        FpABI = FpABIKind::S32;
174
    }
175
  }
176
177
  template <class PredicateLibrary>
178
  void setAllFromPredicates(const PredicateLibrary &P) {
179
    setISALevelAndRevisionFromPredicates(P);
180
    setGPRSizeFromPredicates(P);
181
    setCPR1SizeFromPredicates(P);
182
    setASESetFromPredicates(P);
183
    setFpAbiFromPredicates(P);
184
    OddSPReg = P.useOddSPReg();
185
  }
186
};
187
188
MCStreamer &operator<<(MCStreamer &OS, MipsABIFlagsSection &ABIFlagsSection);
189
}
190
191
#endif