layers: Added APIDumpNoAddr layer that replaces variable addresses in API Dump w/ static "addr" string
diff --git a/xgl-helper.py b/xgl-helper.py
index a594462..d570580 100755
--- a/xgl-helper.py
+++ b/xgl-helper.py
@@ -308,6 +308,8 @@
         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 @@
     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 @@
         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 @@
             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 @@
                         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 @@
         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 a28c6b6..da820eb 100755
--- a/xgl-layer-generate.py
+++ b/xgl-layer-generate.py
@@ -138,11 +138,13 @@
     %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 @@
                                  '        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 @@
                                 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 @@
                             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 @@
                                  '        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 @@
                                  '        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 @@
 
         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 @@
             "Generic" : GenericLayerSubcommand,
             "ApiDump" : ApiDumpSubcommand,
             "ApiDumpFile" : ApiDumpFileSubcommand,
+            "ApiDumpNoAddr" : ApiDumpNoAddrSubcommand,
             "ObjectTracker" : ObjectTrackerSubcommand,
     }