static bool hsail_dbginfo_save_source_to_file(void) { FILE* temp_file_handle = NULL; bool ret_code = false; const char* src_file_name = hsail_dbginfo_get_active_file_name(); /* if no source available, dont mess with anything to do with the file, bail*/ if (gs_hsail_source == NULL) { return ret_code; } if (src_file_name == NULL) { return ret_code; } if (hsail_utils_check_file_exists(src_file_name)) { if (!hsail_utils_set_file_permission(src_file_name, HSAIL_FILE_READ_WRITE)) { printf_filtered("%s could not be made read-write\n",src_file_name); } } temp_file_handle = fopen(src_file_name,"wb"); gdb_assert(temp_file_handle != NULL); fprintf(temp_file_handle, "%s",gs_hsail_source); rewind(temp_file_handle); fclose(temp_file_handle); if (!hsail_utils_set_file_permission(src_file_name, HSAIL_FILE_READ_ONLY)) { printf_filtered("%s could not be made read only\n",src_file_name);; } rocm_printf_filtered("GPU kernel saved to %s\n",src_file_name); ret_code = true; return ret_code; }
bool hsail_utils_set_file_permission(const char* filename, const HsailFilePermission permission) { int stat=1; if (filename == NULL) { return false; } if(!hsail_utils_check_file_exists(filename)) { return false; } if (permission == HSAIL_FILE_READ_ONLY) { stat = chmod(filename, S_IREAD); } else if (permission == HSAIL_FILE_READ_WRITE) { stat = chmod(filename, S_IREAD | S_IWRITE); } else { printf("unhandled permission for %s \n", filename); gdb_assert(0); } if (stat) { printf("Couldn't change permission for %s\n", filename); return false; } else { return true; } }
/* Updates the kernel_source_file_name and saves the kernel to the file * */ static void hsail_kernel_save_source_to_file(struct hsail_kernel* k) { int filename_str_len = 0; char* hsail_source_buffer = NULL; FILE* temp_file_handle = NULL; const char hsail_ext[] = "temp_source"; filename_str_len = strlen(hsail_ext) + 1; gdb_assert(NULL != k); free_current_contents(&k->kernel_source_file_name); k->kernel_source_file_name = (char*)xmalloc(sizeof(char)*filename_str_len); gdb_assert(NULL != k->kernel_source_file_name); memset(k->kernel_source_file_name, '\0', filename_str_len); strcpy(k->kernel_source_file_name, hsail_ext); /* Two other possible directions are below*/ /* Case 1: Implementation where we generate BRIGModule_#Number#.hsail * * The better version for this would be to use an API in debug facilities that gets module name * from kernel name. That'd allow gdb to be aware of "is this a new kernel" * or "is this a new module" and accordingly skip creating a text file. * The 64 below adds some space for a "index" and underscore. */ /* const char hsail_prefix[] = "BrigModule"; static int module_index = 0; filename_str_len = strlen(hsail_ext) + strlen(hsail_prefix) + 64; k->kernel_source_file_name = (char*)xmalloc(sizeof(char)*filename_str_len); memset(k->kernel_source_file_name, '\0',filename_str_len); snprintf(k->kernel_source_file_name,filename_str_len, "%s_%d%s",hsail_prefix, module_index, hsail_ext); module_index = module_index +1; */ /* Case 2: Implementation where we generate kernel_#KernelName#.hsail * * The below logic can be used to save kernels based on the dispatched kernel name. * However, it is not great since the file we save is HSAIL text for a BRIG module * and each could have multiple kernels internally * */ /* const char hsail_prefix[] = "Kernel_"; gdb_assert(k!=NULL); gdb_assert(k->kernel_name != NULL); filename_str_len = strlen(k->kernel_name) + strlen(hsail_ext) + strlen(hsail_prefix); k->kernel_source_file_name = (char*)xmalloc(sizeof(char)*filename_str_len); memset(k->kernel_source_file_name, '\0',filename_str_len); strcpy(k->kernel_source_file_name, hsail_prefix); strcat(k->kernel_source_file_name, k->kernel_name); strcat(k->kernel_source_file_name, hsail_ext); */ hsail_source_buffer = hsail_dbginfo_get_source_buffer(); /* if no source available, dont mess with anything to do with the file, bail*/ if (hsail_source_buffer == NULL) { return; } if (hsail_utils_check_file_exists(k->kernel_source_file_name)) { if (!hsail_utils_set_file_permission(k->kernel_source_file_name, HSAIL_FILE_READ_WRITE)) { printf_filtered("%s could not be made read-write\n",k->kernel_source_file_name); } } temp_file_handle = fopen(k->kernel_source_file_name,"wb"); gdb_assert(temp_file_handle != NULL); fprintf(temp_file_handle, "%s",hsail_source_buffer); rewind(temp_file_handle); fclose(temp_file_handle); if (!hsail_utils_set_file_permission(k->kernel_source_file_name, HSAIL_FILE_READ_ONLY)) { printf_filtered("%s could not be made read only\n",k->kernel_source_file_name);; } printf_filtered("GPU kernel saved to %s\n",k->kernel_source_file_name); }