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