1ce822172d6dad9315df58b726bfe40c1b1317018Dan Gohman//===-- llvm/Target/TargetCallingConv.h - Calling Convention ----*- C++ -*-===// 2ce822172d6dad9315df58b726bfe40c1b1317018Dan Gohman// 3ce822172d6dad9315df58b726bfe40c1b1317018Dan Gohman// The LLVM Compiler Infrastructure 4ce822172d6dad9315df58b726bfe40c1b1317018Dan Gohman// 5ce822172d6dad9315df58b726bfe40c1b1317018Dan Gohman// This file is distributed under the University of Illinois Open Source 6ce822172d6dad9315df58b726bfe40c1b1317018Dan Gohman// License. See LICENSE.TXT for details. 7ce822172d6dad9315df58b726bfe40c1b1317018Dan Gohman// 8ce822172d6dad9315df58b726bfe40c1b1317018Dan Gohman//===----------------------------------------------------------------------===// 9ce822172d6dad9315df58b726bfe40c1b1317018Dan Gohman// 10ce822172d6dad9315df58b726bfe40c1b1317018Dan Gohman// This file defines types for working with calling-convention information. 11ce822172d6dad9315df58b726bfe40c1b1317018Dan Gohman// 12ce822172d6dad9315df58b726bfe40c1b1317018Dan Gohman//===----------------------------------------------------------------------===// 13ce822172d6dad9315df58b726bfe40c1b1317018Dan Gohman 14ce822172d6dad9315df58b726bfe40c1b1317018Dan Gohman#ifndef LLVM_TARGET_TARGETCALLINGCONV_H 15ce822172d6dad9315df58b726bfe40c1b1317018Dan Gohman#define LLVM_TARGET_TARGETCALLINGCONV_H 16ce822172d6dad9315df58b726bfe40c1b1317018Dan Gohman 17ce822172d6dad9315df58b726bfe40c1b1317018Dan Gohmannamespace llvm { 18ce822172d6dad9315df58b726bfe40c1b1317018Dan Gohman 19ce822172d6dad9315df58b726bfe40c1b1317018Dan Gohmannamespace ISD { 20ce822172d6dad9315df58b726bfe40c1b1317018Dan Gohman struct ArgFlagsTy { 21ce822172d6dad9315df58b726bfe40c1b1317018Dan Gohman private: 22ce822172d6dad9315df58b726bfe40c1b1317018Dan Gohman static const uint64_t NoFlagSet = 0ULL; 23ce822172d6dad9315df58b726bfe40c1b1317018Dan Gohman static const uint64_t ZExt = 1ULL<<0; ///< Zero extended 24ce822172d6dad9315df58b726bfe40c1b1317018Dan Gohman static const uint64_t ZExtOffs = 0; 25ce822172d6dad9315df58b726bfe40c1b1317018Dan Gohman static const uint64_t SExt = 1ULL<<1; ///< Sign extended 26ce822172d6dad9315df58b726bfe40c1b1317018Dan Gohman static const uint64_t SExtOffs = 1; 27ce822172d6dad9315df58b726bfe40c1b1317018Dan Gohman static const uint64_t InReg = 1ULL<<2; ///< Passed in register 28ce822172d6dad9315df58b726bfe40c1b1317018Dan Gohman static const uint64_t InRegOffs = 2; 29ce822172d6dad9315df58b726bfe40c1b1317018Dan Gohman static const uint64_t SRet = 1ULL<<3; ///< Hidden struct-ret ptr 30ce822172d6dad9315df58b726bfe40c1b1317018Dan Gohman static const uint64_t SRetOffs = 3; 31ce822172d6dad9315df58b726bfe40c1b1317018Dan Gohman static const uint64_t ByVal = 1ULL<<4; ///< Struct passed by value 32ce822172d6dad9315df58b726bfe40c1b1317018Dan Gohman static const uint64_t ByValOffs = 4; 33ce822172d6dad9315df58b726bfe40c1b1317018Dan Gohman static const uint64_t Nest = 1ULL<<5; ///< Nested fn static chain 34ce822172d6dad9315df58b726bfe40c1b1317018Dan Gohman static const uint64_t NestOffs = 5; 35ce822172d6dad9315df58b726bfe40c1b1317018Dan Gohman static const uint64_t ByValAlign = 0xFULL << 6; //< Struct alignment 36ce822172d6dad9315df58b726bfe40c1b1317018Dan Gohman static const uint64_t ByValAlignOffs = 6; 37ce822172d6dad9315df58b726bfe40c1b1317018Dan Gohman static const uint64_t Split = 1ULL << 10; 38ce822172d6dad9315df58b726bfe40c1b1317018Dan Gohman static const uint64_t SplitOffs = 10; 39ce822172d6dad9315df58b726bfe40c1b1317018Dan Gohman static const uint64_t OrigAlign = 0x1FULL<<27; 40ce822172d6dad9315df58b726bfe40c1b1317018Dan Gohman static const uint64_t OrigAlignOffs = 27; 41ce822172d6dad9315df58b726bfe40c1b1317018Dan Gohman static const uint64_t ByValSize = 0xffffffffULL << 32; //< Struct size 42ce822172d6dad9315df58b726bfe40c1b1317018Dan Gohman static const uint64_t ByValSizeOffs = 32; 43ce822172d6dad9315df58b726bfe40c1b1317018Dan Gohman 44ce822172d6dad9315df58b726bfe40c1b1317018Dan Gohman static const uint64_t One = 1ULL; //< 1 of this type, for shifts 45ce822172d6dad9315df58b726bfe40c1b1317018Dan Gohman 46ce822172d6dad9315df58b726bfe40c1b1317018Dan Gohman uint64_t Flags; 47ce822172d6dad9315df58b726bfe40c1b1317018Dan Gohman public: 48ce822172d6dad9315df58b726bfe40c1b1317018Dan Gohman ArgFlagsTy() : Flags(0) { } 49ce822172d6dad9315df58b726bfe40c1b1317018Dan Gohman 50ce822172d6dad9315df58b726bfe40c1b1317018Dan Gohman bool isZExt() const { return Flags & ZExt; } 51ce822172d6dad9315df58b726bfe40c1b1317018Dan Gohman void setZExt() { Flags |= One << ZExtOffs; } 52ce822172d6dad9315df58b726bfe40c1b1317018Dan Gohman 53ce822172d6dad9315df58b726bfe40c1b1317018Dan Gohman bool isSExt() const { return Flags & SExt; } 54ce822172d6dad9315df58b726bfe40c1b1317018Dan Gohman void setSExt() { Flags |= One << SExtOffs; } 55ce822172d6dad9315df58b726bfe40c1b1317018Dan Gohman 56ce822172d6dad9315df58b726bfe40c1b1317018Dan Gohman bool isInReg() const { return Flags & InReg; } 57ce822172d6dad9315df58b726bfe40c1b1317018Dan Gohman void setInReg() { Flags |= One << InRegOffs; } 58ce822172d6dad9315df58b726bfe40c1b1317018Dan Gohman 59ce822172d6dad9315df58b726bfe40c1b1317018Dan Gohman bool isSRet() const { return Flags & SRet; } 60ce822172d6dad9315df58b726bfe40c1b1317018Dan Gohman void setSRet() { Flags |= One << SRetOffs; } 61ce822172d6dad9315df58b726bfe40c1b1317018Dan Gohman 62ce822172d6dad9315df58b726bfe40c1b1317018Dan Gohman bool isByVal() const { return Flags & ByVal; } 63ce822172d6dad9315df58b726bfe40c1b1317018Dan Gohman void setByVal() { Flags |= One << ByValOffs; } 64ce822172d6dad9315df58b726bfe40c1b1317018Dan Gohman 65ce822172d6dad9315df58b726bfe40c1b1317018Dan Gohman bool isNest() const { return Flags & Nest; } 66ce822172d6dad9315df58b726bfe40c1b1317018Dan Gohman void setNest() { Flags |= One << NestOffs; } 67ce822172d6dad9315df58b726bfe40c1b1317018Dan Gohman 68ce822172d6dad9315df58b726bfe40c1b1317018Dan Gohman unsigned getByValAlign() const { 69ce822172d6dad9315df58b726bfe40c1b1317018Dan Gohman return (unsigned) 70ce822172d6dad9315df58b726bfe40c1b1317018Dan Gohman ((One << ((Flags & ByValAlign) >> ByValAlignOffs)) / 2); 71ce822172d6dad9315df58b726bfe40c1b1317018Dan Gohman } 72ce822172d6dad9315df58b726bfe40c1b1317018Dan Gohman void setByValAlign(unsigned A) { 73ce822172d6dad9315df58b726bfe40c1b1317018Dan Gohman Flags = (Flags & ~ByValAlign) | 74ce822172d6dad9315df58b726bfe40c1b1317018Dan Gohman (uint64_t(Log2_32(A) + 1) << ByValAlignOffs); 75ce822172d6dad9315df58b726bfe40c1b1317018Dan Gohman } 76ce822172d6dad9315df58b726bfe40c1b1317018Dan Gohman 77ce822172d6dad9315df58b726bfe40c1b1317018Dan Gohman bool isSplit() const { return Flags & Split; } 78ce822172d6dad9315df58b726bfe40c1b1317018Dan Gohman void setSplit() { Flags |= One << SplitOffs; } 79ce822172d6dad9315df58b726bfe40c1b1317018Dan Gohman 80ce822172d6dad9315df58b726bfe40c1b1317018Dan Gohman unsigned getOrigAlign() const { 81ce822172d6dad9315df58b726bfe40c1b1317018Dan Gohman return (unsigned) 82ce822172d6dad9315df58b726bfe40c1b1317018Dan Gohman ((One << ((Flags & OrigAlign) >> OrigAlignOffs)) / 2); 83ce822172d6dad9315df58b726bfe40c1b1317018Dan Gohman } 84ce822172d6dad9315df58b726bfe40c1b1317018Dan Gohman void setOrigAlign(unsigned A) { 85ce822172d6dad9315df58b726bfe40c1b1317018Dan Gohman Flags = (Flags & ~OrigAlign) | 86ce822172d6dad9315df58b726bfe40c1b1317018Dan Gohman (uint64_t(Log2_32(A) + 1) << OrigAlignOffs); 87ce822172d6dad9315df58b726bfe40c1b1317018Dan Gohman } 88ce822172d6dad9315df58b726bfe40c1b1317018Dan Gohman 89ce822172d6dad9315df58b726bfe40c1b1317018Dan Gohman unsigned getByValSize() const { 90ce822172d6dad9315df58b726bfe40c1b1317018Dan Gohman return (unsigned)((Flags & ByValSize) >> ByValSizeOffs); 91ce822172d6dad9315df58b726bfe40c1b1317018Dan Gohman } 92ce822172d6dad9315df58b726bfe40c1b1317018Dan Gohman void setByValSize(unsigned S) { 93ce822172d6dad9315df58b726bfe40c1b1317018Dan Gohman Flags = (Flags & ~ByValSize) | (uint64_t(S) << ByValSizeOffs); 94ce822172d6dad9315df58b726bfe40c1b1317018Dan Gohman } 95ce822172d6dad9315df58b726bfe40c1b1317018Dan Gohman 96ce822172d6dad9315df58b726bfe40c1b1317018Dan Gohman /// getArgFlagsString - Returns the flags as a string, eg: "zext align:4". 97ce822172d6dad9315df58b726bfe40c1b1317018Dan Gohman std::string getArgFlagsString(); 98ce822172d6dad9315df58b726bfe40c1b1317018Dan Gohman 99ce822172d6dad9315df58b726bfe40c1b1317018Dan Gohman /// getRawBits - Represent the flags as a bunch of bits. 100ce822172d6dad9315df58b726bfe40c1b1317018Dan Gohman uint64_t getRawBits() const { return Flags; } 101ce822172d6dad9315df58b726bfe40c1b1317018Dan Gohman }; 102ce822172d6dad9315df58b726bfe40c1b1317018Dan Gohman 103ce822172d6dad9315df58b726bfe40c1b1317018Dan Gohman /// InputArg - This struct carries flags and type information about a 104ce822172d6dad9315df58b726bfe40c1b1317018Dan Gohman /// single incoming (formal) argument or incoming (from the perspective 105ce822172d6dad9315df58b726bfe40c1b1317018Dan Gohman /// of the caller) return value virtual register. 106ce822172d6dad9315df58b726bfe40c1b1317018Dan Gohman /// 107ce822172d6dad9315df58b726bfe40c1b1317018Dan Gohman struct InputArg { 108ce822172d6dad9315df58b726bfe40c1b1317018Dan Gohman ArgFlagsTy Flags; 10908903968f7100c2693a113b25b86d2ff39f81b5aDuncan Sands MVT VT; 110ce822172d6dad9315df58b726bfe40c1b1317018Dan Gohman bool Used; 111ce822172d6dad9315df58b726bfe40c1b1317018Dan Gohman 112ce822172d6dad9315df58b726bfe40c1b1317018Dan Gohman InputArg() : VT(MVT::Other), Used(false) {} 113f53e8cd8b1639a358a97deaea7ee5abae7c560adDan Gohman InputArg(ArgFlagsTy flags, EVT vt, bool used) 11408903968f7100c2693a113b25b86d2ff39f81b5aDuncan Sands : Flags(flags), Used(used) { 11508903968f7100c2693a113b25b86d2ff39f81b5aDuncan Sands VT = vt.getSimpleVT(); 116ce822172d6dad9315df58b726bfe40c1b1317018Dan Gohman } 117ce822172d6dad9315df58b726bfe40c1b1317018Dan Gohman }; 118ce822172d6dad9315df58b726bfe40c1b1317018Dan Gohman 119ce822172d6dad9315df58b726bfe40c1b1317018Dan Gohman /// OutputArg - This struct carries flags and a value for a 120ce822172d6dad9315df58b726bfe40c1b1317018Dan Gohman /// single outgoing (actual) argument or outgoing (from the perspective 121ce822172d6dad9315df58b726bfe40c1b1317018Dan Gohman /// of the caller) return value virtual register. 122ce822172d6dad9315df58b726bfe40c1b1317018Dan Gohman /// 123ce822172d6dad9315df58b726bfe40c1b1317018Dan Gohman struct OutputArg { 124ce822172d6dad9315df58b726bfe40c1b1317018Dan Gohman ArgFlagsTy Flags; 12508903968f7100c2693a113b25b86d2ff39f81b5aDuncan Sands MVT VT; 126ce822172d6dad9315df58b726bfe40c1b1317018Dan Gohman 127ce822172d6dad9315df58b726bfe40c1b1317018Dan Gohman /// IsFixed - Is this a "fixed" value, ie not passed through a vararg "...". 128ce822172d6dad9315df58b726bfe40c1b1317018Dan Gohman bool IsFixed; 129ce822172d6dad9315df58b726bfe40c1b1317018Dan Gohman 130ce822172d6dad9315df58b726bfe40c1b1317018Dan Gohman OutputArg() : IsFixed(false) {} 131f53e8cd8b1639a358a97deaea7ee5abae7c560adDan Gohman OutputArg(ArgFlagsTy flags, EVT vt, bool isfixed) 13208903968f7100c2693a113b25b86d2ff39f81b5aDuncan Sands : Flags(flags), IsFixed(isfixed) { 13308903968f7100c2693a113b25b86d2ff39f81b5aDuncan Sands VT = vt.getSimpleVT(); 134ce822172d6dad9315df58b726bfe40c1b1317018Dan Gohman } 135ce822172d6dad9315df58b726bfe40c1b1317018Dan Gohman }; 136ce822172d6dad9315df58b726bfe40c1b1317018Dan Gohman} 137ce822172d6dad9315df58b726bfe40c1b1317018Dan Gohman 138ce822172d6dad9315df58b726bfe40c1b1317018Dan Gohman} // end llvm namespace 139ce822172d6dad9315df58b726bfe40c1b1317018Dan Gohman 140ce822172d6dad9315df58b726bfe40c1b1317018Dan Gohman#endif 141