[compiler-rt] r364231 - (Reland with changes) Adding a function for setting coverage output file.
Vedant Kumar via llvm-commits
llvm-commits at lists.llvm.org
Mon Sep 16 14:00:06 PDT 2019
The counts seem to keep bumping up when the test is re-run:
14| 23|int main(int argc, const char *argv[]) {
15| 23| if (argc < 2)
16| 0| return 1;
17| 23|
18| 23| FILE *F = fopen(argv[1], "r+b");
19| 23| if (!F) {
20| 0| // File might not exist, try opening with truncation
21| 0| F = fopen(argv[1], "w+b");
22| 0| }
23| 23| __llvm_profile_set_file_object(F, 1);
24| 23|
25| 23| return 0;
26| 23|}
vedant
> On Sep 16, 2019, at 1:59 PM, Vedant Kumar <vedant_kumar at apple.com> wrote:
>
>
>
>> On Sep 16, 2019, at 1:57 PM, Sajjad Mirza <sajjadm at google.com <mailto:sajjadm at google.com>> wrote:
>>
>> Hi Vedant,
>>
>> Can you paste the output of llvm-cov? From the RUN at line 8 line, without piping to FileCheck.
>
> Ah, sorry for not including this. Here we go:
>
> ~/src/builds/llvm-project-master-RA (1) $ ./bin/llvm-cov show -instr-profile /Users/vsk/src/builds/llvm-project-master-RA/projects/compiler-rt/test/profile/Profile-x86_64h/Output/instrprof-set-file-object-merging.c.tmp.merging.profdata /Users/vsk/src/builds/llvm-project-master-RA/projects/compiler-rt/test/profile/Profile-x86_64h/Output/instrprof-set-file-object-merging.c.tmp
> 1| |// Test that the specified output merges the profiling data.
> 2| |// Run the program twice so that the counters accumulate.
> 3| |// RUN: %clang -fprofile-instr-generate -fcoverage-mapping -o %t %s
> 4| |// RUN: %run %t %t.merging.profraw
> 5| |// RUN: %run %t %t.merging.profraw
> 6| |// RUN: test -f %t.merging.profraw
> 7| |// RUN: llvm-profdata merge -o %t.merging.profdata %t.merging.profraw
> 8| |// RUN: llvm-cov show -instr-profile %t.merging.profdata %t | FileCheck %s --match-full-lines
> 9| |// RUN: rm %t.merging.profdata %t.merging.profraw
> 10| |#include <stdio.h>
> 11| |
> 12| |extern void __llvm_profile_set_file_object(FILE *, int);
> 13| |
> 14| 21|int main(int argc, const char *argv[]) {
> 15| 21| if (argc < 2)
> 16| 0| return 1;
> 17| 21|
> 18| 21| FILE *F = fopen(argv[1], "r+b");
> 19| 21| if (!F) {
> 20| 0| // File might not exist, try opening with truncation
> 21| 0| F = fopen(argv[1], "w+b");
> 22| 0| }
> 23| 21| __llvm_profile_set_file_object(F, 1);
> 24| 21|
> 25| 21| return 0;
> 26| 21|}
> 27| |// CHECK: 10| |#include <stdio.h>
> 28| |// CHECK: 11| |
> 29| |// CHECK: 12| |extern void __llvm_profile_set_file_object(FILE *, int);
> 30| |// CHECK: 13| |
> 31| |// CHECK: 14| 2|int main(int argc, const char *argv[]) {
> 32| |// CHECK: 15| 2| if (argc < 2)
> 33| |// CHECK: 16| 0| return 1;
> 34| |// CHECK: 17| 2|
> 35| |// CHECK: 18| 2| FILE *F = fopen(argv[1], "r+b");
> 36| |// CHECK: 19| 2| if (!F) {
> 37| |// CHECK: 20| 1| // File might not exist, try opening with truncation
> 38| |// CHECK: 21| 1| F = fopen(argv[1], "w+b");
> 39| |// CHECK: 22| 1| }
> 40| |// CHECK: 23| 2| __llvm_profile_set_file_object(F, 1);
> 41| |// CHECK: 24| 2|
> 42| |// CHECK: 25| 2| return 0;
> 43| |// CHECK: 26| 2|}
>
> vedant
>
>>
>> Sajjad
>>
>> On Mon, Sep 16, 2019 at 12:09 PM Vedant Kumar <vedant_kumar at apple.com <mailto:vedant_kumar at apple.com>> wrote:
>> Hi Sajjad,
>>
>> I've consistently seen one of the tests added here fail on my Mac:
>>
>> Profile-x86_64 :: instrprof-set-file-object-merging.c
>> Profile-x86_64h :: instrprof-set-file-object-merging.c
>>
>> Do you have any ideas as to what might be happening? Here is the output I see:
>>
>> ********************
>> FAIL: Profile-x86_64h :: instrprof-set-file-object-merging.c (208 of 234)
>> ******************** TEST 'Profile-x86_64h :: instrprof-set-file-object-merging.c' FAILED ********************
>> Script:
>> --
>> : 'RUN: at line 3'; /Users/vsk/src/builds/llvm-project-master-RA/./bin/clang -arch x86_64h -stdlib=libc++ -mmacosx-version-min=10.9 -isysroot /Applications/OSEng.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.15.Internal.sdk -fprofile-instr-generate -fcoverage-mapping -o /Users/vsk/src/builds/llvm-project-master-RA/projects/compiler-rt/test/profile/Profile-x86_64h/Output/instrprof-set-file-object-merging.c.tmp /Users/vsk/src/llvm-project-master/compiler-rt/test/profile/instrprof-set-file-object-merging.c
>> : 'RUN: at line 4'; /Users/vsk/src/builds/llvm-project-master-RA/projects/compiler-rt/test/profile/Profile-x86_64h/Output/instrprof-set-file-object-merging.c.tmp /Users/vsk/src/builds/llvm-project-master-RA/projects/compiler-rt/test/profile/Profile-x86_64h/Output/instrprof-set-file-object-merging.c.tmp.merging.profraw
>> : 'RUN: at line 5'; /Users/vsk/src/builds/llvm-project-master-RA/projects/compiler-rt/test/profile/Profile-x86_64h/Output/instrprof-set-file-object-merging.c.tmp /Users/vsk/src/builds/llvm-project-master-RA/projects/compiler-rt/test/profile/Profile-x86_64h/Output/instrprof-set-file-object-merging.c.tmp.merging.profraw
>> : 'RUN: at line 6'; test -f /Users/vsk/src/builds/llvm-project-master-RA/projects/compiler-rt/test/profile/Profile-x86_64h/Output/instrprof-set-file-object-merging.c.tmp.merging.profraw
>> : 'RUN: at line 7'; llvm-profdata merge -o /Users/vsk/src/builds/llvm-project-master-RA/projects/compiler-rt/test/profile/Profile-x86_64h/Output/instrprof-set-file-object-merging.c.tmp.merging.profdata /Users/vsk/src/builds/llvm-project-master-RA/projects/compiler-rt/test/profile/Profile-x86_64h/Output/instrprof-set-file-object-merging.c.tmp.merging.profraw
>> : 'RUN: at line 8'; llvm-cov show -instr-profile /Users/vsk/src/builds/llvm-project-master-RA/projects/compiler-rt/test/profile/Profile-x86_64h/Output/instrprof-set-file-object-merging.c.tmp.merging.profdata /Users/vsk/src/builds/llvm-project-master-RA/projects/compiler-rt/test/profile/Profile-x86_64h/Output/instrprof-set-file-object-merging.c.tmp | FileCheck /Users/vsk/src/llvm-project-master/compiler-rt/test/profile/instrprof-set-file-object-merging.c --match-full-lines
>> : 'RUN: at line 9'; rm /Users/vsk/src/builds/llvm-project-master-RA/projects/compiler-rt/test/profile/Profile-x86_64h/Output/instrprof-set-file-object-merging.c.tmp.merging.profdata /Users/vsk/src/builds/llvm-project-master-RA/projects/compiler-rt/test/profile/Profile-x86_64h/Output/instrprof-set-file-object-merging.c.tmp.merging.profraw
>> --
>> Exit Code: 1
>>
>> Command Output (stderr):
>> --
>> /Users/vsk/src/llvm-project-master/compiler-rt/test/profile/instrprof-set-file-object-merging.c:31:11: error: CHECK: expected string not found in input
>> // CHECK: 14| 2|int main(int argc, const char *argv[]) {
>> ^
>> <stdin>:14:2: note: scanning from here
>> 14| 17|int main(int argc, const char *argv[]) {
>> ^
>> <stdin>:31:15: note: possible intended match here
>> 31| |// CHECK: 14| 2|int main(int argc, const char *argv[]) {
>> ^
>>
>> --
>>
>> thanks,
>> vedant
>>
>> > On Jun 24, 2019, at 2:32 PM, Sajjad Mirza via llvm-commits <llvm-commits at lists.llvm.org <mailto:llvm-commits at lists.llvm.org>> wrote:
>> >
>> > Author: sajjadm
>> > Date: Mon Jun 24 14:32:50 2019
>> > New Revision: 364231
>> >
>> > URL: http://llvm.org/viewvc/llvm-project?rev=364231&view=rev <http://llvm.org/viewvc/llvm-project?rev=364231&view=rev>
>> > Log:
>> > (Reland with changes) Adding a function for setting coverage output file.
>> >
>> > Summary:
>> > User code can open a file on its own and pass it to the runtime, rather than
>> > specifying a name and having the runtime open the file. This supports the use
>> > case where a process cannot open a file on its own but can receive a file
>> > descriptor from another process.
>> >
>> > Relanding https://reviews.llvm.org/D62541 <https://reviews.llvm.org/D62541>. The original revision unlocked
>> > the file before calling flush, this revision fixes that.
>> >
>> > Reviewers: Dor1s, davidxl
>> >
>> > Reviewed By: Dor1s
>> >
>> > Subscribers: #sanitizers, llvm-commits
>> >
>> > Tags: #sanitizers, #llvm
>> >
>> > Differential Revision: https://reviews.llvm.org/D63581 <https://reviews.llvm.org/D63581>
>> >
>> > Added:
>> > compiler-rt/trunk/test/profile/instrprof-set-file-object-merging.c
>> > compiler-rt/trunk/test/profile/instrprof-set-file-object.c
>> > Modified:
>> > compiler-rt/trunk/lib/profile/InstrProfiling.h
>> > compiler-rt/trunk/lib/profile/InstrProfilingFile.c
>> > compiler-rt/trunk/lib/profile/InstrProfilingUtil.c
>> > compiler-rt/trunk/lib/profile/InstrProfilingUtil.h
>> >
>> > Modified: compiler-rt/trunk/lib/profile/InstrProfiling.h
>> > URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/profile/InstrProfiling.h?rev=364231&r1=364230&r2=364231&view=diff <http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/profile/InstrProfiling.h?rev=364231&r1=364230&r2=364231&view=diff>
>> > ==============================================================================
>> > --- compiler-rt/trunk/lib/profile/InstrProfiling.h (original)
>> > +++ compiler-rt/trunk/lib/profile/InstrProfiling.h Mon Jun 24 14:32:50 2019
>> > @@ -10,6 +10,7 @@
>> > #define PROFILE_INSTRPROFILING_H_
>> >
>> > #include "InstrProfilingPort.h"
>> > +#include <stdio.h>
>> >
>> > #define INSTR_PROF_VISIBILITY COMPILER_RT_VISIBILITY
>> > #include "InstrProfData.inc"
>> > @@ -125,7 +126,7 @@ int __llvm_orderfile_write_file(void);
>> > /*!
>> > * \brief this is a wrapper interface to \c __llvm_profile_write_file.
>> > * After this interface is invoked, a arleady dumped flag will be set
>> > - * so that profile won't be dumped again during program exit.
>> > + * so that profile won't be dumped again during program exit.
>> > * Invocation of interface __llvm_profile_reset_counters will clear
>> > * the flag. This interface is designed to be used to collect profile
>> > * data from user selected hot regions. The use model is
>> > @@ -157,6 +158,24 @@ int __llvm_orderfile_dump(void);
>> > */
>> > void __llvm_profile_set_filename(const char *Name);
>> >
>> > +/*!
>> > + * \brief Set the FILE object for writing instrumentation data.
>> > + *
>> > + * Sets the FILE object to be used for subsequent calls to
>> > + * \a __llvm_profile_write_file(). The profile file name set by environment
>> > + * variable, command-line option, or calls to \a __llvm_profile_set_filename
>> > + * will be ignored.
>> > + *
>> > + * \c File will not be closed after a call to \a __llvm_profile_write_file() but
>> > + * it may be flushed. Passing NULL restores default behavior.
>> > + *
>> > + * If \c EnableMerge is nonzero, the runtime will always merge profiling data
>> > + * with the contents of the profiling file. If EnableMerge is zero, the runtime
>> > + * may still merge the data if it would have merged for another reason (for
>> > + * example, because of a %m specifier in the file name).
>> > + */
>> > +void __llvm_profile_set_file_object(FILE *File, int EnableMerge);
>> > +
>> > /*! \brief Register to write instrumentation data to file at exit. */
>> > int __llvm_profile_register_write_file_atexit(void);
>> >
>> >
>> > Modified: compiler-rt/trunk/lib/profile/InstrProfilingFile.c
>> > URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/profile/InstrProfilingFile.c?rev=364231&r1=364230&r2=364231&view=diff <http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/profile/InstrProfilingFile.c?rev=364231&r1=364230&r2=364231&view=diff>
>> > ==============================================================================
>> > --- compiler-rt/trunk/lib/profile/InstrProfilingFile.c (original)
>> > +++ compiler-rt/trunk/lib/profile/InstrProfilingFile.c Mon Jun 24 14:32:50 2019
>> > @@ -37,7 +37,7 @@
>> > /* From where is profile name specified.
>> > * The order the enumerators define their
>> > * precedence. Re-order them may lead to
>> > - * runtime behavior change. */
>> > + * runtime behavior change. */
>> > typedef enum ProfileNameSpecifier {
>> > PNS_unknown = 0,
>> > PNS_default,
>> > @@ -89,9 +89,27 @@ typedef struct lprofFilename {
>> > COMPILER_RT_WEAK lprofFilename lprofCurFilename = {0, 0, 0, 0, {0},
>> > {0}, 0, 0, 0, PNS_unknown};
>> >
>> > +static int ProfileMergeRequested = 0;
>> > +static int isProfileMergeRequested() { return ProfileMergeRequested; }
>> > +static void setProfileMergeRequested(int EnableMerge) {
>> > + ProfileMergeRequested = EnableMerge;
>> > +}
>> > +
>> > +static FILE *ProfileFile = NULL;
>> > +static FILE *getProfileFile() { return ProfileFile; }
>> > +static void setProfileFile(FILE *File) { ProfileFile = File; }
>> > +
>> > +COMPILER_RT_VISIBILITY void __llvm_profile_set_file_object(FILE *File,
>> > + int EnableMerge) {
>> > + setProfileFile(File);
>> > + setProfileMergeRequested(EnableMerge);
>> > +}
>> > +
>> > static int getCurFilenameLength();
>> > static const char *getCurFilename(char *FilenameBuf, int ForceUseBuf);
>> > -static unsigned doMerging() { return lprofCurFilename.MergePoolSize; }
>> > +static unsigned doMerging() {
>> > + return lprofCurFilename.MergePoolSize || isProfileMergeRequested();
>> > +}
>> >
>> > /* Return 1 if there is an error, otherwise return 0. */
>> > static uint32_t fileWriter(ProfDataWriter *This, ProfDataIOVec *IOVecs,
>> > @@ -225,11 +243,16 @@ static void createProfileDir(const char
>> > * its instrumented shared libraries dump profile data into their own data file.
>> > */
>> > static FILE *openFileForMerging(const char *ProfileFileName, int *MergeDone) {
>> > - FILE *ProfileFile;
>> > + FILE *ProfileFile = NULL;
>> > int rc;
>> >
>> > - createProfileDir(ProfileFileName);
>> > - ProfileFile = lprofOpenFileEx(ProfileFileName);
>> > + ProfileFile = getProfileFile();
>> > + if (ProfileFile) {
>> > + lprofLockFileHandle(ProfileFile);
>> > + } else {
>> > + createProfileDir(ProfileFileName);
>> > + ProfileFile = lprofOpenFileEx(ProfileFileName);
>> > + }
>> > if (!ProfileFile)
>> > return NULL;
>> >
>> > @@ -244,6 +267,16 @@ static FILE *openFileForMerging(const ch
>> > return ProfileFile;
>> > }
>> >
>> > +static FILE *getFileObject(const char *OutputName) {
>> > + FILE *File;
>> > + File = getProfileFile();
>> > + if (File != NULL) {
>> > + return File;
>> > + }
>> > +
>> > + return fopen(OutputName, "ab");
>> > +}
>> > +
>> > /* Write profile data to file \c OutputName. */
>> > static int writeFile(const char *OutputName) {
>> > int RetVal;
>> > @@ -251,10 +284,10 @@ static int writeFile(const char *OutputN
>> >
>> > int MergeDone = 0;
>> > VPMergeHook = &lprofMergeValueProfData;
>> > - if (!doMerging())
>> > - OutputFile = fopen(OutputName, "ab");
>> > - else
>> > + if (doMerging())
>> > OutputFile = openFileForMerging(OutputName, &MergeDone);
>> > + else
>> > + OutputFile = getFileObject(OutputName);
>> >
>> > if (!OutputFile)
>> > return -1;
>> > @@ -265,7 +298,15 @@ static int writeFile(const char *OutputN
>> > initFileWriter(&fileWriter, OutputFile);
>> > RetVal = lprofWriteData(&fileWriter, lprofGetVPDataReader(), MergeDone);
>> >
>> > - fclose(OutputFile);
>> > + if (OutputFile == getProfileFile()) {
>> > + fflush(OutputFile);
>> > + if (doMerging()) {
>> > + lprofUnlockFileHandle(OutputFile);
>> > + }
>> > + } else {
>> > + fclose(OutputFile);
>> > + }
>> > +
>> > return RetVal;
>> > }
>> >
>> > @@ -591,7 +632,7 @@ void __llvm_profile_initialize_file(void
>> >
>> > EnvFilenamePat = getFilenamePatFromEnv();
>> > if (EnvFilenamePat) {
>> > - /* Pass CopyFilenamePat = 1, to ensure that the filename would be valid
>> > + /* Pass CopyFilenamePat = 1, to ensure that the filename would be valid
>> > at the moment when __llvm_profile_write_file() gets executed. */
>> > parseAndSetFilename(EnvFilenamePat, PNS_environment, 1);
>> > return;
>> > @@ -627,8 +668,7 @@ int __llvm_profile_write_file(void) {
>> > int PDeathSig = 0;
>> >
>> > if (lprofProfileDumped()) {
>> > - PROF_NOTE("Profile data not written to file: %s.\n",
>> > - "already written");
>> > + PROF_NOTE("Profile data not written to file: %s.\n", "already written");
>> > return 0;
>> > }
>> >
>> >
>> > Modified: compiler-rt/trunk/lib/profile/InstrProfilingUtil.c
>> > URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/profile/InstrProfilingUtil.c?rev=364231&r1=364230&r2=364231&view=diff <http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/profile/InstrProfilingUtil.c?rev=364231&r1=364230&r2=364231&view=diff>
>> > ==============================================================================
>> > --- compiler-rt/trunk/lib/profile/InstrProfilingUtil.c (original)
>> > +++ compiler-rt/trunk/lib/profile/InstrProfilingUtil.c Mon Jun 24 14:32:50 2019
>> > @@ -154,6 +154,26 @@ COMPILER_RT_VISIBILITY int lprofUnlockFd
>> > #endif
>> > }
>> >
>> > +COMPILER_RT_VISIBILITY int lprofLockFileHandle(FILE *F) {
>> > + int fd;
>> > +#if defined(_WIN32)
>> > + fd = _fileno(F);
>> > +#else
>> > + fd = fileno(F);
>> > +#endif
>> > + return lprofLockFd(fd);
>> > +}
>> > +
>> > +COMPILER_RT_VISIBILITY int lprofUnlockFileHandle(FILE *F) {
>> > + int fd;
>> > +#if defined(_WIN32)
>> > + fd = _fileno(F);
>> > +#else
>> > + fd = fileno(F);
>> > +#endif
>> > + return lprofUnlockFd(fd);
>> > +}
>> > +
>> > COMPILER_RT_VISIBILITY FILE *lprofOpenFileEx(const char *ProfileName) {
>> > FILE *f;
>> > int fd;
>> >
>> > Modified: compiler-rt/trunk/lib/profile/InstrProfilingUtil.h
>> > URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/profile/InstrProfilingUtil.h?rev=364231&r1=364230&r2=364231&view=diff <http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/profile/InstrProfilingUtil.h?rev=364231&r1=364230&r2=364231&view=diff>
>> > ==============================================================================
>> > --- compiler-rt/trunk/lib/profile/InstrProfilingUtil.h (original)
>> > +++ compiler-rt/trunk/lib/profile/InstrProfilingUtil.h Mon Jun 24 14:32:50 2019
>> > @@ -23,6 +23,8 @@ unsigned __llvm_profile_get_dir_mode(voi
>> >
>> > int lprofLockFd(int fd);
>> > int lprofUnlockFd(int fd);
>> > +int lprofLockFileHandle(FILE *F);
>> > +int lprofUnlockFileHandle(FILE *F);
>> >
>> > /*! Open file \c Filename for read+write with write
>> > * lock for exclusive access. The caller will block
>> >
>> > Added: compiler-rt/trunk/test/profile/instrprof-set-file-object-merging.c
>> > URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/profile/instrprof-set-file-object-merging.c?rev=364231&view=auto <http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/profile/instrprof-set-file-object-merging.c?rev=364231&view=auto>
>> > ==============================================================================
>> > --- compiler-rt/trunk/test/profile/instrprof-set-file-object-merging.c (added)
>> > +++ compiler-rt/trunk/test/profile/instrprof-set-file-object-merging.c Mon Jun 24 14:32:50 2019
>> > @@ -0,0 +1,43 @@
>> > +// Test that the specified output merges the profiling data.
>> > +// Run the program twice so that the counters accumulate.
>> > +// RUN: %clang -fprofile-instr-generate -fcoverage-mapping -o %t %s
>> > +// RUN: %run %t %t.merging.profraw
>> > +// RUN: %run %t %t.merging.profraw
>> > +// RUN: test -f %t.merging.profraw
>> > +// RUN: llvm-profdata merge -o %t.merging.profdata %t.merging.profraw
>> > +// RUN: llvm-cov show -instr-profile %t.merging.profdata %t | FileCheck %s --match-full-lines
>> > +// RUN: rm %t.merging.profdata %t.merging.profraw
>> > +#include <stdio.h>
>> > +
>> > +extern void __llvm_profile_set_file_object(FILE *, int);
>> > +
>> > +int main(int argc, const char *argv[]) {
>> > + if (argc < 2)
>> > + return 1;
>> > +
>> > + FILE *F = fopen(argv[1], "r+b");
>> > + if (!F) {
>> > + // File might not exist, try opening with truncation
>> > + F = fopen(argv[1], "w+b");
>> > + }
>> > + __llvm_profile_set_file_object(F, 1);
>> > +
>> > + return 0;
>> > +}
>> > +// CHECK: 10| |#include <stdio.h>
>> > +// CHECK: 11| |
>> > +// CHECK: 12| |extern void __llvm_profile_set_file_object(FILE *, int);
>> > +// CHECK: 13| |
>> > +// CHECK: 14| 2|int main(int argc, const char *argv[]) {
>> > +// CHECK: 15| 2| if (argc < 2)
>> > +// CHECK: 16| 0| return 1;
>> > +// CHECK: 17| 2|
>> > +// CHECK: 18| 2| FILE *F = fopen(argv[1], "r+b");
>> > +// CHECK: 19| 2| if (!F) {
>> > +// CHECK: 20| 1| // File might not exist, try opening with truncation
>> > +// CHECK: 21| 1| F = fopen(argv[1], "w+b");
>> > +// CHECK: 22| 1| }
>> > +// CHECK: 23| 2| __llvm_profile_set_file_object(F, 1);
>> > +// CHECK: 24| 2|
>> > +// CHECK: 25| 2| return 0;
>> > +// CHECK: 26| 2|}
>> >
>> > Added: compiler-rt/trunk/test/profile/instrprof-set-file-object.c
>> > URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/profile/instrprof-set-file-object.c?rev=364231&view=auto <http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/profile/instrprof-set-file-object.c?rev=364231&view=auto>
>> > ==============================================================================
>> > --- compiler-rt/trunk/test/profile/instrprof-set-file-object.c (added)
>> > +++ compiler-rt/trunk/test/profile/instrprof-set-file-object.c Mon Jun 24 14:32:50 2019
>> > @@ -0,0 +1,31 @@
>> > +// Test that the specified output has profiling data.
>> > +// RUN: %clang -fprofile-instr-generate -fcoverage-mapping -o %t %s
>> > +// RUN: %run %t %t.file.profraw
>> > +// RUN: test -f %t.file.profraw
>> > +// RUN: llvm-profdata merge -o %t.file.profdata %t.file.profraw
>> > +// RUN: llvm-cov show -instr-profile %t.file.profdata %t | FileCheck %s --match-full-lines
>> > +// RUN: rm %t.file.profraw %t.file.profdata
>> > +#include <stdio.h>
>> > +
>> > +extern void __llvm_profile_set_file_object(FILE *, int);
>> > +
>> > +int main(int argc, const char *argv[]) {
>> > + if (argc < 2)
>> > + return 1;
>> > +
>> > + FILE *F = fopen(argv[1], "w+b");
>> > + __llvm_profile_set_file_object(F, 0);
>> > + return 0;
>> > +}
>> > +// CHECK: 8| |#include <stdio.h>
>> > +// CHECK: 9| |
>> > +// CHECK: 10| |extern void __llvm_profile_set_file_object(FILE *, int);
>> > +// CHECK: 11| |
>> > +// CHECK: 12| 1|int main(int argc, const char *argv[]) {
>> > +// CHECK: 13| 1| if (argc < 2)
>> > +// CHECK: 14| 0| return 1;
>> > +// CHECK: 15| 1|
>> > +// CHECK: 16| 1| FILE *F = fopen(argv[1], "w+b");
>> > +// CHECK: 17| 1| __llvm_profile_set_file_object(F, 0);
>> > +// CHECK: 18| 1| return 0;
>> > +// CHECK: 19| 1|}
>> >
>> >
>> > _______________________________________________
>> > llvm-commits mailing list
>> > llvm-commits at lists.llvm.org <mailto:llvm-commits at lists.llvm.org>
>> > https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits <https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20190916/642370d9/attachment.html>
More information about the llvm-commits
mailing list