Move ABIInfo/ABIArgInfo classes into ABIInfo.h
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@63586 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/CodeGen/ABIInfo.h b/lib/CodeGen/ABIInfo.h
new file mode 100644
index 0000000..4b33c4e
--- /dev/null
+++ b/lib/CodeGen/ABIInfo.h
@@ -0,0 +1,116 @@
+//===----- ABIInfo.h - ABI information access & encapsulation ---*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef CLANG_CODEGEN_ABIINFO_H
+#define CLANG_CODEGEN_ABIINFO_H
+
+namespace clang {
+ /* 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.
+ */
+
+ /// 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;
+ }
+ };
+
+ /// ABIInfo - Target specific hooks for defining how a type should be
+ /// passed or returned from functions.
+ class ABIInfo {
+ public:
+ virtual ~ABIInfo();
+
+ virtual ABIArgInfo classifyReturnType(QualType RetTy,
+ ASTContext &Context) const = 0;
+
+ virtual ABIArgInfo classifyArgumentType(QualType Ty,
+ ASTContext &Context) const = 0;
+ };
+} // end namespace clang
+
+#endif