131f251f1SXinliang David Li #include <stdint.h> 231f251f1SXinliang David Li #include <stdlib.h> 331f251f1SXinliang David Li #include <string.h> 4*9512c0a1SRainer Orth #include "../profile_test.h" 531f251f1SXinliang David Li 631f251f1SXinliang David Li int __llvm_profile_runtime = 0; 731f251f1SXinliang David Li uint64_t __llvm_profile_get_size_for_buffer(void); 831f251f1SXinliang David Li int __llvm_profile_write_buffer(char *); 931f251f1SXinliang David Li void __llvm_profile_reset_counters(void); 1031f251f1SXinliang David Li int __llvm_profile_check_compatibility(const char *, uint64_t); 1131f251f1SXinliang David Li 1231f251f1SXinliang David Li int g = 0; foo(char c)1331f251f1SXinliang David Livoid foo(char c) { 1431f251f1SXinliang David Li if (c == '1') 1531f251f1SXinliang David Li g++; 1631f251f1SXinliang David Li else 1731f251f1SXinliang David Li g--; 1831f251f1SXinliang David Li } 1931f251f1SXinliang David Li 2031f251f1SXinliang David Li extern uint64_t libEntry(char *Buffer, uint64_t MaxSize); 2131f251f1SXinliang David Li main(int argc,const char * argv[])2231f251f1SXinliang David Liint main(int argc, const char *argv[]) { 2331f251f1SXinliang David Li const uint64_t MaxSize = 10000; 24*9512c0a1SRainer Orth static char ALIGNED(sizeof(uint64_t)) Buffer[MaxSize]; 2531f251f1SXinliang David Li 2631f251f1SXinliang David Li uint64_t Size = __llvm_profile_get_size_for_buffer(); 2731f251f1SXinliang David Li if (Size > MaxSize) 2831f251f1SXinliang David Li return 1; 2931f251f1SXinliang David Li 3031f251f1SXinliang David Li __llvm_profile_reset_counters(); 3131f251f1SXinliang David Li foo('0'); 3231f251f1SXinliang David Li 3331f251f1SXinliang David Li if (__llvm_profile_write_buffer(Buffer)) 3431f251f1SXinliang David Li return 1; 3531f251f1SXinliang David Li 3631f251f1SXinliang David Li /* Now check compatibility. Should return 0. */ 3731f251f1SXinliang David Li if (__llvm_profile_check_compatibility(Buffer, Size)) 3831f251f1SXinliang David Li return 1; 3931f251f1SXinliang David Li 4031f251f1SXinliang David Li /* Clear the buffer. */ 4131f251f1SXinliang David Li memset(Buffer, 0, MaxSize); 4231f251f1SXinliang David Li 4331f251f1SXinliang David Li /* Collect profile from shared library. */ 4431f251f1SXinliang David Li Size = libEntry(Buffer, MaxSize); 4531f251f1SXinliang David Li 4631f251f1SXinliang David Li if (!Size) 4731f251f1SXinliang David Li return 1; 4831f251f1SXinliang David Li 4931f251f1SXinliang David Li /* Shared library's profile should not match main executable's. */ 5031f251f1SXinliang David Li if (!__llvm_profile_check_compatibility(Buffer, Size)) 5131f251f1SXinliang David Li return 1; 5231f251f1SXinliang David Li 5331f251f1SXinliang David Li return 0; 5431f251f1SXinliang David Li } 5531f251f1SXinliang David Li 56