| // 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 <stdint.h> | |
| #include <stdio.h> | |
| #include <stdlib.h> | |
| #include <string.h> | |
| 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 |