@@ -72,6 +72,7 @@ typedef struct lprofFilename {
72
72
unsigned OwnsFilenamePat ;
73
73
const char * ProfilePathPrefix ;
74
74
char PidChars [MAX_PID_SIZE ];
75
+ char * TmpDir ;
75
76
char Hostname [COMPILER_RT_MAX_HOSTLEN ];
76
77
unsigned NumPids ;
77
78
unsigned NumHosts ;
@@ -86,8 +87,8 @@ typedef struct lprofFilename {
86
87
ProfileNameSpecifier PNS ;
87
88
} lprofFilename ;
88
89
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 };
91
92
92
93
static int ProfileMergeRequested = 0 ;
93
94
static int isProfileMergeRequested () { return ProfileMergeRequested ; }
@@ -744,6 +745,14 @@ static int parseFilenamePattern(const char *FilenamePat,
744
745
FilenamePat );
745
746
return -1 ;
746
747
}
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
+ }
747
756
} else if (FilenamePat [I ] == 'c' ) {
748
757
if (__llvm_profile_is_continuous_mode_enabled ()) {
749
758
PROF_WARN ("%%c specifier can only be specified once in %s.\n" ,
@@ -827,12 +836,13 @@ static int getCurFilenameLength() {
827
836
return 0 ;
828
837
829
838
if (!(lprofCurFilename .NumPids || lprofCurFilename .NumHosts ||
830
- lprofCurFilename .MergePoolSize ))
839
+ lprofCurFilename .TmpDir || lprofCurFilename . MergePoolSize ))
831
840
return strlen (lprofCurFilename .FilenamePat );
832
841
833
842
Len = strlen (lprofCurFilename .FilenamePat ) +
834
843
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 );
836
846
if (lprofCurFilename .MergePoolSize )
837
847
Len += SIGLEN ;
838
848
return Len ;
@@ -844,14 +854,14 @@ static int getCurFilenameLength() {
844
854
* current filename pattern string is directly returned, unless ForceUseBuf
845
855
* is enabled. */
846
856
static const char * getCurFilename (char * FilenameBuf , int ForceUseBuf ) {
847
- int I , J , PidLength , HostNameLength , FilenamePatLength ;
857
+ int I , J , PidLength , HostNameLength , TmpDirLength , FilenamePatLength ;
848
858
const char * FilenamePat = lprofCurFilename .FilenamePat ;
849
859
850
860
if (!lprofCurFilename .FilenamePat || !lprofCurFilename .FilenamePat [0 ])
851
861
return 0 ;
852
862
853
863
if (!(lprofCurFilename .NumPids || lprofCurFilename .NumHosts ||
854
- lprofCurFilename .MergePoolSize ||
864
+ lprofCurFilename .TmpDir || lprofCurFilename . MergePoolSize ||
855
865
__llvm_profile_is_continuous_mode_enabled ())) {
856
866
if (!ForceUseBuf )
857
867
return lprofCurFilename .FilenamePat ;
@@ -864,6 +874,7 @@ static const char *getCurFilename(char *FilenameBuf, int ForceUseBuf) {
864
874
865
875
PidLength = strlen (lprofCurFilename .PidChars );
866
876
HostNameLength = strlen (lprofCurFilename .Hostname );
877
+ TmpDirLength = lprofCurFilename .TmpDir ? strlen (lprofCurFilename .TmpDir ) : 0 ;
867
878
/* Construct the new filename. */
868
879
for (I = 0 , J = 0 ; FilenamePat [I ]; ++ I )
869
880
if (FilenamePat [I ] == '%' ) {
@@ -873,6 +884,10 @@ static const char *getCurFilename(char *FilenameBuf, int ForceUseBuf) {
873
884
} else if (FilenamePat [I ] == 'h' ) {
874
885
memcpy (FilenameBuf + J , lprofCurFilename .Hostname , HostNameLength );
875
886
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 ;
876
891
} else {
877
892
if (!getMergePoolSize (FilenamePat , & I ))
878
893
continue ;
0 commit comments