| //===-- llvm/Target/TargetCallingConv.h - Calling Convention ----*- 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 types for working with calling-convention information. | |
| // | |
| //===----------------------------------------------------------------------===// | |
| #ifndef LLVM_TARGET_TARGETCALLINGCONV_H | |
| #define LLVM_TARGET_TARGETCALLINGCONV_H | |
| namespace llvm { | |
| namespace ISD { | |
| struct ArgFlagsTy { | |
| private: | |
| static const uint64_t NoFlagSet = 0ULL; | |
| static const uint64_t ZExt = 1ULL<<0; ///< Zero extended | |
| static const uint64_t ZExtOffs = 0; | |
| static const uint64_t SExt = 1ULL<<1; ///< Sign extended | |
| static const uint64_t SExtOffs = 1; | |
| static const uint64_t InReg = 1ULL<<2; ///< Passed in register | |
| static const uint64_t InRegOffs = 2; | |
| static const uint64_t SRet = 1ULL<<3; ///< Hidden struct-ret ptr | |
| static const uint64_t SRetOffs = 3; | |
| static const uint64_t ByVal = 1ULL<<4; ///< Struct passed by value | |
| static const uint64_t ByValOffs = 4; | |
| static const uint64_t Nest = 1ULL<<5; ///< Nested fn static chain | |
| static const uint64_t NestOffs = 5; | |
| static const uint64_t ByValAlign = 0xFULL << 6; //< Struct alignment | |
| static const uint64_t ByValAlignOffs = 6; | |
| static const uint64_t Split = 1ULL << 10; | |
| static const uint64_t SplitOffs = 10; | |
| static const uint64_t OrigAlign = 0x1FULL<<27; | |
| static const uint64_t OrigAlignOffs = 27; | |
| static const uint64_t ByValSize = 0xffffffffULL << 32; //< Struct size | |
| static const uint64_t ByValSizeOffs = 32; | |
| static const uint64_t One = 1ULL; //< 1 of this type, for shifts | |
| uint64_t Flags; | |
| public: | |
| ArgFlagsTy() : Flags(0) { } | |
| bool isZExt() const { return Flags & ZExt; } | |
| void setZExt() { Flags |= One << ZExtOffs; } | |
| bool isSExt() const { return Flags & SExt; } | |
| void setSExt() { Flags |= One << SExtOffs; } | |
| bool isInReg() const { return Flags & InReg; } | |
| void setInReg() { Flags |= One << InRegOffs; } | |
| bool isSRet() const { return Flags & SRet; } | |
| void setSRet() { Flags |= One << SRetOffs; } | |
| bool isByVal() const { return Flags & ByVal; } | |
| void setByVal() { Flags |= One << ByValOffs; } | |
| bool isNest() const { return Flags & Nest; } | |
| void setNest() { Flags |= One << NestOffs; } | |
| unsigned getByValAlign() const { | |
| return (unsigned) | |
| ((One << ((Flags & ByValAlign) >> ByValAlignOffs)) / 2); | |
| } | |
| void setByValAlign(unsigned A) { | |
| Flags = (Flags & ~ByValAlign) | | |
| (uint64_t(Log2_32(A) + 1) << ByValAlignOffs); | |
| } | |
| bool isSplit() const { return Flags & Split; } | |
| void setSplit() { Flags |= One << SplitOffs; } | |
| unsigned getOrigAlign() const { | |
| return (unsigned) | |
| ((One << ((Flags & OrigAlign) >> OrigAlignOffs)) / 2); | |
| } | |
| void setOrigAlign(unsigned A) { | |
| Flags = (Flags & ~OrigAlign) | | |
| (uint64_t(Log2_32(A) + 1) << OrigAlignOffs); | |
| } | |
| unsigned getByValSize() const { | |
| return (unsigned)((Flags & ByValSize) >> ByValSizeOffs); | |
| } | |
| void setByValSize(unsigned S) { | |
| Flags = (Flags & ~ByValSize) | (uint64_t(S) << ByValSizeOffs); | |
| } | |
| /// getArgFlagsString - Returns the flags as a string, eg: "zext align:4". | |
| std::string getArgFlagsString(); | |
| /// getRawBits - Represent the flags as a bunch of bits. | |
| uint64_t getRawBits() const { return Flags; } | |
| }; | |
| /// InputArg - This struct carries flags and type information about a | |
| /// single incoming (formal) argument or incoming (from the perspective | |
| /// of the caller) return value virtual register. | |
| /// | |
| struct InputArg { | |
| ArgFlagsTy Flags; | |
| MVT VT; | |
| bool Used; | |
| InputArg() : VT(MVT::Other), Used(false) {} | |
| InputArg(ArgFlagsTy flags, EVT vt, bool used) | |
| : Flags(flags), Used(used) { | |
| VT = vt.getSimpleVT(); | |
| } | |
| }; | |
| /// OutputArg - This struct carries flags and a value for a | |
| /// single outgoing (actual) argument or outgoing (from the perspective | |
| /// of the caller) return value virtual register. | |
| /// | |
| struct OutputArg { | |
| ArgFlagsTy Flags; | |
| MVT VT; | |
| /// IsFixed - Is this a "fixed" value, ie not passed through a vararg "...". | |
| bool IsFixed; | |
| OutputArg() : IsFixed(false) {} | |
| OutputArg(ArgFlagsTy flags, EVT vt, bool isfixed) | |
| : Flags(flags), IsFixed(isfixed) { | |
| VT = vt.getSimpleVT(); | |
| } | |
| }; | |
| } | |
| } // end llvm namespace | |
| #endif |