]> git.ipfire.org Git - thirdparty/elfutils.git/commitdiff
dwarflint: highlevel_check_i holds Dwarf et.al., pass it to die_check
authorPetr Machata <pmachata@redhat.com>
Wed, 6 Apr 2011 10:06:37 +0000 (12:06 +0200)
committerPetr Machata <pmachata@redhat.com>
Wed, 6 Apr 2011 10:06:37 +0000 (12:06 +0200)
dwarflint/Makefile.am
dwarflint/check_die_tree.cc
dwarflint/check_die_tree.hh
dwarflint/check_duplicate_DW_tag_variable.cc
dwarflint/dwarflint.hh
dwarflint/highlevel_check.hh
dwarflint/highlevel_check.ii [new file with mode: 0644]

index 6bc9113e2045128417120bc7cc8bf4dc744b7709..b9d7ef0e47a22b1da042870006cbc2f735385665 100644 (file)
@@ -59,7 +59,7 @@ dwarflint_SOURCES = \
        elf_file.hh elf_file.ii \
        expected-at.cc expected.hh \
        files.cc files.hh \
-       highlevel_check.cc highlevel_check.hh \
+       highlevel_check.cc highlevel_check.hh highlevel_check.ii \
        main.cc \
        messages.cc messages.hh \
        misc.cc misc.hh \
index 96f1bab52771cef9e1556ddc282a5de32670f25b..d7f0786c3d5d8e7319668fb47d9fabfb3b6b50ca 100644 (file)
@@ -41,7 +41,9 @@ class die_check_context
   checkdescriptor const *_m_cd;
 
 public:
-  die_check_context (checkdescriptor const *cd, dwarflint &lint,
+  die_check_context (highlevel_check_i *check,
+                    checkdescriptor const *cd,
+                    dwarflint &lint,
                     die_check_registrar const &registrar)
     : _m_cd (cd)
   {
@@ -61,7 +63,7 @@ public:
        stack.push_back ((*it)->descriptor ());
        popper p (stack);
        if (lint.rules ().should_check (stack))
-         push_back ((*it)->create (stack, lint));
+         push_back ((*it)->create (check, stack, lint));
       }
   }
 
@@ -125,7 +127,7 @@ public:
 check_die_tree::check_die_tree (checkstack &stack, dwarflint &lint)
   : highlevel_check<check_die_tree> (stack, lint)
 {
-  die_check_context ctx (descriptor (), lint, *dwarflint::die_registrar ());
+  die_check_context ctx (this, descriptor (), lint, *dwarflint::die_registrar ());
 
   for (all_dies_iterator<dwarf> it = all_dies_iterator<dwarf> (dw);
        it != all_dies_iterator<dwarf> (); ++it)
index cd0a14ed31ba6ac7a72f97a39d5a4e66bb383f03..7f9a4ec048af181d6090468d51181b23bd3de360 100644 (file)
@@ -69,9 +69,10 @@ struct reg_die_check
     dwarflint::die_registrar ()->push_back (this);
   }
 
-  virtual die_check *create (checkstack &stack, dwarflint &lint)
+  virtual die_check *create (highlevel_check_i *check,
+                            checkstack &stack, dwarflint &lint)
   {
-    return new T (stack, lint);
+    return new T (check, stack, lint);
   }
 
   virtual checkdescriptor const *descriptor () const
index cd6f4abfafe0fcf73b60b9f81cf0b1c1065763a9..84ab34f67aafbe8ace64d58690c20508a14f2ea3 100644 (file)
@@ -64,7 +64,8 @@ namespace
       return &cd;
     }
 
-    check_duplicate_DW_tag_variable (checkstack &, dwarflint &) {}
+    check_duplicate_DW_tag_variable (highlevel_check_i *,
+                                    checkstack &, dwarflint &) {}
 
     virtual void
     die (all_dies_iterator<dwarf> const &it)
index 6ee64943d413be3291a623e1f2524487fca85c98..199ed7ea6537af3d41b2951cec5ddf63e980762f 100644 (file)
@@ -37,6 +37,7 @@
 #include "checkrule.hh"
 #include "check_registrar.hh"
 #include "dwarflint.ii"
+#include "highlevel_check.ii"
 
 // Classes for full-blown check passes.
 struct main_check_item
@@ -59,7 +60,8 @@ struct die_check_item
 {
   virtual checkdescriptor const *descriptor () const = 0;
   virtual ~die_check_item () {}
-  virtual die_check *create (checkstack &stack, dwarflint &lint) = 0;
+  virtual die_check *create (highlevel_check_i *check,
+                            checkstack &stack, dwarflint &lint) = 0;
 };
 
 class die_check_registrar
index ddeb9e293b98bcebb6df631a68030444e21f3c3c..26dfbd3551bdc0852e7ca38f7fb858a0f3693999 100644 (file)
@@ -52,26 +52,35 @@ public:
   ~open_highlevel_dwarf ();
 };
 
+struct highlevel_check_i
+{
+  open_highlevel_dwarf *_m_loader;
+  Dwarf *const c_dw;
+  elfutils::dwarf const &dw;
+
+  highlevel_check_i (checkstack &stack, dwarflint &lint)
+    : _m_loader (lint.check (stack, _m_loader))
+    , c_dw (_m_loader->c_dw)
+    , dw (_m_loader->dw)
+  {}
+};
+
 template<class T>
 class highlevel_check
   : public check<highlevel_check<T> >
+  , public highlevel_check_i
 {
   open_highlevel_dwarf *_m_loader;
 public:
   static checkdescriptor const *descriptor () {
     static checkdescriptor cd
       (checkdescriptor::create ("highlevel_check")
-       .prereq<typeof (*_m_loader)> ());
+       .prereq<typeof (*highlevel_check_i::_m_loader)> ());
     return &cd;
   }
 
-  Dwarf *const c_dw;
-  elfutils::dwarf const &dw;
-
   highlevel_check (checkstack &stack, dwarflint &lint)
-    : _m_loader (lint.check (stack, _m_loader))
-    , c_dw (_m_loader->c_dw)
-    , dw (_m_loader->dw)
+    : highlevel_check_i (stack, lint)
   {}
 };
 
diff --git a/dwarflint/highlevel_check.ii b/dwarflint/highlevel_check.ii
new file mode 100644 (file)
index 0000000..ddf38e6
--- /dev/null
@@ -0,0 +1 @@
+class highlevel_check_i;