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