@@ -72,6 +72,7 @@ typedef struct lprofFilename {
7272 unsigned OwnsFilenamePat ;
7373 const char * ProfilePathPrefix ;
7474 char PidChars [MAX_PID_SIZE ];
75+ char * TmpDir ;
7576 char Hostname [COMPILER_RT_MAX_HOSTLEN ];
7677 unsigned NumPids ;
7778 unsigned NumHosts ;
@@ -86,8 +87,8 @@ typedef struct lprofFilename {
8687 ProfileNameSpecifier PNS ;
8788} lprofFilename ;
8889
89- static lprofFilename lprofCurFilename = {0 , 0 , 0 , {0 }, { 0 } ,
90- 0 , 0 , 0 , PNS_unknown };
90+ static lprofFilename lprofCurFilename = {0 , 0 , 0 , {0 }, NULL ,
91+ { 0 } , 0 , 0 , 0 , PNS_unknown };
9192
9293static int ProfileMergeRequested = 0 ;
9394static int isProfileMergeRequested () { return ProfileMergeRequested ; }
@@ -744,6 +745,14 @@ static int parseFilenamePattern(const char *FilenamePat,
744745 FilenamePat );
745746 return -1 ;
746747 }
748+ } else if (FilenamePat [I ] == 't' ) {
749+ lprofCurFilename .TmpDir = getenv ("TMPDIR" );
750+ if (!lprofCurFilename .TmpDir ) {
751+ PROF_WARN ("Unable to get the TMPDIR environment variable, referenced "
752+ "in %s. Using the default path." ,
753+ FilenamePat );
754+ return -1 ;
755+ }
747756 } else if (FilenamePat [I ] == 'c' ) {
748757 if (__llvm_profile_is_continuous_mode_enabled ()) {
749758 PROF_WARN ("%%c specifier can only be specified once in %s.\n" ,
@@ -827,12 +836,13 @@ static int getCurFilenameLength() {
827836 return 0 ;
828837
829838 if (!(lprofCurFilename .NumPids || lprofCurFilename .NumHosts ||
830- lprofCurFilename .MergePoolSize ))
839+ lprofCurFilename .TmpDir || lprofCurFilename . MergePoolSize ))
831840 return strlen (lprofCurFilename .FilenamePat );
832841
833842 Len = strlen (lprofCurFilename .FilenamePat ) +
834843 lprofCurFilename .NumPids * (strlen (lprofCurFilename .PidChars ) - 2 ) +
835- lprofCurFilename .NumHosts * (strlen (lprofCurFilename .Hostname ) - 2 );
844+ lprofCurFilename .NumHosts * (strlen (lprofCurFilename .Hostname ) - 2 ) +
845+ (lprofCurFilename .TmpDir ? (strlen (lprofCurFilename .TmpDir ) - 1 ) : 0 );
836846 if (lprofCurFilename .MergePoolSize )
837847 Len += SIGLEN ;
838848 return Len ;
@@ -844,14 +854,14 @@ static int getCurFilenameLength() {
844854 * current filename pattern string is directly returned, unless ForceUseBuf
845855 * is enabled. */
846856static const char * getCurFilename (char * FilenameBuf , int ForceUseBuf ) {
847- int I , J , PidLength , HostNameLength , FilenamePatLength ;
857+ int I , J , PidLength , HostNameLength , TmpDirLength , FilenamePatLength ;
848858 const char * FilenamePat = lprofCurFilename .FilenamePat ;
849859
850860 if (!lprofCurFilename .FilenamePat || !lprofCurFilename .FilenamePat [0 ])
851861 return 0 ;
852862
853863 if (!(lprofCurFilename .NumPids || lprofCurFilename .NumHosts ||
854- lprofCurFilename .MergePoolSize ||
864+ lprofCurFilename .TmpDir || lprofCurFilename . MergePoolSize ||
855865 __llvm_profile_is_continuous_mode_enabled ())) {
856866 if (!ForceUseBuf )
857867 return lprofCurFilename .FilenamePat ;
@@ -864,6 +874,7 @@ static const char *getCurFilename(char *FilenameBuf, int ForceUseBuf) {
864874
865875 PidLength = strlen (lprofCurFilename .PidChars );
866876 HostNameLength = strlen (lprofCurFilename .Hostname );
877+ TmpDirLength = lprofCurFilename .TmpDir ? strlen (lprofCurFilename .TmpDir ) : 0 ;
867878 /* Construct the new filename. */
868879 for (I = 0 , J = 0 ; FilenamePat [I ]; ++ I )
869880 if (FilenamePat [I ] == '%' ) {
@@ -873,6 +884,10 @@ static const char *getCurFilename(char *FilenameBuf, int ForceUseBuf) {
873884 } else if (FilenamePat [I ] == 'h' ) {
874885 memcpy (FilenameBuf + J , lprofCurFilename .Hostname , HostNameLength );
875886 J += HostNameLength ;
887+ } else if (FilenamePat [I ] == 't' ) {
888+ memcpy (FilenameBuf + J , lprofCurFilename .TmpDir , TmpDirLength );
889+ FilenameBuf [J + TmpDirLength ] = DIR_SEPARATOR ;
890+ J += TmpDirLength + 1 ;
876891 } else {
877892 if (!getMergePoolSize (FilenamePat , & I ))
878893 continue ;
0 commit comments