aboutsummaryrefslogtreecommitdiff
path: root/lib/CodeGen/CGCall.cpp
diff options
context:
space:
mode:
authorDaniel Dunbar <daniel@zuster.org>2009-02-03 01:05:53 +0000
committerDaniel Dunbar <daniel@zuster.org>2009-02-03 01:05:53 +0000
commit9eb5c6d3242d85359b2d669564c5e2826efb1931 (patch)
tree7f9d97fe03497e671fa707b38c52ba5376c0df09 /lib/CodeGen/CGCall.cpp
parent1931b44da8da86979a8d7ceb48685686503f197b (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.cpp106
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