[rtems-tools commit] rtemstoolkit/dwarf: Add types of inline. Report machine code size not span.

Chris Johns chrisj at rtems.org
Mon Aug 6 23:12:47 UTC 2018


Module:    rtems-tools
Branch:    master
Commit:    317d85d71f4b156f6d99342700b8a0867058c4a4
Changeset: http://git.rtems.org/rtems-tools/commit/?id=317d85d71f4b156f6d99342700b8a0867058c4a4

Author:    Chris Johns <chrisj at rtems.org>
Date:      Tue Aug  7 09:08:25 2018 +1000

rtemstoolkit/dwarf: Add types of inline. Report machine code size not span.

- Add the types of inlined functions to the interface.

- Return the machine code for each function and not the address span.

---

 rtemstoolkit/rld-dwarf.cpp | 35 ++++++++++++++++++++++++++++++++++-
 rtemstoolkit/rld-dwarf.h   | 16 ++++++++++++++++
 2 files changed, 50 insertions(+), 1 deletion(-)

diff --git a/rtemstoolkit/rld-dwarf.cpp b/rtemstoolkit/rld-dwarf.cpp
index 9cdd84a..e142c43 100644
--- a/rtemstoolkit/rld-dwarf.cpp
+++ b/rtemstoolkit/rld-dwarf.cpp
@@ -813,6 +813,28 @@ namespace rld
       return inline_ == DW_INL_inlined || inline_ == DW_INL_declared_inlined;
     }
 
+    function::inlined
+    function::get_inlined () const
+    {
+      inlined i = inl_not_inlined;
+      switch (inline_)
+      {
+        default:
+        case DW_INL_not_inlined:
+          break;
+        case DW_INL_inlined:
+          i = inl_inline;
+          break;
+        case DW_INL_declared_not_inlined:
+          i = inl_declared_not_inlined;
+          break;
+        case DW_INL_declared_inlined:
+          i = inl_declared_inlined;
+          break;
+      }
+      return i;
+    }
+
     std::string
     function::call_file () const
     {
@@ -831,7 +853,18 @@ namespace rld
     {
       size_t s = 0;
       if (!name_.empty () && has_machine_code ())
-        s = pc_high () - pc_low ();
+      {
+        if (ranges_.empty ())
+          s = pc_high () - pc_low ();
+        else
+        {
+          for (auto& r : ranges_.get ())
+          {
+            if (!r.end () && !r.empty ())
+              s += r.addr2 () - r.addr1 ();
+          }
+        }
+      }
       return s;
     }
 
diff --git a/rtemstoolkit/rld-dwarf.h b/rtemstoolkit/rld-dwarf.h
index d4e4c8a..030be3a 100644
--- a/rtemstoolkit/rld-dwarf.h
+++ b/rtemstoolkit/rld-dwarf.h
@@ -282,6 +282,17 @@ namespace rld
     class function
     {
     public:
+
+      /**
+       * The various inline states. See Table 3.4 DWARF 5 standard.
+       */
+      enum inlined {
+        inl_not_inlined = 0,          /**< Not declared inline nore inlined. */
+        inl_inline = 1,               /**< Not declared inline but inlined. */
+        inl_declared_not_inlined = 2, /**< Declared inline but not inlined. */
+        inl_declared_inlined = 3      /**< Declared inline and inlined */
+      };
+
       function (file& debug, debug_info_entry& die);
       function (const function& orig);
       ~function ();
@@ -333,6 +344,11 @@ namespace rld
       bool is_inlined () const;
 
       /**
+       * Get the inlined state.
+       */
+      inlined get_inlined () const;
+
+      /**
        * Get the call file of the inlined function.
        */
       std::string call_file () const;




More information about the vc mailing list