[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 15:30:51 PDT 2019


Sounds like it. Removing the raw profile before running the test binary fixes the issue for me.

I've gone ahead and tried to fix this in r372041, please let me know if there are any issues.

thanks,
vedant

> On Sep 16, 2019, at 2:38 PM, Sajjad Mirza via llvm-commits <llvm-commits at lists.llvm.org> wrote:
> 
> Maybe the .profraw isn't being cleaned up and so the counts are accumulating in it?
> 
> On Mon, Sep 16, 2019, 14:00 Vedant Kumar <vedant_kumar at apple.com <mailto:vedant_kumar at apple.com>> wrote:
> 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 <mailto: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>
>>> 
>> 
> 
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> 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/5e909278/attachment-0001.html>


More information about the llvm-commits mailing list