summaryrefslogtreecommitdiff
path: root/plugins/itanium/component.c
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2018-07-04 10:24:39 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2018-07-04 10:24:39 (GMT)
commit1ade82e135d4e815db5b33c9ebd67632b74e5e1d (patch)
treeeafda5b3e4062922ee4f0b64e8f90695bfbde9c3 /plugins/itanium/component.c
parent8dc83465a6ca2d5b94b983b39f6c06d37e4126a0 (diff)
Fixed various mistakes in Itanium C++ demangling.
Diffstat (limited to 'plugins/itanium/component.c')
-rw-r--r--plugins/itanium/component.c63
1 files changed, 24 insertions, 39 deletions
diff --git a/plugins/itanium/component.c b/plugins/itanium/component.c
index 6e580f6..d890a1b 100644
--- a/plugins/itanium/component.c
+++ b/plugins/itanium/component.c
@@ -48,9 +48,6 @@
typedef void (* visit_comp_fc) (itanium_component *);
-#define reset_comp_hash(c) c->hash = 0
-
-
/* Crée un composant de contexte Itanium complètement vierge. */
static itanium_component *itd_alloc(void);
@@ -191,6 +188,7 @@ static void visit_comp(itanium_component *comp, visit_comp_fc visitor)
break;
case ICT_TYPE:
+ case ICT_VENDOR_TYPE:
break;
case ICT_QUALIFIED_TYPE:
@@ -227,7 +225,7 @@ static void visit_comp(itanium_component *comp, visit_comp_fc visitor)
break;
case ICT_ARRAY:
- if (!comp->array.numbered_dim)
+ if (!comp->array.numbered_dim && comp->array.dim_expr != NULL)
visit_comp(comp->array.dim_expr, visitor);
visit_comp(comp->array.atype, visitor);
break;
@@ -237,6 +235,10 @@ static void visit_comp(itanium_component *comp, visit_comp_fc visitor)
visit_comp(comp->pmember.member, visitor);
break;
+ case ICT_TEMPLATE_PARAM:
+ visit_comp(comp->unary, visitor);
+ break;
+
case ICT_TEMPLATE_ARGS:
visit_comp(comp->unary, visitor);
break;
@@ -320,7 +322,7 @@ void itd_unref_comp(itanium_component *comp)
{
if (--comp->refcount == 0)
{
- if (comp->type == ICT_TYPE || comp->type == ICT_STD_SUBST)
+ if (comp->type == ICT_TYPE || comp->type == ICT_VENDOR_TYPE || comp->type == ICT_STD_SUBST)
g_object_unref(G_OBJECT(comp->dtype));
itd_free(comp);
@@ -336,34 +338,6 @@ void itd_unref_comp(itanium_component *comp)
/******************************************************************************
* *
-* Paramètres : comp = composant à manipuler. *
-* *
-* Description : Détermine ou fournit l'empreinte d'un composant. *
-* *
-* Retour : - *
-* *
-* Remarques : - *
-* *
-******************************************************************************/
-
-fnv64_t itd_hash_comp(itanium_component *comp)
-{
- char *desc; /* Description du composant */
-
- if (comp->hash == 0)
- {
- desc = itd_translate_component(comp, NULL);
- comp->hash = fnv_64a_hash(desc);
- free(desc);
- }
-
- return comp->hash;
-
-}
-
-
-/******************************************************************************
-* *
* Paramètres : type = type à définir pour le composant. *
* *
* Description : Construit un composant dans un contexte Itanium. *
@@ -797,7 +771,7 @@ itanium_component *itd_append_right_to_binary(ItaniumComponentType type, itanium
if (parent != NULL)
{
for (iter = parent; iter->binary.right != NULL; iter = iter->binary.right)
- reset_comp_hash(iter);
+ ;
iter->binary.right = result;
}
@@ -854,8 +828,6 @@ void itd_set_type(itanium_component *comp, ItaniumComponentType type)
{
comp->type = type;
- reset_comp_hash(comp);
-
}
@@ -1025,6 +997,7 @@ char *itd_translate_component(const itanium_component *comp, char *base)
break;
case ICT_TYPE:
+ case ICT_VENDOR_TYPE:
name = g_data_type_to_string(comp->dtype, true);
result = stradd(base, name);
free(name);
@@ -1112,7 +1085,7 @@ char *itd_translate_component(const itanium_component *comp, char *base)
free(tmp);
}
- else
+ else if (comp->array.dim_expr != NULL)
result = itd_translate_component(comp->array.dim_expr, result);
result = stradd(result, "]");
@@ -1125,6 +1098,10 @@ char *itd_translate_component(const itanium_component *comp, char *base)
result = itd_translate_component(comp->pmember.member, result);
break;
+ case ICT_TEMPLATE_PARAM:
+ result = itd_translate_component(comp->unary, base);
+ break;
+
case ICT_TEMPLATE_ARGS:
result = stradd(base, "<");
result = itd_translate_component(comp->unary, result);
@@ -1543,6 +1520,7 @@ GDataType *itd_translate_component_to_type(const itanium_component *comp)
break;
case ICT_TYPE:
+ case ICT_VENDOR_TYPE:
result = g_data_type_dup(comp->dtype);
break;
@@ -1631,9 +1609,12 @@ GDataType *itd_translate_component_to_type(const itanium_component *comp)
if (comp->array.numbered_dim)
g_array_type_set_dimension_number(G_ARRAY_TYPE(result), comp->array.dim_number);
- else
+ else if (comp->array.dim_expr != NULL)
g_array_type_set_dimension_expression(G_ARRAY_TYPE(result),
- itd_translate_component(comp, NULL));
+ itd_translate_component(comp->array.dim_expr, NULL));
+
+ else
+ g_array_type_set_empty_dimension(G_ARRAY_TYPE(result));
}
@@ -1660,6 +1641,10 @@ GDataType *itd_translate_component_to_type(const itanium_component *comp)
break;
+ case ICT_TEMPLATE_PARAM:
+ result = itd_translate_component_to_type(comp->unary);
+ break;
+
case ICT_TEMPLATE_ARGS:
assert(comp->unary->type == ICT_TYPES_LIST);