diff options
| author | David Majnemer <david.majnemer@gmail.com> | 2015-03-20 17:03:35 +0000 |
|---|---|---|
| committer | David Majnemer <david.majnemer@gmail.com> | 2015-03-20 17:03:35 +0000 |
| commit | c403a1ce323b9a20fcfd928152da8c59321d2a75 (patch) | |
| tree | 57332ad6ee414109310c07c215cd20d7528b10db /clang | |
| parent | be30a6524f398151192c0d3211ffec76ab4cf67b (diff) | |
| download | bcm5719-llvm-c403a1ce323b9a20fcfd928152da8c59321d2a75.tar.gz bcm5719-llvm-c403a1ce323b9a20fcfd928152da8c59321d2a75.zip | |
MS ABI: Accept calls to an unprototyped declaration of _setjmp
This fixes PR22961.
llvm-svn: 232824
Diffstat (limited to 'clang')
| -rw-r--r-- | clang/lib/CodeGen/CGBuiltin.cpp | 10 | ||||
| -rw-r--r-- | clang/lib/Sema/SemaChecking.cpp | 5 | ||||
| -rw-r--r-- | clang/test/CodeGen/ms-setjmp.c | 5 |
3 files changed, 15 insertions, 5 deletions
diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp index fc9e4dd1f21..f5ce8fba8c6 100644 --- a/clang/lib/CodeGen/CGBuiltin.cpp +++ b/clang/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/clang/lib/Sema/SemaChecking.cpp b/clang/lib/Sema/SemaChecking.cpp index 0b6d363088e..d73d33d19e9 100644 --- a/clang/lib/Sema/SemaChecking.cpp +++ b/clang/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/clang/test/CodeGen/ms-setjmp.c b/clang/test/CodeGen/ms-setjmp.c index 385bbed27cf..78928bb7167 100644 --- a/clang/test/CodeGen/ms-setjmp.c +++ b/clang/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; |

