/* GPU disassembler tool */ void si_emu_disasm(char *path) { struct elf_file_t *elf_file; struct elf_symbol_t *symbol; struct elf_section_t *section; struct si_bin_file_t *amd_bin; char kernel_name[MAX_STRING_SIZE]; int i; /* Initialize disassembler */ si_disasm_init(); /* Decode external ELF */ elf_file = elf_file_create_from_path(path); for (i = 0; i < list_count(elf_file->symbol_table); i++) { /* Get symbol and section */ symbol = list_get(elf_file->symbol_table, i); section = list_get(elf_file->section_list, symbol->section); if (!section) continue; /* If symbol is '__OpenCL_XXX_kernel', it points to internal ELF */ if (str_prefix(symbol->name, "__OpenCL_") && str_suffix(symbol->name, "_kernel")) { /* Decode internal ELF */ str_substr(kernel_name, sizeof(kernel_name), symbol->name, 9, strlen(symbol->name) - 16); amd_bin = si_bin_file_create(section->buffer.ptr + symbol->value, symbol->size, kernel_name); /* Get kernel name */ printf("**\n** Disassembly for '__kernel %s'\n**\n\n", kernel_name); si_disasm_buffer(&amd_bin->enc_dict_entry_southern_islands->sec_text_buffer, stdout); printf("\n\n\n"); /* Free internal ELF */ si_bin_file_free(amd_bin); } } /* Free external ELF */ elf_file_free(elf_file); si_disasm_done(); /* End */ mhandle_done(); exit(0); }
void si_opencl_kernel_free(struct si_opencl_kernel_t *kernel) { int i; /* Free arguments */ for (i = 0; i < list_count(kernel->arg_list); i++) si_opencl_kernel_arg_free((struct si_opencl_kernel_arg_t *) list_get(kernel->arg_list, i)); list_free(kernel->arg_list); /* AMD Binary (internal ELF) */ if (kernel->bin_file) si_bin_file_free(kernel->bin_file); /* Free lists */ list_free(kernel->constant_buffer_list); /* Free kernel */ si_opencl_repo_remove_object(si_emu->opencl_repo, kernel); free(kernel); }