callsite: support instruction pointer field
[babeltrace.git] / formats / ctf / metadata / ctf-visitor-generate-io-struct.c
index 0e9fe7961845ca9b99c8d7d30d881eb1bb26fc58..de9986113de508f36bfe66ac5950c6786da728ef 100644 (file)
@@ -2507,6 +2507,19 @@ int ctf_callsite_declaration_visit(FILE *fd, int depth, struct ctf_node *node,
                                goto error;
                        }
                        CTF_CALLSITE_SET_FIELD(callsite, line);
+               } else if (!strcmp(left, "ip")) {
+                       if (CTF_CALLSITE_FIELD_IS_SET(callsite, ip)) {
+                               fprintf(fd, "[error] %s: ip already declared in callsite declaration\n", __func__);
+                               ret = -EPERM;
+                               goto error;
+                       }
+                       ret = get_unary_unsigned(&node->u.ctf_expression.right, &callsite->ip);
+                       if (ret) {
+                               fprintf(fd, "[error] %s: unexpected unary expression for callsite ip\n", __func__);
+                               ret = -EINVAL;
+                               goto error;
+                       }
+                       CTF_CALLSITE_SET_FIELD(callsite, ip);
                } else {
                        fprintf(fd, "[warning] %s: attribute \"%s\" is unknown in callsite declaration.\n", __func__, left);
                }
@@ -2529,6 +2542,7 @@ int ctf_callsite_visit(FILE *fd, int depth, struct ctf_node *node, struct ctf_tr
        int ret = 0;
        struct ctf_node *iter;
        struct ctf_callsite *callsite;
+       struct ctf_callsite_dups *cs_dups;
 
        callsite = g_new0(struct ctf_callsite, 1);
        bt_list_for_each_entry(iter, &node->u.callsite.declaration_list, siblings) {
@@ -2557,7 +2571,15 @@ int ctf_callsite_visit(FILE *fd, int depth, struct ctf_node *node, struct ctf_tr
                goto error;
        }
 
-       g_hash_table_insert(trace->callsites, (gpointer) (unsigned long) callsite->name, callsite);
+       cs_dups = g_hash_table_lookup(trace->callsites,
+               (gpointer) (unsigned long) callsite->name);
+       if (!cs_dups) {
+               cs_dups = g_new0(struct ctf_callsite_dups, 1);
+               BT_INIT_LIST_HEAD(&cs_dups->head);
+               g_hash_table_insert(trace->callsites,
+                       (gpointer) (unsigned long) callsite->name, cs_dups);
+       }
+       bt_list_add_tail(&callsite->node, &cs_dups->head);
        return 0;
 
 error:
@@ -2570,11 +2592,14 @@ error:
 static
 void callsite_free(gpointer data)
 {
-       struct ctf_callsite *callsite = data;
+       struct ctf_callsite_dups *cs_dups = data;
+       struct ctf_callsite *callsite, *cs_n;
 
-       g_free(callsite->func);
-       g_free(callsite->file);
-       g_free(callsite);
+       bt_list_for_each_entry_safe(callsite, cs_n, &cs_dups->head, node) {
+               g_free(callsite->func);
+               g_free(callsite->file);
+               g_free(callsite);
+       }
 }
 
 static
This page took 0.02353 seconds and 4 git commands to generate.