xref: /llvm-project/compiler-rt/test/profile/Inputs/instrprof-merge-match.c (revision 9512c0a1d1966b7c9328ed1460a1787c4a45cbb6)
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 Li void 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 Li int 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