@@ -71,6 +71,7 @@ typedef struct lprofFilename {
7171 * by runtime. */
7272 unsigned OwnsFilenamePat ;
7373 const char * ProfilePathPrefix ;
74+ const char * Filename ;
7475 char PidChars [MAX_PID_SIZE ];
7576 char Hostname [COMPILER_RT_MAX_HOSTLEN ];
7677 unsigned NumPids ;
@@ -88,11 +89,12 @@ typedef struct lprofFilename {
8889 ProfileNameSpecifier PNS ;
8990} lprofFilename ;
9091
91- COMPILER_RT_WEAK lprofFilename lprofCurFilename = {
92- 0 , 0 , 0 , {0 }, {0 }, 0 , 0 , 0 , {0 }, 0 , PNS_unknown };
92+ COMPILER_RT_WEAK lprofFilename lprofCurFilename = {0 , 0 , 0 , 0 , {0 },
93+ {0 }, 0 , 0 , 0 , {0 }, 0 ,
94+ PNS_unknown };
9395
9496static int getCurFilenameLength ();
95- static const char * getCurFilename (char * FilenameBuf );
97+ static const char * getCurFilename (char * FilenameBuf , int ForceUseBuf );
9698static unsigned doMerging () { return lprofCurFilename .MergePoolSize ; }
9799
98100/* Return 1 if there is an error, otherwise return 0. */
@@ -270,7 +272,7 @@ static void truncateCurrentFile(void) {
270272
271273 Length = getCurFilenameLength ();
272274 FilenameBuf = (char * )COMPILER_RT_ALLOCA (Length + 1 );
273- Filename = getCurFilename (FilenameBuf );
275+ Filename = getCurFilename (FilenameBuf , 0 );
274276 if (!Filename )
275277 return ;
276278
@@ -340,9 +342,12 @@ static int parseFilenamePattern(const char *FilenamePat,
340342 int MergingEnabled = 0 ;
341343 char SignalNo ;
342344
343- /* Clean up cached prefix. */
345+ /* Clean up cached prefix and filename . */
344346 if (lprofCurFilename .ProfilePathPrefix )
345347 free ((void * )lprofCurFilename .ProfilePathPrefix );
348+ if (lprofCurFilename .Filename )
349+ free ((void * )lprofCurFilename .Filename );
350+
346351 memset (& lprofCurFilename , 0 , sizeof (lprofCurFilename ));
347352
348353 if (lprofCurFilename .FilenamePat && lprofCurFilename .OwnsFilenamePat ) {
@@ -480,17 +485,25 @@ static int getCurFilenameLength() {
480485/* Return the pointer to the current profile file name (after substituting
481486 * PIDs and Hostnames in filename pattern. \p FilenameBuf is the buffer
482487 * to store the resulting filename. If no substitution is needed, the
483- * current filename pattern string is directly returned. */
484- static const char * getCurFilename (char * FilenameBuf ) {
485- int I , J , PidLength , HostNameLength ;
488+ * current filename pattern string is directly returned, unless ForceUseBuf
489+ * is enabled. */
490+ static const char * getCurFilename (char * FilenameBuf , int ForceUseBuf ) {
491+ int I , J , PidLength , HostNameLength , FilenamePatLength ;
486492 const char * FilenamePat = lprofCurFilename .FilenamePat ;
487493
488494 if (!lprofCurFilename .FilenamePat || !lprofCurFilename .FilenamePat [0 ])
489495 return 0 ;
490496
491497 if (!(lprofCurFilename .NumPids || lprofCurFilename .NumHosts ||
492- lprofCurFilename .MergePoolSize || lprofCurFilename .NumExitSignals ))
493- return lprofCurFilename .FilenamePat ;
498+ lprofCurFilename .MergePoolSize || lprofCurFilename .NumExitSignals )) {
499+ if (!ForceUseBuf )
500+ return lprofCurFilename .FilenamePat ;
501+
502+ FilenamePatLength = strlen (lprofCurFilename .FilenamePat );
503+ memcpy (FilenameBuf , lprofCurFilename .FilenamePat , FilenamePatLength );
504+ FilenameBuf [FilenamePatLength ] = '\0' ;
505+ return FilenameBuf ;
506+ }
494507
495508 PidLength = strlen (lprofCurFilename .PidChars );
496509 HostNameLength = strlen (lprofCurFilename .Hostname );
@@ -547,7 +560,7 @@ const char *__llvm_profile_get_path_prefix(void) {
547560
548561 Length = getCurFilenameLength ();
549562 FilenameBuf = (char * )COMPILER_RT_ALLOCA (Length + 1 );
550- Filename = getCurFilename (FilenameBuf );
563+ Filename = getCurFilename (FilenameBuf , 0 );
551564 if (!Filename )
552565 return "\0" ;
553566
@@ -567,6 +580,29 @@ const char *__llvm_profile_get_path_prefix(void) {
567580 return Prefix ;
568581}
569582
583+ COMPILER_RT_VISIBILITY
584+ const char * __llvm_profile_get_filename (void ) {
585+ int Length ;
586+ char * FilenameBuf ;
587+ const char * Filename ;
588+
589+ if (lprofCurFilename .Filename )
590+ return lprofCurFilename .Filename ;
591+
592+ Length = getCurFilenameLength ();
593+ FilenameBuf = (char * )malloc (Length + 1 );
594+ if (!FilenameBuf ) {
595+ PROF_ERR ("Failed to %s\n" , "allocate memory." );
596+ return "\0" ;
597+ }
598+ Filename = getCurFilename (FilenameBuf , 1 );
599+ if (!Filename )
600+ return "\0" ;
601+
602+ lprofCurFilename .Filename = FilenameBuf ;
603+ return FilenameBuf ;
604+ }
605+
570606/* This method is invoked by the runtime initialization hook
571607 * InstrProfilingRuntime.o if it is linked in. Both user specified
572608 * profile path via -fprofile-instr-generate= and LLVM_PROFILE_FILE
@@ -623,7 +659,7 @@ int __llvm_profile_write_file(void) {
623659
624660 Length = getCurFilenameLength ();
625661 FilenameBuf = (char * )COMPILER_RT_ALLOCA (Length + 1 );
626- Filename = getCurFilename (FilenameBuf );
662+ Filename = getCurFilename (FilenameBuf , 0 );
627663
628664 /* Check the filename. */
629665 if (!Filename ) {
0 commit comments