]> sourceware.org Git - libabigail.git/commitdiff
Make decl_base::get_context_rel() return a naked pointer
authorDodji Seketeli <dodji@redhat.com>
Tue, 10 Mar 2015 10:45:46 +0000 (11:45 +0100)
committerDodji Seketeli <dodji@redhat.com>
Tue, 10 Mar 2015 15:02:37 +0000 (16:02 +0100)
Accessing the context relationship of declarations and setting some
member properties appear to be high in performance profiles due to
shared pointer handling.  This patch makes the context relationship
accessors return a naked pointer and also passes a bunch of shared
pointer as references around.

* include/abg-fwd.h (set_member_is_static): Add an overload that
takes the member as a reference to a smart pointer.
(set_member_function_{is_dtor, is_ctor, is_const, vtable_offset,
is_virtual}): Pass the member function as a reference.
(set_member_function_is_const, set_member_function_is_virtual):
Pass the member function as a non-const reference.
* include/abg-ir.h (decl_base::get_context_rel): Return a naked
pointer.
(set_member_is_static, set_member_function_is_virtual): Adjust
this friend declaration.
(set_member_access_specifier): Add an overload that takes a
reference to the member.  Pass a reference to smart pointer to the
other overload.
(set_member_function_is_{is_ctor,is_dtor,is_const,is_virtual,vtable_offset}):
Take a non-const reference to function_decl.
* src/abg-ir.cc (decl_base::get_context_rel): Likewise.
(equals(const decl_base&, const decl_base&, change_kind*)):
Adjust.
(equals(const var_decl&, const var_decl&, change_kind*)):
Likewise.
(get_member_access_specifier, get_member_is_static)
(set_data_member_offset, get_data_member_offset)
(set_data_member_is_laid_out, get_data_member_is_laid_out)
(get_member_function_is_ctor, set_member_function_is_ctor)
(get_member_function_is_dtor, set_member_function_is_dtor)
(get_member_function_is_const, set_member_function_is_const)
(get_member_function_vtable_offset)
(set_member_function_vtable_offset)
(get_member_function_is_virtual, set_member_function_is_virtual):
Likewise.
(set_member_access_specifier): Add an overload that takes a
reference to decl_base.
(set_member_is_static, set_member_function_{is_dtor, is_ctor,
is_const, vtable_offset, is_virtual}): Pass the member function as
a reference.): Add an overload that takes the member as a
reference, and write the older overload in terms of the new one.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
include/abg-fwd.h
include/abg-ir.h
src/abg-ir.cc

index 0c208b8fd11dc9130b3227dcfbb3f1ceafebe345..e236c9f5b44fd26ea2895adb78b2c054925b6f08 100644 (file)
@@ -298,7 +298,7 @@ void
 set_member_is_static(decl_base&, bool);
 
 void
-set_member_is_static(shared_ptr<decl_base>, bool);
+set_member_is_static(const shared_ptr<decl_base>&, bool);
 
 bool
 is_data_member(const var_decl&);
@@ -364,7 +364,7 @@ bool
 get_member_function_is_dtor(const shared_ptr<function_decl>);
 
 void
-set_member_function_is_dtor(const function_decl&, bool);
+set_member_function_is_dtor(function_decl&, bool);
 
 void
 set_member_function_is_dtor(const shared_ptr<function_decl>, bool);
@@ -376,7 +376,7 @@ bool
 get_member_function_is_const(const shared_ptr<function_decl>);
 
 void
-set_member_function_is_const(const function_decl&, bool);
+set_member_function_is_const(function_decl&, bool);
 
 void
 set_member_function_is_const(const shared_ptr<function_decl>, bool);
@@ -405,7 +405,7 @@ bool
 get_member_function_is_virtual(const function_decl*);
 
 void
-set_member_function_is_virtual(const function_decl&, bool);
+set_member_function_is_virtual(function_decl&, bool);
 
 void
 set_member_function_is_virtual(const shared_ptr<function_decl>&, bool);
index b77e792d0f27f9b79b651506f86e64c68d56c24f..a0fc462ff591ef3059f252878d89806f7b731a32 100644 (file)
@@ -669,10 +669,10 @@ public:
   set_scope(scope_decl*);
 
 protected:
-  const context_rel_sptr
+  const context_rel*
   get_context_rel() const;
 
-  context_rel_sptr
+  context_rel*
   get_context_rel();
 
   void
@@ -770,7 +770,7 @@ public:
   get_member_access_specifier(const decl_base_sptr d);
 
   friend void
-  set_member_access_specifier(const decl_base_sptr d,
+  set_member_access_specifier(decl_base& d,
                              access_specifier a);
 
   friend bool
@@ -780,13 +780,16 @@ public:
   get_member_is_static(const decl_base_sptr d);
 
   friend void
-  set_member_is_static(decl_base_sptr d, bool s);
+  set_member_is_static(const decl_base_sptr& d, bool s);
+
+  friend void
+  set_member_is_static(decl_base& d, bool s);
 
   friend bool
   get_member_function_is_virtual(const function_decl& f);
 
   friend void
-  set_member_function_is_virtual(const function_decl&, bool);
+  set_member_function_is_virtual(function_decl&, bool);
 
   friend class class_decl;
 };// end class decl_base
@@ -2644,8 +2647,13 @@ enum access_specifier
 get_member_access_specifier(const decl_base_sptr);
 
 void
-set_member_access_specifier(decl_base_sptr,
+set_member_access_specifier(decl_base&,
+                           access_specifier);
+
+void
+set_member_access_specifier(const decl_base_sptr&,
                            access_specifier);
+
 std::ostream&
 operator<<(std::ostream&, access_specifier);
 
@@ -2941,13 +2949,13 @@ public:
   get_member_function_is_ctor(const function_decl&);
 
   friend void
-  set_member_function_is_ctor(const function_decl&, bool);
+  set_member_function_is_ctor(function_decl&, bool);
 
   friend bool
   get_member_function_is_dtor(const function_decl&);
 
   friend void
-  set_member_function_is_dtor(const function_decl&, bool);
+  set_member_function_is_dtor(function_decl&, bool);
 
   friend bool
   get_member_function_is_static(const function_decl&);
@@ -2959,19 +2967,19 @@ public:
   get_member_function_is_const(const function_decl&);
 
   friend void
-  set_member_function_is_const(const function_decl&, bool);
+  set_member_function_is_const(function_decl&, bool);
 
   friend size_t
   get_member_function_vtable_offset(const function_decl&);
 
   friend void
-  set_member_function_vtable_offset(const function_decl&, size_t);
+  set_member_function_vtable_offset(function_decl&, size_t);
 
   friend bool
   get_member_function_is_virtual(const function_decl&);
 
   friend void
-  set_member_function_is_virtual(const function_decl&, bool);
+  set_member_function_is_virtual(function_decl&, bool);
 
   virtual ~method_decl();
 };// end class class_decl::method_decl
index b169a06957ff062d0c64578a79ccf100c868f72f..a1bc6f4ed562dc85785d8068c7dd970c5c029edb 100644 (file)
@@ -1193,16 +1193,16 @@ decl_base::set_qualified_name(const string& n) const
 ///Getter for the context relationship.
 ///
 ///@return the context relationship for the current decl_base.
-const context_rel_sptr
+const context_rel*
 decl_base::get_context_rel() const
-{return priv_->context_;}
+{return priv_->context_.get();}
 
 ///Getter for the context relationship.
 ///
 ///@return the context relationship for the current decl_base.
-context_rel_sptr
+context_rel*
 decl_base::get_context_rel()
-{return priv_->context_;}
+{return priv_->context_.get();}
 
 void
 decl_base::set_context_rel(context_rel_sptr c)
@@ -1490,7 +1490,7 @@ equals(const decl_base& l, const decl_base& r, change_kind* k)
 
   if (is_member_decl(l) && is_member_decl(r))
     {
-      context_rel_sptr r1 = l.get_context_rel(), r2 = r.get_context_rel();
+      const context_rel* r1 = l.get_context_rel(), *r2 = r.get_context_rel();
       if (*r1 != *r2)
        {
          result = false;
@@ -1723,7 +1723,7 @@ get_member_access_specifier(const decl_base& d)
 {
   assert(is_member_decl(d));
 
-  context_rel_sptr c = d.get_context_rel();
+  const context_rel* c = d.get_context_rel();
   assert(c);
 
   return c->get_access_specifier();
@@ -1748,17 +1748,29 @@ get_member_access_specifier(const decl_base_sptr d)
 ///
 /// @param a the new access specifier to set the class member to.
 void
-set_member_access_specifier(decl_base_sptr d,
+set_member_access_specifier(decl_base& d,
                            access_specifier a)
 {
   assert(is_member_decl(d));
 
-  context_rel_sptr c = d->get_context_rel();
+  context_rel* c = d.get_context_rel();
   assert(c);
 
   c->set_access_specifier(a);
 }
 
+/// Sets the access specifier for a class member.
+///
+/// @param d the class member to set the access specifier for.  Note
+/// that this must be a class member otherwise the function aborts the
+/// current process.
+///
+/// @param a the new access specifier to set the class member to.
+void
+set_member_access_specifier(const decl_base_sptr& d,
+                           access_specifier a)
+{set_member_access_specifier(*d, a);}
+
 /// Gets a flag saying if a class member is static or not.
 ///
 /// @param d the declaration for the class member to consider. Note
@@ -1771,7 +1783,7 @@ get_member_is_static(const decl_base&d)
 {
   assert(is_member_decl(d));
 
-  context_rel_sptr c = d.get_context_rel();
+  const context_rel* c = d.get_context_rel();
   assert(c);
 
   return c->get_is_static();
@@ -1808,16 +1820,28 @@ get_member_is_static(const decl_base_sptr d)
 /// @param s this must be true if the member is to be static, false
 /// otherwise.
 void
-set_member_is_static(decl_base_sptr d, bool s)
+set_member_is_static(decl_base& d, bool s)
 {
   assert(is_member_decl(d));
 
-  context_rel_sptr c = d->get_context_rel();
+  context_rel* c = d.get_context_rel();
   assert(c);
 
   c->set_is_static(s);
 }
 
+/// Sets the static-ness property of a class member.
+///
+/// @param d the class member to set the static-ness property for.
+/// Note that this must be a class member otherwise the function
+/// aborts the current process.
+///
+/// @param s this must be true if the member is to be static, false
+/// otherwise.
+void
+set_member_is_static(const decl_base_sptr& d, bool s)
+{set_member_is_static(*d, s);}
+
 /// Test if a var_decl is a data member.
 ///
 /// @param v the var_decl to consider.
@@ -1872,8 +1896,8 @@ set_data_member_offset(var_decl_sptr m, size_t o)
 {
   assert(is_data_member(m));
 
-  dm_context_rel_sptr ctxt_rel =
-    dynamic_pointer_cast<dm_context_rel>(m->get_context_rel());
+  dm_context_rel* ctxt_rel =
+    dynamic_cast<dm_context_rel*>(m->get_context_rel());
   assert(ctxt_rel);
 
   ctxt_rel->set_offset_in_bits(o);
@@ -1888,8 +1912,8 @@ size_t
 get_data_member_offset(const var_decl& m)
 {
   assert(is_data_member(m));
-  dm_context_rel_sptr ctxt_rel =
-    dynamic_pointer_cast<dm_context_rel>(m.get_context_rel());
+  const dm_context_rel* ctxt_rel =
+    dynamic_cast<const dm_context_rel*>(m.get_context_rel());
   assert(ctxt_rel);
   return ctxt_rel->get_offset_in_bits();
 }
@@ -1921,8 +1945,8 @@ void
 set_data_member_is_laid_out(var_decl_sptr m, bool l)
 {
   assert(is_data_member(m));
-  dm_context_rel_sptr ctxt_rel =
-    dynamic_pointer_cast<dm_context_rel>(m->get_context_rel());
+  dm_context_rel* ctxt_rel =
+    dynamic_cast<dm_context_rel*>(m->get_context_rel());
   ctxt_rel->set_is_laid_out(l);
 }
 
@@ -1935,8 +1959,8 @@ bool
 get_data_member_is_laid_out(const var_decl& m)
 {
   assert(is_data_member(m));
-  dm_context_rel_sptr ctxt_rel =
-    dynamic_pointer_cast<dm_context_rel>(m.get_context_rel());
+  const dm_context_rel* ctxt_rel =
+    dynamic_cast<const dm_context_rel*>(m.get_context_rel());
 
   return ctxt_rel->get_is_laid_out();
 }
@@ -1991,8 +2015,8 @@ get_member_function_is_ctor(const function_decl& f)
     dynamic_cast<const class_decl::method_decl*>(&f);
   assert(m);
 
-  mem_fn_context_rel_sptr ctxt =
-    dynamic_pointer_cast<mem_fn_context_rel>(m->get_context_rel());
+  const mem_fn_context_rel* ctxt =
+    dynamic_cast<const mem_fn_context_rel*>(m->get_context_rel());
 
   return ctxt->is_constructor();
 }
@@ -2014,16 +2038,16 @@ get_member_function_is_ctor(const function_decl_sptr f)
 /// @param f the new boolean value of the is_ctor property.  Is true
 /// if @p f is a constructor, false otherwise.
 void
-set_member_function_is_ctor(const function_decl& f, bool c)
+set_member_function_is_ctor(function_decl& f, bool c)
 {
   assert(is_member_function(f));
 
-  const class_decl::method_decl* m =
-    dynamic_cast<const class_decl::method_decl*>(&f);
+  class_decl::method_decl* m =
+    dynamic_cast<class_decl::method_decl*>(&f);
   assert(m);
 
-  mem_fn_context_rel_sptr ctxt =
-    dynamic_pointer_cast<mem_fn_context_rel>(m->get_context_rel());
+  mem_fn_context_rel* ctxt =
+    dynamic_cast<mem_fn_context_rel*>(m->get_context_rel());
 
   ctxt->is_constructor(c);
 }
@@ -2052,8 +2076,8 @@ get_member_function_is_dtor(const function_decl& f)
     dynamic_cast<const class_decl::method_decl*>(&f);
   assert(m);
 
-  mem_fn_context_rel_sptr ctxt =
-    dynamic_pointer_cast<mem_fn_context_rel>(m->get_context_rel());
+  const mem_fn_context_rel* ctxt =
+    dynamic_cast<const mem_fn_context_rel*>(m->get_context_rel());
 
   return ctxt->is_destructor();
 }
@@ -2073,16 +2097,16 @@ get_member_function_is_dtor(const function_decl_sptr f)
 ///
 /// @param d true if @p f is a destructor, false otherwise.
 void
-set_member_function_is_dtor(const function_decl& f, bool d)
+set_member_function_is_dtor(function_decl& f, bool d)
 {
     assert(is_member_function(f));
 
-  const class_decl::method_decl* m =
-    dynamic_cast<const class_decl::method_decl*>(&f);
+  class_decl::method_decl* m =
+    dynamic_cast<class_decl::method_decl*>(&f);
   assert(m);
 
-  mem_fn_context_rel_sptr ctxt =
-    dynamic_pointer_cast<mem_fn_context_rel>(m->get_context_rel());
+  mem_fn_context_rel* ctxt =
+    dynamic_cast<mem_fn_context_rel*>(m->get_context_rel());
 
   ctxt->is_destructor(d);
 }
@@ -2110,8 +2134,8 @@ get_member_function_is_const(const function_decl& f)
     dynamic_cast<const class_decl::method_decl*>(&f);
   assert(m);
 
-  mem_fn_context_rel_sptr ctxt =
-    dynamic_pointer_cast<mem_fn_context_rel>(m->get_context_rel());
+  const mem_fn_context_rel* ctxt =
+    dynamic_cast<const mem_fn_context_rel*>(m->get_context_rel());
 
   return ctxt->is_const();
 }
@@ -2131,16 +2155,16 @@ get_member_function_is_const(const function_decl_sptr f)
 ///
 /// @param is_const the new value of the const-ness property of @p f
 void
-set_member_function_is_const(const function_decl& f, bool is_const)
+set_member_function_is_const(function_decl& f, bool is_const)
 {
   assert(is_member_function(f));
 
-  const class_decl::method_decl* m =
-    dynamic_cast<const class_decl::method_decl*>(&f);
+  class_decl::method_decl* m =
+    dynamic_cast<class_decl::method_decl*>(&f);
   assert(m);
 
-  mem_fn_context_rel_sptr ctxt =
-    dynamic_pointer_cast<mem_fn_context_rel>(m->get_context_rel());
+  mem_fn_context_rel* ctxt =
+    dynamic_cast<mem_fn_context_rel*>(m->get_context_rel());
 
   ctxt->is_const(is_const);
 }
@@ -2168,8 +2192,8 @@ get_member_function_vtable_offset(const function_decl& f)
     dynamic_cast<const class_decl::method_decl*>(&f);
   assert(m);
 
-  mem_fn_context_rel_sptr ctxt =
-    dynamic_pointer_cast<mem_fn_context_rel>(m->get_context_rel());
+  const mem_fn_context_rel* ctxt =
+    dynamic_cast<const mem_fn_context_rel*>(m->get_context_rel());
 
   return ctxt->vtable_offset();
 }
@@ -2189,16 +2213,16 @@ get_member_function_vtable_offset(const function_decl_sptr f)
 ///
 /// @param s the new vtable offset.
 void
-set_member_function_vtable_offset(const function_decl& f, size_t s)
+set_member_function_vtable_offset(function_decl& f, size_t s)
 {
   assert(is_member_function(f));
 
-  const class_decl::method_decl* m =
-    dynamic_cast<const class_decl::method_decl*>(&f);
+  class_decl::method_decl* m =
+    dynamic_cast<class_decl::method_decl*>(&f);
   assert(m);
 
-  mem_fn_context_rel_sptr ctxt =
-    dynamic_pointer_cast<mem_fn_context_rel>(m->get_context_rel());
+  mem_fn_context_rel* ctxt =
+    dynamic_cast<mem_fn_context_rel*>(m->get_context_rel());
 
   ctxt->vtable_offset(s);
 }
@@ -2225,8 +2249,8 @@ get_member_function_is_virtual(const function_decl& f)
     dynamic_cast<const class_decl::method_decl*>(&f);
   assert(m);
 
-  mem_fn_context_rel_sptr ctxt =
-    dynamic_pointer_cast<mem_fn_context_rel>(m->get_context_rel());
+  const mem_fn_context_rel* ctxt =
+    dynamic_cast<const mem_fn_context_rel*>(m->get_context_rel());
 
   return ctxt->is_virtual();
 }
@@ -2255,16 +2279,16 @@ get_member_function_is_virtual(const function_decl* mem_fn)
 ///
 /// @param is_virtual set to true if the function is virtual.
 void
-set_member_function_is_virtual(const function_decl& f, bool is_virtual)
+set_member_function_is_virtual(function_decl& f, bool is_virtual)
 {
   assert(is_member_function(f));
 
-  const class_decl::method_decl* m =
-    dynamic_cast<const class_decl::method_decl*>(&f);
+  class_decl::method_decl* m =
+    dynamic_cast<class_decl::method_decl*>(&f);
   assert(m);
 
-  mem_fn_context_rel_sptr ctxt =
-    dynamic_pointer_cast<mem_fn_context_rel>(m->get_context_rel());
+  mem_fn_context_rel* ctxt =
+    dynamic_cast<mem_fn_context_rel*>(m->get_context_rel());
 
   ctxt->is_virtual(is_virtual);
 }
@@ -5924,10 +5948,10 @@ equals(const var_decl& l, const var_decl& r, change_kind* k)
          return false;
       }
 
-  dm_context_rel_sptr c0 =
-    dynamic_pointer_cast<dm_context_rel>(l.get_context_rel());
-  dm_context_rel_sptr c1 =
-    dynamic_pointer_cast<dm_context_rel>(r.get_context_rel());
+  const dm_context_rel* c0 =
+    dynamic_cast<const dm_context_rel*>(l.get_context_rel());
+  const dm_context_rel* c1 =
+    dynamic_cast<const dm_context_rel*>(r.get_context_rel());
   assert(c0 && c1);
 
   if (*c0 != *c1)
This page took 0.074102 seconds and 5 git commands to generate.