diff options
Diffstat (limited to 'llvm/utils/TableGen/Basic/CodeGenIntrinsics.h')
| -rw-r--r-- | llvm/utils/TableGen/Basic/CodeGenIntrinsics.h | 104 |
1 files changed, 66 insertions, 38 deletions
diff --git a/llvm/utils/TableGen/Basic/CodeGenIntrinsics.h b/llvm/utils/TableGen/Basic/CodeGenIntrinsics.h index 403706407fdb..8428d09a9400 100644 --- a/llvm/utils/TableGen/Basic/CodeGenIntrinsics.h +++ b/llvm/utils/TableGen/Basic/CodeGenIntrinsics.h @@ -10,11 +10,12 @@ // //===----------------------------------------------------------------------===// -#ifndef LLVM_UTILS_TABLEGEN_CODEGENINTRINSICS_H -#define LLVM_UTILS_TABLEGEN_CODEGENINTRINSICS_H +#ifndef LLVM_UTILS_TABLEGEN_BASIC_CODEGENINTRINSICS_H +#define LLVM_UTILS_TABLEGEN_BASIC_CODEGENINTRINSICS_H #include "SDNodeProperties.h" #include "llvm/ADT/ArrayRef.h" +#include "llvm/ADT/DenseMap.h" #include "llvm/ADT/SmallVector.h" #include "llvm/Support/ModRef.h" #include <string> @@ -25,13 +26,22 @@ namespace llvm { class Record; class RecordKeeper; +// Global information needed to build intrinsics. +struct CodeGenIntrinsicContext { + explicit CodeGenIntrinsicContext(const RecordKeeper &RC); + std::vector<const Record *> DefaultProperties; + + // Maximum number of values an intrinsic can return. + unsigned MaxNumReturn; +}; + struct CodeGenIntrinsic { - Record *TheDef; // The actual record defining this intrinsic. + const Record *TheDef; // The actual record defining this intrinsic. std::string Name; // The name of the LLVM function "llvm.bswap.i32" - std::string EnumName; // The name of the enum "bswap_i32" - std::string ClangBuiltinName; // Name of the corresponding GCC builtin, or "". - std::string MSBuiltinName; // Name of the corresponding MS builtin, or "". - std::string TargetPrefix; // Target prefix, e.g. "ppc" for t-s intrinsics. + StringRef EnumName; // The name of the enum "bswap_i32" + StringRef ClangBuiltinName; // Name of the corresponding GCC builtin, or "". + StringRef MSBuiltinName; // Name of the corresponding MS builtin, or "". + StringRef TargetPrefix; // Target prefix, e.g. "ppc" for t-s intrinsics. /// This structure holds the return values and parameter values of an /// intrinsic. If the number of return values is > 1, then the intrinsic @@ -43,13 +53,13 @@ struct CodeGenIntrinsic { /// only populated when in the context of a target .td file. When building /// Intrinsics.td, this isn't available, because we don't know the target /// pointer size. - std::vector<Record *> RetTys; + std::vector<const Record *> RetTys; /// The MVT::SimpleValueType for each parameter type. Note that this list is /// only populated when in the context of a target .td file. When building /// Intrinsics.td, this isn't available, because we don't know the target /// pointer size. - std::vector<Record *> ParamTys; + std::vector<const Record *> ParamTys; }; IntrinsicSignature IS; @@ -58,54 +68,54 @@ struct CodeGenIntrinsic { MemoryEffects ME = MemoryEffects::unknown(); /// SDPatternOperator Properties applied to the intrinsic. - unsigned Properties; + unsigned Properties = 0; /// This is set to true if the intrinsic is overloaded by its argument /// types. - bool isOverloaded; + bool isOverloaded = false; /// True if the intrinsic is commutative. - bool isCommutative; + bool isCommutative = false; /// True if the intrinsic can throw. - bool canThrow; + bool canThrow = false; /// True if the intrinsic is marked as noduplicate. - bool isNoDuplicate; + bool isNoDuplicate = false; /// True if the intrinsic is marked as nomerge. - bool isNoMerge; + bool isNoMerge = false; /// True if the intrinsic is no-return. - bool isNoReturn; + bool isNoReturn = false; /// True if the intrinsic is no-callback. - bool isNoCallback; + bool isNoCallback = false; /// True if the intrinsic is no-sync. - bool isNoSync; + bool isNoSync = false; /// True if the intrinsic is no-free. - bool isNoFree; + bool isNoFree = false; /// True if the intrinsic is will-return. - bool isWillReturn; + bool isWillReturn = false; /// True if the intrinsic is cold. - bool isCold; + bool isCold = false; /// True if the intrinsic is marked as convergent. - bool isConvergent; + bool isConvergent = false; /// True if the intrinsic has side effects that aren't captured by any /// of the other flags. - bool hasSideEffects; + bool hasSideEffects = false; // True if the intrinsic is marked as speculatable. - bool isSpeculatable; + bool isSpeculatable = false; // True if the intrinsic is marked as strictfp. - bool isStrictFP; + bool isStrictFP = false; enum ArgAttrKind { NoCapture, @@ -139,12 +149,12 @@ struct CodeGenIntrinsic { bool hasProperty(enum SDNP Prop) const { return Properties & (1 << Prop); } - /// Goes through all IntrProperties that have IsDefault - /// value set and sets the property. - void setDefaultProperties(Record *R, ArrayRef<Record *> DefaultProperties); + /// Goes through all IntrProperties that have IsDefault value set and sets + /// the property. + void setDefaultProperties(ArrayRef<const Record *> DefaultProperties); - /// Helper function to set property \p Name to true; - void setProperty(Record *R); + /// Helper function to set property \p Name to true. + void setProperty(const Record *R); /// Returns true if the parameter at \p ParamIdx is a pointer type. Returns /// false if the parameter is not a pointer, or \p ParamIdx is greater than @@ -155,32 +165,50 @@ struct CodeGenIntrinsic { bool isParamImmArg(unsigned ParamIdx) const; - CodeGenIntrinsic(Record *R, ArrayRef<Record *> DefaultProperties); + CodeGenIntrinsic(const Record *R, const CodeGenIntrinsicContext &Ctx); }; class CodeGenIntrinsicTable { - std::vector<CodeGenIntrinsic> Intrinsics; - public: struct TargetSet { - std::string Name; + StringRef Name; size_t Offset; size_t Count; }; - std::vector<TargetSet> Targets; explicit CodeGenIntrinsicTable(const RecordKeeper &RC); - CodeGenIntrinsicTable() = default; bool empty() const { return Intrinsics.empty(); } size_t size() const { return Intrinsics.size(); } auto begin() const { return Intrinsics.begin(); } auto end() const { return Intrinsics.end(); } - CodeGenIntrinsic &operator[](size_t Pos) { return Intrinsics[Pos]; } const CodeGenIntrinsic &operator[](size_t Pos) const { return Intrinsics[Pos]; } + ArrayRef<CodeGenIntrinsic> operator[](const TargetSet &Set) const { + return ArrayRef(&Intrinsics[Set.Offset], Set.Count); + } + ArrayRef<TargetSet> getTargets() const { return Targets; } + +private: + void CheckDuplicateIntrinsics() const; + void CheckTargetIndependentIntrinsics() const; + void CheckOverloadSuffixConflicts() const; + + std::vector<CodeGenIntrinsic> Intrinsics; + std::vector<TargetSet> Targets; +}; + +// This class builds `CodeGenIntrinsic` on demand for a given Def. +class CodeGenIntrinsicMap { + DenseMap<const Record *, std::unique_ptr<CodeGenIntrinsic>> Map; + const CodeGenIntrinsicContext Ctx; + +public: + explicit CodeGenIntrinsicMap(const RecordKeeper &RC) : Ctx(RC) {} + const CodeGenIntrinsic &operator[](const Record *Def); }; + } // namespace llvm -#endif +#endif // LLVM_UTILS_TABLEGEN_BASIC_CODEGENINTRINSICS_H |
