radeonsi: add symbols to si_shader_binary

Reviewed-by: Marek Olšák <marek.olsak@amd.com>
Signed-off-by: Qiang Yu <yuq825@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/22573>
This commit is contained in:
Qiang Yu 2023-04-26 10:40:58 +08:00 committed by Marge Bot
parent 6a360e4a71
commit 7aac3508dc
4 changed files with 20 additions and 1 deletions

View file

@ -3335,6 +3335,9 @@ void si_shader_binary_clean(struct si_shader_binary *binary)
free(binary->llvm_ir_string);
binary->llvm_ir_string = NULL;
free((void *)binary->symbols);
binary->symbols = NULL;
free(binary->uploaded_code);
binary->uploaded_code = NULL;
binary->uploaded_code_size = 0;

View file

@ -826,6 +826,9 @@ struct si_shader_binary {
const char *disasm_string;
size_t disasm_size;
const unsigned *symbols;
unsigned num_symbols;
};
struct gfx9_gs_info {

View file

@ -107,6 +107,14 @@ si_aco_build_shader_binary(void **data, const struct ac_shader_config *config,
memcpy(shader->binary.llvm_ir_string, llvm_ir_str, llvm_ir_size);
}
if (num_symbols) {
unsigned symbol_size = num_symbols * sizeof(*symbols);
void *data = MALLOC(symbol_size);
memcpy(data, symbols, symbol_size);
shader->binary.symbols = data;
shader->binary.num_symbols = num_symbols;
}
shader->config = *config;
}

View file

@ -274,13 +274,15 @@ static uint32_t *si_get_shader_binary(struct si_shader *shader)
/* Refuse to allocate overly large buffers and guard against integer
* overflow. */
if (shader->binary.code_size > UINT_MAX / 4 || llvm_ir_size > UINT_MAX / 4)
if (shader->binary.code_size > UINT_MAX / 4 || llvm_ir_size > UINT_MAX / 4 ||
shader->binary.num_symbols > UINT_MAX / 32)
return NULL;
unsigned size = sizeof(struct si_shader_blob_head) +
align(sizeof(shader->config), 4) +
align(sizeof(shader->info), 4) +
4 + align(shader->binary.code_size, 4) +
4 + shader->binary.num_symbols * 8 +
4 + align(llvm_ir_size, 4);
uint32_t *buffer = (uint32_t*)CALLOC(1, size);
if (!buffer)
@ -296,6 +298,7 @@ static uint32_t *si_get_shader_binary(struct si_shader *shader)
ptr = write_data(ptr, &shader->config, sizeof(shader->config));
ptr = write_data(ptr, &shader->info, sizeof(shader->info));
ptr = write_chunk(ptr, shader->binary.code_buffer, shader->binary.code_size);
ptr = write_chunk(ptr, shader->binary.symbols, shader->binary.num_symbols * 8);
ptr = write_chunk(ptr, shader->binary.llvm_ir_string, llvm_ir_size);
assert((char *)ptr - (char *)buffer == (ptrdiff_t)size);
@ -322,6 +325,8 @@ static bool si_load_shader_binary(struct si_shader *shader, void *binary)
ptr = read_data(ptr, &shader->info, sizeof(shader->info));
ptr = read_chunk(ptr, (void **)&shader->binary.code_buffer, &code_size);
shader->binary.code_size = code_size;
ptr = read_chunk(ptr, (void **)&shader->binary.symbols, &chunk_size);
shader->binary.num_symbols = chunk_size / 8;
ptr = read_chunk(ptr, (void **)&shader->binary.llvm_ir_string, &chunk_size);
if (!shader->is_gs_copy_shader &&