79
79
80
80
#define DIR_UP ".."
81
81
82
+ /* The following ptx message is no error, unless --verify has been specified.
83
+ To be used when a sm_ has been specified which the installed ptxas does
84
+ not support. */
85
+ #define PTXAS_IGNORE_ERR "is not defined for option 'gpu-name'"
86
+
82
87
static const char * outname = NULL ;
83
88
84
89
static void __attribute__ ((format (printf , 1 , 2 )))
@@ -947,12 +952,25 @@ process (FILE *in, FILE *out, int *verify, const char *inname)
947
952
/* Wait for a process to finish, and exit if a nonzero status is found. */
948
953
949
954
int
950
- collect_wait (const char * prog , struct pex_obj * pex )
955
+ collect_wait (const char * prog , struct pex_obj * pex , int force )
951
956
{
952
957
int status ;
953
958
954
959
if (!pex_get_status (pex , 1 , & status ))
955
960
fatal_error ("can't get program status: %m" );
961
+ if (!force )
962
+ {
963
+ FILE * in = pex_read_err (pex , 0 );
964
+ char buffer [1024 ];
965
+ size_t n = fread (buffer , sizeof (char ), 1024 , in );
966
+ if (n && memmem (buffer , n , PTXAS_IGNORE_ERR , strlen (PTXAS_IGNORE_ERR )))
967
+ return 0 ;
968
+ while (n )
969
+ {
970
+ fwrite (buffer , sizeof (char ), n , stderr );
971
+ n = fread (buffer , sizeof (char ), 1024 , in );
972
+ }
973
+ }
956
974
pex_free (pex );
957
975
958
976
if (status )
@@ -972,9 +990,9 @@ collect_wait (const char *prog, struct pex_obj *pex)
972
990
}
973
991
974
992
static void
975
- do_wait (const char * prog , struct pex_obj * pex )
993
+ do_wait (const char * prog , struct pex_obj * pex , int force )
976
994
{
977
- int ret = collect_wait (prog , pex );
995
+ int ret = collect_wait (prog , pex , force );
978
996
if (ret != 0 )
979
997
{
980
998
fatal_error ("%s returned %d exit status" , prog , ret );
@@ -984,16 +1002,18 @@ do_wait (const char *prog, struct pex_obj *pex)
984
1002
985
1003
/* Execute a program, and wait for the reply. */
986
1004
static void
987
- fork_execute (const char * prog , char * const * argv )
1005
+ fork_execute (const char * prog , char * const * argv , int force )
988
1006
{
989
1007
struct pex_obj * pex = pex_init (0 , "nvptx-as" , NULL );
990
1008
if (pex == NULL )
991
1009
fatal_error ("pex_init failed: %m" );
992
1010
993
1011
int err ;
994
1012
const char * errmsg ;
995
-
996
- errmsg = pex_run (pex , PEX_LAST | PEX_SEARCH , argv [0 ], argv , NULL ,
1013
+ int flags = PEX_LAST | PEX_SEARCH ;
1014
+ if (!force )
1015
+ flags |= PEX_STDERR_TO_PIPE ;
1016
+ errmsg = pex_run (pex , flags , argv [0 ], argv , NULL ,
997
1017
NULL , & err );
998
1018
if (errmsg != NULL )
999
1019
{
@@ -1005,7 +1025,7 @@ fork_execute (const char *prog, char *const *argv)
1005
1025
else
1006
1026
fatal_error ("%s" , errmsg );
1007
1027
}
1008
- do_wait (prog , pex );
1028
+ do_wait (prog , pex , force );
1009
1029
}
1010
1030
1011
1031
/* Determine if progname is available in PATH. */
@@ -1186,10 +1206,10 @@ This program has absolutely no warranty.\n",
1186
1206
/* We don't have a PTX file for 'ptxas' to read in; skip verification. */
1187
1207
verify = 0 ;
1188
1208
else if (verify == -1 )
1189
- if (program_available ("ptxas" ))
1190
- verify = 1 ;
1209
+ if (! program_available ("ptxas" ))
1210
+ verify = 0 ;
1191
1211
1192
- if (verify > 0 )
1212
+ if (verify != 0 )
1193
1213
{
1194
1214
/* We override the default '--gpu-name' of 'ptxas': its default may not
1195
1215
be sufficient for what is requested in the '.target' directive in the
@@ -1217,7 +1237,7 @@ This program has absolutely no warranty.\n",
1217
1237
obstack_ptr_grow (& argv_obstack , "-O0" );
1218
1238
obstack_ptr_grow (& argv_obstack , NULL );
1219
1239
char * const * new_argv = XOBFINISH (& argv_obstack , char * const * );
1220
- fork_execute (new_argv [0 ], new_argv );
1240
+ fork_execute (new_argv [0 ], new_argv , verify > 0 );
1221
1241
}
1222
1242
return 0 ;
1223
1243
}
0 commit comments