// RUN: %clang_profgen -O3 -o %t %s // RUN: %run %t %t.out.1 %t.out.2 %t.out.3 %t.out.4 // RUN: cat %t.out.1 | FileCheck %s // RUN: diff %t.out.1 %t.out.2 // RUN: diff %t.out.2 %t.out.3 // RUN: diff %t.out.3 %t.out.4 #include #include #include #include typedef struct ProfBufferIO ProfBufferIO; ProfBufferIO *lprofCreateBufferIOInternal(void *File, uint32_t BufferSz); void lprofDeleteBufferIO(ProfBufferIO *BufferIO); int lprofBufferIOWrite(ProfBufferIO *BufferIO, const char *Data, uint32_t Size); int lprofBufferIOFlush(ProfBufferIO *BufferIO); int __llvm_profile_runtime = 0; const char *SmallData = "ABC\n"; const char *MediumData = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\n"; char LargeData[10 * 1024]; int main(int argc, const char *argv[]) { ProfBufferIO *BufferIO; FILE *File[4]; uint32_t IOBufferSize[4] = {8, 128, 8 * 1024, 11 * 1024}; int I, J; if (argc < 5) return 1; for (I = 0; I < 10 * 1024 - 2; I++) LargeData[I] = 'A'; LargeData[I++] = '\n'; LargeData[I++] = '\0'; for (J = 0; J < 4; J++) { File[J] = fopen(argv[1 + J], "w"); if (!File[J]) return 1; BufferIO = lprofCreateBufferIOInternal(File[J], IOBufferSize[J]); lprofBufferIOWrite(BufferIO, "Short Strings:\n", strlen("Short Strings:\n")); for (I = 0; I < 1024; I++) { lprofBufferIOWrite(BufferIO, SmallData, strlen(SmallData)); } lprofBufferIOWrite(BufferIO, "Long Strings:\n", strlen("Long Strings:\n")); for (I = 0; I < 1024; I++) { lprofBufferIOWrite(BufferIO, MediumData, strlen(MediumData)); } lprofBufferIOWrite(BufferIO, "Extra Long Strings:\n", strlen("Extra Long Strings:\n")); for (I = 0; I < 10; I++) { lprofBufferIOWrite(BufferIO, LargeData, strlen(LargeData)); } lprofBufferIOWrite(BufferIO, "Mixed Strings:\n", strlen("Mixed Strings:\n")); for (I = 0; I < 1024; I++) { lprofBufferIOWrite(BufferIO, MediumData, strlen(MediumData)); lprofBufferIOWrite(BufferIO, SmallData, strlen(SmallData)); } lprofBufferIOWrite(BufferIO, "Endings:\n", strlen("Endings:\n")); lprofBufferIOWrite(BufferIO, "END\n", strlen("END\n")); lprofBufferIOWrite(BufferIO, "ENDEND\n", strlen("ENDEND\n")); lprofBufferIOWrite(BufferIO, "ENDENDEND\n", strlen("ENDENDEND\n")); lprofBufferIOWrite(BufferIO, "ENDENDENDEND\n", strlen("ENDENDENDEND\n")); lprofBufferIOFlush(BufferIO); lprofDeleteBufferIO(BufferIO); fclose(File[J]); } return 0; } // CHECK-LABEL: Short Strings: // CHECK: ABC // CHECK-NEXT: ABC // CHECK-NEXT: ABC // CHECK-NEXT: ABC // CHECK-NEXT: ABC // CHECK-NEXT: ABC // CHECK-NEXT: ABC // CHECK-NEXT: ABC // CHECK-NEXT: ABC // CHECK-NEXT: ABC // CHECK-NEXT: ABC // CHECK-NEXT: ABC // CHECK-NEXT: ABC // CHECK-NEXT: ABC // CHECK-LABEL: Long Strings: // CHECK-NEXT: ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 // CHECK-NEXT: ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 // CHECK-NEXT: ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 // CHECK-NEXT: ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 // CHECK-NEXT: ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 // CHECK-NEXT: ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 // CHECK-NEXT: ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 // CHECK-NEXT: ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 // CHECK-NEXT: ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 // CHECK-NEXT: ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 // CHECK-NEXT: ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 // CHECK-NEXT: ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 // CHECK-LABEL: Mixed Strings: // CHECK: ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 // CHECK-NEXT: ABC // CHECK-NEXT: ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 // CHECK-NEXT: ABC // CHECK-NEXT: ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 // CHECK-NEXT: ABC // CHECK-NEXT: ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 // CHECK-NEXT: ABC // CHECK-NEXT: ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 // CHECK-NEXT: ABC // CHECK-NEXT: ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 // CHECK-NEXT: ABC // CHECK-NEXT: ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 // CHECK-NEXT: ABC // CHECK-NEXT: ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 // CHECK-NEXT: ABC // CHECK-LABEL: Endings: // CHECK: END // CHECK-NEXT: ENDEND // CHECK-NEXT: ENDENDEND // CHECK-NEXT: ENDENDENDEND