~pali/+junk/llvm-toolchain-3.7

« back to all changes in this revision

Viewing changes to include/llvm/Support/TargetParser.h

  • Committer: Package Import Robot
  • Author(s): Sylvestre Ledru
  • Date: 2015-07-15 17:51:08 UTC
  • Revision ID: package-import@ubuntu.com-20150715175108-l8mynwovkx4zx697
Tags: upstream-3.7~+rc2
ImportĀ upstreamĀ versionĀ 3.7~+rc2

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
//===-- TargetParser - Parser for target features ---------------*- 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
// This file implements a target parser to recognise hardware features such as
 
11
// FPU/CPU/ARCH names as well as specific support such as HDIV, etc.
 
12
//
 
13
//===----------------------------------------------------------------------===//
 
14
 
 
15
#ifndef LLVM_SUPPORT_TARGETPARSER_H
 
16
#define LLVM_SUPPORT_TARGETPARSER_H
 
17
 
 
18
// FIXME: vector is used because that's what clang uses for subtarget feature
 
19
// lists, but SmallVector would probably be better
 
20
#include <vector>
 
21
 
 
22
namespace llvm {
 
23
  class StringRef;
 
24
 
 
25
// Target specific information into their own namespaces. These should be
 
26
// generated from TableGen because the information is already there, and there
 
27
// is where new information about targets will be added.
 
28
// FIXME: To TableGen this we need to make some table generated files available
 
29
// even if the back-end is not compiled with LLVM, plus we need to create a new
 
30
// back-end to TableGen to create these clean tables.
 
31
namespace ARM {
 
32
  // FPU names.
 
33
  enum FPUKind {
 
34
    FK_INVALID = 0,
 
35
    FK_NONE,
 
36
    FK_VFP,
 
37
    FK_VFPV2,
 
38
    FK_VFPV3,
 
39
    FK_VFPV3_FP16,
 
40
    FK_VFPV3_D16,
 
41
    FK_VFPV3_D16_FP16,
 
42
    FK_VFPV3XD,
 
43
    FK_VFPV3XD_FP16,
 
44
    FK_VFPV4,
 
45
    FK_VFPV4_D16,
 
46
    FK_FPV4_SP_D16,
 
47
    FK_FPV5_D16,
 
48
    FK_FPV5_SP_D16,
 
49
    FK_FP_ARMV8,
 
50
    FK_NEON,
 
51
    FK_NEON_FP16,
 
52
    FK_NEON_VFPV4,
 
53
    FK_NEON_FP_ARMV8,
 
54
    FK_CRYPTO_NEON_FP_ARMV8,
 
55
    FK_SOFTVFP,
 
56
    FK_LAST
 
57
  };
 
58
 
 
59
  // FPU Version
 
60
  enum FPUVersion {
 
61
    FV_NONE = 0,
 
62
    FV_VFPV2,
 
63
    FV_VFPV3,
 
64
    FV_VFPV3_FP16,
 
65
    FV_VFPV4,
 
66
    FV_VFPV5
 
67
  };
 
68
 
 
69
  // An FPU name implies one of three levels of Neon support:
 
70
  enum NeonSupportLevel {
 
71
    NS_None = 0, ///< No Neon
 
72
    NS_Neon,     ///< Neon
 
73
    NS_Crypto    ///< Neon with Crypto
 
74
  };
 
75
 
 
76
  // An FPU name restricts the FPU in one of three ways:
 
77
  enum FPURestriction {
 
78
    FR_None = 0, ///< No restriction
 
79
    FR_D16,      ///< Only 16 D registers
 
80
    FR_SP_D16    ///< Only single-precision instructions, with 16 D registers
 
81
  };
 
82
 
 
83
  // Arch names.
 
84
  enum ArchKind {
 
85
    AK_INVALID = 0,
 
86
    AK_ARMV2,
 
87
    AK_ARMV2A,
 
88
    AK_ARMV3,
 
89
    AK_ARMV3M,
 
90
    AK_ARMV4,
 
91
    AK_ARMV4T,
 
92
    AK_ARMV5T,
 
93
    AK_ARMV5TE,
 
94
    AK_ARMV5TEJ,
 
95
    AK_ARMV6,
 
96
    AK_ARMV6K,
 
97
    AK_ARMV6T2,
 
98
    AK_ARMV6Z,
 
99
    AK_ARMV6ZK,
 
100
    AK_ARMV6M,
 
101
    AK_ARMV6SM,
 
102
    AK_ARMV7A,
 
103
    AK_ARMV7R,
 
104
    AK_ARMV7M,
 
105
    AK_ARMV7EM,
 
106
    AK_ARMV8A,
 
107
    AK_ARMV8_1A,
 
108
    // Non-standard Arch names.
 
109
    AK_IWMMXT,
 
110
    AK_IWMMXT2,
 
111
    AK_XSCALE,
 
112
    AK_ARMV5,
 
113
    AK_ARMV5E,
 
114
    AK_ARMV6J,
 
115
    AK_ARMV6HL,
 
116
    AK_ARMV7,
 
117
    AK_ARMV7L,
 
118
    AK_ARMV7HL,
 
119
    AK_ARMV7S,
 
120
    AK_LAST
 
121
  };
 
122
 
 
123
  // Arch extension modifiers for CPUs.
 
124
  enum ArchExtKind {
 
125
    AEK_INVALID = 0,
 
126
    AEK_CRC,
 
127
    AEK_CRYPTO,
 
128
    AEK_FP,
 
129
    AEK_HWDIV,
 
130
    AEK_MP,
 
131
    AEK_SIMD,
 
132
    AEK_SEC,
 
133
    AEK_VIRT,
 
134
    // Unsupported extensions.
 
135
    AEK_OS,
 
136
    AEK_IWMMXT,
 
137
    AEK_IWMMXT2,
 
138
    AEK_MAVERICK,
 
139
    AEK_XSCALE,
 
140
    AEK_LAST
 
141
  };
 
142
 
 
143
  // ISA kinds.
 
144
  enum ISAKind {
 
145
    IK_INVALID = 0,
 
146
    IK_ARM,
 
147
    IK_THUMB,
 
148
    IK_AARCH64
 
149
  };
 
150
 
 
151
  // Endianness
 
152
  // FIXME: BE8 vs. BE32?
 
153
  enum EndianKind {
 
154
    EK_INVALID = 0,
 
155
    EK_LITTLE,
 
156
    EK_BIG
 
157
  };
 
158
 
 
159
  // v6/v7/v8 Profile
 
160
  enum ProfileKind {
 
161
    PK_INVALID = 0,
 
162
    PK_A,
 
163
    PK_R,
 
164
    PK_M
 
165
  };
 
166
} // namespace ARM
 
167
 
 
168
// Target Parsers, one per architecture.
 
169
class ARMTargetParser {
 
170
  static StringRef getFPUSynonym(StringRef FPU);
 
171
  static StringRef getArchSynonym(StringRef Arch);
 
172
 
 
173
public:
 
174
  static StringRef getCanonicalArchName(StringRef Arch);
 
175
 
 
176
  // Information by ID
 
177
  static const char * getFPUName(unsigned FPUKind);
 
178
  static     unsigned getFPUVersion(unsigned FPUKind);
 
179
  static     unsigned getFPUNeonSupportLevel(unsigned FPUKind);
 
180
  static     unsigned getFPURestriction(unsigned FPUKind);
 
181
  // FIXME: This should be moved to TargetTuple once it exists
 
182
  static       bool   getFPUFeatures(unsigned FPUKind,
 
183
                                     std::vector<const char*> &Features);
 
184
  static const char * getArchName(unsigned ArchKind);
 
185
  static   unsigned   getArchAttr(unsigned ArchKind);
 
186
  static const char * getCPUAttr(unsigned ArchKind);
 
187
  static const char * getSubArch(unsigned ArchKind);
 
188
  static const char * getArchExtName(unsigned ArchExtKind);
 
189
  static const char * getDefaultCPU(StringRef Arch);
 
190
 
 
191
  // Parser
 
192
  static unsigned parseFPU(StringRef FPU);
 
193
  static unsigned parseArch(StringRef Arch);
 
194
  static unsigned parseArchExt(StringRef ArchExt);
 
195
  static unsigned parseCPUArch(StringRef CPU);
 
196
  static unsigned parseArchISA(StringRef Arch);
 
197
  static unsigned parseArchEndian(StringRef Arch);
 
198
  static unsigned parseArchProfile(StringRef Arch);
 
199
  static unsigned parseArchVersion(StringRef Arch);
 
200
 
 
201
};
 
202
 
 
203
} // namespace llvm
 
204
 
 
205
#endif