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 libdwelf nested functions with macros.


To be compiled without gnu99 extension.

Signed-off-by: Chih-Hung Hsieh <chh@google.com>
---
 libdwelf/ChangeLog                |  5 +++++
 libdwelf/dwelf_elf_gnu_build_id.c | 42 +++++++++++++++++++++------------------
 2 files changed, 28 insertions(+), 19 deletions(-)

diff --git a/libdwelf/ChangeLog b/libdwelf/ChangeLog
index 342cb9c..1300182 100644
--- a/libdwelf/ChangeLog
+++ b/libdwelf/ChangeLog
@@ -1,3 +1,8 @@
+2015-09-14  Chih-Hung Hsieh  <chh@google.com>
+
+	* dwelf_elf_gnu_build_id.c (find_elf_build_id): Replace nested function
+	with macro.
+
 2014-11-14  Mark Wielaard  <mjw@redhat.com>
 
 	* dwelf_elf_gnu_debuglink.c (dwelf_elf_gnu_debuglink): Check d_buf
diff --git a/libdwelf/dwelf_elf_gnu_build_id.c b/libdwelf/dwelf_elf_gnu_build_id.c
index 1ed501d..cb20bca 100644
--- a/libdwelf/dwelf_elf_gnu_build_id.c
+++ b/libdwelf/dwelf_elf_gnu_build_id.c
@@ -42,25 +42,29 @@ find_elf_build_id (Dwfl_Module *mod, int e_type, Elf *elf,
 		   const void **build_id_bits, GElf_Addr *build_id_elfaddr,
 		   int *build_id_len)
 {
-  int check_notes (Elf_Data *data, GElf_Addr data_elfaddr)
-  {
-    size_t pos = 0;
-    GElf_Nhdr nhdr;
-    size_t name_pos;
-    size_t desc_pos;
-    while ((pos = gelf_getnote (data, pos, &nhdr, &name_pos, &desc_pos)) > 0)
-      if (nhdr.n_type == NT_GNU_BUILD_ID
-	  && nhdr.n_namesz == sizeof "GNU" && !memcmp (data->d_buf + name_pos,
-						       "GNU", sizeof "GNU"))
-	{
-	  *build_id_bits = data->d_buf + desc_pos;
-	  *build_id_elfaddr = (data_elfaddr == NO_VADDR
-			       ? 0 : data_elfaddr + desc_pos);
-	  *build_id_len = nhdr.n_descsz;
-	  return 1;
-	}
-    return 0;
-  }
+#define check_notes(_data, _data_elfaddr) \
+  ( { \
+    Elf_Data *data = _data; \
+    GElf_Addr data_elfaddr = _data_elfaddr;  \
+    int check_result = 0; \
+    size_t pos = 0; \
+    GElf_Nhdr nhdr; \
+    size_t name_pos; \
+    size_t desc_pos; \
+    while ((pos = gelf_getnote (data, pos, &nhdr, &name_pos, &desc_pos)) > 0) \
+      if (nhdr.n_type == NT_GNU_BUILD_ID \
+	  && nhdr.n_namesz == sizeof "GNU" && !memcmp (data->d_buf + name_pos, \
+						       "GNU", sizeof "GNU")) \
+	{ \
+	  *build_id_bits = data->d_buf + desc_pos; \
+	  *build_id_elfaddr = (data_elfaddr == NO_VADDR \
+			       ? 0 : data_elfaddr + desc_pos); \
+	  *build_id_len = nhdr.n_descsz; \
+	  check_result = 1; \
+	  break; \
+	} \
+    check_result; \
+  } )
 
   size_t shstrndx = SHN_UNDEF;
   int result = 0;
-- 
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]