123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139 |
- //===- SearchableTable.td ----------------------------------*- tablegen -*-===//
- //
- // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
- // See https://llvm.org/LICENSE.txt for license information.
- // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
- //
- //===----------------------------------------------------------------------===//
- //
- // This file defines the key top-level classes needed to produce a reasonably
- // generic table that can be binary-searched. Three types of objects can be
- // defined using the classes in this file:
- //
- // 1. (Generic) Enums. By instantiating the GenericEnum class once, an enum with
- // the name of the def is generated. It is guarded by the preprocessor define
- // GET_name_DECL, where name is the name of the def.
- //
- // 2. (Generic) Tables and search indices. By instantiating the GenericTable
- // class once, a table with the name of the instantiating def is generated and
- // guarded by the GET_name_IMPL preprocessor guard.
- //
- // Both a primary key and additional secondary keys / search indices can also
- // be defined, which result in the generation of lookup functions. Their
- // declarations and definitions are all guarded by GET_name_DECL and
- // GET_name_IMPL, respectively, where name is the name of the underlying table.
- //
- // See AArch64SystemOperands.td and its generated header for example uses.
- //
- //===----------------------------------------------------------------------===//
- // Define a record derived from this class to generate a generic enum.
- //
- // The name of the record is used as the type name of the C++ enum.
- class GenericEnum {
- // Name of a TableGen class. The enum will have one entry for each record
- // that derives from that class.
- string FilterClass;
- // (Optional) Name of a field that is present in all collected records and
- // contains the name of enum entries.
- //
- // If NameField is not set, the record names will be used instead.
- string NameField;
- // (Optional) Name of a field that is present in all collected records and
- // contains the numerical value of enum entries.
- //
- // If ValueField is not set, enum values will be assigned automatically,
- // starting at 0, according to a lexicographical sort of the entry names.
- string ValueField;
- }
- // Define a record derived from this class to generate a generic table. This
- // table can have a searchable primary key, and it can also be referenced by
- // external search indices.
- //
- // The name of the record is used as the name of the global primary array of
- // entries of the table in C++.
- class GenericTable {
- // Name of a class. The table will have one entry for each record that
- // derives from that class.
- string FilterClass;
- // Name of the C++ struct/class type that holds table entries. The
- // declaration of this type is not generated automatically.
- string CppTypeName = FilterClass;
- // List of the names of fields of collected records that contain the data for
- // table entries, in the order that is used for initialization in C++.
- //
- // TableGen needs to know the type of the fields so that it can format
- // the initializers correctly. It can infer the type of bit, bits, string,
- // Intrinsic, and Instruction values.
- //
- // For each field of the table named xxx, TableGen will look for a field
- // named TypeOf_xxx and use that as a more detailed description of the
- // type of the field. This is required for fields whose type
- // cannot be deduced automatically, such as enum fields. For example:
- //
- // def MyEnum : GenericEnum {
- // let FilterClass = "MyEnum";
- // ...
- // }
- //
- // class MyTableEntry {
- // MyEnum V;
- // ...
- // }
- //
- // def MyTable : GenericTable {
- // let FilterClass = "MyTableEntry";
- // let Fields = ["V", ...];
- // string TypeOf_V = "MyEnum";
- // }
- //
- // If a string field was initialized with a code literal, TableGen will
- // emit the code verbatim. However, if a string field was initialized
- // in some other way, but should be interpreted as code, then a TypeOf_xxx
- // field is necessary, with a value of "code":
- //
- // string TypeOf_Predicate = "code";
- list<string> Fields;
- // (Optional) List of fields that make up the primary key.
- list<string> PrimaryKey;
- // (Optional) Name of the primary key search function.
- string PrimaryKeyName;
- // See SearchIndex.EarlyOut
- bit PrimaryKeyEarlyOut = false;
- }
- // Define a record derived from this class to generate an additional search
- // index for a generic table that has been defined earlier.
- //
- // The name of the record will be used as the name of the C++ lookup function.
- class SearchIndex {
- // Table that this search index refers to.
- GenericTable Table;
- // List of fields that make up the key.
- list<string> Key;
- // If true, the lookup function will check the first field of the key against
- // the minimum and maximum values in the index before entering the binary
- // search. This is convenient for tables that add extended data for a subset
- // of a larger enum-based space, e.g. extended data about a subset of
- // instructions.
- //
- // Can only be used when the first field is an integral (non-string) type.
- bit EarlyOut = false;
- }
- // Legacy table type with integrated enum.
- class SearchableTable {
- list<string> SearchableFields;
- string EnumNameField = "Name";
- string EnumValueField;
- }
|