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;

}
Exemple #2
0
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;
    }
}
Exemple #3
0
/* 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);

}