about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorFabrice Desclaux <fabrice.desclaux@cea.fr>2017-07-22 14:26:43 +0200
committerFabrice Desclaux <fabrice.desclaux@cea.fr>2017-08-04 17:04:24 +0200
commit19084a5729fd2ba5a0a13e19a82f12760d1861c9 (patch)
tree78589fa7ba52d39f0d5e71f73e59639bfae42bec
parent2e7e6f0536704cbcd40fba9d0308a73a1da92346 (diff)
downloadmiasm-19084a5729fd2ba5a0a13e19a82f12760d1861c9.tar.gz
miasm-19084a5729fd2ba5a0a13e19a82f12760d1861c9.zip
TypeMngr: generate name for unnamed structs/unions
-rw-r--r--miasm2/core/ctypesmngr.py31
1 files changed, 27 insertions, 4 deletions
diff --git a/miasm2/core/ctypesmngr.py b/miasm2/core/ctypesmngr.py
index eeffb696..761689a8 100644
--- a/miasm2/core/ctypesmngr.py
+++ b/miasm2/core/ctypesmngr.py
@@ -118,10 +118,12 @@ class CTypeStruct(CTypeBase):
     """C type for structure"""
 
     def __init__(self, name, fields=None):
+        assert name is not None
         self.name = name
         if fields is None:
             fields = ()
-        for _, field in fields:
+        for field_name, field in fields:
+            assert field_name is not None
             assert isinstance(field, CTypeBase)
         self.fields = tuple(fields)
         super(CTypeStruct, self).__init__()
@@ -146,10 +148,12 @@ class CTypeUnion(CTypeBase):
     """C type for union"""
 
     def __init__(self, name, fields=None):
+        assert name is not None
         self.name = name
         if fields is None:
             fields = []
-        for _, field in fields:
+        for field_name, field in fields:
+            assert field_name is not None
             assert isinstance(field, CTypeBase)
         self.fields = tuple(fields)
         super(CTypeUnion, self).__init__()
@@ -292,6 +296,7 @@ class FuncNameIdentifier(c_ast.NodeVisitor):
 class CAstTypes(object):
     """Store all defined C types and typedefs"""
     INTERNAL_PREFIX = "__GENTYPE__"
+    ANONYMOUS_PREFIX = "__ANONYMOUS__"
 
     def __init__(self, knowntypes=None, knowntypedefs=None):
         if knowntypes is None:
@@ -342,10 +347,20 @@ class CAstTypes(object):
         self.cpt += 1
         return self.INTERNAL_PREFIX + "%d" % cpt
 
+    def gen_anon_name(self):
+        """Generate name for anonymous strucs/union"""
+        cpt = self.cpt
+        self.cpt += 1
+        return self.ANONYMOUS_PREFIX + "%d" % cpt
+
     def is_generated_name(self, name):
         """Return True if the name is internal"""
         return name.startswith(self.INTERNAL_PREFIX)
 
+    def is_anonymous_name(self, name):
+        """Return True if the name is anonymous"""
+        return name.startswith(self.ANONYMOUS_PREFIX)
+
     def add_type(self, type_id, type_obj):
         """Add new C type
         @type_id: Type descriptor (CTypeBase instance)
@@ -521,7 +536,11 @@ class CAstTypes(object):
         args = []
         if ast.decls:
             for arg in ast.decls:
-                args.append((arg.name, self.ast_to_typeid(arg)))
+                if arg.name is None:
+                    arg_name = self.gen_anon_name()
+                else:
+                    arg_name = arg.name
+                args.append((arg_name, self.ast_to_typeid(arg)))
         decl = CTypeStruct(name, args)
         return decl
 
@@ -531,7 +550,11 @@ class CAstTypes(object):
         args = []
         if ast.decls:
             for arg in ast.decls:
-                args.append((arg.name, self.ast_to_typeid(arg)))
+                if arg.name is None:
+                    arg_name = self.gen_anon_name()
+                else:
+                    arg_name = arg.name
+                args.append((arg_name, self.ast_to_typeid(arg)))
         decl = CTypeUnion(name, args)
         return decl