+#endif /* NDEBUG */
+
+#ifndef NDEBUG
+
+static const char *firm_vrfy_failure_msg;
+
+/**
+ * Show diagnostic if an entity overwrites another one not
+ * in direct superclasses.
+ */
+static void show_ent_not_supertp(ir_entity *ent, ir_entity *ovw)
+{
+ ir_type *owner = get_entity_owner(ent);
+ ir_type *ov_own = get_entity_owner(ovw);
+ int i;
+
+ fprintf(stderr, "Type verification error:\n");
+ ir_fprintf(stderr, "Entity %+F::%+e owerwrites ", owner, ent);
+ ir_fprintf(stderr, "Entity %+F::%+e\n", ov_own, ovw);
+
+ ir_fprintf(stderr, "Supertypes of %+F:\n", owner);
+ for (i = 0; i < get_class_n_supertypes(owner); ++i) {
+ ir_type *super = get_class_supertype(owner, i);
+ ir_fprintf(stderr, " %+F:\n", super);
+ }
+}
+
+/**
+ * Show diagnostic if an entity overwrites a wrong number of things.
+ */
+static void show_ent_overwrite_cnt(ir_entity *ent)
+{
+ ir_type *owner = get_entity_owner(ent);
+ int i, j, k, found, show_stp = 0;
+
+ fprintf(stderr, "Type verification error:\n");
+ ir_fprintf(stderr, "Entity %t::%e owerwrites\n", owner, ent);
+ for (i = 0; i < get_entity_n_overwrites(ent); ++i) {
+ ir_entity *ovw = get_entity_overwrites(ent, i);
+ ir_type *ov_own = get_entity_owner(ovw);
+
+ ir_fprintf(stderr, " %t::%e\n", ov_own, ovw);
+ for (k = 0; k < i; ++k)
+ if (ovw == get_entity_overwrites(ent, k)) {
+ ir_fprintf(stderr, " ->%t::%e entered more than once\n", ov_own, ovw);
+ break;
+ }
+
+ found = 0;
+ for (j = get_class_n_supertypes(owner) - 1; j >= 0; --j) {
+ if (ov_own == get_class_supertype(owner, j)) {
+ show_stp = found = 1;
+ break;
+ }
+ }
+ if (! found)
+ ir_fprintf(stderr, " ->%t not in super types of %t\n", ov_own, owner);
+ }
+
+ if (show_stp) {
+ ir_fprintf(stderr, "Supertypes of %t:\n", owner);
+ for (i = 0; i < get_class_n_supertypes(owner); ++i) {
+ ir_type *super = get_class_supertype(owner, i);
+ ir_fprintf(stderr, " %t:\n", super);
+ }
+ }
+}
+
+#endif /* #ifndef NDEBUG */