aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xglave-generate.py169
-rw-r--r--layers/CMakeLists.txt1
-rwxr-xr-xxgl_helper.py105
3 files changed, 114 insertions, 161 deletions
diff --git a/glave-generate.py b/glave-generate.py
index 64e5310c..876c4c28 100755
--- a/glave-generate.py
+++ b/glave-generate.py
@@ -416,14 +416,14 @@ class Subcommand(object):
ps = []
skip_list = [] # store params that are already accounted for so we don't count them twice
# Dict of specific params with unique custom sizes
- custom_size_dict = {'xgl_shader_create_info': '((pCreateInfo != NULL) ? pCreateInfo->codeSize : 0) + sizeof(XGL_SHADER_CREATE_INFO)',
- 'xgl_graphics_pipeline_create_info': '(calculate_pipeline_state_size(pCreateInfo->pNext)) + sizeof(XGL_GRAPHICS_PIPELINE_CREATE_INFO)',
- 'pUpdateChain': 'sizeof(XGL_DESCRIPTOR_SET) + (calculate_update_descriptors_size(pUpdateChain))',
+ custom_size_dict = {'xgl_shader_create_info': 'get_struct_chain_size((void*)pCreateInfo)',
+ 'xgl_graphics_pipeline_create_info': 'get_struct_chain_size((void*)pCreateInfo)',
+ 'pUpdateChain': 'get_struct_chain_size(pUpdateChain)',
'pSetBindPoints': '(XGL_SHADER_STAGE_COMPUTE * sizeof(uint32_t))', # Accounting for largest possible array
- 'xgl_descriptor_set_layout_create_info': '(calculate_create_ds_layout_size(pSetLayoutInfoList))',
- 'xgl_cmd_buffer_begin_info': 'sizeof(XGL_CMD_BUFFER_BEGIN_INFO) + (calculate_begin_cmdbuf_size(pBeginInfo->pNext))',
- 'xgl_memory_alloc_info': 'sizeof(XGL_MEMORY_ALLOC_INFO) + calculate_alloc_memory_size(pAllocInfo->pNext)',
- 'xgl_compute_pipeline_create_info': 'sizeof(XGL_COMPUTE_PIPELINE_CREATE_INFO) + calculate_pipeline_state_size(pCreateInfo->pNext)'}
+ 'xgl_descriptor_set_layout_create_info': 'get_struct_chain_size((void*)pSetLayoutInfoList)',
+ 'xgl_cmd_buffer_begin_info': 'get_struct_chain_size((void*)pBeginInfo)',
+ 'xgl_memory_alloc_info': 'get_struct_chain_size((void*)pAllocInfo)',
+ 'xgl_compute_pipeline_create_info': 'get_struct_chain_size((void*)pCreateInfo)'}
for p in params:
#First handle custom cases
if p.ty.strip('*').replace('const ', '').lower() in custom_size_dict:
@@ -950,27 +950,6 @@ class Subcommand(object):
hf_body.append(' return;')
hf_body.append('}')
hf_body.append('')
- hf_body.append('static size_t calculate_begin_cmdbuf_size(const XGL_CMD_BUFFER_BEGIN_INFO* pNext)')
- hf_body.append('{')
- hf_body.append(' size_t siz = 0;')
- hf_body.append(' while (pNext != NULL)')
- hf_body.append(' {')
- hf_body.append(' switch (pNext->sType)')
- hf_body.append(' {')
- hf_body.append(' case XGL_STRUCTURE_TYPE_CMD_BUFFER_GRAPHICS_BEGIN_INFO:')
- hf_body.append(' {')
- hf_body.append(' siz += sizeof(XGL_CMD_BUFFER_GRAPHICS_BEGIN_INFO);')
- hf_body.append(' break;')
- hf_body.append(' }')
- hf_body.append(' default:')
- hf_body.append(' glv_LogError("calculate_begin_cmdbuf_size() bad internal state sType\\n");')
- hf_body.append(' break;')
- hf_body.append(' }')
- hf_body.append(' pNext = (XGL_CMD_BUFFER_BEGIN_INFO*)pNext->pNext;')
- hf_body.append(' }')
- hf_body.append(' return siz;')
- hf_body.append('}')
- hf_body.append('')
hf_body.append('static void add_alloc_memory_to_trace_packet(glv_trace_packet_header* pHeader, void** ppOut, const void* pIn)')
hf_body.append('{')
hf_body.append(' const XGL_MEMORY_ALLOC_INFO* pInNow = pIn;')
@@ -1004,32 +983,6 @@ class Subcommand(object):
hf_body.append(' return;')
hf_body.append('}')
hf_body.append('')
- hf_body.append('static size_t calculate_alloc_memory_size(const XGL_MEMORY_ALLOC_INFO* pNext)')
- hf_body.append('{')
- hf_body.append(' size_t siz = 0;')
- hf_body.append(' while (pNext != NULL)')
- hf_body.append(' {')
- hf_body.append(' switch (pNext->sType)')
- hf_body.append(' {')
- hf_body.append(' case XGL_STRUCTURE_TYPE_MEMORY_ALLOC_BUFFER_INFO:')
- hf_body.append(' {')
- hf_body.append(' siz += sizeof(XGL_MEMORY_ALLOC_BUFFER_INFO);')
- hf_body.append(' break;')
- hf_body.append(' }')
- hf_body.append(' case XGL_STRUCTURE_TYPE_MEMORY_ALLOC_IMAGE_INFO:')
- hf_body.append(' {')
- hf_body.append(' siz += sizeof(XGL_MEMORY_ALLOC_IMAGE_INFO);')
- hf_body.append(' break;')
- hf_body.append(' }')
- hf_body.append(' default:')
- hf_body.append(' glv_LogError("calculate_alloc_memory_size() bad internal state sType\\n");')
- hf_body.append(' break;')
- hf_body.append(' }')
- hf_body.append(' pNext = (XGL_MEMORY_ALLOC_INFO*)pNext->pNext;')
- hf_body.append(' }')
- hf_body.append(' return siz;')
- hf_body.append('}')
- hf_body.append('')
hf_body.append('static size_t calculate_memory_barrier_size(uint32_t mbCount, const void** ppMemBarriers)')
hf_body.append('{')
hf_body.append(' uint32_t i, siz=0;')
@@ -1052,22 +1005,6 @@ class Subcommand(object):
hf_body.append(' }')
hf_body.append(' return siz;')
hf_body.append('}')
- hf_body.append('static size_t calculate_pipeline_shader_size(const XGL_PIPELINE_SHADER* shader)')
- hf_body.append('{')
- hf_body.append(' size_t size = 0;')
- hf_body.append(' size += sizeof(XGL_PIPELINE_SHADER);')
- hf_body.append(' // constant buffers')
- hf_body.append(' if (shader->linkConstBufferCount > 0 && shader->pLinkConstBufferInfo != NULL)')
- hf_body.append(' {')
- hf_body.append(' uint32_t i;')
- hf_body.append(' for (i = 0; i < shader->linkConstBufferCount; i++)')
- hf_body.append(' {')
- hf_body.append(' size += sizeof(XGL_LINK_CONST_BUFFER);')
- hf_body.append(' size += shader->pLinkConstBufferInfo[i].bufferSize;')
- hf_body.append(' }')
- hf_body.append(' }')
- hf_body.append(' return size;')
- hf_body.append('}')
hf_body.append('')
hf_body.append('static void add_pipeline_shader_to_trace_packet(glv_trace_packet_header* pHeader, XGL_PIPELINE_SHADER* packetShader, const XGL_PIPELINE_SHADER* paramShader)')
hf_body.append('{')
@@ -1097,18 +1034,6 @@ class Subcommand(object):
hf_body.append(' }')
hf_body.append('}')
hf_body.append('')
- hf_body.append('static size_t calculate_create_ds_layout_size(const XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO* pCreateInfo)')
- hf_body.append('{')
- hf_body.append(' size_t update_size = 0;')
- hf_body.append(' XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO* pTrav = (XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO*)pCreateInfo;')
- hf_body.append(' while (pTrav)')
- hf_body.append(' {')
- hf_body.append(' update_size += sizeof(XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO);')
- hf_body.append(' pTrav = (XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO*)pTrav->pNext;')
- hf_body.append(' }')
- hf_body.append(' return update_size;')
- hf_body.append('}')
- hf_body.append('')
hf_body.append('static void add_create_ds_layout_to_trace_packet(glv_trace_packet_header* pHeader, void** ppOut, const void* pIn)')
hf_body.append('{')
hf_body.append(' const XGL_DESCRIPTOR_SET_LAYOUT_CREATE_INFO* pInNow = pIn;')
@@ -1125,47 +1050,6 @@ class Subcommand(object):
hf_body.append(' return;')
hf_body.append('}')
hf_body.append('')
- hf_body.append('static size_t calculate_update_descriptors_size(const void* pUpdateChain)')
- hf_body.append('{')
- hf_body.append(' const XGL_UPDATE_SAMPLERS* pNext = pUpdateChain;')
- hf_body.append(' size_t totalUpdateSize = 0;')
- hf_body.append(' while (pNext)')
- hf_body.append(' {')
- hf_body.append(' switch (pNext->sType)')
- hf_body.append(' {')
- hf_body.append(' case XGL_STRUCTURE_TYPE_UPDATE_SAMPLERS:')
- hf_body.append(' {')
- hf_body.append(' totalUpdateSize += sizeof(XGL_UPDATE_SAMPLERS) + ((XGL_UPDATE_SAMPLERS*)pNext)->count * sizeof(XGL_SAMPLER);')
- hf_body.append(' break;')
- hf_body.append(' }')
- hf_body.append(' case XGL_STRUCTURE_TYPE_UPDATE_SAMPLER_TEXTURES:')
- hf_body.append(' {')
- hf_body.append(' totalUpdateSize += sizeof(XGL_UPDATE_SAMPLER_TEXTURES) + ((XGL_UPDATE_SAMPLER_TEXTURES*)pNext)->count * (sizeof(XGL_SAMPLER_IMAGE_VIEW_INFO) + sizeof(XGL_IMAGE_VIEW_ATTACH_INFO));')
- hf_body.append(' break;')
- hf_body.append(' }')
- hf_body.append(' case XGL_STRUCTURE_TYPE_UPDATE_IMAGES:')
- hf_body.append(' {')
- hf_body.append(' totalUpdateSize += sizeof(XGL_UPDATE_IMAGES) + (((XGL_UPDATE_IMAGES*)pNext)->count * (sizeof(XGL_IMAGE_VIEW_ATTACH_INFO) + sizeof(XGL_IMAGE_VIEW_ATTACH_INFO*)));')
- hf_body.append(' break;')
- hf_body.append(' }')
- hf_body.append(' case XGL_STRUCTURE_TYPE_UPDATE_BUFFERS:')
- hf_body.append(' {')
- hf_body.append(' totalUpdateSize += sizeof(XGL_UPDATE_BUFFERS) + (((XGL_UPDATE_BUFFERS*)pNext)->count * (sizeof(XGL_BUFFER_VIEW_ATTACH_INFO) + sizeof(XGL_BUFFER_VIEW_ATTACH_INFO*)));')
- hf_body.append(' break;')
- hf_body.append(' }')
- hf_body.append(' case XGL_STRUCTURE_TYPE_UPDATE_AS_COPY:')
- hf_body.append(' {')
- hf_body.append(' totalUpdateSize += sizeof(XGL_UPDATE_AS_COPY);')
- hf_body.append(' break;')
- hf_body.append(' }')
- hf_body.append(' default:')
- hf_body.append(' assert(0);')
- hf_body.append(' }')
- hf_body.append(' pNext = (XGL_UPDATE_SAMPLERS*)pNext->pNext;')
- hf_body.append(' }')
- hf_body.append(' return totalUpdateSize;')
- hf_body.append('}')
- hf_body.append('')
hf_body.append('static void add_update_descriptors_to_trace_packet(glv_trace_packet_header* pHeader, void** ppOut, const void* pIn)')
hf_body.append('{')
hf_body.append(' const XGL_UPDATE_SAMPLERS* pInNow = pIn;')
@@ -1248,14 +1132,6 @@ class Subcommand(object):
hf_body.append(' return;')
hf_body.append('}')
hf_body.append('')
- hf_body.append('static size_t calculate_pipeline_state_size(const void* pState)')
- hf_body.append('{')
- hf_body.append(' const XGL_GRAPHICS_PIPELINE_CREATE_INFO* pNext = pState;')
- hf_body.append(' size_t totalStateSize = 0;')
- hf_body.append(' while (pNext)')
- hf_body.append(' {')
- hf_body.append(' switch (pNext->sType)')
- hf_body.append(' {')
pipe_state_list = ['IA_STATE_CREATE_INFO',
'TESS_STATE_CREATE_INFO',
'RS_STATE_CREATE_INFO',
@@ -1263,36 +1139,6 @@ class Subcommand(object):
'VP_STATE_CREATE_INFO',
'MS_STATE_CREATE_INFO'
]
- for pipe_state in pipe_state_list:
- hf_body.append(' case XGL_STRUCTURE_TYPE_PIPELINE_%s:' % pipe_state)
- hf_body.append(' totalStateSize += sizeof(XGL_PIPELINE_%s);' % pipe_state)
- hf_body.append(' break;')
- hf_body.append(' case XGL_STRUCTURE_TYPE_PIPELINE_CB_STATE_CREATE_INFO:')
- hf_body.append(' {')
- hf_body.append(' totalStateSize += (sizeof(XGL_PIPELINE_CB_STATE_CREATE_INFO) + ((XGL_PIPELINE_CB_STATE_CREATE_INFO *) pNext)->attachmentCount * sizeof(XGL_PIPELINE_CB_ATTACHMENT_STATE));')
- hf_body.append(' break;')
- hf_body.append(' }')
- hf_body.append(' case XGL_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO:')
- hf_body.append(' {')
- hf_body.append(' const XGL_PIPELINE_SHADER_STAGE_CREATE_INFO* pShaderStage = (const XGL_PIPELINE_SHADER_STAGE_CREATE_INFO*)pNext;')
- hf_body.append(' totalStateSize += (sizeof(XGL_PIPELINE_SHADER_STAGE_CREATE_INFO) + calculate_pipeline_shader_size(&pShaderStage->shader));')
- hf_body.append(' break;')
- hf_body.append(' }')
- hf_body.append(' case XGL_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_CREATE_INFO:')
- hf_body.append(' {')
- hf_body.append(' const XGL_PIPELINE_VERTEX_INPUT_CREATE_INFO* pVi = (const XGL_PIPELINE_VERTEX_INPUT_CREATE_INFO*)pNext;')
- hf_body.append(' totalStateSize += sizeof(XGL_PIPELINE_VERTEX_INPUT_CREATE_INFO) + pVi->bindingCount * sizeof(XGL_VERTEX_INPUT_BINDING_DESCRIPTION)')
- hf_body.append(' + pVi->attributeCount * sizeof(XGL_VERTEX_INPUT_ATTRIBUTE_DESCRIPTION);')
- hf_body.append(' break;')
- hf_body.append(' }')
- hf_body.append(' default:')
- hf_body.append(' assert(0);')
- hf_body.append(' }')
- hf_body.append(' pNext = (XGL_GRAPHICS_PIPELINE_CREATE_INFO*)pNext->pNext;')
- hf_body.append(' }')
- hf_body.append(' return totalStateSize;')
- hf_body.append('}')
- hf_body.append('')
hf_body.append('static void add_pipeline_state_to_trace_packet(glv_trace_packet_header* pHeader, void** ppOut, const void* pIn)')
hf_body.append('{')
hf_body.append(' const XGL_GRAPHICS_PIPELINE_CREATE_INFO* pInNow = pIn;')
@@ -3551,6 +3397,7 @@ class GlaveTraceC(Subcommand):
header_txt.append('#include "glvtrace_xgl_xglwsix11ext.h"')
header_txt.append('#include "glv_interconnect.h"')
header_txt.append('#include "glv_filelike.h"')
+ header_txt.append('#include "xgl_struct_size_helper.h"')
header_txt.append('#ifdef WIN32')
header_txt.append('#include "mhook/mhook-lib/mhook.h"')
header_txt.append('#endif')
diff --git a/layers/CMakeLists.txt b/layers/CMakeLists.txt
index 774574c1..c8c6ca72 100644
--- a/layers/CMakeLists.txt
+++ b/layers/CMakeLists.txt
@@ -65,6 +65,7 @@ run_xgl_helper(gen_struct_wrappers
xgl_struct_string_helper_cpp.h
xgl_struct_string_helper_no_addr.h
xgl_struct_string_helper_no_addr_cpp.h
+ xgl_struct_size_helper.h
xgl_struct_wrappers.h
xgl_struct_wrappers.cpp
)
diff --git a/xgl_helper.py b/xgl_helper.py
index 3258cea8..56ce09b3 100755
--- a/xgl_helper.py
+++ b/xgl_helper.py
@@ -354,6 +354,8 @@ class StructWrapperGen:
self.shg = CommonFileGen(self.string_helper_filename)
self.shcppg = CommonFileGen(self.string_helper_cpp_filename)
self.vhg = CommonFileGen(self.validate_helper_filename)
+ self.size_helper_filename = os.path.join(out_dir, self.api+"_struct_size_helper.h")
+ self.size_helper_gen = CommonFileGen(self.size_helper_filename)
#print(self.header_filename)
self.header_txt = ""
self.definition_txt = ""
@@ -418,6 +420,13 @@ class StructWrapperGen:
self.vhg.setBody(self._generateValidateHelperFunctions())
self.vhg.generate()
+ def generateSizeHelper(self):
+ print("Generating struct size helper")
+ self.size_helper_gen.setCopyright(self._generateCopyright())
+ self.size_helper_gen.setHeader(self._generateSizeHelperHeader())
+ self.size_helper_gen.setBody(self._generateSizeHelperFunctions())
+ self.size_helper_gen.generate()
+
def _generateCopyright(self):
return "//This is the copyright\n"
@@ -481,6 +490,9 @@ class StructWrapperGen:
def _get_vh_func_name(self, struct):
return self._get_func_name(struct, 'validate')
+ def _get_size_helper_func_name(self, struct):
+ return self._get_func_name(struct, 'size')
+
# Return elements to create formatted string for given struct member
def _get_struct_print_formatted(self, struct_member, pre_var_name="prefix", postfix = "\\n", struct_var_name="pStruct", struct_ptr=True, print_array=False):
struct_op = "->"
@@ -963,6 +975,97 @@ class StructWrapperGen:
#header.append("char* dynamic_display(const void* pStruct, const char* prefix);\n")
return "".join(header)
+ def _generateSizeHelperFunctions(self):
+ sh_funcs = []
+ # We do two passes, first pass just generates prototypes for all the functsions
+ for s in self.struct_dict:
+ sh_funcs.append('size_t %s(const %s* pStruct);' % (self._get_size_helper_func_name(s), typedef_fwd_dict[s]))
+ sh_funcs.append('\n')
+ for s in self.struct_dict:
+ skip_list = [] # Used when struct elements need to be skipped b/c size already accounted for
+ sh_funcs.append('size_t %s(const %s* pStruct)\n{' % (self._get_size_helper_func_name(s), typedef_fwd_dict[s]))
+ indent = ' '
+ sh_funcs.append('%ssize_t structSize = 0;' % (indent))
+ sh_funcs.append('%sif (pStruct) {' % (indent))
+ indent = ' '
+ sh_funcs.append('%sstructSize = sizeof(%s);' % (indent, typedef_fwd_dict[s]))
+ i_decl = False
+ for m in sorted(self.struct_dict[s]):
+ if m in skip_list:
+ continue
+ if self.struct_dict[s][m]['dyn_array']:
+ if self.struct_dict[s][m]['full_type'].count('*') > 1:
+ if not is_type(self.struct_dict[s][m]['type'], 'struct') and not 'char' in self.struct_dict[s][m]['type'].lower():
+ sh_funcs.append('%sstructSize += pStruct->%s*(sizeof(%s*) + sizeof(%s));' % (indent, self.struct_dict[s][m]['array_size'], self.struct_dict[s][m]['type'], self.struct_dict[s][m]['type']))
+ else: # This is an array of char* or array of struct ptrs
+ if not i_decl:
+ sh_funcs.append('%suint32_t i = 0;' % (indent))
+ i_decl = True
+ sh_funcs.append('%sfor (i = 0; i < pStruct->%s; i++) {' % (indent, self.struct_dict[s][m]['array_size']))
+ indent = ' '
+ if is_type(self.struct_dict[s][m]['type'], 'struct'):
+ sh_funcs.append('%sstructSize += (sizeof(%s*) + %s(pStruct->%s[i]));' % (indent, self.struct_dict[s][m]['type'], self._get_size_helper_func_name(self.struct_dict[s][m]['type']), self.struct_dict[s][m]['name']))
+ else:
+ sh_funcs.append('%sstructSize += (sizeof(char) * strlen(pStruct->%s[i]));' % (indent, self.struct_dict[s][m]['name']))
+ indent = ' '
+ sh_funcs.append('%s}' % (indent))
+ else:
+ if is_type(self.struct_dict[s][m]['type'], 'struct'):
+ if not i_decl:
+ sh_funcs.append('%suint32_t i = 0;' % (indent))
+ i_decl = True
+ sh_funcs.append('%sfor (i = 0; i < pStruct->%s; i++) {' % (indent, self.struct_dict[s][m]['array_size']))
+ indent = ' '
+ sh_funcs.append('%sstructSize += %s(&pStruct->%s[i]);' % (indent, self._get_size_helper_func_name(self.struct_dict[s][m]['type']), self.struct_dict[s][m]['name']))
+ indent = ' '
+ sh_funcs.append('%s}' % (indent))
+ else:
+ sh_funcs.append('%sstructSize += pStruct->%s*sizeof(%s);' % (indent, self.struct_dict[s][m]['array_size'], self.struct_dict[s][m]['type']))
+ elif self.struct_dict[s][m]['ptr'] and 'pNext' != self.struct_dict[s][m]['name']:
+ if 'char' in self.struct_dict[s][m]['type'].lower():
+ sh_funcs.append('%sstructSize += sizeof(%s)*strlen(pStruct->%s);' % (indent, self.struct_dict[s][m]['type'], self.struct_dict[s][m]['name']))
+ elif is_type(self.struct_dict[s][m]['type'], 'struct'):
+ sh_funcs.append('%sstructSize += %s(pStruct->%s);' % (indent, self._get_size_helper_func_name(self.struct_dict[s][m]['type']), self.struct_dict[s][m]['name']))
+ else:
+ sh_funcs.append('%sstructSize += sizeof(%s);' % (indent, self.struct_dict[s][m]['type']))
+ elif 'size_t' == self.struct_dict[s][m]['type'].lower():
+ sh_funcs.append('%sstructSize += pStruct->%s;' % (indent, self.struct_dict[s][m]['name']))
+ skip_list.append(m+1)
+ indent = ' '
+ sh_funcs.append('%s}' % (indent))
+ sh_funcs.append("%sreturn structSize;\n}" % (indent))
+ # Now generate generic function to loop over struct chain (or handle generic structs)
+ sh_funcs.append('size_t get_struct_chain_size(const void* pStruct)\n{')
+ sh_funcs.append(' // Just use XGL_APPLICATION_INFO as struct until actual type is resolved')
+ sh_funcs.append(' XGL_APPLICATION_INFO* pNext = (XGL_APPLICATION_INFO*)pStruct;')
+ sh_funcs.append(' size_t structSize = 0;')
+ sh_funcs.append(' while (pNext) {')
+ sh_funcs.append(' switch (pNext->sType) {')
+ for e in enum_type_dict:
+ if '_STRUCTURE_TYPE' in e:
+ for v in sorted(enum_type_dict[e]):
+ struct_name = v.replace("_STRUCTURE_TYPE", "")
+ sh_funcs.append(' case %s:\n {' % (v))
+ sh_funcs.append(' structSize += %s((%s*)pNext);' % (self._get_size_helper_func_name(struct_name), struct_name))
+ sh_funcs.append(' break;')
+ sh_funcs.append(' }')
+ sh_funcs.append(" default:")
+ sh_funcs.append(" structSize += 0;")
+ sh_funcs.append(' }')
+ sh_funcs.append(' pNext = (XGL_APPLICATION_INFO*)pNext->pNext;')
+ sh_funcs.append(' }')
+ sh_funcs.append(' return structSize;\n}')
+ return "\n".join(sh_funcs)
+
+ def _generateSizeHelperHeader(self):
+ header = []
+ header.append("//#includes, #defines, globals and such...\n")
+ for f in self.include_headers:
+ header.append("#include <%s>\n" % f)
+ header.append('\n// Function Prototypes\n')
+ header.append("size_t get_struct_chain_size(const void* pStruct);\n")
+ return "".join(header)
+
def _generateHeader(self):
header = []
header.append("//#includes, #defines, globals and such...\n")
@@ -1421,6 +1524,8 @@ def main(argv=None):
sw.generateStringHelperCpp()
sw.set_no_addr(False)
sw.generateStringHelperCpp()
+ sw.set_include_headers(["stdio.h", "stdlib.h"])
+ sw.generateSizeHelper()
if opts.gen_cmake:
cmg = CMakeGen(sw, os.path.dirname(enum_sh_filename))
cmg.generate()