From: Timm Bäder <tbae...@redhat.com> Do one loop check for 32/64 bit inside the loop, instead of outside. This way we have only one call site for the function called in the loop body.
Signed-off-by: Timm Bäder <tbae...@redhat.com> --- libdwfl/dwfl_segment_report_module.c | 52 +++++++++++++++------------- 1 file changed, 27 insertions(+), 25 deletions(-) diff --git a/libdwfl/dwfl_segment_report_module.c b/libdwfl/dwfl_segment_report_module.c index a69ead8f..276e9117 100644 --- a/libdwfl/dwfl_segment_report_module.c +++ b/libdwfl/dwfl_segment_report_module.c @@ -623,27 +623,27 @@ dwfl_segment_report_module (Dwfl *dwfl, int ndx, const char *name, Elf32_Phdr *p32 = phdrsp; Elf64_Phdr *p64 = phdrsp; - if (ei_class == ELFCLASS32) + if ((ei_class == ELFCLASS32 + && elf32_xlatetom (&xlateto, &xlatefrom, ei_data) == NULL) + || (ei_class == ELFCLASS64 + && elf64_xlatetom (&xlateto, &xlatefrom, ei_data) == NULL)) { - if (elf32_xlatetom (&xlateto, &xlatefrom, ei_data) == NULL) - found_bias = false; /* Trigger error check. */ - else - for (uint_fast16_t i = 0; i < phnum; ++i) - consider_phdr (p32[i].p_type, - p32[i].p_vaddr, p32[i].p_memsz, - p32[i].p_offset, p32[i].p_filesz, - p32[i].p_align); + found_bias = false; /* Trigger error check */ } else { - if (elf64_xlatetom (&xlateto, &xlatefrom, ei_data) == NULL) - found_bias = false; /* Trigger error check. */ - else - for (uint_fast16_t i = 0; i < phnum; ++i) - consider_phdr (p64[i].p_type, - p64[i].p_vaddr, p64[i].p_memsz, - p64[i].p_offset, p64[i].p_filesz, - p64[i].p_align); + for (uint_fast16_t i = 0; i < phnum; ++i) + { + bool is32 = (ei_class == ELFCLASS32); + GElf_Word type = is32 ? p32[i].p_type : p64[i].p_type; + GElf_Addr vaddr = is32 ? p32[i].p_vaddr : p64[i].p_vaddr; + GElf_Xword memsz = is32 ? p32[i].p_memsz : p64[i].p_memsz; + GElf_Off offset = is32 ? p32[i].p_offset : p64[i].p_offset; + GElf_Xword filesz = is32 ? p32[i].p_filesz : p64[i].p_filesz; + GElf_Xword align = is32 ? p32[i].p_align : p64[i].p_align; + + consider_phdr (type, vaddr, memsz, offset, filesz, align); + } } finish_portion (dwfl, memory_callback, memory_callback_arg, &ph_buffer, &ph_buffer_size); @@ -952,14 +952,16 @@ dwfl_segment_report_module (Dwfl *dwfl, int ndx, const char *name, } } - if (ei_class == ELFCLASS32) - for (uint_fast16_t i = 0; i < phnum; ++i) - read_phdr (p32[i].p_type, p32[i].p_vaddr, - p32[i].p_offset, p32[i].p_filesz); - else - for (uint_fast16_t i = 0; i < phnum; ++i) - read_phdr (p64[i].p_type, p64[i].p_vaddr, - p64[i].p_offset, p64[i].p_filesz); + for (uint_fast16_t i = 0; i < phnum; ++i) + { + bool is32 = (ei_class == ELFCLASS32); + GElf_Word type = is32 ? p32[i].p_type : p64[i].p_type; + GElf_Addr vaddr = is32 ? p32[i].p_vaddr : p64[i].p_vaddr; + GElf_Off offset = is32 ? p32[i].p_offset : p64[i].p_offset; + GElf_Xword filesz = is32 ? p32[i].p_filesz : p64[i].p_filesz; + + read_phdr (type, vaddr, offset, filesz); + } } else { -- 2.26.2