]> granicus.if.org Git - clang/commitdiff
XCore target exception handling
authorRobert Lytton <robert@xmos.com>
Mon, 27 Jan 2014 17:56:25 +0000 (17:56 +0000)
committerRobert Lytton <robert@xmos.com>
Mon, 27 Jan 2014 17:56:25 +0000 (17:56 +0000)
Implement __builtin_eh_return_data_regno()

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@200231 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Basic/Targets.cpp
test/CodeGen/xcore-abi.c

index e1c51efc70c1f08df15cd1f14fc65d009badf0bf..94c8ea959896a6feaed309613e6be032c49e5a99 100644 (file)
@@ -5514,6 +5514,10 @@ public:
                                      TargetInfo::ConstraintInfo &Info) const {
     return false;
   }
+  virtual int getEHDataRegisterNumber(unsigned RegNo) const {
+    // R0=ExceptionPointerRegister R1=ExceptionSelectorRegister
+    return (RegNo < 2)? RegNo : -1;
+  }
 };
 
 const Builtin::Info XCoreTargetInfo::BuiltinInfo[] = {
index 94a44c12827823297af7a39017e06037da8915da..f92f52e2c1114e82e4354497f60c2b55619129ef 100644 (file)
@@ -1,3 +1,4 @@
+// REQUIRES: xcore-registered-target
 // RUN: %clang_cc1 -triple xcore -verify %s
 _Static_assert(sizeof(long long) == 8, "sizeof long long is wrong");
 _Static_assert(_Alignof(long long) == 4, "alignof long long is wrong");
@@ -112,10 +113,18 @@ void testbuiltin (void) {
   // CHECK: call i32 @llvm.xcore.getps(i32 {{%[a-z0-9]+}})
   // CHECK: call i32 @llvm.xcore.bitrev(i32 {{%[a-z0-9]+}})
   // CHECK: call void @llvm.xcore.setps(i32 {{%[a-z0-9]+}}, i32 {{%[a-z0-9]+}})
-  int i = __builtin_getid();
-  unsigned int ui = __builtin_getps(i);
+  volatile int i = __builtin_getid();
+  volatile unsigned int ui = __builtin_getps(i);
   ui = __builtin_bitrev(ui);
   __builtin_setps(i,ui);
+
+  // CHECK: store volatile i32 0, i32* {{%[a-z0-9]+}}, align 4
+  // CHECK: store volatile i32 1, i32* {{%[a-z0-9]+}}, align 4
+  // CHECK: store volatile i32 -1, i32* {{%[a-z0-9]+}}, align 4
+  volatile int res;
+  res = __builtin_eh_return_data_regno(0);
+  res = __builtin_eh_return_data_regno(1);
+  res = __builtin_eh_return_data_regno(2);
 }
 
 // CHECK-LABEL: define zeroext i8 @testchar()