Subversion Repositories QNX 8.QNX8 LLVM/Clang compiler suite

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
14 pmbaty 1
#ifndef LLVM_TABLEGEN_DIRECTIVEEMITTER_H
2
#define LLVM_TABLEGEN_DIRECTIVEEMITTER_H
3
 
4
#include "llvm/ADT/StringExtras.h"
5
#include "llvm/TableGen/Record.h"
6
 
7
namespace llvm {
8
 
9
// Wrapper class that contains DirectiveLanguage's information defined in
10
// DirectiveBase.td and provides helper methods for accessing it.
11
class DirectiveLanguage {
12
public:
13
  explicit DirectiveLanguage(const llvm::RecordKeeper &Records)
14
      : Records(Records) {
15
    const auto &DirectiveLanguages = getDirectiveLanguages();
16
    Def = DirectiveLanguages[0];
17
  }
18
 
19
  StringRef getName() const { return Def->getValueAsString("name"); }
20
 
21
  StringRef getCppNamespace() const {
22
    return Def->getValueAsString("cppNamespace");
23
  }
24
 
25
  StringRef getDirectivePrefix() const {
26
    return Def->getValueAsString("directivePrefix");
27
  }
28
 
29
  StringRef getClausePrefix() const {
30
    return Def->getValueAsString("clausePrefix");
31
  }
32
 
33
  StringRef getClauseEnumSetClass() const {
34
    return Def->getValueAsString("clauseEnumSetClass");
35
  }
36
 
37
  StringRef getFlangClauseBaseClass() const {
38
    return Def->getValueAsString("flangClauseBaseClass");
39
  }
40
 
41
  bool hasMakeEnumAvailableInNamespace() const {
42
    return Def->getValueAsBit("makeEnumAvailableInNamespace");
43
  }
44
 
45
  bool hasEnableBitmaskEnumInNamespace() const {
46
    return Def->getValueAsBit("enableBitmaskEnumInNamespace");
47
  }
48
 
49
  std::vector<Record *> getDirectives() const {
50
    return Records.getAllDerivedDefinitions("Directive");
51
  }
52
 
53
  std::vector<Record *> getClauses() const {
54
    return Records.getAllDerivedDefinitions("Clause");
55
  }
56
 
57
  bool HasValidityErrors() const;
58
 
59
private:
60
  const llvm::Record *Def;
61
  const llvm::RecordKeeper &Records;
62
 
63
  std::vector<Record *> getDirectiveLanguages() const {
64
    return Records.getAllDerivedDefinitions("DirectiveLanguage");
65
  }
66
};
67
 
68
// Base record class used for Directive and Clause class defined in
69
// DirectiveBase.td.
70
class BaseRecord {
71
public:
72
  explicit BaseRecord(const llvm::Record *Def) : Def(Def) {}
73
 
74
  StringRef getName() const { return Def->getValueAsString("name"); }
75
 
76
  StringRef getAlternativeName() const {
77
    return Def->getValueAsString("alternativeName");
78
  }
79
 
80
  // Returns the name of the directive formatted for output. Whitespace are
81
  // replaced with underscores.
82
  std::string getFormattedName() {
83
    StringRef Name = Def->getValueAsString("name");
84
    std::string N = Name.str();
85
    std::replace(N.begin(), N.end(), ' ', '_');
86
    return N;
87
  }
88
 
89
  bool isDefault() const { return Def->getValueAsBit("isDefault"); }
90
 
91
  // Returns the record name.
92
  StringRef getRecordName() const { return Def->getName(); }
93
 
94
protected:
95
  const llvm::Record *Def;
96
};
97
 
98
// Wrapper class that contains a Directive's information defined in
99
// DirectiveBase.td and provides helper methods for accessing it.
100
class Directive : public BaseRecord {
101
public:
102
  explicit Directive(const llvm::Record *Def) : BaseRecord(Def) {}
103
 
104
  std::vector<Record *> getAllowedClauses() const {
105
    return Def->getValueAsListOfDefs("allowedClauses");
106
  }
107
 
108
  std::vector<Record *> getAllowedOnceClauses() const {
109
    return Def->getValueAsListOfDefs("allowedOnceClauses");
110
  }
111
 
112
  std::vector<Record *> getAllowedExclusiveClauses() const {
113
    return Def->getValueAsListOfDefs("allowedExclusiveClauses");
114
  }
115
 
116
  std::vector<Record *> getRequiredClauses() const {
117
    return Def->getValueAsListOfDefs("requiredClauses");
118
  }
119
};
120
 
121
// Wrapper class that contains Clause's information defined in DirectiveBase.td
122
// and provides helper methods for accessing it.
123
class Clause : public BaseRecord {
124
public:
125
  explicit Clause(const llvm::Record *Def) : BaseRecord(Def) {}
126
 
127
  // Optional field.
128
  StringRef getClangClass() const {
129
    return Def->getValueAsString("clangClass");
130
  }
131
 
132
  // Optional field.
133
  StringRef getFlangClass() const {
134
    return Def->getValueAsString("flangClass");
135
  }
136
 
137
  // Get the formatted name for Flang parser class. The generic formatted class
138
  // name is constructed from the name were the first letter of each word is
139
  // captitalized and the underscores are removed.
140
  // ex: async -> Async
141
  //     num_threads -> NumThreads
142
  std::string getFormattedParserClassName() {
143
    StringRef Name = Def->getValueAsString("name");
144
    std::string N = Name.str();
145
    bool Cap = true;
146
    std::transform(N.begin(), N.end(), N.begin(), [&Cap](unsigned char C) {
147
      if (Cap == true) {
148
        C = llvm::toUpper(C);
149
        Cap = false;
150
      } else if (C == '_') {
151
        Cap = true;
152
      }
153
      return C;
154
    });
155
    llvm::erase_value(N, '_');
156
    return N;
157
  }
158
 
159
  // Optional field.
160
  StringRef getEnumName() const {
161
    return Def->getValueAsString("enumClauseValue");
162
  }
163
 
164
  std::vector<Record *> getClauseVals() const {
165
    return Def->getValueAsListOfDefs("allowedClauseValues");
166
  }
167
 
168
  bool isValueOptional() const { return Def->getValueAsBit("isValueOptional"); }
169
 
170
  bool isValueList() const { return Def->getValueAsBit("isValueList"); }
171
 
172
  StringRef getDefaultValue() const {
173
    return Def->getValueAsString("defaultValue");
174
  }
175
 
176
  bool isImplicit() const { return Def->getValueAsBit("isImplicit"); }
177
 
178
  std::vector<StringRef> getAliases() const {
179
    return Def->getValueAsListOfStrings("aliases");
180
  }
181
 
182
  StringRef getPrefix() const { return Def->getValueAsString("prefix"); }
183
 
184
  bool isPrefixOptional() const {
185
    return Def->getValueAsBit("isPrefixOptional");
186
  }
187
};
188
 
189
// Wrapper class that contains VersionedClause's information defined in
190
// DirectiveBase.td and provides helper methods for accessing it.
191
class VersionedClause {
192
public:
193
  explicit VersionedClause(const llvm::Record *Def) : Def(Def) {}
194
 
195
  // Return the specific clause record wrapped in the Clause class.
196
  Clause getClause() const { return Clause{Def->getValueAsDef("clause")}; }
197
 
198
  int64_t getMinVersion() const { return Def->getValueAsInt("minVersion"); }
199
 
200
  int64_t getMaxVersion() const { return Def->getValueAsInt("maxVersion"); }
201
 
202
private:
203
  const llvm::Record *Def;
204
};
205
 
206
class ClauseVal : public BaseRecord {
207
public:
208
  explicit ClauseVal(const llvm::Record *Def) : BaseRecord(Def) {}
209
 
210
  int getValue() const { return Def->getValueAsInt("value"); }
211
 
212
  bool isUserVisible() const { return Def->getValueAsBit("isUserValue"); }
213
};
214
 
215
} // namespace llvm
216
 
217
#endif