1 // RUN: %clang_profgen -O3 -o %t %s 2 // RUN: %run %t %t.out.1 %t.out.2 %t.out.3 %t.out.4 3 // RUN: cat %t.out.1 | FileCheck %s 4 // RUN: diff %t.out.1 %t.out.2 5 // RUN: diff %t.out.2 %t.out.3 6 // RUN: diff %t.out.3 %t.out.4 7 8 #include <stdint.h> 9 #include <stdio.h> 10 #include <stdlib.h> 11 #include <string.h> 12 13 typedef struct ProfBufferIO ProfBufferIO; 14 ProfBufferIO *llvmCreateBufferIOInternal(FILE *File, uint32_t DefaultBufferSz); 15 void llvmDeleteBufferIO(ProfBufferIO *BufferIO); 16 17 int llvmBufferIOWrite(ProfBufferIO *BufferIO, const char *Data, uint32_t Size); 18 int llvmBufferIOFlush(ProfBufferIO *BufferIO); 19 20 int __llvm_profile_runtime = 0; 21 22 const char *SmallData = "ABC\n"; 23 const char *MediumData = 24 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\n"; 25 char LargeData[10 * 1024]; 26 int main(int argc, const char *argv[]) { 27 ProfBufferIO *BufferIO; 28 FILE *File[4]; 29 uint32_t IOBufferSize[4] = {8, 128, 8 * 1024, 11 * 1024}; 30 int I, J; 31 if (argc < 5) 32 return 1; 33 34 for (I = 0; I < 10 * 1024 - 2; I++) 35 LargeData[I] = 'A'; 36 37 LargeData[I++] = '\n'; 38 LargeData[I++] = '\0'; 39 40 for (J = 0; J < 4; J++) { 41 File[J] = fopen(argv[1 + J], "w"); 42 if (!File[J]) 43 return 1; 44 45 BufferIO = llvmCreateBufferIOInternal(File[J], IOBufferSize[J]); 46 47 llvmBufferIOWrite(BufferIO, "Short Strings:\n", strlen("Short Strings:\n")); 48 for (I = 0; I < 1024; I++) { 49 llvmBufferIOWrite(BufferIO, SmallData, strlen(SmallData)); 50 } 51 llvmBufferIOWrite(BufferIO, "Long Strings:\n", strlen("Long Strings:\n")); 52 for (I = 0; I < 1024; I++) { 53 llvmBufferIOWrite(BufferIO, MediumData, strlen(MediumData)); 54 } 55 llvmBufferIOWrite(BufferIO, "Extra Long Strings:\n", 56 strlen("Extra Long Strings:\n")); 57 for (I = 0; I < 10; I++) { 58 llvmBufferIOWrite(BufferIO, LargeData, strlen(LargeData)); 59 } 60 llvmBufferIOWrite(BufferIO, "Mixed Strings:\n", strlen("Mixed Strings:\n")); 61 for (I = 0; I < 1024; I++) { 62 llvmBufferIOWrite(BufferIO, MediumData, strlen(MediumData)); 63 llvmBufferIOWrite(BufferIO, SmallData, strlen(SmallData)); 64 } 65 llvmBufferIOWrite(BufferIO, "Endings:\n", strlen("Endings:\n")); 66 llvmBufferIOWrite(BufferIO, "END\n", strlen("END\n")); 67 llvmBufferIOWrite(BufferIO, "ENDEND\n", strlen("ENDEND\n")); 68 llvmBufferIOWrite(BufferIO, "ENDENDEND\n", strlen("ENDENDEND\n")); 69 llvmBufferIOWrite(BufferIO, "ENDENDENDEND\n", strlen("ENDENDENDEND\n")); 70 llvmBufferIOFlush(BufferIO); 71 72 llvmDeleteBufferIO(BufferIO); 73 74 fclose(File[J]); 75 } 76 return 0; 77 } 78 79 // CHECK-LABEL: Short Strings: 80 // CHECK: ABC 81 // CHECK-NEXT: ABC 82 // CHECK-NEXT: ABC 83 // CHECK-NEXT: ABC 84 // CHECK-NEXT: ABC 85 // CHECK-NEXT: ABC 86 // CHECK-NEXT: ABC 87 // CHECK-NEXT: ABC 88 // CHECK-NEXT: ABC 89 // CHECK-NEXT: ABC 90 // CHECK-NEXT: ABC 91 // CHECK-NEXT: ABC 92 // CHECK-NEXT: ABC 93 // CHECK-NEXT: ABC 94 // CHECK-LABEL: Long Strings: 95 // CHECK-NEXT: ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 96 // CHECK-NEXT: ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 97 // CHECK-NEXT: ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 98 // CHECK-NEXT: ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 99 // CHECK-NEXT: ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 100 // CHECK-NEXT: ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 101 // CHECK-NEXT: ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 102 // CHECK-NEXT: ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 103 // CHECK-NEXT: ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 104 // CHECK-NEXT: ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 105 // CHECK-NEXT: ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 106 // CHECK-NEXT: ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 107 // CHECK-LABEL: Mixed Strings: 108 // CHECK: ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 109 // CHECK-NEXT: ABC 110 // CHECK-NEXT: ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 111 // CHECK-NEXT: ABC 112 // CHECK-NEXT: ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 113 // CHECK-NEXT: ABC 114 // CHECK-NEXT: ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 115 // CHECK-NEXT: ABC 116 // CHECK-NEXT: ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 117 // CHECK-NEXT: ABC 118 // CHECK-NEXT: ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 119 // CHECK-NEXT: ABC 120 // CHECK-NEXT: ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 121 // CHECK-NEXT: ABC 122 // CHECK-NEXT: ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 123 // CHECK-NEXT: ABC 124 // CHECK-LABEL: Endings: 125 // CHECK: END 126 // CHECK-NEXT: ENDEND 127 // CHECK-NEXT: ENDENDEND 128 // CHECK-NEXT: ENDENDENDEND 129