This is the mail archive of the
elfutils-devel@sourceware.org
mailing list for the elfutils project.
[PATCH] Replace libdwfl nested functions with macros, part 1.
- From: Chih-Hung Hsieh <chh at google dot com>
- To: elfutils-devel at lists dot fedorahosted dot org
- Date: Tue, 15 Sep 2015 11:44:47 -0700
- Subject: [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