Pirama Arumuga Nainar | 7c91505 | 2015-04-08 08:58:29 -0700 | [diff] [blame] | 1 | // RUN: %clang_dfsan -DLIB -c %s -o %t.lib.o && \ |
| 2 | // RUN: %clang_dfsan -c %s -o %t.o && \ |
| 3 | // RUN: %clang_dfsan %t.lib.o %t.o -o %t.bin && \ |
Stephen Hines | 2d1fdb2 | 2014-05-28 23:58:16 -0700 | [diff] [blame] | 4 | // RUN: %run %t.bin |
| 5 | |
Pirama Arumuga Nainar | 7c91505 | 2015-04-08 08:58:29 -0700 | [diff] [blame] | 6 | // RUN: %clang_dfsan -mllvm -dfsan-args-abi -DLIB -c %s -o %t.lib.o && \ |
| 7 | // RUN: %clang_dfsan -mllvm -dfsan-args-abi -c %s -o %t.o && \ |
| 8 | // RUN: %clang_dfsan -mllvm -dfsan-args-abi %t.o %t.lib.o -o %t.bin && \ |
Stephen Hines | 2d1fdb2 | 2014-05-28 23:58:16 -0700 | [diff] [blame] | 9 | // RUN: %run %t.bin |
| 10 | |
| 11 | #include <sanitizer/dfsan_interface.h> |
| 12 | #include <assert.h> |
| 13 | |
| 14 | #ifdef LIB |
| 15 | // Compiling this file with and without LIB defined allows this file to be |
| 16 | // built as two separate translation units. This ensures that the code |
| 17 | // can not be optimized in a way that removes behavior we wish to test. For |
| 18 | // example, computing a value should cause labels to be allocated only if |
| 19 | // the computation is actually done. Putting the computation here prevents |
| 20 | // the compiler from optimizing away the computation (and labeling) that |
| 21 | // tests wish to verify. |
| 22 | |
| 23 | int add_in_separate_translation_unit(int a, int b) { |
| 24 | return a + b; |
| 25 | } |
| 26 | |
| 27 | int multiply_in_separate_translation_unit(int a, int b) { |
| 28 | return a * b; |
| 29 | } |
| 30 | |
| 31 | #else |
| 32 | |
| 33 | int add_in_separate_translation_unit(int i, int j); |
| 34 | int multiply_in_separate_translation_unit(int i, int j); |
| 35 | |
| 36 | int main(void) { |
| 37 | size_t label_count; |
| 38 | |
| 39 | // No labels allocated yet. |
| 40 | label_count = dfsan_get_label_count(); |
| 41 | assert(0 == label_count); |
| 42 | |
| 43 | int i = 1; |
| 44 | dfsan_label i_label = dfsan_create_label("i", 0); |
| 45 | dfsan_set_label(i_label, &i, sizeof(i)); |
| 46 | |
| 47 | // One label allocated for i. |
| 48 | label_count = dfsan_get_label_count(); |
| 49 | assert(1u == label_count); |
| 50 | |
| 51 | int j = 2; |
| 52 | dfsan_label j_label = dfsan_create_label("j", 0); |
| 53 | dfsan_set_label(j_label, &j, sizeof(j)); |
| 54 | |
| 55 | // Check that a new label was allocated for j. |
| 56 | label_count = dfsan_get_label_count(); |
| 57 | assert(2u == label_count); |
| 58 | |
| 59 | // Create a value that combines i and j. |
| 60 | int i_plus_j = add_in_separate_translation_unit(i, j); |
| 61 | |
| 62 | // Check that a label was created for the union of i and j. |
| 63 | label_count = dfsan_get_label_count(); |
| 64 | assert(3u == label_count); |
| 65 | |
| 66 | // Combine i and j in a different way. Check that the existing label is |
| 67 | // reused, and a new label is not created. |
| 68 | int j_times_i = multiply_in_separate_translation_unit(j, i); |
| 69 | label_count = dfsan_get_label_count(); |
| 70 | assert(3u == label_count); |
| 71 | assert(dfsan_get_label(i_plus_j) == dfsan_get_label(j_times_i)); |
| 72 | |
| 73 | return 0; |
| 74 | } |
| 75 | #endif // #ifdef LIB |