__dsos__findnew_link_by_longname_id(root, dso, NULL, id);
 }
 
+static int __dso_id__cmp(struct dso_id *a, struct dso_id *b)
+{
+       if (a->maj > b->maj) return -1;
+       if (a->maj < b->maj) return 1;
+
+       if (a->min > b->min) return -1;
+       if (a->min < b->min) return 1;
+
+       if (a->ino > b->ino) return -1;
+       if (a->ino < b->ino) return 1;
+
+       /*
+        * Synthesized MMAP events have zero ino_generation, avoid comparing
+        * them with MMAP events with actual ino_generation.
+        *
+        * I found it harmful because the mismatch resulted in a new
+        * dso that did not have a build ID whereas the original dso did have a
+        * build ID. The build ID was essential because the object was not found
+        * otherwise. - Adrian
+        */
+       if (a->ino_generation && b->ino_generation) {
+               if (a->ino_generation > b->ino_generation) return -1;
+               if (a->ino_generation < b->ino_generation) return 1;
+       }
+
+       return 0;
+}
+
+bool dso_id__empty(struct dso_id *id)
+{
+       if (!id)
+               return true;
+
+       return !id->maj && !id->min && !id->ino && !id->ino_generation;
+}
+
+void dso__inject_id(struct dso *dso, struct dso_id *id)
+{
+       dso->id.maj = id->maj;
+       dso->id.min = id->min;
+       dso->id.ino = id->ino;
+       dso->id.ino_generation = id->ino_generation;
+}
+
+int dso_id__cmp(struct dso_id *a, struct dso_id *b)
+{
+       /*
+        * The second is always dso->id, so zeroes if not set, assume passing
+        * NULL for a means a zeroed id
+        */
+       if (dso_id__empty(a) || dso_id__empty(b))
+               return 0;
+
+       return __dso_id__cmp(a, b);
+}
+
+int dso__cmp_id(struct dso *a, struct dso *b)
+{
+       return __dso_id__cmp(&a->id, &b->id);
+}
+
 void dso__set_long_name(struct dso *dso, const char *name, bool name_allocated)
 {
        dso__set_long_name_id(dso, name, NULL, name_allocated);
 
        dso->loaded = true;
 }
 
+int dso_id__cmp(struct dso_id *a, struct dso_id *b);
+bool dso_id__empty(struct dso_id *id);
+
 struct dso *dso__new_id(const char *name, struct dso_id *id);
 struct dso *dso__new(const char *name);
 void dso__delete(struct dso *dso);
 int dso__cmp_id(struct dso *a, struct dso *b);
 void dso__set_short_name(struct dso *dso, const char *name, bool name_allocated);
 void dso__set_long_name(struct dso *dso, const char *name, bool name_allocated);
+void dso__inject_id(struct dso *dso, struct dso_id *id);
 
 int dso__name_len(const struct dso *dso);
 
 
        exit_rwsem(&dsos->lock);
 }
 
-static int __dso_id__cmp(struct dso_id *a, struct dso_id *b)
-{
-       if (a->maj > b->maj) return -1;
-       if (a->maj < b->maj) return 1;
-
-       if (a->min > b->min) return -1;
-       if (a->min < b->min) return 1;
-
-       if (a->ino > b->ino) return -1;
-       if (a->ino < b->ino) return 1;
-
-       /*
-        * Synthesized MMAP events have zero ino_generation, avoid comparing
-        * them with MMAP events with actual ino_generation.
-        *
-        * I found it harmful because the mismatch resulted in a new
-        * dso that did not have a build ID whereas the original dso did have a
-        * build ID. The build ID was essential because the object was not found
-        * otherwise. - Adrian
-        */
-       if (a->ino_generation && b->ino_generation) {
-               if (a->ino_generation > b->ino_generation) return -1;
-               if (a->ino_generation < b->ino_generation) return 1;
-       }
-
-       return 0;
-}
-
-static bool dso_id__empty(struct dso_id *id)
-{
-       if (!id)
-               return true;
-
-       return !id->maj && !id->min && !id->ino && !id->ino_generation;
-}
-
-static void dso__inject_id(struct dso *dso, struct dso_id *id)
-{
-       dso->id.maj = id->maj;
-       dso->id.min = id->min;
-       dso->id.ino = id->ino;
-       dso->id.ino_generation = id->ino_generation;
-}
-
-static int dso_id__cmp(struct dso_id *a, struct dso_id *b)
-{
-       /*
-        * The second is always dso->id, so zeroes if not set, assume passing
-        * NULL for a means a zeroed id
-        */
-       if (dso_id__empty(a) || dso_id__empty(b))
-               return 0;
-
-       return __dso_id__cmp(a, b);
-}
-
-int dso__cmp_id(struct dso *a, struct dso *b)
-{
-       return __dso_id__cmp(&a->id, &b->id);
-}
-
 bool __dsos__read_build_ids(struct dsos *dsos, bool with_hits)
 {
        struct list_head *head = &dsos->head;