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