Blame | Last modification | View Log | Download | RSS feed
//===- 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.EarlyOutbit 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;}