mirror of https://github.com/microsoft/clang.git
Re-enable several builtins in non-gnu modes.
This is a partial revert of 183015. By not recognizing things like _setjmp we lose (returns_twice) attribute on them, which leads to incorrect code generation. Fixes PR16138. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@206362 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
11ab38baa1
commit
c80d3f6f2f
|
@ -740,6 +740,9 @@ LIBBUILTIN(setjmp, "iJ", "fj", "setjmp.h", ALL_LANGUAGES)
|
|||
LIBBUILTIN(longjmp, "vJi", "fr", "setjmp.h", ALL_LANGUAGES)
|
||||
|
||||
// Non-C library functions, active in GNU mode only.
|
||||
// Functions with (returns_twice) attribute (marked as "j") are still active in
|
||||
// all languages, because losing this attribute would result in miscompilation
|
||||
// when these functions are used in non-GNU mode. PR16138.
|
||||
LIBBUILTIN(alloca, "v*z", "f", "stdlib.h", ALL_GNU_LANGUAGES)
|
||||
// POSIX string.h
|
||||
LIBBUILTIN(stpcpy, "c*c*cC*", "f", "string.h", ALL_GNU_LANGUAGES)
|
||||
|
@ -758,16 +761,16 @@ LIBBUILTIN(strcasecmp, "icC*cC*", "f", "strings.h", ALL_GNU_LANGUAGES)
|
|||
LIBBUILTIN(strncasecmp, "icC*cC*z", "f", "strings.h", ALL_GNU_LANGUAGES)
|
||||
// POSIX unistd.h
|
||||
LIBBUILTIN(_exit, "vi", "fr", "unistd.h", ALL_GNU_LANGUAGES)
|
||||
LIBBUILTIN(vfork, "p", "fj", "unistd.h", ALL_GNU_LANGUAGES)
|
||||
LIBBUILTIN(vfork, "p", "fj", "unistd.h", ALL_LANGUAGES)
|
||||
// POSIX setjmp.h
|
||||
|
||||
LIBBUILTIN(_setjmp, "iJ", "fj", "setjmp.h", ALL_GNU_LANGUAGES)
|
||||
LIBBUILTIN(__sigsetjmp, "iSJi", "fj", "setjmp.h", ALL_GNU_LANGUAGES)
|
||||
LIBBUILTIN(sigsetjmp, "iSJi", "fj", "setjmp.h", ALL_GNU_LANGUAGES)
|
||||
LIBBUILTIN(setjmp_syscall, "iJ", "fj", "setjmp.h", ALL_GNU_LANGUAGES)
|
||||
LIBBUILTIN(savectx, "iJ", "fj", "setjmp.h", ALL_GNU_LANGUAGES)
|
||||
LIBBUILTIN(qsetjmp, "iJ", "fj", "setjmp.h", ALL_GNU_LANGUAGES)
|
||||
LIBBUILTIN(getcontext, "iK*", "fj", "setjmp.h", ALL_GNU_LANGUAGES)
|
||||
LIBBUILTIN(_setjmp, "iJ", "fj", "setjmp.h", ALL_LANGUAGES)
|
||||
LIBBUILTIN(__sigsetjmp, "iSJi", "fj", "setjmp.h", ALL_LANGUAGES)
|
||||
LIBBUILTIN(sigsetjmp, "iSJi", "fj", "setjmp.h", ALL_LANGUAGES)
|
||||
LIBBUILTIN(setjmp_syscall, "iJ", "fj", "setjmp.h", ALL_LANGUAGES)
|
||||
LIBBUILTIN(savectx, "iJ", "fj", "setjmp.h", ALL_LANGUAGES)
|
||||
LIBBUILTIN(qsetjmp, "iJ", "fj", "setjmp.h", ALL_LANGUAGES)
|
||||
LIBBUILTIN(getcontext, "iK*", "fj", "setjmp.h", ALL_LANGUAGES)
|
||||
|
||||
LIBBUILTIN(_longjmp, "vJi", "fr", "setjmp.h", ALL_GNU_LANGUAGES)
|
||||
LIBBUILTIN(siglongjmp, "vSJi", "fr", "setjmp.h", ALL_GNU_LANGUAGES)
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
// RUN: %clang_cc1 -triple i386-unknown-unknown -emit-llvm -Os -o - %s | FileCheck %s
|
||||
// RUN: %clang_cc1 -triple i386-unknown-unknown -emit-llvm -Os -std=c99 -o - %s | FileCheck %s
|
||||
// CHECK: define signext i8 @f0(i32 %x) [[NUW:#[0-9]+]]
|
||||
// CHECK: define zeroext i8 @f1(i32 %x) [[NUW]]
|
||||
// CHECK: define void @f2(i8 signext %x) [[NUW]]
|
||||
|
@ -117,6 +118,16 @@ void f19(void) {
|
|||
setjmp(0);
|
||||
}
|
||||
|
||||
// CHECK-LABEL: define void @f20()
|
||||
// CHECK: {
|
||||
// CHECK: call i32 @_setjmp(i32* null)
|
||||
// CHECK: [[RT_CALL]]
|
||||
// CHECK: ret void
|
||||
int _setjmp(jmp_buf);
|
||||
void f20(void) {
|
||||
_setjmp(0);
|
||||
}
|
||||
|
||||
// CHECK: attributes [[NUW]] = { nounwind optsize readnone{{.*}} }
|
||||
// CHECK: attributes [[AI]] = { alwaysinline nounwind optsize readnone{{.*}} }
|
||||
// CHECK: attributes [[ALIGN]] = { nounwind optsize readnone alignstack=16{{.*}} }
|
||||
|
|
|
@ -13,14 +13,6 @@ int bzero;
|
|||
int strcasecmp;
|
||||
int strncasecmp;
|
||||
int _exit;
|
||||
int vfork;
|
||||
int _setjmp;
|
||||
int __sigsetjmp;
|
||||
int sigsetjmp;
|
||||
int setjmp_syscall;
|
||||
int savectx;
|
||||
int qsetjmp;
|
||||
int getcontext;
|
||||
int _longjmp;
|
||||
int siglongjmp;
|
||||
int strlcpy;
|
||||
|
|
Loading…
Reference in New Issue