Prepare to compile with clang. Signed-off-by: Chih-Hung Hsieh <c...@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 <c...@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 <c...@google.com> Mark Wielaard <m...@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