summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Wielaard <mjw@redhat.com>2016-11-02 13:29:26 +0100
committerMark Wielaard <mjw@redhat.com>2016-11-10 11:59:00 +0100
commita3cc8182b2ae05290b0eafa74b70746d7befc0e4 (patch)
tree7d1f74f9f464b810a95dc7cd78c73930a938924a
parent33ca0e1b9dfb47c6f9836c7fc19d04bd34337767 (diff)
downloadelfutils-a3cc8182b2ae05290b0eafa74b70746d7befc0e4.tar.gz
Add GCC7 -Wimplicit-fallthrough support/fixes.
GCC7 will have a new -Wimplicit-fallthrough warning. It did catch one small buglet in elflint option procession. So it seems useful to enable to make sure all swatch case fallthroughs are deliberate. Add configure check to detect whether gcc support -Wimplicit-fallthrough and enable it. Add fixes and explicit fallthrough comments where necessary. Signed-off-by: Mark Wielaard <mjw@redhat.com>
-rw-r--r--ChangeLog7
-rw-r--r--backends/ChangeLog11
-rw-r--r--backends/i386_regs.c1
-rw-r--r--backends/i386_retval.c3
-rw-r--r--backends/linux-core-note.c4
-rw-r--r--backends/m68k_retval.c4
-rw-r--r--backends/ppc_regs.c2
-rw-r--r--backends/x86_64_regs.c1
-rw-r--r--config/ChangeLog5
-rw-r--r--config/eu.am8
-rw-r--r--configure.ac10
-rw-r--r--libcpu/ChangeLog6
-rw-r--r--libcpu/i386_disasm.c2
-rw-r--r--libdw/ChangeLog10
-rw-r--r--libdw/cfi.c2
-rw-r--r--libdw/encoded-value.h1
-rw-r--r--libdwfl/dwfl_report_elf.c2
-rw-r--r--src/ChangeLog8
-rw-r--r--src/addr2line.c1
-rw-r--r--src/elfcompress.c3
-rw-r--r--src/elflint.c4
-rw-r--r--src/objdump.c4
-rw-r--r--tests/ChangeLog5
-rw-r--r--tests/backtrace-data.c1
-rw-r--r--tests/backtrace.c2
25 files changed, 89 insertions, 18 deletions
diff --git a/ChangeLog b/ChangeLog
index 8d615721..f21421f9 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,4 +1,9 @@
-2015-10-11 Akihiko Odaki <akihiko.odaki.4i@stu.hosei.ac.jp>
+2016-11-02 Mark Wielaard <mjw@redhat.com>
+
+ * configure.ac: Add check for whether gcc accepts
+ -Wimplict-fallthrough.
+
+2016-10-11 Akihiko Odaki <akihiko.odaki.4i@stu.hosei.ac.jp>
* configure.ac: Add memrchr, rawmemchr and powerof2 checks.
diff --git a/backends/ChangeLog b/backends/ChangeLog
index 53d29081..1c561b50 100644
--- a/backends/ChangeLog
+++ b/backends/ChangeLog
@@ -1,3 +1,14 @@
+2016-11-02 Mark Wielaard <mjw@redhat.com>
+
+ * i386_regs.c (i386_register_info): Add fallthrough comment.
+ * i386_retval.c (i386_return_value_location): Move fallthrough
+ comment.
+ * linux-core-note.c (core_note): Adjust fallthrough comment.
+ * m68k_retval.c (m68k_return_value_location): Move fallthrough
+ comment.
+ * ppc_regs.c (ppc_register_info): Add fallthrough comment.
+ * x86_64_regs.c (x86_64_register_info): Likewise.
+
2016-08-09 Jose E. Marchesi <jose.marchesi@oracle.com>
* sparc_attrs.c (sparc_check_object_attribute): Fix the
diff --git a/backends/i386_regs.c b/backends/i386_regs.c
index fb8ded33..fd963a62 100644
--- a/backends/i386_regs.c
+++ b/backends/i386_regs.c
@@ -92,6 +92,7 @@ i386_register_info (Ebl *ebl __attribute__ ((unused)),
case 5:
case 8:
*type = DW_ATE_address;
+ /* Fallthrough */
case 0 ... 3:
case 6 ... 7:
name[0] = 'e';
diff --git a/backends/i386_retval.c b/backends/i386_retval.c
index 9da797d5..4aa646fe 100644
--- a/backends/i386_retval.c
+++ b/backends/i386_retval.c
@@ -122,9 +122,8 @@ i386_return_value_location (Dwarf_Die *functypedie, const Dwarf_Op **locp)
return nloc_intreg;
if (size <= 8)
return nloc_intregpair;
-
- /* Else fall through. */
}
+ /* Fallthrough */
case DW_TAG_structure_type:
case DW_TAG_class_type:
diff --git a/backends/linux-core-note.c b/backends/linux-core-note.c
index a4ec0be0..67638d70 100644
--- a/backends/linux-core-note.c
+++ b/backends/linux-core-note.c
@@ -225,8 +225,8 @@ EBLHOOK(core_note) (const GElf_Nhdr *nhdr, const char *name,
case sizeof "CORE":
if (memcmp (name, "CORE", nhdr->n_namesz) == 0)
break;
- /* Buggy old Linux kernels didn't terminate "LINUX".
- Fall through. */
+ /* Buggy old Linux kernels didn't terminate "LINUX". */
+ /* Fall through. */
case sizeof "LINUX":
if (memcmp (name, "LINUX", nhdr->n_namesz) == 0)
diff --git a/backends/m68k_retval.c b/backends/m68k_retval.c
index 2dd285a0..c68ed022 100644
--- a/backends/m68k_retval.c
+++ b/backends/m68k_retval.c
@@ -134,10 +134,8 @@ m68k_return_value_location (Dwarf_Die *functypedie, const Dwarf_Op **locp)
return nloc_intreg;
if (size <= 8)
return nloc_intregpair;
-
- /* Else fall through. */
}
-
+ /* Fallthrough */
case DW_TAG_structure_type:
case DW_TAG_class_type:
case DW_TAG_union_type:
diff --git a/backends/ppc_regs.c b/backends/ppc_regs.c
index 4b92a9aa..bcf4f7a3 100644
--- a/backends/ppc_regs.c
+++ b/backends/ppc_regs.c
@@ -140,7 +140,7 @@ ppc_register_info (Ebl *ebl __attribute__ ((unused)),
case 100:
if (*bits == 32)
return stpcpy (name, "mq") + 1 - name;
-
+ /* Fallthrough */
case 102 ... 107:
name[0] = 's';
name[1] = 'p';
diff --git a/backends/x86_64_regs.c b/backends/x86_64_regs.c
index 2172d9f1..84304407 100644
--- a/backends/x86_64_regs.c
+++ b/backends/x86_64_regs.c
@@ -87,6 +87,7 @@ x86_64_register_info (Ebl *ebl __attribute__ ((unused)),
case 6 ... 7:
*type = DW_ATE_address;
+ /* Fallthrough */
case 0 ... 5:
name[0] = 'r';
name[1] = baseregs[regno][0];
diff --git a/config/ChangeLog b/config/ChangeLog
index 2ca25bc3..a18fa847 100644
--- a/config/ChangeLog
+++ b/config/ChangeLog
@@ -1,3 +1,8 @@
+2016-11-02 Mark Wielaard <mjw@redhat.com>
+
+ * eu.am: Check HAVE_IMPLICIT_FALLTHROUGH_WARNING.
+ (AM_CFLAGS): Add IMPLICIT_FALLTHROUGH_WARNING.
+
2016-08-04 Mark Wielaard <mjw@redhat.com>
* elfutils.spec.in: Update for 0.167.
diff --git a/config/eu.am b/config/eu.am
index 4998771d..8fe1e259 100644
--- a/config/eu.am
+++ b/config/eu.am
@@ -61,10 +61,16 @@ else
NULL_DEREFERENCE_WARNING=
endif
+if HAVE_IMPLICIT_FALLTHROUGH_WARNING
+IMPLICIT_FALLTHROUGH_WARNING=-Wimplicit-fallthrough
+else
+IMPLICIT_FALLTHROUGH_WARNING=
+endif
+
AM_CFLAGS = -std=gnu99 -Wall -Wshadow -Wformat=2 \
-Wold-style-definition -Wstrict-prototypes \
$(LOGICAL_OP_WARNING) $(DUPLICATED_COND_WARNING) \
- $(NULL_DEREFERENCE_WARNING) \
+ $(NULL_DEREFERENCE_WARNING) $(IMPLICIT_FALLTHROUGH_WARNING) \
$(if $($(*F)_no_Werror),,-Werror) \
$(if $($(*F)_no_Wunused),,-Wunused -Wextra) \
$(if $($(*F)_no_Wstack_usage),,$(STACK_USAGE_WARNING)) \
diff --git a/configure.ac b/configure.ac
index c02d4c2a..c55fb9b4 100644
--- a/configure.ac
+++ b/configure.ac
@@ -311,6 +311,16 @@ CFLAGS="$old_CFLAGS"])
AM_CONDITIONAL(HAVE_NULL_DEREFERENCE_WARNING,
[test "x$ac_cv_null_dereference" != "xno"])
+# -Wimplicit-fallthrough was added by GCC7
+AC_CACHE_CHECK([whether gcc accepts -Wimplicit-fallthrough], ac_cv_implicit_fallthrough, [dnl
+old_CFLAGS="$CFLAGS"
+CFLAGS="$CFLAGS -Wimplicit-fallthrough -Werror"
+AC_COMPILE_IFELSE([AC_LANG_SOURCE([])],
+ ac_cv_implicit_fallthrough=yes, ac_cv_implicit_fallthrough=no)
+CFLAGS="$old_CFLAGS"])
+AM_CONDITIONAL(HAVE_IMPLICIT_FALLTHROUGH_WARNING,
+ [test "x$ac_cv_implicit_fallthrough" != "xno"])
+
dnl Check if we have argp available from our libc
AC_LINK_IFELSE(
[AC_LANG_PROGRAM(
diff --git a/libcpu/ChangeLog b/libcpu/ChangeLog
index fff1d96a..79110c22 100644
--- a/libcpu/ChangeLog
+++ b/libcpu/ChangeLog
@@ -1,4 +1,8 @@
-2015-10-11 Akihiko Odaki <akihiko.odaki.4i@stu.hosei.ac.jp>
+2016-11-02 Mark Wielaard <mjw@redhat.com>
+
+ * i386_disasm.c (i386_disasm): Add fallthrough comment.
+
+2016-10-11 Akihiko Odaki <akihiko.odaki.4i@stu.hosei.ac.jp>
* i386_lex.l: Remove system.h include, add libeu.h include.
* i386_parse.y: Remove sys/param.h include, add libeu.h include.
diff --git a/libcpu/i386_disasm.c b/libcpu/i386_disasm.c
index 699dd619..831afbe2 100644
--- a/libcpu/i386_disasm.c
+++ b/libcpu/i386_disasm.c
@@ -819,7 +819,7 @@ i386_disasm (Ebl *ebl __attribute__((unused)),
++param_start;
break;
}
-
+ /* Fallthrough */
default:
assert (! "INVALID not handled");
}
diff --git a/libdw/ChangeLog b/libdw/ChangeLog
index c2f25ea6..cc92f163 100644
--- a/libdw/ChangeLog
+++ b/libdw/ChangeLog
@@ -1,4 +1,12 @@
-2015-10-11 Akihiko Odaki <akihiko.odaki.4i@stu.hosei.ac.jp>
+2016-11-02 Mark Wielaard <mjw@redhat.com>
+
+ * cfi.c (execute_cfi): Add fallthrough comments.
+ * encoded-value.h (encoded_value_size): Add explicit return instead
+ of relying on fallthrough.
+ * dwfl_report_elf.c (__libdwfl_elf_address_range): Add fallthrough
+ comment.
+
+2016-10-11 Akihiko Odaki <akihiko.odaki.4i@stu.hosei.ac.jp>
* dwarf_getpubnames.c: Remove sys/param.h include, add system.h.
* libdw_alloc.c: Likewise.
diff --git a/libdw/cfi.c b/libdw/cfi.c
index 1fd668d7..daa845f3 100644
--- a/libdw/cfi.c
+++ b/libdw/cfi.c
@@ -138,6 +138,7 @@ execute_cfi (Dwarf_CFI *cache,
case DW_CFA_advance_loc1:
operand = *program++;
+ /* Fallthrough */
case DW_CFA_advance_loc + 0 ... DW_CFA_advance_loc + CFI_PRIMARY_MAX:
advance_loc:
loc += operand * cie->code_alignment_factor;
@@ -300,6 +301,7 @@ execute_cfi (Dwarf_CFI *cache,
case DW_CFA_restore_extended:
get_uleb128 (operand, program, end);
+ /* Fallthrough */
case DW_CFA_restore + 0 ... DW_CFA_restore + CFI_PRIMARY_MAX:
if (unlikely (abi_cfi) && likely (opcode == DW_CFA_restore))
diff --git a/libdw/encoded-value.h b/libdw/encoded-value.h
index 48d868fb..f0df4cec 100644
--- a/libdw/encoded-value.h
+++ b/libdw/encoded-value.h
@@ -64,6 +64,7 @@ encoded_value_size (const Elf_Data *data, const unsigned char e_ident[],
if (*end++ & 0x80u)
return end - p;
}
+ return 0;
default:
return 0;
diff --git a/libdwfl/dwfl_report_elf.c b/libdwfl/dwfl_report_elf.c
index 1c6e401d..73a5511a 100644
--- a/libdwfl/dwfl_report_elf.c
+++ b/libdwfl/dwfl_report_elf.c
@@ -170,7 +170,7 @@ __libdwfl_elf_address_range (Elf *elf, GElf_Addr base, bool add_p_vaddr,
/* An assigned base address is meaningless for these. */
base = 0;
add_p_vaddr = true;
-
+ /* Fallthrough. */
case ET_DYN:
default:;
size_t phnum;
diff --git a/src/ChangeLog b/src/ChangeLog
index ee67cffc..b2909b65 100644
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -1,3 +1,11 @@
+2016-11-02 Mark Wielaard <mjw@redhat.com>
+
+ * addr2line.c (handle_address): Add fallthrough comment.
+ * elfcompress.c (parse_opt): Adjust fallthrough comment.
+ * elflint.c (parse_opt): Add missing break after 'd' case.
+ (check_sections): Add fallthrough comments.
+ * objdump.c (parse_opt): Add explantion for fallthrough comment.
+
2016-10-22 Kevin Cernekee <cernekee@chromium.org>
* unstrip.c: Fix "invalid string offset" error caused by using the
diff --git a/src/addr2line.c b/src/addr2line.c
index 0ce854f6..bea24aea 100644
--- a/src/addr2line.c
+++ b/src/addr2line.c
@@ -632,6 +632,7 @@ handle_address (const char *string, Dwfl *dwfl)
case 1:
addr = 0;
j = i;
+ /* Fallthrough */
case 2:
if (string[j] != '\0')
break;
diff --git a/src/elfcompress.c b/src/elfcompress.c
index 7392cb76..82ab9655 100644
--- a/src/elfcompress.c
+++ b/src/elfcompress.c
@@ -155,7 +155,8 @@ parse_opt (int key, char *arg __attribute__ ((unused)),
argp_error (state,
N_("Only one input file allowed together with '-o'"));
/* We only use this for checking the number of arguments, we don't
- actually want to consume them, so fallthrough. */
+ actually want to consume them. */
+ /* Fallthrough */
default:
return ARGP_ERR_UNKNOWN;
}
diff --git a/src/elflint.c b/src/elflint.c
index 8b52ee2b..b304a309 100644
--- a/src/elflint.c
+++ b/src/elflint.c
@@ -210,6 +210,7 @@ parse_opt (int key, char *arg __attribute__ ((unused)),
case 'd':
is_debuginfo = true;
+ break;
case ARGP_gnuld:
gnuld = true;
@@ -3963,6 +3964,7 @@ section [%2zu] '%s': merge flag set but entry size is zero\n"),
case SHT_NOBITS:
if (is_debuginfo)
break;
+ /* Fallthrough */
default:
ERROR (gettext ("\
section [%2zu] '%s' has unexpected type %d for an executable section\n"),
@@ -4305,7 +4307,7 @@ section [%2d] '%s': unknown core file note type %" PRIu32
if (nhdr.n_namesz == sizeof "Linux"
&& !memcmp (data->d_buf + name_offset, "Linux", sizeof "Linux"))
break;
-
+ /* Fallthrough */
default:
if (shndx == 0)
ERROR (gettext ("\
diff --git a/src/objdump.c b/src/objdump.c
index 1afcd573..f84513ca 100644
--- a/src/objdump.c
+++ b/src/objdump.c
@@ -234,7 +234,9 @@ parse_opt (int key, char *arg,
program_invocation_short_name);
exit (EXIT_FAILURE);
}
-
+ /* We only use this for checking the number of arguments, we don't
+ actually want to consume them. */
+ /* Fallthrough */
default:
return ARGP_ERR_UNKNOWN;
}
diff --git a/tests/ChangeLog b/tests/ChangeLog
index 3d34778b..5a9d5372 100644
--- a/tests/ChangeLog
+++ b/tests/ChangeLog
@@ -1,3 +1,8 @@
+2016-11-02 Mark Wielaard <mjw@redhat.com>
+
+ * backtrace-data.c (thread_callback): Add explicit break after error.
+ * backtrace.c (callback_verify): Change PASSTHRU to FALLTHRU.
+
2016-10-22 Kevin Cernekee <cernekee@chromium.org>
* Makefile.am (TESTS): Add run-unstrip-test4.sh.
diff --git a/tests/backtrace-data.c b/tests/backtrace-data.c
index bc5ceba0..b7158dae 100644
--- a/tests/backtrace-data.c
+++ b/tests/backtrace-data.c
@@ -250,6 +250,7 @@ thread_callback (Dwfl_Thread *thread, void *thread_arg __attribute__ ((unused)))
break;
case -1:
error (1, 0, "dwfl_thread_getframes: %s", dwfl_errmsg (-1));
+ break;
default:
abort ();
}
diff --git a/tests/backtrace.c b/tests/backtrace.c
index 2440ab34..1ff6353c 100644
--- a/tests/backtrace.c
+++ b/tests/backtrace.c
@@ -123,7 +123,7 @@ callback_verify (pid_t tid, unsigned frameno, Dwarf_Addr pc,
assert (symname2 == NULL || strcmp (symname2, "jmp") != 0);
break;
}
- /* PASSTHRU */
+ /* FALLTHRU */
case 4:
assert (symname != NULL && strcmp (symname, "stdarg") == 0);
break;