123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102 |
- //===- CodeGenIntrinsic.h - Intrinsic Class Wrapper ------------*- C++ -*--===//
- //
- // The LLVM Compiler Infrastructure
- //
- // This file is distributed under the University of Illinois Open Source
- // License. See LICENSE.TXT for details.
- //
- //===----------------------------------------------------------------------===//
- //
- // This file defines a wrapper class for the 'Intrinsic' TableGen class.
- //
- //===----------------------------------------------------------------------===//
- #ifndef LLVM_UTILS_TABLEGEN_CODEGENINTRINSICS_H
- #define LLVM_UTILS_TABLEGEN_CODEGENINTRINSICS_H
- #include "llvm/CodeGen/MachineValueType.h"
- #include <string>
- #include <vector>
- namespace llvm {
- class Record;
- class RecordKeeper;
- class CodeGenTarget;
- struct CodeGenIntrinsic {
- 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 GCCBuiltinName;// 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.
- /// IntrinsicSignature - This structure holds the return values and
- /// parameter values of an intrinsic. If the number of return values is > 1,
- /// then the intrinsic implicitly returns a first-class aggregate. The
- /// numbering of the types starts at 0 with the first return value and
- /// continues from there through the parameter list. This is useful for
- /// "matching" types.
- struct IntrinsicSignature {
- /// RetVTs - The MVT::SimpleValueType for each return 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<MVT::SimpleValueType> RetVTs;
- /// RetTypeDefs - The records for each return type.
- std::vector<Record*> RetTypeDefs;
- /// ParamVTs - 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<MVT::SimpleValueType> ParamVTs;
- /// ParamTypeDefs - The records for each parameter type.
- std::vector<Record*> ParamTypeDefs;
- };
- IntrinsicSignature IS;
- // Memory mod/ref behavior of this intrinsic.
- enum {
- NoMem, ReadArgMem, ReadMem, ReadWriteArgMem, ReadWriteMem
- } ModRef;
- /// This is set to true if the intrinsic is overloaded by its argument
- /// types.
- bool isOverloaded;
- /// isCommutative - True if the intrinsic is commutative.
- bool isCommutative;
- /// canThrow - True if the intrinsic can throw.
- bool canThrow;
- /// isNoDuplicate - True if the intrinsic is marked as noduplicate.
- bool isNoDuplicate;
- /// isNoReturn - True if the intrinsic is no-return.
- bool isNoReturn;
- /// isConvergent - True if the intrinsic is marked as convergent.
- bool isConvergent;
- enum ArgAttribute {
- NoCapture,
- ReadOnly,
- ReadNone
- };
- std::vector<std::pair<unsigned, ArgAttribute> > ArgumentAttributes;
- CodeGenIntrinsic(Record *R);
- };
- /// LoadIntrinsics - Read all of the intrinsics defined in the specified
- /// .td file.
- std::vector<CodeGenIntrinsic> LoadIntrinsics(const RecordKeeper &RC,
- bool TargetOnly);
- }
- #endif
|