]> granicus.if.org Git - clang/commitdiff
swiftcc: Add an api to query whether a target ABI stores swifterror in a register
authorArnold Schwaighofer <aschwaighofer@apple.com>
Thu, 1 Dec 2016 18:07:38 +0000 (18:07 +0000)
committerArnold Schwaighofer <aschwaighofer@apple.com>
Thu, 1 Dec 2016 18:07:38 +0000 (18:07 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@288394 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/CodeGen/SwiftCallingConv.h
lib/CodeGen/ABIInfo.h
lib/CodeGen/SwiftCallingConv.cpp
lib/CodeGen/TargetInfo.cpp

index dd0ae2f1d65060fa3333307ed601ce7f857b8562..23db43e6739c4c52c79688750699add5267eaa49 100644 (file)
@@ -160,6 +160,9 @@ ABIArgInfo classifyArgumentType(CodeGenModule &CGM, CanQualType type);
 /// private interface for Clang.
 void computeABIInfo(CodeGenModule &CGM, CGFunctionInfo &FI);
 
+/// Is swifterror lowered to a register by the target ABI.
+bool isSwiftErrorLoweredInRegister(CodeGenModule &CGM);
+
 } // end namespace swiftcall
 } // end namespace CodeGen
 } // end namespace clang
index 530a7ef560c5bff328b7d3b8a520679fc7515a5a..ac31dfdaf3e4bc4524bcf1ae1aff8ba2ca28b305 100644 (file)
@@ -142,6 +142,8 @@ namespace swiftcall {
                                            llvm::Type *eltTy,
                                            unsigned elts) const;
 
+    virtual bool isSwiftErrorInRegister() const = 0;
+
     static bool classof(const ABIInfo *info) {
       return info->supportsSwift();
     }
index 1629c443652d3f3b58391e7cf59a5e5bfacff0eb..0bfe30a32c8064e1dd6c81cdff8f8f0ccd0c76f5 100644 (file)
@@ -828,3 +828,8 @@ void swiftcall::computeABIInfo(CodeGenModule &CGM, CGFunctionInfo &FI) {
     argInfo.info = classifyArgumentType(CGM, argInfo.type);
   }
 }
+
+// Is swifterror lowered to a register by the target ABI.
+bool swiftcall::isSwiftErrorLoweredInRegister(CodeGenModule &CGM) {
+  return getSwiftABIInfo(CGM).isSwiftErrorInRegister();
+}
index caac27b965cc0f4caa86ef9936d27484cf2b3ffe..e4f7d99bef674f6d886a7011e37af3b9bafcd839 100644 (file)
@@ -958,6 +958,11 @@ public:
     // scalar registers.
     return occupiesMoreThan(CGT, scalars, /*total*/ 3);
   }  
+
+  bool isSwiftErrorInRegister() const override {
+    // x86-32 lowering does not support passing swifterror in a register.
+    return false;
+  }
 };
 
 class X86_32TargetCodeGenInfo : public TargetCodeGenInfo {
@@ -2012,6 +2017,9 @@ public:
                                     bool asReturnValue) const override {
     return occupiesMoreThan(CGT, scalars, /*total*/ 4);
   }  
+  bool isSwiftErrorInRegister() const override {
+    return true;
+  }
 };
 
 /// WinX86_64ABIInfo - The Windows X86_64 ABI information.
@@ -2043,6 +2051,10 @@ public:
     return occupiesMoreThan(CGT, scalars, /*total*/ 4);
   }
 
+  bool isSwiftErrorInRegister() const override {
+    return true;
+  }
+
 private:
   ABIArgInfo classify(QualType Ty, unsigned &FreeSSERegs,
                       bool IsReturnType) const;
@@ -4628,6 +4640,9 @@ private:
                                     bool asReturnValue) const override {
     return occupiesMoreThan(CGT, scalars, /*total*/ 4);
   }
+  bool isSwiftErrorInRegister() const override {
+    return true;
+  }
 };
 
 class AArch64TargetCodeGenInfo : public TargetCodeGenInfo {
@@ -5181,6 +5196,9 @@ private:
                                     bool asReturnValue) const override {
     return occupiesMoreThan(CGT, scalars, /*total*/ 4);
   }
+  bool isSwiftErrorInRegister() const override {
+    return true;
+  }
 };
 
 class ARMTargetCodeGenInfo : public TargetCodeGenInfo {
@@ -5949,6 +5967,9 @@ public:
                                     bool asReturnValue) const override {
     return occupiesMoreThan(CGT, scalars, /*total*/ 4);
   }
+  bool isSwiftErrorInRegister() const override {
+    return true;
+  }
 };
 
 class SystemZTargetCodeGenInfo : public TargetCodeGenInfo {