From 045c6afa2c366c545e7e730e20a0fc5bdfe1571f Mon Sep 17 00:00:00 2001 From: eshcherb <33529668+eshcherb@users.noreply.github.com> Date: Thu, 21 Mar 2019 00:28:18 -0500 Subject: [PATCH] adding hip_prof_gen verbose log (#977) * adding hip_prof_gen verbose log * adding stderr fatal error * adding no error exit by default * adding hip_prof_str regeneration dependencies * adding more informative messages * fixing error mesage --- hipamd/CMakeLists.txt | 11 +++++----- hipamd/hip_prof_gen.py | 50 +++++++++++++++++++++++++++++++----------- 2 files changed, 42 insertions(+), 19 deletions(-) diff --git a/hipamd/CMakeLists.txt b/hipamd/CMakeLists.txt index 115f746cd9..78d2bc7a30 100644 --- a/hipamd/CMakeLists.txt +++ b/hipamd/CMakeLists.txt @@ -168,12 +168,11 @@ set(PROF_API_STR "${CMAKE_CURRENT_SOURCE_DIR}/include/hip/hcc_detail/hip_prof_st set(PROF_API_HDR "${CMAKE_CURRENT_SOURCE_DIR}/include/hip/hcc_detail/hip_runtime_api.h") set(PROF_API_SRC "${CMAKE_CURRENT_SOURCE_DIR}/src") set(PROF_API_GEN "${CMAKE_CURRENT_SOURCE_DIR}/hip_prof_gen.py") -add_custom_command( - OUTPUT ${PROF_API_STR} - COMMAND ${PROF_API_GEN} ${OPT_PROF_API} ${PROF_API_HDR} ${PROF_API_SRC} ${PROF_API_STR} - DEPENDS ${PROF_API_GEN} ${PROF_API_HDR} -) -add_custom_target(prof ALL DEPENDS ${PROF_API_STR}) +set(PROF_API_LOG "${PROJECT_BINARY_DIR}/hip_prof_gen.log.txt") +set(PROF_API_CMD "${PROF_API_GEN} -v ${OPT_PROF_API} ${PROF_API_HDR} ${PROF_API_SRC} ${PROF_API_STR} >${PROF_API_LOG}") +MESSAGE(STATUS "Generating profiling promitives: ${PROF_API_STR}") +execute_process(COMMAND sh -c "rm -f ${PROF_API_STR}; ${PROF_API_CMD}") +set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS ${PROF_API_GEN} ${PROF_API_HDR} ${PROF_API_STR}) # Enable profiling API if(USE_PROF_API EQUAL 1) diff --git a/hipamd/hip_prof_gen.py b/hipamd/hip_prof_gen.py index 81df5132dd..09bf65ebcd 100755 --- a/hipamd/hip_prof_gen.py +++ b/hipamd/hip_prof_gen.py @@ -1,25 +1,36 @@ #!/usr/bin/python import os, sys, re -verbose = 0 PROF_HEADER = "hip_prof_str.h" OUTPUT = PROF_HEADER REC_MAX_LEN = 1024 -# Fatal error termination +# Messages and errors controll +verbose = 0 +errexit = 0 inp_file = 'none' line_num = -1 -def fatal(msg): - if line_num != -1: - print >>sys.stderr, "Error: " + msg + ", file '" + inp_file + "', line (" + str(line_num) + ")" - else: - print >>sys.stderr, "Error: " + msg - sys.exit(1) # Verbose message def message(msg): if verbose: print >>sys.stdout, msg +# Fatal error termination +def error(msg): + if line_num != -1: + msg += ", file '" + inp_file + "', line (" + str(line_num) + ")" + if errexit: + msg = " Error: " + msg + else: + msg = " Warning: " + msg + + print >>sys.stdout, msg + print >>sys.stderr, sys.argv[0] + msg + +def fatal(msg): + error(msg) + if errexit: sys.exit(1) + ############################################################# # Normalizing API arguments def filtr_api_args(args_str): @@ -77,7 +88,7 @@ def parse_api(inp_file_p, out): global line_num inp_file = inp_file_p - beg_pattern = re.compile("^(hipError_t|const char\s*\*)\s+[^\(]+\("); + beg_pattern = re.compile("^(hipError_t|const char\s*\*)\s+([^\(]+)\("); api_pattern = re.compile("^(hipError_t|const char\s*\*)\s+([^\(]+)\(([^\)]*)\)"); end_pattern = re.compile("Texture"); hidden_pattern = re.compile(r'__attribute__\(\(visibility\("hidden"\)\)\)') @@ -99,7 +110,16 @@ def parse_api(inp_file_p, out): if len(record) > REC_MAX_LEN: fatal("bad record \"" + record + "\"") - if beg_pattern.match(record) and (hidden == 0) and (nms_level == 0): found = 1 + m = beg_pattern.match(line) + if m: + name = m.group(2) + if hidden != 0: + message("api: " + name + " - hidden") + elif nms_level != 0: + message("api: " + name + " - hip_impl") + else: + message("api: " + name) + found = 1 if found != 0: record = re.sub("\s__dparm\([^\)]*\)", '', record); @@ -206,7 +226,7 @@ def parse_content(inp_file_p, api_map, out): else: # Warning about mismatched API, possible non public overloaded version api_diff = '\t\t' + inp_file + " line(" + str(line_num) + ")\n\t\tapi: " + api_types + "\n\t\teta: " + eta_types - message("\t" + api_name + ':\n' + api_diff + '\n') + message("\t" + api_name + ' args mismatch:\n' + api_diff + '\n') # API found action if found == 2: @@ -394,6 +414,10 @@ if (len(sys.argv) > 1) and (sys.argv[1] == '-v'): verbose = 1 sys.argv.pop(1) +if (len(sys.argv) > 1) and (sys.argv[1] == '-e'): + errexit = 1 + sys.argv.pop(1) + if (len(sys.argv) < 3): fatal ("Usage: " + sys.argv[0] + " [-v] \n" + " -v - verbose messages\n" + @@ -441,10 +465,10 @@ if len(opts_map) != 0: args_str = api_map[name]; api_map[name] = list_api_args(args_str) if not name in opts_map: - fatal("not found: " + name) + error("implementation not found: " + name) not_found += 1 if not_found != 0: - fatal(not_found + " API calls not found") + fatal(str(not_found) + " API calls missing in interception layer") # Generating output header file with open(OUTPUT, 'w') as f: