Benjamin Kramer | cc179cb | 2009-10-27 12:19:13 +0000 | [diff] [blame] | 1 | // RUN: clang-cc -triple x86_64-apple-darwin -S %s -o - | FileCheck %s |
| 2 | |
| 3 | #define strcpy(dest, src) \ |
| 4 | ((__builtin_object_size(dest, 0) != -1ULL) \ |
| 5 | ? __builtin___strcpy_chk (dest, src, __builtin_object_size(dest, 1)) \ |
| 6 | : __inline_strcpy_chk(dest, src)) |
| 7 | |
| 8 | static char *__inline_strcpy_chk (char *dest, const char *src) { |
| 9 | return __builtin___strcpy_chk(dest, src, __builtin_object_size(dest, 1)); |
| 10 | } |
Mike Stump | 64eda9e | 2009-10-26 18:35:08 +0000 | [diff] [blame] | 11 | |
| 12 | char gbuf[63]; |
| 13 | char *gp; |
Mike Stump | 48c2af8 | 2009-10-29 23:22:14 +0000 | [diff] [blame] | 14 | int gi, gj; |
Mike Stump | 64eda9e | 2009-10-26 18:35:08 +0000 | [diff] [blame] | 15 | |
| 16 | void test1() { |
| 17 | // CHECK: movabsq $59, %rdx |
Jakob Stoklund Olesen | 936d2a8 | 2009-11-17 01:47:01 +0000 | [diff] [blame] | 18 | // CHECK-NEXT: movq |
| 19 | // CHECK-NEXT: movq |
Mike Stump | 64eda9e | 2009-10-26 18:35:08 +0000 | [diff] [blame] | 20 | // CHECK-NEXT: call ___strcpy_chk |
| 21 | strcpy(&gbuf[4], "Hi there"); |
| 22 | } |
| 23 | |
| 24 | void test2() { |
| 25 | // CHECK: movabsq $63, %rdx |
Jakob Stoklund Olesen | 936d2a8 | 2009-11-17 01:47:01 +0000 | [diff] [blame] | 26 | // CHECK-NEXT: movq |
| 27 | // CHECK-NEXT: movq |
Mike Stump | 64eda9e | 2009-10-26 18:35:08 +0000 | [diff] [blame] | 28 | // CHECK-NEXT: call ___strcpy_chk |
| 29 | strcpy(gbuf, "Hi there"); |
| 30 | } |
| 31 | |
Mike Stump | 06bc9bc | 2009-10-26 21:38:39 +0000 | [diff] [blame] | 32 | void test3() { |
| 33 | // CHECK: movabsq $0, %rdx |
Jakob Stoklund Olesen | 936d2a8 | 2009-11-17 01:47:01 +0000 | [diff] [blame] | 34 | // CHECK-NEXT: movq |
| 35 | // CHECK-NEXT: movq |
Mike Stump | 06bc9bc | 2009-10-26 21:38:39 +0000 | [diff] [blame] | 36 | // CHECK-NEXT: call ___strcpy_chk |
| 37 | strcpy(&gbuf[100], "Hi there"); |
Mike Stump | 64eda9e | 2009-10-26 18:35:08 +0000 | [diff] [blame] | 38 | } |
| 39 | |
Mike Stump | 06bc9bc | 2009-10-26 21:38:39 +0000 | [diff] [blame] | 40 | void test4() { |
| 41 | // CHECK: movabsq $0, %rdx |
Jakob Stoklund Olesen | 936d2a8 | 2009-11-17 01:47:01 +0000 | [diff] [blame] | 42 | // CHECK-NEXT: movq |
| 43 | // CHECK-NEXT: movq |
Mike Stump | 06bc9bc | 2009-10-26 21:38:39 +0000 | [diff] [blame] | 44 | // CHECK-NEXT: call ___strcpy_chk |
| 45 | strcpy((char*)(void*)&gbuf[-1], "Hi there"); |
| 46 | } |
| 47 | |
| 48 | void test5() { |
Mike Stump | 3ada2df | 2009-11-09 22:40:09 +0000 | [diff] [blame] | 49 | // CHECK: movq $-1, %rax |
| 50 | // CHECK-NEXT: cmpq $-1, %rax |
Mike Stump | 06bc9bc | 2009-10-26 21:38:39 +0000 | [diff] [blame] | 51 | // CHECK: call ___inline_strcpy_chk |
| 52 | strcpy(gp, "Hi there"); |
| 53 | } |
| 54 | |
| 55 | void test6() { |
Mike Stump | 660e6f7 | 2009-10-26 23:05:19 +0000 | [diff] [blame] | 56 | char buf[57]; |
| 57 | |
| 58 | // CHECK: movabsq $53, %rdx |
Jakob Stoklund Olesen | 936d2a8 | 2009-11-17 01:47:01 +0000 | [diff] [blame] | 59 | // CHECK-NEXT: movq |
| 60 | // CHECK-NEXT: movq |
Mike Stump | 660e6f7 | 2009-10-26 23:05:19 +0000 | [diff] [blame] | 61 | // CHECK-NEXT: call ___strcpy_chk |
| 62 | strcpy(&buf[4], "Hi there"); |
| 63 | } |
Mike Stump | 48c2af8 | 2009-10-29 23:22:14 +0000 | [diff] [blame] | 64 | |
| 65 | void test7() { |
| 66 | int i; |
| 67 | // CHECK-NOT: call ___strcpy_chk |
| 68 | // CHECK: call ___inline_strcpy_chk |
| 69 | strcpy((++i, gbuf), "Hi there"); |
| 70 | } |
| 71 | |
| 72 | void test8() { |
| 73 | char *buf[50]; |
| 74 | // CHECK-NOT: call ___strcpy_chk |
| 75 | // CHECK: call ___inline_strcpy_chk |
| 76 | strcpy(buf[++gi], "Hi there"); |
| 77 | } |
| 78 | |
| 79 | void test9() { |
| 80 | // CHECK-NOT: call ___strcpy_chk |
| 81 | // CHECK: call ___inline_strcpy_chk |
| 82 | strcpy((char *)((++gi) + gj), "Hi there"); |
| 83 | } |
| 84 | |
| 85 | char **p; |
| 86 | void test10() { |
| 87 | // CHECK-NOT: call ___strcpy_chk |
| 88 | // CHECK: call ___inline_strcpy_chk |
| 89 | strcpy(*(++p), "Hi there"); |
| 90 | } |
Mike Stump | 2623aa2 | 2009-10-29 23:29:54 +0000 | [diff] [blame] | 91 | |
| 92 | void test11() { |
| 93 | // CHECK-NOT: call ___strcpy_chk |
| 94 | // CHECK: call ___inline_strcpy_chk |
| 95 | strcpy(gp = gbuf, "Hi there"); |
| 96 | } |
| 97 | |
| 98 | void test12() { |
| 99 | // CHECK-NOT: call ___strcpy_chk |
| 100 | // CHECK: call ___inline_strcpy_chk |
| 101 | strcpy(++gp, "Hi there"); |
| 102 | } |
| 103 | |
| 104 | void test13() { |
| 105 | // CHECK-NOT: call ___strcpy_chk |
| 106 | // CHECK: call ___inline_strcpy_chk |
| 107 | strcpy(gp++, "Hi there"); |
| 108 | } |
| 109 | |
| 110 | void test14() { |
| 111 | // CHECK-NOT: call ___strcpy_chk |
| 112 | // CHECK: call ___inline_strcpy_chk |
| 113 | strcpy(--gp, "Hi there"); |
| 114 | } |
| 115 | |
| 116 | void test15() { |
| 117 | // CHECK-NOT: call ___strcpy_chk |
| 118 | // CHECK: call ___inline_strcpy_chk |
| 119 | strcpy(gp--, "Hi there"); |
| 120 | } |
Mike Stump | 3f0147e | 2009-10-29 23:34:20 +0000 | [diff] [blame] | 121 | |
| 122 | void test16() { |
| 123 | // CHECK-NOT: call ___strcpy_chk |
| 124 | // CHECK: call ___inline_strcpy_chk |
| 125 | strcpy(gp += 1, "Hi there"); |
| 126 | } |