mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-24 03:33:20 +01:00
86fa0255b2
The way the named arguments for various system instructions are handled at the moment has a few problems: - Large-scale duplication between AArch64BaseInfo.h and AArch64BaseInfo.cpp - That weird Mapping class that I have no idea what I was on when I thought it was a good idea. - Searches are performed linearly through the entire list. - We print absolutely all registers in upper-case, even though some are canonically mixed case (SPSel for example). - The ARM ARM specifies sysregs in terms of 5 fields, but those are relegated to comments in our implementation, with a slightly opaque hex value indicating the canonical encoding LLVM will use. This adds a new TableGen backend to produce efficiently searchable tables, and switches AArch64 over to using that infrastructure. llvm-svn: 274576
42 lines
1.8 KiB
TableGen
42 lines
1.8 KiB
TableGen
//===- SearchableTable.td ----------------------------------*- tablegen -*-===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// This file defines the key top-level classes needed to produce a reasonably
|
|
// generic table that can be binary-searched via int and string entries.
|
|
//
|
|
// Each table must instantiate "Mappingkind", listing the fields that should be
|
|
// included and fields that shoould be searchable. Only two kinds of fields are
|
|
// searchable at the moment: "strings" (which are compared case-insensitively),
|
|
// and "bits".
|
|
//
|
|
// For each "MappingKind" the generated header will create GET_MAPPINGKIND_DECL
|
|
// and GET_MAPPINGKIND_IMPL guards.
|
|
//
|
|
// Inside the DECL guard will be a set of function declarations:
|
|
// "lookup{InstanceClass}By{SearchableField}", returning "const {InstanceClass}
|
|
// *" and accepting either a StringRef or a uintN_t. Additionally, if
|
|
// EnumNameField is still defined, there will be an "enum {InstanceClass}Values"
|
|
// allowing C++ code to reference either the primary data table's entries (if
|
|
// EnumValueField is not defined) or some other field (e.g. encoding) if it is.
|
|
//
|
|
// Inside the IMPL guard will be a primary data table "{InstanceClass}sList" and
|
|
// as many searchable indexes as requested
|
|
// ("{InstanceClass}sBy{SearchableField}"). Additionally implementations of the
|
|
// lookup function will be provided.
|
|
//
|
|
// See AArch64SystemOperands.td and its generated header for example uses.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
class SearchableTable {
|
|
list<string> SearchableFields;
|
|
string EnumNameField = "Name";
|
|
string EnumValueField;
|
|
}
|