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: