Re: [PATCH] D19062: Add functions in ctype.h to builtin function database (Fix)
aaron.ballman closed this revision. aaron.ballman added a comment. I have commit in r268553 http://reviews.llvm.org/D19062 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
Re: [PATCH] D19062: Add functions in ctype.h to builtin function database (Fix)
twoh updated this revision to Diff 56198. twoh added a comment. Rebased on ToT. Thanks @aaron.ballman! http://reviews.llvm.org/D19062 Files: include/clang/Basic/Builtins.def include/clang/Basic/Builtins.h lib/Sema/SemaDecl.cpp test/FixIt/typo.m test/Sema/enable_if.c test/Sema/libbuiltins-ctype-powerpc64.c test/Sema/libbuiltins-ctype-x86_64.c Index: test/Sema/libbuiltins-ctype-x86_64.c === --- test/Sema/libbuiltins-ctype-x86_64.c +++ test/Sema/libbuiltins-ctype-x86_64.c @@ -0,0 +1,65 @@ +// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -emit-llvm < %s | FileCheck %s + +int isalnum(int); +int isalpha(int); +int isblank(int); +int iscntrl(int); +int isdigit(int); +int isgraph(int); +int islower(int); +int isprint(int); +int ispunct(int); +int isspace(int); +int isupper(int); +int isxdigit(int); +int tolower(int); +int toupper(int); + +void test(int x) { + // CHECK: call i32 @isalnum(i32 {{%[0-9]+}}) [[NUW_RO_CALL:#[0-9]+]] + (void)isalnum(x); + // CHECK: call i32 @isalpha(i32 {{%[0-9]+}}) [[NUW_RO_CALL:#[0-9]+]] + (void)isalpha(x); + // CHECK: call i32 @isblank(i32 {{%[0-9]+}}) [[NUW_RO_CALL:#[0-9]+]] + (void)isblank(x); + // CHECK: call i32 @iscntrl(i32 {{%[0-9]+}}) [[NUW_RO_CALL:#[0-9]+]] + (void)iscntrl(x); + // CHECK: call i32 @isdigit(i32 {{%[0-9]+}}) [[NUW_RO_CALL:#[0-9]+]] + (void)isdigit(x); + // CHECK: call i32 @isgraph(i32 {{%[0-9]+}}) [[NUW_RO_CALL:#[0-9]+]] + (void)isgraph(x); + // CHECK: call i32 @islower(i32 {{%[0-9]+}}) [[NUW_RO_CALL:#[0-9]+]] + (void)islower(x); + // CHECK: call i32 @isprint(i32 {{%[0-9]+}}) [[NUW_RO_CALL:#[0-9]+]] + (void)isprint(x); + // CHECK: call i32 @ispunct(i32 {{%[0-9]+}}) [[NUW_RO_CALL:#[0-9]+]] + (void)ispunct(x); + // CHECK: call i32 @isspace(i32 {{%[0-9]+}}) [[NUW_RO_CALL:#[0-9]+]] + (void)isspace(x); + // CHECK: call i32 @isupper(i32 {{%[0-9]+}}) [[NUW_RO_CALL:#[0-9]+]] + (void)isupper(x); + // CHECK: call i32 @isxdigit(i32 {{%[0-9]+}}) [[NUW_RO_CALL:#[0-9]+]] + (void)isxdigit(x); + // CHECK: call i32 @tolower(i32 {{%[0-9]+}}) [[NUW_RO_CALL:#[0-9]+]] + (void)tolower(x); + // CHECK: call i32 @toupper(i32 {{%[0-9]+}}) [[NUW_RO_CALL:#[0-9]+]] + (void)toupper(x); +} + +// CHECK: declare i32 @isalnum(i32) [[NUW_RO:#[0-9]+]] +// CHECK: declare i32 @isalpha(i32) [[NUW_RO:#[0-9]+]] +// CHECK: declare i32 @isblank(i32) [[NUW_RO:#[0-9]+]] +// CHECK: declare i32 @iscntrl(i32) [[NUW_RO:#[0-9]+]] +// CHECK: declare i32 @isdigit(i32) [[NUW_RO:#[0-9]+]] +// CHECK: declare i32 @isgraph(i32) [[NUW_RO:#[0-9]+]] +// CHECK: declare i32 @islower(i32) [[NUW_RO:#[0-9]+]] +// CHECK: declare i32 @isprint(i32) [[NUW_RO:#[0-9]+]] +// CHECK: declare i32 @ispunct(i32) [[NUW_RO:#[0-9]+]] +// CHECK: declare i32 @isspace(i32) [[NUW_RO:#[0-9]+]] +// CHECK: declare i32 @isupper(i32) [[NUW_RO:#[0-9]+]] +// CHECK: declare i32 @isxdigit(i32) [[NUW_RO:#[0-9]+]] +// CHECK: declare i32 @tolower(i32) [[NUW_RO:#[0-9]+]] +// CHECK: declare i32 @toupper(i32) [[NUW_RO:#[0-9]+]] + +// CHECK: attributes [[NUW_RO]] = { nounwind readonly{{.*}} } +// CHECK: attributes [[NUW_RO_CALL]] = { nounwind readonly } Index: test/Sema/libbuiltins-ctype-powerpc64.c === --- test/Sema/libbuiltins-ctype-powerpc64.c +++ test/Sema/libbuiltins-ctype-powerpc64.c @@ -0,0 +1,65 @@ +// RUN: %clang_cc1 -triple powerpc64-unknown-linux-gnu -emit-llvm < %s | FileCheck %s + +int isalnum(int); +int isalpha(int); +int isblank(int); +int iscntrl(int); +int isdigit(int); +int isgraph(int); +int islower(int); +int isprint(int); +int ispunct(int); +int isspace(int); +int isupper(int); +int isxdigit(int); +int tolower(int); +int toupper(int); + +void test(int x) { + // CHECK: call signext i32 @isalnum(i32 signext {{%[0-9]+}}) [[NUW_RO_CALL:#[0-9]+]] + (void)isalnum(x); + // CHECK: call signext i32 @isalpha(i32 signext {{%[0-9]+}}) [[NUW_RO_CALL:#[0-9]+]] + (void)isalpha(x); + // CHECK: call signext i32 @isblank(i32 signext {{%[0-9]+}}) [[NUW_RO_CALL:#[0-9]+]] + (void)isblank(x); + // CHECK: call signext i32 @iscntrl(i32 signext {{%[0-9]+}}) [[NUW_RO_CALL:#[0-9]+]] + (void)iscntrl(x); + // CHECK: call signext i32 @isdigit(i32 signext {{%[0-9]+}}) [[NUW_RO_CALL:#[0-9]+]] + (void)isdigit(x); + // CHECK: call signext i32 @isgraph(i32 signext {{%[0-9]+}}) [[NUW_RO_CALL:#[0-9]+]] + (void)isgraph(x); + // CHECK: call signext i32 @islower(i32 signext {{%[0-9]+}}) [[NUW_RO_CALL:#[0-9]+]] + (void)islower(x); + // CHECK: call signext i32 @isprint(i32 signext {{%[0-9]+}}) [[NUW_RO_CALL:#[0-9]+]] + (void)isprint(x); + // CHECK: call signext i32 @ispunct(i32 signext {{%[0-9]+}}) [[NUW_RO_CALL:#[0-9]+]] + (void)ispunct(x); + // CHECK: call signext i32 @isspace(i32 signext {{%[0-9]+}}) [[NUW_RO_CALL:#[0-9]+]] + (void)isspace(x); + // CHECK: call signext i32 @isupper(i32 signext {{%[0-9]+}}) [[NUW_RO_CALL:#[0-9]+]] + (void)isupper(x); + // CHECK: call signext i32 @i
Re: [PATCH] D19062: Add functions in ctype.h to builtin function database (Fix)
aaron.ballman added a comment. In http://reviews.llvm.org/D19062#41, @twoh wrote: > Ping. Can someone please commit this patch for me? Thanks! Can you rebase the diff on ToT and update the review with the new patch? When I try to apply, I get merge conflicts. Thanks! http://reviews.llvm.org/D19062 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
Re: [PATCH] D19062: Add functions in ctype.h to builtin function database (Fix)
twoh added a comment. Ping. Can someone please commit this patch for me? Thanks! http://reviews.llvm.org/D19062 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
Re: [PATCH] D19062: Add functions in ctype.h to builtin function database (Fix)
twoh updated this revision to Diff 55377. twoh added a comment. Addressing comments from @joerg. Two versions of the test provided, one for an architecture with signed char(x86_64) and the other for an architecture with unsigned char(powerpc64). http://reviews.llvm.org/D19062 Files: include/clang/Basic/Builtins.def include/clang/Basic/Builtins.h lib/Sema/SemaDecl.cpp test/FixIt/typo.m test/Sema/enable_if.c test/Sema/libbuiltins-ctype-powerpc64.c test/Sema/libbuiltins-ctype-x86_64.c Index: test/Sema/libbuiltins-ctype-x86_64.c === --- test/Sema/libbuiltins-ctype-x86_64.c +++ test/Sema/libbuiltins-ctype-x86_64.c @@ -0,0 +1,65 @@ +// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -emit-llvm < %s | FileCheck %s + +int isalnum(int); +int isalpha(int); +int isblank(int); +int iscntrl(int); +int isdigit(int); +int isgraph(int); +int islower(int); +int isprint(int); +int ispunct(int); +int isspace(int); +int isupper(int); +int isxdigit(int); +int tolower(int); +int toupper(int); + +void test(int x) { + // CHECK: call i32 @isalnum(i32 {{%[0-9]+}}) [[NUW_RO_CALL:#[0-9]+]] + (void)isalnum(x); + // CHECK: call i32 @isalpha(i32 {{%[0-9]+}}) [[NUW_RO_CALL:#[0-9]+]] + (void)isalpha(x); + // CHECK: call i32 @isblank(i32 {{%[0-9]+}}) [[NUW_RO_CALL:#[0-9]+]] + (void)isblank(x); + // CHECK: call i32 @iscntrl(i32 {{%[0-9]+}}) [[NUW_RO_CALL:#[0-9]+]] + (void)iscntrl(x); + // CHECK: call i32 @isdigit(i32 {{%[0-9]+}}) [[NUW_RO_CALL:#[0-9]+]] + (void)isdigit(x); + // CHECK: call i32 @isgraph(i32 {{%[0-9]+}}) [[NUW_RO_CALL:#[0-9]+]] + (void)isgraph(x); + // CHECK: call i32 @islower(i32 {{%[0-9]+}}) [[NUW_RO_CALL:#[0-9]+]] + (void)islower(x); + // CHECK: call i32 @isprint(i32 {{%[0-9]+}}) [[NUW_RO_CALL:#[0-9]+]] + (void)isprint(x); + // CHECK: call i32 @ispunct(i32 {{%[0-9]+}}) [[NUW_RO_CALL:#[0-9]+]] + (void)ispunct(x); + // CHECK: call i32 @isspace(i32 {{%[0-9]+}}) [[NUW_RO_CALL:#[0-9]+]] + (void)isspace(x); + // CHECK: call i32 @isupper(i32 {{%[0-9]+}}) [[NUW_RO_CALL:#[0-9]+]] + (void)isupper(x); + // CHECK: call i32 @isxdigit(i32 {{%[0-9]+}}) [[NUW_RO_CALL:#[0-9]+]] + (void)isxdigit(x); + // CHECK: call i32 @tolower(i32 {{%[0-9]+}}) [[NUW_RO_CALL:#[0-9]+]] + (void)tolower(x); + // CHECK: call i32 @toupper(i32 {{%[0-9]+}}) [[NUW_RO_CALL:#[0-9]+]] + (void)toupper(x); +} + +// CHECK: declare i32 @isalnum(i32) [[NUW_RO:#[0-9]+]] +// CHECK: declare i32 @isalpha(i32) [[NUW_RO:#[0-9]+]] +// CHECK: declare i32 @isblank(i32) [[NUW_RO:#[0-9]+]] +// CHECK: declare i32 @iscntrl(i32) [[NUW_RO:#[0-9]+]] +// CHECK: declare i32 @isdigit(i32) [[NUW_RO:#[0-9]+]] +// CHECK: declare i32 @isgraph(i32) [[NUW_RO:#[0-9]+]] +// CHECK: declare i32 @islower(i32) [[NUW_RO:#[0-9]+]] +// CHECK: declare i32 @isprint(i32) [[NUW_RO:#[0-9]+]] +// CHECK: declare i32 @ispunct(i32) [[NUW_RO:#[0-9]+]] +// CHECK: declare i32 @isspace(i32) [[NUW_RO:#[0-9]+]] +// CHECK: declare i32 @isupper(i32) [[NUW_RO:#[0-9]+]] +// CHECK: declare i32 @isxdigit(i32) [[NUW_RO:#[0-9]+]] +// CHECK: declare i32 @tolower(i32) [[NUW_RO:#[0-9]+]] +// CHECK: declare i32 @toupper(i32) [[NUW_RO:#[0-9]+]] + +// CHECK: attributes [[NUW_RO]] = { nounwind readonly{{.*}} } +// CHECK: attributes [[NUW_RO_CALL]] = { nounwind readonly } Index: test/Sema/libbuiltins-ctype-powerpc64.c === --- test/Sema/libbuiltins-ctype-powerpc64.c +++ test/Sema/libbuiltins-ctype-powerpc64.c @@ -0,0 +1,65 @@ +// RUN: %clang_cc1 -triple powerpc64-unknown-linux-gnu -emit-llvm < %s | FileCheck %s + +int isalnum(int); +int isalpha(int); +int isblank(int); +int iscntrl(int); +int isdigit(int); +int isgraph(int); +int islower(int); +int isprint(int); +int ispunct(int); +int isspace(int); +int isupper(int); +int isxdigit(int); +int tolower(int); +int toupper(int); + +void test(int x) { + // CHECK: call signext i32 @isalnum(i32 signext {{%[0-9]+}}) [[NUW_RO_CALL:#[0-9]+]] + (void)isalnum(x); + // CHECK: call signext i32 @isalpha(i32 signext {{%[0-9]+}}) [[NUW_RO_CALL:#[0-9]+]] + (void)isalpha(x); + // CHECK: call signext i32 @isblank(i32 signext {{%[0-9]+}}) [[NUW_RO_CALL:#[0-9]+]] + (void)isblank(x); + // CHECK: call signext i32 @iscntrl(i32 signext {{%[0-9]+}}) [[NUW_RO_CALL:#[0-9]+]] + (void)iscntrl(x); + // CHECK: call signext i32 @isdigit(i32 signext {{%[0-9]+}}) [[NUW_RO_CALL:#[0-9]+]] + (void)isdigit(x); + // CHECK: call signext i32 @isgraph(i32 signext {{%[0-9]+}}) [[NUW_RO_CALL:#[0-9]+]] + (void)isgraph(x); + // CHECK: call signext i32 @islower(i32 signext {{%[0-9]+}}) [[NUW_RO_CALL:#[0-9]+]] + (void)islower(x); + // CHECK: call signext i32 @isprint(i32 signext {{%[0-9]+}}) [[NUW_RO_CALL:#[0-9]+]] + (void)isprint(x); + // CHECK: call signext i32 @ispunct(i32 signext {{%[0-9]+}}) [[NUW_RO_CALL:#[0-9]+]] + (void)ispunct(x); + // CHECK: call signext i32 @isspace(i32 signext {{%[0-9]+}}) [[NUW_RO_CALL:#[0-9]+]] + (void)isspace(
Re: [PATCH] D19062: Add functions in ctype.h to builtin function database (Fix)
joerg added a comment. Looking again at the failure mode, I think the best approach is to go back to the original test case and just select a fixed target. The problematic IR difference is purely an ABI choice of the target and not even related to -fsigned-char vs -funsigned-char. As such, the extensive use of regular expressions just makes the test case harder to read and maintain. http://reviews.llvm.org/D19062 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
Re: [PATCH] D19062: Add functions in ctype.h to builtin function database (Fix)
twoh added a comment. Ping. @joerg, could you please take a look? http://reviews.llvm.org/D19062 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
Re: [PATCH] D19062: Add functions in ctype.h to builtin function database (Fix)
rsmith accepted this revision. rsmith added a reviewer: rsmith. rsmith added a comment. This revision is now accepted and ready to land. LGTM too, but please wait for @joerg's review as e had concerns about the previous revision. http://reviews.llvm.org/D19062 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
Re: [PATCH] D19062: Add functions in ctype.h to builtin function database (Fix)
aaron.ballman added a comment. This looks reasonable to me, but I am curious what @joerg thinks of this approach. http://reviews.llvm.org/D19062 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D19062: Add functions in ctype.h to builtin function database (Fix)
twoh created this revision. twoh added a reviewer: aaron.ballman. twoh added subscribers: joerg, cfe-commits, rsmith. Add functions declared in ctype.h to builtin function database. All functions are annotated with nothrow and const attribute, which enables better optimization. This patch has been accepted and committed in r266199(http://reviews.llvm.org/D18970, http://reviews.llvm.org/rL266199), but reverted because newly added test caused build bot failures(http://reviews.llvm.org/rL266201). I fixed the test and resubmit patch here. http://reviews.llvm.org/D19062 Files: include/clang/Basic/Builtins.def include/clang/Basic/Builtins.h lib/Sema/SemaDecl.cpp test/FixIt/typo.m test/Sema/enable_if.c test/Sema/libbuiltins-ctype.c Index: test/Sema/libbuiltins-ctype.c === --- test/Sema/libbuiltins-ctype.c +++ test/Sema/libbuiltins-ctype.c @@ -0,0 +1,65 @@ +// RUN: %clang_cc1 -emit-llvm < %s | FileCheck %s + +int isalnum(int); +int isalpha(int); +int isblank(int); +int iscntrl(int); +int isdigit(int); +int isgraph(int); +int islower(int); +int isprint(int); +int ispunct(int); +int isspace(int); +int isupper(int); +int isxdigit(int); +int tolower(int); +int toupper(int); + +void test(int x) { + // CHECK: call {{.*}}isalnum{{.*}} [[NUW_RO_CALL:#[0-9]+]] + (void)isalnum(x); + // CHECK: call {{.*}}isalpha{{.*}} [[NUW_RO_CALL:#[0-9]+]] + (void)isalpha(x); + // CHECK: call {{.*}}isblank{{.*}} [[NUW_RO_CALL:#[0-9]+]] + (void)isblank(x); + // CHECK: call {{.*}}iscntrl{{.*}} [[NUW_RO_CALL:#[0-9]+]] + (void)iscntrl(x); + // CHECK: call {{.*}}isdigit{{.*}} [[NUW_RO_CALL:#[0-9]+]] + (void)isdigit(x); + // CHECK: call {{.*}}isgraph{{.*}} [[NUW_RO_CALL:#[0-9]+]] + (void)isgraph(x); + // CHECK: call {{.*}}islower{{.*}} [[NUW_RO_CALL:#[0-9]+]] + (void)islower(x); + // CHECK: call {{.*}}isprint{{.*}} [[NUW_RO_CALL:#[0-9]+]] + (void)isprint(x); + // CHECK: call {{.*}}ispunct{{.*}} [[NUW_RO_CALL:#[0-9]+]] + (void)ispunct(x); + // CHECK: call {{.*}}isspace{{.*}} [[NUW_RO_CALL:#[0-9]+]] + (void)isspace(x); + // CHECK: call {{.*}}isupper{{.*}} [[NUW_RO_CALL:#[0-9]+]] + (void)isupper(x); + // CHECK: call {{.*}}isxdigit{{.*}} [[NUW_RO_CALL:#[0-9]+]] + (void)isxdigit(x); + // CHECK: call {{.*}}tolower{{.*}} [[NUW_RO_CALL:#[0-9]+]] + (void)tolower(x); + // CHECK: call {{.*}}toupper{{.*}} [[NUW_RO_CALL:#[0-9]+]] + (void)toupper(x); +} + +// CHECK: declare {{.*}}isalnum{{.*}} [[NUW_RO:#[0-9]+]] +// CHECK: declare {{.*}}isalpha{{.*}} [[NUW_RO:#[0-9]+]] +// CHECK: declare {{.*}}isblank{{.*}} [[NUW_RO:#[0-9]+]] +// CHECK: declare {{.*}}iscntrl{{.*}} [[NUW_RO:#[0-9]+]] +// CHECK: declare {{.*}}isdigit{{.*}} [[NUW_RO:#[0-9]+]] +// CHECK: declare {{.*}}isgraph{{.*}} [[NUW_RO:#[0-9]+]] +// CHECK: declare {{.*}}islower{{.*}} [[NUW_RO:#[0-9]+]] +// CHECK: declare {{.*}}isprint{{.*}} [[NUW_RO:#[0-9]+]] +// CHECK: declare {{.*}}ispunct{{.*}} [[NUW_RO:#[0-9]+]] +// CHECK: declare {{.*}}isspace{{.*}} [[NUW_RO:#[0-9]+]] +// CHECK: declare {{.*}}isupper{{.*}} [[NUW_RO:#[0-9]+]] +// CHECK: declare {{.*}}isxdigit{{.*}} [[NUW_RO:#[0-9]+]] +// CHECK: declare {{.*}}tolower{{.*}} [[NUW_RO:#[0-9]+]] +// CHECK: declare {{.*}}toupper{{.*}} [[NUW_RO:#[0-9]+]] + +// CHECK: attributes [[NUW_RO]] = { nounwind readonly{{.*}} } +// CHECK: attributes [[NUW_RO_CALL]] = { nounwind readonly } Index: test/Sema/enable_if.c === --- test/Sema/enable_if.c +++ test/Sema/enable_if.c @@ -72,8 +72,8 @@ __attribute__((unavailable("'c' must have the value of an unsigned char or EOF"))); void test3(int c) { - isdigit(c); - isdigit(10); + isdigit(c); // expected-warning{{ignoring return value of function declared with pure attribute}} + isdigit(10); // expected-warning{{ignoring return value of function declared with pure attribute}} #ifndef CODEGEN isdigit(-10); // expected-error{{call to unavailable function 'isdigit': 'c' must have the value of an unsigned char or EOF}} #endif Index: test/FixIt/typo.m === --- test/FixIt/typo.m +++ test/FixIt/typo.m @@ -113,8 +113,6 @@ @end -double *isupper(int); - @interface Sub2 : Super - (int)method2; @end Index: lib/Sema/SemaDecl.cpp === --- lib/Sema/SemaDecl.cpp +++ lib/Sema/SemaDecl.cpp @@ -274,16 +274,16 @@ // so build a dependent node to describe the type. if (WantNontrivialTypeSourceInfo) return ActOnTypenameType(S, SourceLocation(), *SS, II, NameLoc).get(); - + NestedNameSpecifierLoc QualifierLoc = SS->getWithLocInContext(Context); QualType T = CheckTypenameType(ETK_None, SourceLocation(), QualifierLoc, II, NameLoc); return ParsedType::make(T); } return nullptr; } - + if (!LookupCtx