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