From a19960e79a2a4b6cf3fa11540c69a5df50bcf1ad Mon Sep 17 00:00:00 2001 From: Evgeny Date: Mon, 15 Jun 2020 21:05:16 -0500 Subject: [PATCH] HIP-PROF: fixing pointers tracing Change-Id: Id2c35972e1d134012980c95a3649ddfdf9303494 --- rocclr/hip_prof_gen.py | 72 ++++++++++++++++++++++++++++++++++-------- 1 file changed, 58 insertions(+), 14 deletions(-) diff --git a/rocclr/hip_prof_gen.py b/rocclr/hip_prof_gen.py index c59d1cca35..680071a775 100755 --- a/rocclr/hip_prof_gen.py +++ b/rocclr/hip_prof_gen.py @@ -120,6 +120,16 @@ def filtr_api_opts(args_str): for arg_tuple in args_list: opts_list.append(arg_tuple[1]) return opts_list + +# Checking for pointer non-void arg type +def pointer_ck(arg_type): + ptr_type = '' + m = re.match(r'(.*)\*$', arg_type) + if m: + ptr_type = m.group(1) + ptr_type = re.sub(r'const ', '', ptr_type) + if ptr_type == 'void': ptr_type = '' + return ptr_type ############################################################# # Parsing API header # hipError_t hipSetupArgument(const void* arg, size_t size, size_t offset); @@ -425,10 +435,15 @@ def generate_prof_header(f, api_map, opts_map): if len(args) != 0: f.write(' struct {\n') for arg_tuple in args: - if arg_tuple[0] == "hipLimit_t": - f.write(' enum ' + arg_tuple[0] + ' ' + arg_tuple[1] + ';\n') - else: - f.write(' ' + arg_tuple[0] + ' ' + arg_tuple[1] + ';\n') + arg_type = arg_tuple[0] + ptr_type = pointer_ck(arg_type) + arg_name = arg_tuple[1] + # Checking for enum type + if arg_type == "hipLimit_t": arg_type = 'enum ' + arg_type + # Structuer field code + f.write(' ' + arg_type + ' ' + arg_name + ';\n') + if ptr_type != '': + f.write(' ' + ptr_type + ' ' + arg_name + '__val;\n') f.write(' } ' + name + ';\n') f.write( ' } args;\n' + @@ -450,20 +465,43 @@ def generate_prof_header(f, api_map, opts_map): for ind in range(0, len(args)): arg_tuple = args[ind] arg_type = arg_tuple[0] + ptr_type = pointer_ck(arg_type) fld_name = arg_tuple[1] - arg_name = opts_list[ind] - if arg_type == "char*": - f.write(' cb_data.args.' + name + '.' + fld_name + ' = strdup("***"); \\\n') - elif arg_type == "const char*": - f.write(' cb_data.args.' + name + '.' + fld_name + ' = (' + arg_name + ') ? strdup(' + arg_name + ') : NULL; \\\n') + opt_name = opts_list[ind] + if arg_type == "const char*": + f.write(' cb_data.args.' + name + '.' + fld_name + ' = (' + opt_name + ') ? strdup(' + opt_name + ') : NULL; \\\n') else: - f.write(' cb_data.args.' + name + '.' + fld_name + ' = (' + arg_type + ')' + arg_name + '; \\\n') + f.write(' cb_data.args.' + name + '.' + fld_name + ' = (' + arg_type + ')' + opt_name + '; \\\n') f.write('};\n') f.write('#define INIT_CB_ARGS_DATA(cb_id, cb_data) INIT_##cb_id##_CB_ARGS_DATA(cb_data)\n') + f.write('#if HIP_PROF_HIP_API_STRING\n') + # Generating the method for the API args filling + f.write('\n') + f.write('// HIP API args filling method\n') + f.write('void hipApiArgsInit(hip_api_id_t id, hip_api_data_t* data) {\n') + f.write(' switch (id) {\n') + for name, args in api_map.items(): + f.write('// ' + name + str(args) + '\n') + f.write(' case HIP_API_ID_' + name + ':\n') + for ind in range(0, len(args)): + arg_tuple = args[ind] + arg_type = arg_tuple[0] + ptr_type = pointer_ck(arg_type) + fld_name = arg_tuple[1] + var_name = 'data->args.' + name + '.' + fld_name + if arg_type == "char*": + f.write(' ' + var_name + ' = (' + var_name + ') ? strdup(' + var_name + ') : NULL; \\\n') + else: + if ptr_type != '': + f.write(' if (' + var_name + ') ' + var_name + '__val = *(' + var_name + '); \\\n') + f.write(' break;\n') + f.write(' default: break;\n') + f.write(' };\n') + f.write('}\n') + # Generating the method for the API string, name and parameters f.write('\n') - f.write('#if HIP_PROF_HIP_API_STRING\n') f.write('#include \n'); f.write('#include \n'); f.write('// HIP API string method, method name and parameters\n') @@ -476,21 +514,27 @@ def generate_prof_header(f, api_map, opts_map): for ind in range(0, len(args)): arg_tuple = args[ind] arg_type = arg_tuple[0] + ptr_type = pointer_ck(arg_type) arg_name = arg_tuple[1] var_name = 'data->args.' + name + '.' + arg_name delim = '' if ind == 0 else ', '; oss_stream = 'oss << "' + delim + arg_name + '=' line_shift = ' ' f.write(line_shift) - if re.search(r'\*', arg_type): + if ptr_type != '': f.write('if (' + var_name + ' == NULL) ' + oss_stream + 'NULL";\n' + line_shift + 'else ') - f.write(oss_stream + '" << ' + var_name + ';\n') + if pointer_ck(ptr_type) != '': + f.write(oss_stream + '" << (void*)' + var_name + '__val' + ';\n') + else: + f.write(oss_stream + '" << ' + var_name + '__val' + ';\n') + else: + f.write(oss_stream + '" << ' + var_name + ';\n') f.write(' oss << ")";\n') f.write(' break;\n') f.write(' default: oss << "unknown";\n') f.write(' };\n') f.write(' return strdup(oss.str().c_str());\n') - f.write('};\n') + f.write('}\n') f.write('#endif // HIP_PROF_HIP_API_STRING\n') f.write('#endif // _HIP_PROF_STR_H\n');