@@ -74,6 +74,7 @@ typedef struct lprofFilename {
74
74
unsigned OwnsFilenamePat ;
75
75
const char * ProfilePathPrefix ;
76
76
char PidChars [MAX_PID_SIZE ];
77
+ char * TmpDir ;
77
78
char Hostname [COMPILER_RT_MAX_HOSTLEN ];
78
79
unsigned NumPids ;
79
80
unsigned NumHosts ;
@@ -90,8 +91,8 @@ typedef struct lprofFilename {
90
91
ProfileNameSpecifier PNS ;
91
92
} lprofFilename ;
92
93
93
- static lprofFilename lprofCurFilename = {0 , 0 , 0 , {0 }, { 0 }, 0 ,
94
- 0 , 0 , {0 }, 0 , PNS_unknown };
94
+ static lprofFilename lprofCurFilename = {0 , 0 , 0 , {0 }, NULL , { 0 } ,
95
+ 0 , 0 , 0 , {0 }, 0 , PNS_unknown };
95
96
96
97
static int ProfileMergeRequested = 0 ;
97
98
static int isProfileMergeRequested () { return ProfileMergeRequested ; }
@@ -773,6 +774,14 @@ static int parseFilenamePattern(const char *FilenamePat,
773
774
FilenamePat );
774
775
return -1 ;
775
776
}
777
+ } else if (FilenamePat [I ] == 't' ) {
778
+ lprofCurFilename .TmpDir = getenv ("TMPDIR" );
779
+ if (!lprofCurFilename .TmpDir ) {
780
+ PROF_WARN ("Unable to get the TMPDIR environment variable, referenced "
781
+ "in %s. Using the default path." ,
782
+ FilenamePat );
783
+ return -1 ;
784
+ }
776
785
} else if (FilenamePat [I ] == 'c' ) {
777
786
if (__llvm_profile_is_continuous_mode_enabled ()) {
778
787
PROF_WARN ("%%c specifier can only be specified once in %s.\n" ,
@@ -874,12 +883,14 @@ static int getCurFilenameLength() {
874
883
return 0 ;
875
884
876
885
if (!(lprofCurFilename .NumPids || lprofCurFilename .NumHosts ||
877
- lprofCurFilename .MergePoolSize || lprofCurFilename .NumExitSignals ))
886
+ lprofCurFilename .TmpDir || lprofCurFilename .MergePoolSize ||
887
+ lprofCurFilename .NumExitSignals ))
878
888
return strlen (lprofCurFilename .FilenamePat );
879
889
880
890
Len = strlen (lprofCurFilename .FilenamePat ) +
881
891
lprofCurFilename .NumPids * (strlen (lprofCurFilename .PidChars ) - 2 ) +
882
- lprofCurFilename .NumHosts * (strlen (lprofCurFilename .Hostname ) - 2 );
892
+ lprofCurFilename .NumHosts * (strlen (lprofCurFilename .Hostname ) - 2 ) +
893
+ (lprofCurFilename .TmpDir ? (strlen (lprofCurFilename .TmpDir ) - 1 ) : 0 );
883
894
if (lprofCurFilename .MergePoolSize )
884
895
Len += SIGLEN ;
885
896
for (I = 0 ; I < lprofCurFilename .NumExitSignals ; ++ I ) {
@@ -896,14 +907,14 @@ static int getCurFilenameLength() {
896
907
* current filename pattern string is directly returned, unless ForceUseBuf
897
908
* is enabled. */
898
909
static const char * getCurFilename (char * FilenameBuf , int ForceUseBuf ) {
899
- int I , J , PidLength , HostNameLength , FilenamePatLength ;
910
+ int I , J , PidLength , HostNameLength , TmpDirLength , FilenamePatLength ;
900
911
const char * FilenamePat = lprofCurFilename .FilenamePat ;
901
912
902
913
if (!lprofCurFilename .FilenamePat || !lprofCurFilename .FilenamePat [0 ])
903
914
return 0 ;
904
915
905
916
if (!(lprofCurFilename .NumPids || lprofCurFilename .NumHosts ||
906
- lprofCurFilename .MergePoolSize ||
917
+ lprofCurFilename .TmpDir || lprofCurFilename . MergePoolSize ||
907
918
__llvm_profile_is_continuous_mode_enabled () ||
908
919
lprofCurFilename .NumExitSignals )) {
909
920
if (!ForceUseBuf )
@@ -917,6 +928,7 @@ static const char *getCurFilename(char *FilenameBuf, int ForceUseBuf) {
917
928
918
929
PidLength = strlen (lprofCurFilename .PidChars );
919
930
HostNameLength = strlen (lprofCurFilename .Hostname );
931
+ TmpDirLength = lprofCurFilename .TmpDir ? strlen (lprofCurFilename .TmpDir ) : 0 ;
920
932
/* Construct the new filename. */
921
933
for (I = 0 , J = 0 ; FilenamePat [I ]; ++ I )
922
934
if (FilenamePat [I ] == '%' ) {
@@ -929,6 +941,10 @@ static const char *getCurFilename(char *FilenameBuf, int ForceUseBuf) {
929
941
} else if (containsExitOnSignalSpecifier (FilenamePat , I )) {
930
942
while (FilenamePat [I ] != 'x' )
931
943
++ I ;
944
+ } else if (FilenamePat [I ] == 't' ) {
945
+ memcpy (FilenameBuf + J , lprofCurFilename .TmpDir , TmpDirLength );
946
+ FilenameBuf [J + TmpDirLength ] = DIR_SEPARATOR ;
947
+ J += TmpDirLength + 1 ;
932
948
} else {
933
949
if (!getMergePoolSize (FilenamePat , & I ))
934
950
continue ;
0 commit comments