| 1 | #include <stdint.h> |
|---|---|
| 2 | #include <stdlib.h> |
| 3 | #include <string.h> |
| 4 | #include "../profile_test.h" |
| 5 | |
| 6 | int __llvm_profile_runtime = 0; |
| 7 | uint64_t __llvm_profile_get_size_for_buffer(void); |
| 8 | int __llvm_profile_write_buffer(char *); |
| 9 | void __llvm_profile_reset_counters(void); |
| 10 | int __llvm_profile_check_compatibility(const char *, uint64_t); |
| 11 | |
| 12 | int g = 0; |
| 13 | void foo(char c) { |
| 14 | if (c == '1') |
| 15 | g++; |
| 16 | else |
| 17 | g--; |
| 18 | } |
| 19 | |
| 20 | extern uint64_t libEntry(char *Buffer, uint64_t MaxSize); |
| 21 | |
| 22 | int main(int argc, const char *argv[]) { |
| 23 | const uint64_t MaxSize = 10000; |
| 24 | static char ALIGNED(sizeof(uint64_t)) Buffer[MaxSize]; |
| 25 | |
| 26 | uint64_t Size = __llvm_profile_get_size_for_buffer(); |
| 27 | if (Size > MaxSize) |
| 28 | return 1; |
| 29 | |
| 30 | __llvm_profile_reset_counters(); |
| 31 | foo(c: '0'); |
| 32 | |
| 33 | if (__llvm_profile_write_buffer(Buffer)) |
| 34 | return 1; |
| 35 | |
| 36 | /* Now check compatibility. Should return 0. */ |
| 37 | if (__llvm_profile_check_compatibility(Buffer, Size)) |
| 38 | return 1; |
| 39 | |
| 40 | /* Clear the buffer. */ |
| 41 | memset(s: Buffer, c: 0, n: MaxSize); |
| 42 | |
| 43 | /* Collect profile from shared library. */ |
| 44 | Size = libEntry(Buffer, MaxSize); |
| 45 | |
| 46 | if (!Size) |
| 47 | return 1; |
| 48 | |
| 49 | /* Shared library's profile should not match main executable's. */ |
| 50 | if (!__llvm_profile_check_compatibility(Buffer, Size)) |
| 51 | return 1; |
| 52 | |
| 53 | return 0; |
| 54 | } |
| 55 | |
| 56 |
