From: Robert Lytton Date: Mon, 27 Jan 2014 17:56:25 +0000 (+0000) Subject: XCore target exception handling X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=1bbd3da4d81b4a38bf82369eeb0d90f4810dade3;p=clang XCore target exception handling Implement __builtin_eh_return_data_regno() git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@200231 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Basic/Targets.cpp b/lib/Basic/Targets.cpp index e1c51efc70..94c8ea9598 100644 --- a/lib/Basic/Targets.cpp +++ b/lib/Basic/Targets.cpp @@ -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[] = { diff --git a/test/CodeGen/xcore-abi.c b/test/CodeGen/xcore-abi.c index 94a44c1282..f92f52e2c1 100644 --- a/test/CodeGen/xcore-abi.c +++ b/test/CodeGen/xcore-abi.c @@ -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()