mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-08-31 12:30:06 +00:00
value type, so there is no point in passing it around using an EVT. Use the simpler MVT everywhere. Rather than trying to propagate this information maximally in all the code that using the calling convention stuff, I chose to do a mainly low impact change instead. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@118167 91177308-0d34-0410-b5e6-96231b3b80d8
141 lines
4.6 KiB
C++
141 lines
4.6 KiB
C++
//===-- 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
|