This is the mail archive of the elfutils-devel@sourceware.org mailing list for the elfutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH] Replace libdwfl nested functions with macros, part 1.


Prepare to compile with clang.

Signed-off-by: Chih-Hung Hsieh <chh@google.com>
---
 libdwfl/ChangeLog                 | 13 ++++++
 libdwfl/argp-std.c                | 35 +++++++++-------
 libdwfl/core-file.c               | 76 ++++++++++++++++++----------------
 libdwfl/dwfl_module.c             | 25 ++++++-----
 libdwfl/dwfl_module_getsrc_file.c | 31 ++++++++------
 libdwfl/elf-from-memory.c         | 87 +++++++++++++++++++++------------------
 libdwfl/frame_unwind.c            | 75 ++++++++++++++++++---------------
 libdwfl/linux-proc-maps.c         | 27 ++++++------
 8 files changed, 207 insertions(+), 162 deletions(-)

diff --git a/libdwfl/ChangeLog b/libdwfl/ChangeLog
index 0ab386f..a3268ba 100644
--- a/libdwfl/ChangeLog
+++ b/libdwfl/ChangeLog
@@ -1,3 +1,16 @@
+2015-09-15  Chih-Hung Hsieh  <chh@google.com>
+
+	* argp-std.c (parse_opt): Replace inline nested functions
+	with macros expanding to a block or statement expression.
+	* core-file.c (elf_begin_rand): Likewise.
+	(dwfl_elf_phdr_memory_callback): Likewise.
+	* dwfl_module.c (dwfl_report_module): Likewise.
+	* elf-from-memory.c (elf_from_remote_memory): Likewise.
+	* frame_unwind.c (expr_eval): Likewise.
+	* linux-proc-maps.c (proc_maps_report): Likewise.
+	* dwfl_module_getsrc_file.c (dwfl_module_getsrc_file): Replace simple
+	nested functions with simple file scope inline functions.
+
 2015-09-09  Chih-Hung Hsieh  <chh@google.com>
 	    Mark Wielaard  <mjw@redhat.com>
 
diff --git a/libdwfl/argp-std.c b/libdwfl/argp-std.c
index 42b7e78..7ab7df4 100644
--- a/libdwfl/argp-std.c
+++ b/libdwfl/argp-std.c
@@ -103,22 +103,29 @@ struct parse_opt
 static error_t
 parse_opt (int key, char *arg, struct argp_state *state)
 {
-  inline void failure (Dwfl *dwfl, int errnum, const char *msg)
-    {
-      if (dwfl != NULL)
-	dwfl_end (dwfl);
-      if (errnum == -1)
-	argp_failure (state, EXIT_FAILURE, 0, "%s: %s",
-		      msg, INTUSE(dwfl_errmsg) (-1));
-      else
-	argp_failure (state, EXIT_FAILURE, errnum, "%s", msg);
-    }
-  inline error_t fail (Dwfl *dwfl, int errnum, const char *msg)
-    {
-      failure (dwfl, errnum, msg);
-      return errnum == -1 ? EIO : errnum;
+  #define failure(_dwfl, _errnum, _msg) \
+    { \
+      Dwfl *failure_dwfl = _dwfl; \
+      int failure_errnum = _errnum; \
+      const char *failure_msg = _msg; \
+      if (failure_dwfl != NULL) \
+	dwfl_end (failure_dwfl); \
+      if (failure_errnum == -1) \
+	argp_failure (state, EXIT_FAILURE, 0, "%s: %s", \
+		      failure_msg, INTUSE(dwfl_errmsg) (-1)); \
+      else \
+	argp_failure (state, EXIT_FAILURE, failure_errnum, "%s", failure_msg); \
     }
 
+  #define fail(_dwfl, _errnum, _msg) \
+    ( { \
+      Dwfl *fail_dwfl = _dwfl; \
+      int fail_errnum = _errnum; \
+      const char *fail_msg = _msg; \
+      failure (fail_dwfl, fail_errnum, fail_msg); \
+      fail_errnum == -1 ? EIO : fail_errnum; \
+    } )
+
   switch (key)
     {
     case ARGP_KEY_INIT:
diff --git a/libdwfl/core-file.c b/libdwfl/core-file.c
index bbe0899..eac2c4b 100644
--- a/libdwfl/core-file.c
+++ b/libdwfl/core-file.c
@@ -49,14 +49,15 @@ elf_begin_rand (Elf *parent, loff_t offset, loff_t size, loff_t *next)
     return NULL;
 
   /* On failure return, we update *NEXT to point back at OFFSET.  */
-  inline Elf *fail (int error)
-  {
-    if (next != NULL)
-      *next = offset;
-    //__libelf_seterrno (error);
-    __libdwfl_seterrno (DWFL_E (LIBELF, error));
-    return NULL;
-  }
+  #define fail(_error) \
+  ( { \
+    int error = _error; \
+    if (next != NULL) \
+      *next = offset; \
+    /* __libelf_seterrno (error); */ \
+    __libdwfl_seterrno (DWFL_E (LIBELF, error)); \
+    NULL; \
+  } )
 
   loff_t min = (parent->kind == ELF_K_ELF ?
 		(parent->class == ELFCLASS32
@@ -270,38 +271,43 @@ dwfl_elf_phdr_memory_callback (Dwfl *dwfl, int ndx,
   GElf_Off end;
   GElf_Addr end_vaddr;
 
-  inline void update_end ()
-  {
-    end = (phdr.p_offset + phdr.p_filesz + align - 1) & -align;
-    end_vaddr = (phdr.p_vaddr + phdr.p_memsz + align - 1) & -align;
+  #define update_end() \
+  { \
+    end = (phdr.p_offset + phdr.p_filesz + align - 1) & -align; \
+    end_vaddr = (phdr.p_vaddr + phdr.p_memsz + align - 1) & -align; \
   }
 
   update_end ();
 
   /* Use following contiguous segments to get towards SIZE.  */
-  inline bool more (size_t size)
-  {
-    while (end <= start || end - start < size)
-      {
-	if (phdr.p_filesz < phdr.p_memsz)
-	  /* This segment is truncated, so no following one helps us.  */
-	  return false;
-
-	if (unlikely (gelf_getphdr (elf, ndx++, &phdr) == NULL))
-	  return false;
-
-	if (phdr.p_type == PT_LOAD)
-	  {
-	    if (phdr.p_offset > end
-		|| phdr.p_vaddr > end_vaddr)
-	      /* It's discontiguous!  */
-	      return false;
-
-	    update_end ();
-	  }
-      }
-    return true;
-  }
+  #define more(_size) \
+  ( { \
+    size_t size = _size; \
+    bool result = true; \
+    while (end <= start || end - start < size) \
+      { \
+	if (phdr.p_filesz < phdr.p_memsz) { \
+	  /* This segment is truncated, so no following one helps us.  */ \
+	  result = false; \
+          break; \
+        } \
+	if (unlikely (gelf_getphdr (elf, ndx++, (Elf64_Phdr *) &phdr) == NULL)) { \
+	  result = false; \
+          break; \
+        } \
+	if (phdr.p_type == PT_LOAD) \
+	  { \
+	    if (phdr.p_offset > end \
+		|| phdr.p_vaddr > end_vaddr) { \
+	      /* It's discontiguous!  */ \
+	      result = false; \
+	      break; \
+            } \
+	    update_end (); \
+	  } \
+      } \
+    result; \
+  } ) \
 
   /* We need at least this much.  */
   if (! more (minread))
diff --git a/libdwfl/dwfl_module.c b/libdwfl/dwfl_module.c
index 8efcfaa..ea5d811 100644
--- a/libdwfl/dwfl_module.c
+++ b/libdwfl/dwfl_module.c
@@ -134,19 +134,18 @@ dwfl_report_module (Dwfl *dwfl, const char *name,
 {
   Dwfl_Module **tailp = &dwfl->modulelist, **prevp = tailp;
 
-  inline Dwfl_Module *use (Dwfl_Module *mod)
-  {
-    mod->next = *tailp;
-    *tailp = mod;
-
-    if (unlikely (dwfl->lookup_module != NULL))
-      {
-	free (dwfl->lookup_module);
-	dwfl->lookup_module = NULL;
-      }
-
-    return mod;
-  }
+  #define use(_mod) \
+  ( { \
+    Dwfl_Module *use_mod = _mod; \
+    use_mod->next = *tailp; \
+    *tailp = use_mod; \
+    if (unlikely (dwfl->lookup_module != NULL)) \
+      { \
+	free (dwfl->lookup_module); \
+	dwfl->lookup_module = NULL; \
+      } \
+    use_mod; \
+  } )
 
   for (Dwfl_Module *m = *prevp; m != NULL; m = *(prevp = &m->next))
     {
diff --git a/libdwfl/dwfl_module_getsrc_file.c b/libdwfl/dwfl_module_getsrc_file.c
index 20aa8a5..4eca954 100644
--- a/libdwfl/dwfl_module_getsrc_file.c
+++ b/libdwfl/dwfl_module_getsrc_file.c
@@ -30,6 +30,24 @@
 #include "../libdw/libdwP.h"
 
 
+static inline const char*
+INTUSE(dwarf_line_file) (const Dwarf_Line *line)
+{
+  return line->files->info[line->file].name;
+}
+
+static inline Dwarf_Line *
+dwfl_line (const Dwfl_Line *line)
+{
+  return &dwfl_linecu (line)->die.cu->lines->info[line->idx];
+}
+
+static inline const char *
+dwfl_line_file (const Dwfl_Line *line)
+{
+  return INTUSE(dwarf_line_file) (dwfl_line (line));
+}
+
 int
 dwfl_module_getsrc_file (Dwfl_Module *mod,
 			 const char *fname, int lineno, int column,
@@ -58,19 +76,6 @@ dwfl_module_getsrc_file (Dwfl_Module *mod,
 	 && cu != NULL
 	 && (error = __libdwfl_cu_getsrclines (cu)) == DWFL_E_NOERROR)
     {
-      inline const char *INTUSE(dwarf_line_file) (const Dwarf_Line *line)
-	{
-	  return line->files->info[line->file].name;
-	}
-      inline Dwarf_Line *dwfl_line (const Dwfl_Line *line)
-	{
-	  return &dwfl_linecu (line)->die.cu->lines->info[line->idx];
-	}
-      inline const char *dwfl_line_file (const Dwfl_Line *line)
-	{
-	  return INTUSE(dwarf_line_file) (dwfl_line (line));
-	}
-
       /* Search through all the line number records for a matching
 	 file and line/column number.  If any of the numbers is zero,
 	 no match is performed.  */
diff --git a/libdwfl/elf-from-memory.c b/libdwfl/elf-from-memory.c
index ed8f6e9..a5ae1b3 100644
--- a/libdwfl/elf-from-memory.c
+++ b/libdwfl/elf-from-memory.c
@@ -216,33 +216,37 @@ elf_from_remote_memory (GElf_Addr ehdr_vma,
   bool found_base = false;
   switch (ehdr.e32.e_ident[EI_CLASS])
     {
-      /* Sanity checks segments and calculates segment_end,
-	 segments_end, segments_end_mem and loadbase (if not
-	 found_base yet).  Returns true if sanity checking failed,
-	 false otherwise.  */
-      inline bool handle_segment (GElf_Addr vaddr, GElf_Off offset,
-				  GElf_Xword filesz, GElf_Xword memsz)
-	{
-	  /* Sanity check the segment load aligns with the pagesize.  */
-	  if (((vaddr - offset) & (pagesize - 1)) != 0)
-	    return true;
-
-	  GElf_Off segment_end = ((offset + filesz + pagesize - 1)
-				  & -pagesize);
-
-	  if (segment_end > (GElf_Off) contents_size)
-	    contents_size = segment_end;
-
-	  if (!found_base && (offset & -pagesize) == 0)
-	    {
-	      loadbase = ehdr_vma - (vaddr & -pagesize);
-	      found_base = true;
-	    }
-
-	  segments_end = offset + filesz;
-	  segments_end_mem = offset + memsz;
-	  return false;
-	}
+  /* Sanity checks segments and calculates segment_end,
+   segments_end, segments_end_mem and loadbase (if not
+   found_base yet).  Returns true if sanity checking failed,
+   false otherwise.  */
+  #define handle_segment(_vaddr, _offset, _filesz, _memsz) \
+    ( { \
+      bool result; \
+      GElf_Addr vaddr = _vaddr; \
+      GElf_Off offset = _offset; \
+      GElf_Xword filesz = _filesz; \
+      GElf_Xword memsz = _memsz; \
+      /* Sanity check the segment load aligns with the pagesize.  */ \
+      if (((vaddr - offset) & (pagesize - 1)) != 0) \
+        result = true; \
+      else \
+        { \
+          result = false; \
+          GElf_Off segment_end = ((offset + filesz + pagesize - 1) \
+                                 & -pagesize); \
+          if (segment_end > (GElf_Off) contents_size) \
+            contents_size = segment_end; \
+          if (!found_base && (offset & -pagesize) == 0) \
+            { \
+              loadbase = ehdr_vma - (vaddr & -pagesize); \
+              found_base = true; \
+            } \
+          segments_end = offset + filesz; \
+          segments_end_mem = offset + memsz; \
+        } \
+      result; \
+    } )
 
     case ELFCLASS32:
       if (elf32_xlatetom (&xlateto, &xlatefrom,
@@ -299,19 +303,22 @@ elf_from_remote_memory (GElf_Addr ehdr_vma,
   switch (ehdr.e32.e_ident[EI_CLASS])
     {
       /* Reads the given segment.  Returns true if reading fails,
-	 false otherwise.  */
-      inline bool handle_segment (GElf_Addr vaddr, GElf_Off offset,
-				  GElf_Xword filesz)
-	{
-	  GElf_Off start = offset & -pagesize;
-	  GElf_Off end = (offset + filesz + pagesize - 1) & -pagesize;
-	  if (end > (GElf_Off) contents_size)
-	    end = contents_size;
-	  nread = (*read_memory) (arg, buffer + start,
-				  (loadbase + vaddr) & -pagesize,
-				  end - start, end - start);
-	  return nread <= 0;
-	}
+         false otherwise.  */
+      #undef handle_segment
+      #define handle_segment(_vaddr, _offset, _filesz) \
+        ( { \
+          GElf_Addr vaddr = _vaddr; \
+          GElf_Off offset = _offset; \
+          GElf_Xword filesz = _filesz; \
+          GElf_Off start = offset & -pagesize; \
+          GElf_Off end = (offset + filesz + pagesize - 1) & -pagesize; \
+          if (end > (GElf_Off) contents_size) \
+            end = contents_size; \
+          nread = (*read_memory) (arg, buffer + start, \
+                                  (loadbase + vaddr) & -pagesize, \
+                                   end - start, end - start); \
+          (nread <= 0); \
+        } )
 
     case ELFCLASS32:
       for (uint_fast16_t i = 0; i < phnum; ++i)
diff --git a/libdwfl/frame_unwind.c b/libdwfl/frame_unwind.c
index bd100b8..261805b 100644
--- a/libdwfl/frame_unwind.c
+++ b/libdwfl/frame_unwind.c
@@ -117,40 +117,47 @@ expr_eval (Dwfl_Frame *state, Dwarf_Frame *frame, const Dwarf_Op *ops,
   Dwarf_Addr *stack = NULL;
   size_t stack_used = 0, stack_allocated = 0;
 
-  bool
-  push (Dwarf_Addr val)
-  {
-    if (stack_used >= DWARF_EXPR_STACK_MAX)
-      {
-	__libdwfl_seterrno (DWFL_E_INVALID_DWARF);
-	return false;
-      }
-    if (stack_used == stack_allocated)
-      {
-	stack_allocated = MAX (stack_allocated * 2, 32);
-	Dwarf_Addr *stack_new = realloc (stack, stack_allocated * sizeof (*stack));
-	if (stack_new == NULL)
-	  {
-	    __libdwfl_seterrno (DWFL_E_NOMEM);
-	    return false;
-	  }
-	stack = stack_new;
-      }
-    stack[stack_used++] = val;
-    return true;
-  }
-
-  bool
-  pop (Dwarf_Addr *val)
-  {
-    if (stack_used == 0)
-      {
-	__libdwfl_seterrno (DWFL_E_INVALID_DWARF);
-	return false;
-      }
-    *val = stack[--stack_used];
-    return true;
-  }
+  #define push(_val) \
+  ( { \
+    bool push_result; \
+    Dwarf_Addr push_val = _val; \
+    if (stack_used >= DWARF_EXPR_STACK_MAX) \
+      { \
+         __libdwfl_seterrno (DWFL_E_INVALID_DWARF); \
+         push_result = false; \
+      } \
+    else \
+      { \
+        if (stack_used == stack_allocated) \
+          { \
+            stack_allocated = MAX (stack_allocated * 2, 32); \
+            Dwarf_Addr *stack_new = realloc (stack, stack_allocated * sizeof (*stack)); \
+            if (stack_new == NULL) \
+              { \
+                __libdwfl_seterrno (DWFL_E_NOMEM); \
+                push_result = false; \
+              } \
+            stack = stack_new; \
+          } \
+        stack[stack_used++] = push_val; \
+        push_result = true; \
+      } \
+      push_result; \
+  } )
+
+  #define pop(_val) \
+  ( { \
+    Dwarf_Addr *pop_val = _val; \
+    bool pop_result = true; \
+    if (stack_used == 0) \
+      { \
+	__libdwfl_seterrno (DWFL_E_INVALID_DWARF); \
+	pop_result = false; \
+      } \
+    else \
+      *pop_val = stack[--stack_used]; \
+    pop_result; \
+  } )
 
   Dwarf_Addr val1, val2;
   bool is_location = false;
diff --git a/libdwfl/linux-proc-maps.c b/libdwfl/linux-proc-maps.c
index d085834..4693983 100644
--- a/libdwfl/linux-proc-maps.c
+++ b/libdwfl/linux-proc-maps.c
@@ -183,19 +183,20 @@ proc_maps_report (Dwfl *dwfl, FILE *f, GElf_Addr sysinfo_ehdr, pid_t pid)
   char *last_file = NULL;
   Dwarf_Addr low = 0, high = 0;
 
-  inline bool report (void)
-    {
-      if (last_file != NULL)
-	{
-	  Dwfl_Module *mod = INTUSE(dwfl_report_module) (dwfl, last_file,
-							 low, high);
-	  free (last_file);
-	  last_file = NULL;
-	  if (unlikely (mod == NULL))
-	    return true;
-	}
-      return false;
-    }
+  #define report() \
+    ( { \
+      bool report_result = false; \
+      if (last_file != NULL) \
+	{ \
+	  Dwfl_Module *mod = INTUSE(dwfl_report_module) (dwfl, last_file, \
+							 low, high); \
+	  free (last_file); \
+	  last_file = NULL; \
+	  if (unlikely (mod == NULL)) \
+	    report_result = true; \
+	} \
+      report_result; \
+    } )
 
   char *line = NULL;
   size_t linesz;
-- 
2.6.0.rc0.131.gf624c3d


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]