diff options
author | Tobin Ehlis <tobin@lunarg.com> | 2014-11-26 03:43:26 +0300 |
---|---|---|
committer | Courtney Goeltzenleuchter <courtney@LunarG.com> | 2014-11-26 20:03:12 +0300 |
commit | 9e7c78b300a83399eb83b31946bc2c50c185fc50 (patch) | |
tree | e35a5e549c3027cf20a47a47b82615c01a6dff2f | |
parent | a3c04222d44520f2d841c814c4c4f4741b0deec4 (diff) |
layers: Added APIDumpNoAddr layer that replaces variable addresses in API Dump w/ static "addr" stringkhronos-master-20141209
-rwxr-xr-x | xgl-helper.py | 36 | ||||
-rwxr-xr-x | xgl-layer-generate.py | 55 |
2 files changed, 79 insertions, 12 deletions
diff --git a/xgl-helper.py b/xgl-helper.py index a59446259..d570580e7 100755 --- a/xgl-helper.py +++ b/xgl-helper.py @@ -308,6 +308,8 @@ class StructWrapperGen: self.header_filename = os.path.join(out_dir, self.api+"_struct_wrappers.h") self.class_filename = os.path.join(out_dir, self.api+"_struct_wrappers.cpp") self.string_helper_filename = os.path.join(out_dir, self.api+"_struct_string_helper.h") + self.string_helper_no_addr_filename = os.path.join(out_dir, self.api+"_struct_string_helper_no_addr.h") + self.no_addr = False self.hfg = CommonFileGen(self.header_filename) self.cfg = CommonFileGen(self.class_filename) self.shg = CommonFileGen(self.string_helper_filename) @@ -318,6 +320,13 @@ class StructWrapperGen: def set_include_headers(self, include_headers): self.include_headers = include_headers + def set_no_addr(self, no_addr): + self.no_addr = no_addr + if self.no_addr: + self.shg = CommonFileGen(self.string_helper_no_addr_filename) + else: + self.shg = CommonFileGen(self.string_helper_filename) + # Return class name for given struct name def get_class_name(self, struct_name): class_name = struct_name.strip('_').lower() + "_struct_wrapper" @@ -454,7 +463,6 @@ class StructWrapperGen: elif 'INT' in struct_member['type']: print_type = "i" elif struct_member['ptr']: - #cast_type = "" pass else: #print("Unhandled struct type: %s" % struct_member['type']) @@ -465,6 +473,9 @@ class StructWrapperGen: member_post = "[i]" print_out = "%%s%s%s = %%%s%s" % (member_name, member_print_post, print_type, postfix) # section of print that goes inside of quotes print_arg = ", %s,%s %s(%s%s%s)%s" % (pre_var_name, array_index, cast_type, struct_var_name, struct_op, member_name, member_post) # section of print passed to portion in quotes + if self.no_addr and "p" == print_type: + print_out = "%%s%s%s = addr\\n" % (member_name, member_print_post) # section of print that goes inside of quotes + print_arg = ", %s" % (pre_var_name) return (print_out, print_arg) def _generateStringHelperFunctions(self): @@ -498,22 +509,34 @@ class StructWrapperGen: if 'pNext' == stp_list[index]['name']: sh_funcs.append(' tmpStr = dynamic_display((XGL_VOID*)pStruct->pNext, prefix);\n') sh_funcs.append(' stp_strs[%i] = (char*)malloc(256+strlen(tmpStr));\n' % index) - sh_funcs.append(' sprintf(stp_strs[%i], " %%spNext (%%p)\\n%%s", prefix, (void*)pStruct->pNext, tmpStr);\n' % index) + if self.no_addr: + sh_funcs.append(' sprintf(stp_strs[%i], " %%spNext (addr)\\n%%s", prefix, tmpStr);\n' % index) + else: + sh_funcs.append(' sprintf(stp_strs[%i], " %%spNext (%%p)\\n%%s", prefix, (void*)pStruct->pNext, tmpStr);\n' % index) sh_funcs.append(' free(tmpStr);\n') else: sh_funcs.append(' tmpStr = %s(pStruct->%s, extra_indent);\n' % (self._get_sh_func_name(stp_list[index]['type']), stp_list[index]['name'])) sh_funcs.append(' stp_strs[%i] = (char*)malloc(256+strlen(tmpStr)+strlen(prefix));\n' % (index)) - sh_funcs.append(' sprintf(stp_strs[%i], " %%s%s (%%p)\\n%%s", prefix, (void*)pStruct->%s, tmpStr);\n' % (index, stp_list[index]['name'], stp_list[index]['name'])) + if self.no_addr: + sh_funcs.append(' sprintf(stp_strs[%i], " %%s%s (addr)\\n%%s", prefix, tmpStr);\n' % (index, stp_list[index]['name'])) + else: + sh_funcs.append(' sprintf(stp_strs[%i], " %%s%s (%%p)\\n%%s", prefix, (void*)pStruct->%s, tmpStr);\n' % (index, stp_list[index]['name'], stp_list[index]['name'])) sh_funcs.append(' }\n') sh_funcs.append(" else\n stp_strs[%i] = &dummy_char;\n" % (index)) elif stp_list[index]['array']: # TODO : For now just printing first element of array sh_funcs.append(' tmpStr = %s(&pStruct->%s[0], extra_indent);\n' % (self._get_sh_func_name(stp_list[index]['type']), stp_list[index]['name'])) sh_funcs.append(' stp_strs[%i] = (char*)malloc(256+strlen(tmpStr));\n' % (index)) - sh_funcs.append(' sprintf(stp_strs[%i], " %%s%s[0] (%%p)\\n%%s", prefix, (void*)&pStruct->%s[0], tmpStr);\n' % (index, stp_list[index]['name'], stp_list[index]['name'])) + if self.no_addr: + sh_funcs.append(' sprintf(stp_strs[%i], " %%s%s[0] (addr)\\n%%s", prefix, tmpStr);\n' % (index, stp_list[index]['name'])) + else: + sh_funcs.append(' sprintf(stp_strs[%i], " %%s%s[0] (%%p)\\n%%s", prefix, (void*)&pStruct->%s[0], tmpStr);\n' % (index, stp_list[index]['name'], stp_list[index]['name'])) else: sh_funcs.append(' tmpStr = %s(&pStruct->%s, extra_indent);\n' % (self._get_sh_func_name(stp_list[index]['type']), stp_list[index]['name'])) sh_funcs.append(' stp_strs[%i] = (char*)malloc(256+strlen(tmpStr));\n' % (index)) - sh_funcs.append(' sprintf(stp_strs[%i], " %%s%s (%%p)\\n%%s", prefix, (void*)&pStruct->%s, tmpStr);\n' % (index, stp_list[index]['name'], stp_list[index]['name'])) + if self.no_addr: + sh_funcs.append(' sprintf(stp_strs[%i], " %%s%s (addr)\\n%%s", prefix, tmpStr);\n' % (index, stp_list[index]['name'])) + else: + sh_funcs.append(' sprintf(stp_strs[%i], " %%s%s (%%p)\\n%%s", prefix, (void*)&pStruct->%s, tmpStr);\n' % (index, stp_list[index]['name'], stp_list[index]['name'])) total_strlen_str += 'strlen(stp_strs[%i]) + ' % index sh_funcs.append(' str = (char*)malloc(%ssizeof(char)*1024);\n' % (total_strlen_str)) sh_funcs.append(' sprintf(str, "') @@ -853,6 +876,9 @@ def main(argv=None): print("Generating struct wrapper class to %s" % sw.class_filename) sw.generateBody() sw.generateStringHelper() + # Generate a 2nd helper file that excludes addrs + sw.set_no_addr(True) + sw.generateStringHelper() if opts.gen_cmake: cmg = CMakeGen(sw, os.path.dirname(enum_filename)) cmg.generate() diff --git a/xgl-layer-generate.py b/xgl-layer-generate.py index a28c6b63a..da820eb9c 100755 --- a/xgl-layer-generate.py +++ b/xgl-layer-generate.py @@ -138,11 +138,13 @@ class Subcommand(object): %s; };""" % ";\n ".join(entries) - def _generate_dispatch_entrypoints(self, qual="", layer="Generic"): + def _generate_dispatch_entrypoints(self, qual="", layer="Generic", no_addr=False): if qual: qual += " " layer_name = layer + if no_addr: + layer_name = "%sNoAddr" % layer funcs = [] for proto in self.protos: if proto.name != "GetProcAddr" and proto.name != "InitAndEnumerateGpus": @@ -175,7 +177,7 @@ class Subcommand(object): ' strncpy(pOutLayers[0], "%s", maxStringSize);\n' ' return XGL_SUCCESS;\n' ' }\n' - '}' % (qual, decl, proto.params[0].name, proto.name, ret_val, c_call, proto.name, stmt, layer)) + '}' % (qual, decl, proto.params[0].name, proto.name, ret_val, c_call, proto.name, stmt, layer_name)) elif proto.params[0].ty != "XGL_PHYSICAL_GPU": funcs.append('%s%s\n' '{\n' @@ -233,6 +235,8 @@ class Subcommand(object): if p.name == proto.params[y].name: cp = True (pft, pfi) = self._get_printf_params(p.ty, p.name, cp) + if no_addr and "%p" == pft: + (pft, pfi) = ("%s", '"addr"') log_func += '%s = %s, ' % (p.name, pft) print_vals += ', %s' % (pfi) # TODO : Just want this to be simple check for params of STRUCT type @@ -253,10 +257,16 @@ class Subcommand(object): cis_print_func = 'xgl_print_%s' % (proto.params[sp_index].ty.strip('const ').strip('*').lower()) log_func += '\n if (%s) {' % (proto.params[sp_index].name) log_func += '\n pTmpStr = %s(%s, " ");' % (cis_print_func, proto.params[sp_index].name) - if "file" in layer: - log_func += '\n fprintf(pOutFile, " %s (%%p)\\n%%s\\n", (void*)%s, pTmpStr);' % (proto.params[sp_index].name, proto.params[sp_index].name) + if "File" in layer: + if no_addr: + log_func += '\n fprintf(pOutFile, " %s (addr)\\n%%s\\n", pTmpStr);' % (proto.params[sp_index].name) + else: + log_func += '\n fprintf(pOutFile, " %s (%%p)\\n%%s\\n", (void*)%s, pTmpStr);' % (proto.params[sp_index].name, proto.params[sp_index].name) else: - log_func += '\n printf(" %s (%%p)\\n%%s\\n", (void*)%s, pTmpStr);' % (proto.params[sp_index].name, proto.params[sp_index].name) + if no_addr: + log_func += '\n printf(" %s (addr)\\n%%s\\n", pTmpStr);' % (proto.params[sp_index].name) + else: + log_func += '\n printf(" %s (%%p)\\n%%s\\n", (void*)%s, pTmpStr);' % (proto.params[sp_index].name, proto.params[sp_index].name) log_func += '\n fflush(stdout);' log_func += '\n free(pTmpStr);\n }' if proto.name == "EnumerateLayers": @@ -278,7 +288,7 @@ class Subcommand(object): ' strncpy(pOutLayers[0], "%s", maxStringSize);\n' ' return XGL_SUCCESS;\n' ' }\n' - '}' % (qual, decl, proto.params[0].name, ret_val, c_call,f_open, log_func, f_close, stmt, layer)) + '}' % (qual, decl, proto.params[0].name, ret_val, c_call,f_open, log_func, f_close, stmt, layer_name)) elif proto.params[0].ty != "XGL_PHYSICAL_GPU": funcs.append('%s%s\n' '{\n' @@ -384,7 +394,7 @@ class Subcommand(object): ' strncpy(pOutLayers[0], "%s", maxStringSize);\n' ' return XGL_SUCCESS;\n' ' }\n' - '}' % (qual, decl, proto.params[0].name, using_line, ret_val, c_call, create_line, destroy_line, stmt, layer)) + '}' % (qual, decl, proto.params[0].name, using_line, ret_val, c_call, create_line, destroy_line, stmt, layer_name)) elif proto.params[0].ty != "XGL_PHYSICAL_GPU": funcs.append('%s%s\n' '{\n' @@ -584,6 +594,36 @@ class ApiDumpFileSubcommand(Subcommand): return "\n\n".join(body) +class ApiDumpNoAddrSubcommand(Subcommand): + def generate_header(self): + header_txt = [] + header_txt.append('#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <assert.h>\n#include <pthread.h>\n#include "xglLayer.h"\n#include "xgl_struct_string_helper_no_addr.h"\n\nstatic XGL_LAYER_DISPATCH_TABLE nextTable;\nstatic XGL_BASE_LAYER_OBJECT *pCurObj;\nstatic pthread_once_t tabOnce = PTHREAD_ONCE_INIT;\npthread_mutex_t print_lock = PTHREAD_MUTEX_INITIALIZER;\n') + header_txt.append('#define MAX_TID 513') + header_txt.append('static pthread_t tidMapping[MAX_TID] = {0};') + header_txt.append('static uint32_t maxTID = 0;') + header_txt.append('// Map actual TID to an index value and return that index') + header_txt.append('// This keeps TIDs in range from 0-MAX_TID and simplifies compares between runs') + header_txt.append('static uint32_t getTIDIndex() {') + header_txt.append(' pthread_t tid = pthread_self();') + header_txt.append(' for (uint32_t i = 0; i < maxTID; i++) {') + header_txt.append(' if (tid == tidMapping[i])') + header_txt.append(' return i;') + header_txt.append(' }') + header_txt.append(" // Don't yet have mapping, set it and return newly set index") + header_txt.append(' uint32_t retVal = (uint32_t)maxTID;') + header_txt.append(' tidMapping[maxTID++] = tid;') + header_txt.append(' assert(maxTID < MAX_TID);') + header_txt.append(' return retVal;') + header_txt.append('}') + return "\n".join(header_txt) + + def generate_body(self): + body = [self._generate_layer_dispatch_table(), + self._generate_dispatch_entrypoints("XGL_LAYER_EXPORT", "APIDump", True), + self._generate_layer_gpa_function()] + + return "\n\n".join(body) + class ObjectTrackerSubcommand(Subcommand): def generate_header(self): header_txt = [] @@ -792,6 +832,7 @@ def main(): "Generic" : GenericLayerSubcommand, "ApiDump" : ApiDumpSubcommand, "ApiDumpFile" : ApiDumpFileSubcommand, + "ApiDumpNoAddr" : ApiDumpNoAddrSubcommand, "ObjectTracker" : ObjectTrackerSubcommand, } |