1 // REQUIRES: shell 2 3 // Check that all of the hashes in this file are unique (i.e, that none of the 4 // profiles for these functions are mutually interchangeable). 5 // 6 // RUN: llvm-profdata show -all-functions %S/Inputs/cxx-hash-v2.profdata.v5 | grep "Hash: 0x" | sort > %t.hashes 7 // RUN: uniq %t.hashes > %t.hashes.unique 8 // RUN: diff %t.hashes %t.hashes.unique 9 10 // RUN: llvm-profdata merge %S/Inputs/cxx-hash-v2.proftext -o %t.profdata 11 // RUN: %clang_cc1 -std=c++11 -fexceptions -fcxx-exceptions -triple x86_64-apple-macosx10.9 -main-file-name cxx-hash-v2.mm %s -o /dev/null -emit-llvm -fprofile-instrument-use-path=%t.profdata 2>&1 | FileCheck %s -allow-empty 12 // RUN: %clang_cc1 -std=c++11 -fexceptions -fcxx-exceptions -triple x86_64-apple-macosx10.9 -main-file-name cxx-hash-v2.mm %s -o /dev/null -emit-llvm -fprofile-instrument-use-path=%S/Inputs/cxx-hash-v2.profdata.v5 2>&1 | FileCheck %s -allow-empty 13 14 // CHECK-NOT: warning: profile data may be out of date 15 16 int x; 17 int arr[1] = {0}; 18 loop_after_if_else()19void loop_after_if_else() { 20 if (1) 21 x = 1; 22 else 23 x = 2; 24 while (0) 25 ++x; 26 } 27 loop_in_then_block()28void loop_in_then_block() { 29 if (1) { 30 while (0) 31 ++x; 32 } else { 33 x = 2; 34 } 35 } 36 loop_in_else_block()37void loop_in_else_block() { 38 if (1) { 39 x = 1; 40 } else { 41 while (0) 42 ++x; 43 } 44 } 45 if_inside_of_for()46void if_inside_of_for() { 47 for (x = 0; x < 0; ++x) { 48 x = 1; 49 if (1) 50 x = 2; 51 } 52 } 53 if_outside_of_for()54void if_outside_of_for() { 55 for (x = 0; x < 0; ++x) 56 x = 1; 57 if (1) 58 x = 2; 59 } 60 if_inside_of_while()61void if_inside_of_while() { 62 while (0) { 63 x = 1; 64 if (1) 65 x = 2; 66 } 67 } 68 if_outside_of_while()69void if_outside_of_while() { 70 while (0) 71 x = 1; 72 if (1) 73 x = 2; 74 } 75 nested_dos()76void nested_dos() { 77 do { 78 do { 79 ++x; 80 } while (0); 81 } while (0); 82 } 83 consecutive_dos()84void consecutive_dos() { 85 do { 86 } while (0); 87 do { 88 ++x; 89 } while (0); 90 } 91 loop_empty()92void loop_empty() { 93 for (x = 0; x < 5; ++x) {} 94 } 95 loop_return()96void loop_return() { 97 for (x = 0; x < 5; ++x) 98 return; 99 } 100 loop_continue()101void loop_continue() { 102 for (x = 0; x < 5; ++x) 103 continue; 104 } 105 loop_break()106void loop_break() { 107 for (x = 0; x < 5; ++x) 108 break; 109 } 110 no_gotos()111void no_gotos() { 112 static void *dispatch[] = {&&done}; 113 x = 0; 114 done: 115 ++x; 116 } 117 direct_goto()118void direct_goto() { 119 static void *dispatch[] = {&&done}; 120 x = 0; 121 goto done; 122 done: 123 ++x; 124 } 125 indirect_goto()126void indirect_goto() { 127 static void *dispatch[] = {&&done}; 128 x = 0; 129 goto *dispatch[x]; 130 done: 131 ++x; 132 } 133 nested_for_ranges()134void nested_for_ranges() { 135 for (int a : arr) 136 for (int b : arr) 137 ++x; 138 } 139 consecutive_for_ranges()140void consecutive_for_ranges() { 141 for (int a : arr) {} 142 for (int b : arr) 143 ++x; 144 } 145 nested_try_catch()146void nested_try_catch() { 147 try { 148 try { 149 ++x; 150 } catch (...) {} 151 } catch (...) {} 152 } 153 consecutive_try_catch()154void consecutive_try_catch() { 155 try {} catch (...) {} 156 try { 157 ++x; 158 } catch (...) {} 159 } 160 no_throw()161void no_throw() {} 162 has_throw()163void has_throw() { 164 throw 0; 165 } 166 single_lnot()167void single_lnot() { 168 if (!x) {} 169 } 170 double_lnot()171void double_lnot() { 172 if (!!x) {} 173 } 174 main()175int main() { 176 return 0; 177 } 178