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
//===- SearchableTable.td ----------------------------------*- tablegen -*-===//
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 file defines the key top-level classes needed to produce a reasonably
10
// generic table that can be binary-searched. Three types of objects can be
11
// defined using the classes in this file:
12
//
13
// 1. (Generic) Enums. By instantiating the GenericEnum class once, an enum with
14
// the name of the def is generated. It is guarded by the preprocessor define
15
// GET_name_DECL, where name is the name of the def.
16
//
17
// 2. (Generic) Tables and search indices. By instantiating the GenericTable
18
// class once, a table with the name of the instantiating def is generated and
19
// guarded by the GET_name_IMPL preprocessor guard.
20
//
21
// Both a primary key and additional secondary keys / search indices can also
22
// be defined, which result in the generation of lookup functions. Their
23
// declarations and definitions are all guarded by GET_name_DECL and
24
// GET_name_IMPL, respectively, where name is the name of the underlying table.
25
//
26
// See AArch64SystemOperands.td and its generated header for example uses.
27
//
28
//===----------------------------------------------------------------------===//
29
 
30
// Define a record derived from this class to generate a generic enum.
31
//
32
// The name of the record is used as the type name of the C++ enum.
33
class GenericEnum {
34
  // Name of a TableGen class. The enum will have one entry for each record
35
  // that derives from that class.
36
  string FilterClass;
37
 
38
  // (Optional) Name of a field that is present in all collected records and
39
  // contains the name of enum entries.
40
  //
41
  // If NameField is not set, the record names will be used instead.
42
  string NameField;
43
 
44
  // (Optional) Name of a field that is present in all collected records and
45
  // contains the numerical value of enum entries.
46
  //
47
  // If ValueField is not set, enum values will be assigned automatically,
48
  // starting at 0, according to a lexicographical sort of the entry names.
49
  string ValueField;
50
}
51
 
52
// Define a record derived from this class to generate a generic table. This
53
// table can have a searchable primary key, and it can also be referenced by
54
// external search indices.
55
//
56
// The name of the record is used as the name of the global primary array of
57
// entries of the table in C++.
58
class GenericTable {
59
  // Name of a class. The table will have one entry for each record that
60
  // derives from that class.
61
  string FilterClass;
62
 
63
  // Name of the C++ struct/class type that holds table entries. The
64
  // declaration of this type is not generated automatically.
65
  string CppTypeName = FilterClass;
66
 
67
  // List of the names of fields of collected records that contain the data for
68
  // table entries, in the order that is used for initialization in C++.
69
  //
70
  // TableGen needs to know the type of the fields so that it can format
71
  // the initializers correctly. It can infer the type of bit, bits, string,
72
  // Intrinsic, and Instruction values. 
73
  //
74
  // For each field of the table named xxx, TableGen will look for a field
75
  // named TypeOf_xxx and use that as a more detailed description of the
76
  // type of the field. This is required for fields whose type
77
  // cannot be deduced automatically, such as enum fields. For example:
78
  //
79
  //   def MyEnum : GenericEnum {
80
  //     let FilterClass = "MyEnum";
81
  //     ...
82
  //   }
83
  //
84
  //   class MyTableEntry {
85
  //     MyEnum V;
86
  //     ...
87
  //   }
88
  //
89
  //   def MyTable : GenericTable {
90
  //     let FilterClass = "MyTableEntry";
91
  //     let Fields = ["V", ...];
92
  //     string TypeOf_V = "MyEnum";
93
  //   }
94
  //
95
  // If a string field was initialized with a code literal, TableGen will
96
  // emit the code verbatim. However, if a string field was initialized
97
  // in some other way, but should be interpreted as code, then a TypeOf_xxx
98
  // field is necessary, with a value of "code":
99
  //
100
  //     string TypeOf_Predicate = "code";
101
  list<string> Fields;
102
 
103
  // (Optional) List of fields that make up the primary key.
104
  list<string> PrimaryKey;
105
 
106
  // (Optional) Name of the primary key search function.
107
  string PrimaryKeyName;
108
 
109
  // See SearchIndex.EarlyOut
110
  bit PrimaryKeyEarlyOut = false;
111
}
112
 
113
// Define a record derived from this class to generate an additional search
114
// index for a generic table that has been defined earlier.
115
//
116
// The name of the record will be used as the name of the C++ lookup function.
117
class SearchIndex {
118
  // Table that this search index refers to.
119
  GenericTable Table;
120
 
121
  // List of fields that make up the key.
122
  list<string> Key;
123
 
124
  // If true, the lookup function will check the first field of the key against
125
  // the minimum and maximum values in the index before entering the binary
126
  // search. This is convenient for tables that add extended data for a subset
127
  // of a larger enum-based space, e.g. extended data about a subset of
128
  // instructions.
129
  //
130
  // Can only be used when the first field is an integral (non-string) type.
131
  bit EarlyOut = false;
132
}
133
 
134
// Legacy table type with integrated enum.
135
class SearchableTable {
136
  list<string> SearchableFields;
137
  string EnumNameField = "Name";
138
  string EnumValueField;
139
}