Viewing file: SetTheory.h (4.77 KB) -rw-r--r-- Select action/file-type: (+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
//===- SetTheory.h - Generate ordered sets from DAG expressions -*- C++ -*-===// // // 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 implements the SetTheory class that computes ordered sets of // Records from DAG expressions. Operators for standard set operations are // predefined, and it is possible to add special purpose set operators as well. // // The user may define named sets as Records of predefined classes. Set // expanders can be added to a SetTheory instance to teach it how to find the // elements of such a named set. // // These are the predefined operators. The argument lists can be individual // elements (defs), other sets (defs of expandable classes), lists, or DAG // expressions that are evaluated recursively. // // - (add S1, S2 ...) Union sets. This is also how sets are created from element // lists. // // - (sub S1, S2, ...) Set difference. Every element in S1 except for the // elements in S2, ... // // - (and S1, S2) Set intersection. Every element in S1 that is also in S2. // // - (shl S, N) Shift left. Remove the first N elements from S. // // - (trunc S, N) Truncate. The first N elements of S. // // - (rotl S, N) Rotate left. Same as (add (shl S, N), (trunc S, N)). // // - (rotr S, N) Rotate right. // // - (decimate S, N) Decimate S by picking every N'th element, starting with // the first one. For instance, (decimate S, 2) returns the even elements of // S. // // - (sequence "Format", From, To, [Stride]) Generate a sequence of defs with // printf. For instance, (sequence "R%u", 0, 3) -> [ R0, R1, R2, R3 ] and // (sequence "R%u", 20, 30, 5) -> [ R20, R25, R30 ]. // //===----------------------------------------------------------------------===//
#ifndef LLVM_TABLEGEN_SETTHEORY_H #define LLVM_TABLEGEN_SETTHEORY_H
#include "llvm/ADT/ArrayRef.h" #include "llvm/ADT/SetVector.h" #include "llvm/ADT/StringMap.h" #include "llvm/ADT/StringRef.h" #include "llvm/Support/SMLoc.h" #include <map> #include <memory> #include <vector>
namespace llvm {
class DagInit; class Init; class Record;
class SetTheory { public: using RecVec = std::vector<Record *>; using RecSet = SmallSetVector<Record *, 16>;
/// Operator - A callback representing a DAG operator. class Operator { virtual void anchor();
public: virtual ~Operator() = default;
/// apply - Apply this operator to Expr's arguments and insert the result /// in Elts. virtual void apply(SetTheory&, DagInit *Expr, RecSet &Elts, ArrayRef<SMLoc> Loc) = 0; };
/// Expander - A callback function that can transform a Record representing a /// set into a fully expanded list of elements. Expanders provide a way for /// users to define named sets that can be used in DAG expressions. class Expander { virtual void anchor();
public: virtual ~Expander() = default;
virtual void expand(SetTheory&, Record*, RecSet &Elts) = 0; };
private: // Map set defs to their fully expanded contents. This serves as a memoization // cache and it makes it possible to return const references on queries. using ExpandMap = std::map<Record *, RecVec>; ExpandMap Expansions;
// Known DAG operators by name. StringMap<std::unique_ptr<Operator>> Operators;
// Typed expanders by class name. StringMap<std::unique_ptr<Expander>> Expanders;
public: /// Create a SetTheory instance with only the standard operators. SetTheory();
/// addExpander - Add an expander for Records with the named super class. void addExpander(StringRef ClassName, std::unique_ptr<Expander>);
/// addFieldExpander - Add an expander for ClassName that simply evaluates /// FieldName in the Record to get the set elements. That is all that is /// needed for a class like: /// /// class Set<dag d> { /// dag Elts = d; /// } /// void addFieldExpander(StringRef ClassName, StringRef FieldName);
/// addOperator - Add a DAG operator. void addOperator(StringRef Name, std::unique_ptr<Operator>);
/// evaluate - Evaluate Expr and append the resulting set to Elts. void evaluate(Init *Expr, RecSet &Elts, ArrayRef<SMLoc> Loc);
/// evaluate - Evaluate a sequence of Inits and append to Elts. template<typename Iter> void evaluate(Iter begin, Iter end, RecSet &Elts, ArrayRef<SMLoc> Loc) { while (begin != end) evaluate(*begin++, Elts, Loc); }
/// expand - Expand a record into a set of elements if possible. Return a /// pointer to the expanded elements, or NULL if Set cannot be expanded /// further. const RecVec *expand(Record *Set); };
} // end namespace llvm
#endif // LLVM_TABLEGEN_SETTHEORY_H
|