From faf9eba98b8715a7a045ded93960660509d6d9a5 Mon Sep 17 00:00:00 2001 From: David Majnemer <david.majnemer@gmail.com> Date: Fri, 20 Mar 2015 17:03:35 +0000 Subject: [PATCH] MS ABI: Accept calls to an unprototyped declaration of _setjmp This fixes PR22961. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@232824 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/CGBuiltin.cpp | 10 ++++++---- lib/Sema/SemaChecking.cpp | 5 +++++ test/CodeGen/ms-setjmp.c | 5 ++++- 3 files changed, 15 insertions(+), 5 deletions(-) diff --git a/lib/CodeGen/CGBuiltin.cpp b/lib/CodeGen/CGBuiltin.cpp index fc9e4dd1f21..f5ce8fba8c6 100644 --- a/lib/CodeGen/CGBuiltin.cpp +++ b/lib/CodeGen/CGBuiltin.cpp @@ -1699,8 +1699,8 @@ RValue CodeGenFunction::EmitBuiltinExpr(const FunctionDecl *FD, llvm::Constant *SetJmpEx = CGM.CreateRuntimeFunction( llvm::FunctionType::get(IntTy, ArgTypes, /*isVarArg=*/false), "_setjmpex", ReturnsTwiceAttr); - llvm::Value *Buf = - Builder.CreateBitCast(EmitScalarExpr(E->getArg(0)), Int8PtrTy); + llvm::Value *Buf = Builder.CreateBitOrPointerCast( + EmitScalarExpr(E->getArg(0)), Int8PtrTy); llvm::Value *FrameAddr = Builder.CreateCall(CGM.getIntrinsic(Intrinsic::frameaddress), ConstantInt::get(Int32Ty, 0)); @@ -1709,14 +1709,15 @@ RValue CodeGenFunction::EmitBuiltinExpr(const FunctionDecl *FD, CS.setAttributes(ReturnsTwiceAttr); return RValue::get(CS.getInstruction()); } + break; } case Builtin::BI_setjmp: { if (getTarget().getTriple().isOSMSVCRT()) { llvm::AttributeSet ReturnsTwiceAttr = AttributeSet::get(getLLVMContext(), llvm::AttributeSet::FunctionIndex, llvm::Attribute::ReturnsTwice); - llvm::Value *Buf = - Builder.CreateBitCast(EmitScalarExpr(E->getArg(0)), Int8PtrTy); + llvm::Value *Buf = Builder.CreateBitOrPointerCast( + EmitScalarExpr(E->getArg(0)), Int8PtrTy); llvm::CallSite CS; if (getTarget().getTriple().getArch() == llvm::Triple::x86) { llvm::Type *ArgTypes[] = {Int8PtrTy, IntTy}; @@ -1740,6 +1741,7 @@ RValue CodeGenFunction::EmitBuiltinExpr(const FunctionDecl *FD, CS.setAttributes(ReturnsTwiceAttr); return RValue::get(CS.getInstruction()); } + break; } case Builtin::BI__GetExceptionInfo: { diff --git a/lib/Sema/SemaChecking.cpp b/lib/Sema/SemaChecking.cpp index 0b6d363088e..d73d33d19e9 100644 --- a/lib/Sema/SemaChecking.cpp +++ b/lib/Sema/SemaChecking.cpp @@ -323,6 +323,11 @@ Sema::CheckBuiltinFunctionCall(FunctionDecl *FDecl, unsigned BuiltinID, if (SemaBuiltinSetjmp(TheCall)) return ExprError(); break; + case Builtin::BI_setjmp: + case Builtin::BI_setjmpex: + if (checkArgCount(*this, TheCall, 1)) + return true; + break; case Builtin::BI__builtin_classify_type: if (checkArgCount(*this, TheCall, 1)) return true; diff --git a/test/CodeGen/ms-setjmp.c b/test/CodeGen/ms-setjmp.c index 385bbed27cf..78928bb7167 100644 --- a/test/CodeGen/ms-setjmp.c +++ b/test/CodeGen/ms-setjmp.c @@ -1,10 +1,13 @@ +// RUN: %clang_cc1 -fms-extensions -DDECLARE_SETJMP -triple i686-windows-msvc -emit-llvm %s -o - | FileCheck --check-prefix=I386 %s +// RUN: %clang_cc1 -fms-extensions -DDECLARE_SETJMP -triple x86_64-windows-msvc -emit-llvm %s -o - | FileCheck --check-prefix=X64 %s // RUN: %clang_cc1 -fms-extensions -triple i686-windows-msvc -emit-llvm %s -o - | FileCheck --check-prefix=I386 %s // RUN: %clang_cc1 -fms-extensions -triple x86_64-windows-msvc -emit-llvm %s -o - | FileCheck --check-prefix=X64 %s - typedef char jmp_buf[1]; +#ifdef DECLARE_SETJMP int _setjmp(jmp_buf env); int _setjmpex(jmp_buf env); +#endif jmp_buf jb; -- GitLab