diff options
author | Daniel Dunbar <daniel@zuster.org> | 2009-02-03 01:05:53 +0000 |
---|---|---|
committer | Daniel Dunbar <daniel@zuster.org> | 2009-02-03 01:05:53 +0000 |
commit | 9eb5c6d3242d85359b2d669564c5e2826efb1931 (patch) | |
tree | 7f9d97fe03497e671fa707b38c52ba5376c0df09 /lib/CodeGen/CGCall.cpp | |
parent | 1931b44da8da86979a8d7ceb48685686503f197b (diff) |
Move ABIInfo/ABIArgInfo classes into ABIInfo.h
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@63586 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/CGCall.cpp')
-rw-r--r-- | lib/CodeGen/CGCall.cpp | 106 |
1 files changed, 3 insertions, 103 deletions
diff --git a/lib/CodeGen/CGCall.cpp b/lib/CodeGen/CGCall.cpp index 30257d2699..c6e804ea0b 100644 --- a/lib/CodeGen/CGCall.cpp +++ b/lib/CodeGen/CGCall.cpp @@ -24,6 +24,9 @@ #include "llvm/Attributes.h" #include "llvm/Support/CommandLine.h" #include "llvm/Target/TargetData.h" + +#include "ABIInfo.h" + using namespace clang; using namespace CodeGen; @@ -118,109 +121,6 @@ CGFunctionInfo::arg_iterator CGFunctionInfo::arg_end() const { /***/ -/// ABIArgInfo - Helper class to encapsulate information about how a -/// specific C type should be passed to or returned from a function. -class ABIArgInfo { -public: - enum Kind { - Default, - StructRet, /// Only valid for return values. The return value - /// should be passed through a pointer to a caller - /// allocated location passed as an implicit first - /// argument to the function. - - Ignore, /// Ignore the argument (treat as void). Useful for - /// void and empty structs. - - Coerce, /// Only valid for aggregate return types, the argument - /// should be accessed by coercion to a provided type. - - ByVal, /// Only valid for aggregate argument types. The - /// structure should be passed "byval" with the - /// specified alignment (0 indicates default - /// alignment). - - Expand, /// Only valid for aggregate argument types. The - /// structure should be expanded into consecutive - /// arguments for its constituent fields. Currently - /// expand is only allowed on structures whose fields - /// are all scalar types or are themselves expandable - /// types. - - KindFirst=Default, KindLast=Expand - }; - -private: - Kind TheKind; - const llvm::Type *TypeData; - unsigned UIntData; - - ABIArgInfo(Kind K, const llvm::Type *TD=0, - unsigned UI=0) : TheKind(K), - TypeData(TD), - UIntData(0) {} -public: - static ABIArgInfo getDefault() { - return ABIArgInfo(Default); - } - static ABIArgInfo getStructRet() { - return ABIArgInfo(StructRet); - } - static ABIArgInfo getIgnore() { - return ABIArgInfo(Ignore); - } - static ABIArgInfo getCoerce(const llvm::Type *T) { - return ABIArgInfo(Coerce, T); - } - static ABIArgInfo getByVal(unsigned Alignment) { - return ABIArgInfo(ByVal, 0, Alignment); - } - static ABIArgInfo getExpand() { - return ABIArgInfo(Expand); - } - - Kind getKind() const { return TheKind; } - bool isDefault() const { return TheKind == Default; } - bool isStructRet() const { return TheKind == StructRet; } - bool isIgnore() const { return TheKind == Ignore; } - bool isCoerce() const { return TheKind == Coerce; } - bool isByVal() const { return TheKind == ByVal; } - bool isExpand() const { return TheKind == Expand; } - - // Coerce accessors - const llvm::Type *getCoerceToType() const { - assert(TheKind == Coerce && "Invalid kind!"); - return TypeData; - } - - // ByVal accessors - unsigned getByValAlignment() const { - assert(TheKind == ByVal && "Invalid kind!"); - return UIntData; - } -}; - -/***/ - -/* FIXME: All of this stuff should be part of the target interface - somehow. It is currently here because it is not clear how to factor - the targets to support this, since the Targets currently live in a - layer below types n'stuff. - */ - -/// ABIInfo - Target specific hooks for defining how a type should be -/// passed or returned from functions. -class clang::ABIInfo { -public: - virtual ~ABIInfo(); - - virtual ABIArgInfo classifyReturnType(QualType RetTy, - ASTContext &Context) const = 0; - - virtual ABIArgInfo classifyArgumentType(QualType Ty, - ASTContext &Context) const = 0; -}; - ABIInfo::~ABIInfo() {} /// isEmptyStruct - Return true iff a structure has no non-empty |