From: Joerg Sonnenberger Date: Wed, 4 Mar 2015 14:25:35 +0000 (+0000) Subject: Adjust the changes from r230255 to bail out if the backend can't lower X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=2e21a1581baef31f2103f75bba735a15c89d3971;p=clang Adjust the changes from r230255 to bail out if the backend can't lower __builtin_setjmp/__builtin_longjmp and don't fall back to the libc functions. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@231245 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/Basic/Builtins.def b/include/clang/Basic/Builtins.def index 632509bf89..29fd7b49cb 100644 --- a/include/clang/Basic/Builtins.def +++ b/include/clang/Basic/Builtins.def @@ -448,8 +448,8 @@ BUILTIN(__builtin_extract_return_addr, "v*v*", "n") BUILTIN(__builtin_frame_address, "v*IUi", "n") BUILTIN(__builtin___clear_cache, "vc*c*", "n") BUILTIN(__builtin_flt_rounds, "i", "nc") -BUILTIN(__builtin_setjmp, "iv**", "Fj") -BUILTIN(__builtin_longjmp, "vv**i", "Fr") +BUILTIN(__builtin_setjmp, "iv**", "j") +BUILTIN(__builtin_longjmp, "vv**i", "r") BUILTIN(__builtin_unwind_init, "v", "") BUILTIN(__builtin_eh_return_data_regno, "iIi", "nc") BUILTIN(__builtin_snprintf, "ic*zcC*.", "nFp:2:") diff --git a/lib/CodeGen/CGBuiltin.cpp b/lib/CodeGen/CGBuiltin.cpp index d3d1e22b4b..014ea9d939 100644 --- a/lib/CodeGen/CGBuiltin.cpp +++ b/lib/CodeGen/CGBuiltin.cpp @@ -859,8 +859,11 @@ RValue CodeGenFunction::EmitBuiltinExpr(const FunctionDecl *FD, return RValue::get(Builder.CreateZExt(Result, Int64Ty, "extend.zext")); } case Builtin::BI__builtin_setjmp: { - if (!getTargetHooks().hasSjLjLowering(*this)) - break; + if (!getTargetHooks().hasSjLjLowering(*this)) { + CGM.ErrorUnsupported(E, "__builtin_setjmp"); + return RValue::get(nullptr); + } + // Buffer is a void**. Value *Buf = EmitScalarExpr(E->getArg(0)); @@ -883,8 +886,10 @@ RValue CodeGenFunction::EmitBuiltinExpr(const FunctionDecl *FD, return RValue::get(Builder.CreateCall(F, Buf)); } case Builtin::BI__builtin_longjmp: { - if (!getTargetHooks().hasSjLjLowering(*this)) - break; + if (!getTargetHooks().hasSjLjLowering(*this)) { + CGM.ErrorUnsupported(E, "__builtin_longjmp"); + return RValue::get(nullptr); + } Value *Buf = EmitScalarExpr(E->getArg(0)); Buf = Builder.CreateBitCast(Buf, Int8PtrTy); diff --git a/lib/CodeGen/TargetInfo.h b/lib/CodeGen/TargetInfo.h index 87f13760e8..0c3fdc3c8a 100644 --- a/lib/CodeGen/TargetInfo.h +++ b/lib/CodeGen/TargetInfo.h @@ -226,9 +226,8 @@ public: return 0; } - /// Control whether __builtin_longjmp / __builtin_setjmp are lowered to - /// llvm.eh.sjlj.longjmp / llvm.eh.sjlj.setjmp or the normal library - /// function. + /// Control if __builtin_longjmp / __builtin_setjmp can be lowered to + /// llvm.eh.sjlj.longjmp / llvm.eh.sjlj.setjmp. virtual bool hasSjLjLowering(CodeGen::CodeGenFunction &CGF) const { return false; } diff --git a/test/CodeGen/builtin-longjmp.c b/test/CodeGen/builtin-longjmp.c index 75c91b8374..7f0fcfd951 100644 --- a/test/CodeGen/builtin-longjmp.c +++ b/test/CodeGen/builtin-longjmp.c @@ -1,11 +1,12 @@ -// RUN: %clang_cc1 -triple i386-unknown-unknown -emit-llvm < %s| FileCheck %s -check-prefix=SUPPORTED -// RUN: %clang_cc1 -triple x86_64-unknown-unknown -emit-llvm < %s| FileCheck %s -check-prefix=SUPPORTED -// RUN: %clang_cc1 -triple powerpc-unknown-unknown -emit-llvm < %s| FileCheck %s -check-prefix=SUPPORTED -// RUN: %clang_cc1 -triple powerpc64-unknown-unknown -emit-llvm < %s| FileCheck %s -check-prefix=SUPPORTED -// RUN: %clang_cc1 -triple arm-unknown-unknown -emit-llvm < %s| FileCheck %s -check-prefix=UNSUPPORTED -// RUN: %clang_cc1 -triple aarch64-unknown-unknown -emit-llvm < %s| FileCheck %s -check-prefix=UNSUPPORTED -// RUN: %clang_cc1 -triple mips-unknown-unknown -emit-llvm < %s| FileCheck %s -check-prefix=UNSUPPORTED -// RUN: %clang_cc1 -triple mips64-unknown-unknown -emit-llvm < %s| FileCheck %s -check-prefix=UNSUPPORTED +// RUN: %clang_cc1 -triple i386-unknown-unknown -emit-llvm < %s| FileCheck %s +// RUN: %clang_cc1 -triple x86_64-unknown-unknown -emit-llvm < %s| FileCheck %s +// RUN: %clang_cc1 -triple powerpc-unknown-unknown -emit-llvm < %s| FileCheck %s +// RUN: %clang_cc1 -triple powerpc64-unknown-unknown -emit-llvm < %s| FileCheck %s + +// RUN: %clang_cc1 -triple arm-unknown-unknown -emit-llvm -verify %s +// RUN: %clang_cc1 -triple aarch64-unknown-unknown -emit-llvm -verify %s +// RUN: %clang_cc1 -triple mips-unknown-unknown -emit-llvm -verify %s +// RUN: %clang_cc1 -triple mips64-unknown-unknown -emit-llvm -verify %s // Check that __builtin_longjmp and __builtin_setjmp are lowerd into // IR intrinsics on those architectures that can handle them. @@ -14,18 +15,14 @@ typedef void *jmp_buf; jmp_buf buf; -// SUPPORTED: define{{.*}} void @do_jump() -// SUPPORTED: call{{.*}} void @llvm.eh.sjlj.longjmp -// UNSUPPORTED: define{{.*}} void @do_jump() -// UNSUPPORTED: call{{.*}} void @longjmp +// CHECK: define{{.*}} void @do_jump() +// CHECK: call{{.*}} void @llvm.eh.sjlj.longjmp -// SUPPORTED: define{{.*}} void @do_setjmp() -// SUPPORTED: call{{.*}} i32 @llvm.eh.sjlj.setjmp -// UNSUPPORTED: define{{.*}} void @do_setjmp() -// UNSUPPORTED: call{{.*}} i32 @setjmp +// CHECK: define{{.*}} void @do_setjmp() +// CHECK: call{{.*}} i32 @llvm.eh.sjlj.setjmp void do_jump(void) { - __builtin_longjmp(buf, 1); + __builtin_longjmp(buf, 1); // expected-error {{cannot compile this __builtin_longjmp yet}} } void f(void);