This is the mail archive of the
elfutils-devel@sourceware.org
mailing list for the elfutils project.
Re: [PATCH] Replace libdwelf nested functions with macros.
- From: Chih-Hung Hsieh <chh at google dot com>
- To: elfutils-devel at lists dot fedorahosted dot org
- Date: Wed, 14 Oct 2015 10:18:44 -0700
- Subject: Re: [PATCH] Replace libdwelf nested functions with macros.
This patch could be abandoned and replaced by the new patch "Move nested
functions in libdwelf".
On Tue, Sep 15, 2015 at 2:26 PM, Chih-Hung Hsieh <chh@google.com> wrote:
> 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
>
>
This patch could be abandoned and replaced by the new patch "Move nested functions in libdwelf".
On Tue, Sep 15, 2015 at 2:26 PM, Chih-Hung Hsieh
<chh@google.com> wrote:
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 = "" \
+Â Â 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