1. 03 Mar, 2016 1 commit
  2. 21 Feb, 2013 6 commits
    • Daniel Santos's avatar
      bug.h, compiler.h: introduce compiletime_assert & BUILD_BUG_ON_MSG · 9a8ab1c3
      Daniel Santos authored
      Introduce compiletime_assert to compiler.h, which moves the details of
      how to break a build and emit an error message for a specific compiler
      to the headers where these details should be.  Following in the
      tradition of the POSIX assert macro, compiletime_assert creates a
      build-time error when the supplied condition is *false*.
      
      Next, we add BUILD_BUG_ON_MSG to bug.h which simply wraps
      compiletime_assert, inverting the logic, so that it fails when the
      condition is *true*, consistent with the language "build bug on." This
      macro allows you to specify the error message you want emitted when the
      supplied condition is true.
      
      Finally, we remove all other code from bug.h that mucks with these
      details (BUILD_BUG & BUILD_BUG_ON), and have them all call
      BUILD_BUG_ON_MSG.  This not only reduces source code bloat, but also
      prevents the possibility of code being changed for one macro and not for
      the other (which was previously the case for BUILD_BUG and
      BUILD_BUG_ON).
      
      Since __compiletime_error_fallback is now only used in compiler.h, I'm
      considering it a private macro and removing the double negation that's
      now extraneous.
      
      [akpm@linux-foundation.org: checkpatch fixes]
      Signed-off-by: default avatarDaniel Santos <daniel.santos@pobox.com>
      Cc: Andi Kleen <ak@linux.intel.com>
      Cc: Borislav Petkov <bp@alien8.de>
      Cc: David Rientjes <rientjes@google.com>
      Cc: Joe Perches <joe@perches.com>
      Cc: Josh Triplett <josh@joshtriplett.org>
      Cc: Paul Gortmaker <paul.gortmaker@windriver.com>
      Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
      9a8ab1c3
    • Daniel Santos's avatar
      compiler.h, bug.h: prevent double error messages with BUILD_BUG{,_ON} · c361d3e5
      Daniel Santos authored
      Prior to the introduction of __attribute__((error("msg"))) in gcc 4.3,
      creating compile-time errors required a little trickery.
      BUILD_BUG{,_ON} uses this attribute when available to generate
      compile-time errors, but also uses the negative-sized array trick for
      older compilers, resulting in two error messages in some cases.  The
      reason it's "some" cases is that as of gcc 4.4, the negative-sized array
      will not create an error in some situations, like inline functions.
      
      This patch replaces the negative-sized array code with the new
      __compiletime_error_fallback() macro which expands to the same thing
      unless the the error attribute is available, in which case it expands to
      do{}while(0), resulting in exactly one compile-time error on all
      versions of gcc.
      
      Note that we are not changing the negative-sized array code for the
      unoptimized version of BUILD_BUG_ON, since it has the potential to catch
      problems that would be disabled in later versions of gcc were
      __compiletime_error_fallback used.  The reason is that that an
      unoptimized build can't always remove calls to an error-attributed
      function call (like we are using) that should effectively become dead
      code if it were optimized.  However, using a negative-sized array with a
      similar value will not result in an false-positive (error).  The only
      caveat being that it will also fail to catch valid conditions, which we
      should be expecting in an unoptimized build anyway.
      Signed-off-by: default avatarDaniel Santos <daniel.santos@pobox.com>
      Cc: Andi Kleen <ak@linux.intel.com>
      Cc: Borislav Petkov <bp@alien8.de>
      Cc: David Rientjes <rientjes@google.com>
      Cc: Joe Perches <joe@perches.com>
      Cc: Josh Triplett <josh@joshtriplett.org>
      Cc: Paul Gortmaker <paul.gortmaker@windriver.com>
      Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
      c361d3e5
    • Daniel Santos's avatar
      bug.h: make BUILD_BUG_ON generate compile-time error · a3ccc497
      Daniel Santos authored
      Negative sized arrays wont create a compile-time error in some cases
      starting with gcc 4.4 (e.g., inlined functions), but gcc 4.3 introduced
      the error function attribute that will.
      
      This patch modifies BUILD_BUG_ON to behave like BUILD_BUG already does,
      using the error function attribute so that you don't have to build the
      entire kernel to discover that you have a problem, and then enjoy trying
      to track it down from a link-time error.
      
      Also, we are only including asm/bug.h and then expecting that
      linux/compiler.h will eventually be included to define __linktime_error
      (used in BUILD_BUG_ON).  This patch includes it directly for clarity and
      to avoid the possibility of changes in <arch>/*/include/asm/bug.h being
      changed or not including linux/compiler.h for some reason.
      Signed-off-by: default avatarDaniel Santos <daniel.santos@pobox.com>
      Acked-by: default avatarBorislav Petkov <bp@alien8.de>
      Cc: Andi Kleen <ak@linux.intel.com>
      Cc: David Rientjes <rientjes@google.com>
      Cc: Joe Perches <joe@perches.com>
      Cc: Josh Triplett <josh@joshtriplett.org>
      Cc: Paul Gortmaker <paul.gortmaker@windriver.com>
      Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
      a3ccc497
    • Daniel Santos's avatar
      bug.h: prevent double evaulation of `condition' in BUILD_BUG_ON · 1d6a0d19
      Daniel Santos authored
      When calling BUILD_BUG_ON in an optimized build using gcc 4.3 and later,
      the condition will be evaulated twice, possibily with side-effects.  This
      patch eliminates that error.
      
      [akpm@linux-foundation.org: tweak code layout]
      Signed-off-by: default avatarDaniel Santos <daniel.santos@pobox.com>
      Cc: Andi Kleen <ak@linux.intel.com>
      Cc: Borislav Petkov <bp@alien8.de>
      Cc: David Rientjes <rientjes@google.com>
      Cc: Joe Perches <joe@perches.com>
      Cc: Josh Triplett <josh@joshtriplett.org>
      Cc: Paul Gortmaker <paul.gortmaker@windriver.com>
      Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
      1d6a0d19
    • Daniel Santos's avatar
      bug.h: fix BUILD_BUG_ON macro in __CHECKER__ · ca623c91
      Daniel Santos authored
      When __CHECKER__ is defined, we disable all of the BUILD_BUG.* macros.
      However, both BUILD_BUG_ON_NOT_POWER_OF_2 and BUILD_BUG_ON was evaluating
      to nothing in this case, and we want (0) since this is a function-like
      macro that will be followed by a semicolon.
      Signed-off-by: default avatarDaniel Santos <daniel.santos@pobox.com>
      Acked-by: default avatarBorislav Petkov <bp@alien8.de>
      Cc: Andi Kleen <ak@linux.intel.com>
      Cc: David Rientjes <rientjes@google.com>
      Cc: Joe Perches <joe@perches.com>
      Cc: Josh Triplett <josh@joshtriplett.org>
      Cc: Paul Gortmaker <paul.gortmaker@windriver.com>
      Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
      ca623c91
    • Daniel Santos's avatar
      compiler{,-gcc4}.h, bug.h: Remove duplicate macros · 6ae8d048
      Daniel Santos authored
      __linktime_error() does the same thing as __compiletime_error() and is
      only used in bug.h.  Since the macro defines a function attribute that
      will cause a failure at compile-time (not link-time), it makes more sense
      to keep __compiletime_error(), which is also neatly mated with
      __compiletime_warning().
      Signed-off-by: default avatarDaniel Santos <daniel.santos@pobox.com>
      Acked-by: default avatarDavid Rientjes <rientjes@google.com>
      Acked-by: default avatarBorislav Petkov <bp@alien8.de>
      Cc: Andi Kleen <ak@linux.intel.com>
      Cc: Joe Perches <joe@perches.com>
      Cc: Josh Triplett <josh@joshtriplett.org>
      Cc: Paul Gortmaker <paul.gortmaker@windriver.com>
      Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
      6ae8d048
  3. 26 Nov, 2012 1 commit
  4. 29 May, 2012 1 commit
    • Konstantin Khlebnikov's avatar
      bug: introduce BUILD_BUG_ON_INVALID() macro · baf05aa9
      Konstantin Khlebnikov authored
      Sometimes we want to check some expressions correctness at compile time.
      "(void)(e);" or "if (e);" can be dangerous if the expression has
      side-effects, and gcc sometimes generates a lot of code, even if the
      expression has no effect.
      
      This patch introduces macro BUILD_BUG_ON_INVALID() for such checks, it
      forces a compilation error if expression is invalid without any extra
      code.
      
      [Cast to "long" required because sizeof does not work for bit-fields.]
      Signed-off-by: default avatarKonstantin Khlebnikov <khlebnikov@openvz.org>
      Cc: Linus Torvalds <torvalds@linux-foundation.org>
      Cc: Geert Uytterhoeven <geert@linux-m68k.org>
      Cc: "H. Peter Anvin" <hpa@zytor.com>
      Cc: Cong Wang <xiyou.wangcong@gmail.com>
      Cc: Hugh Dickins <hughd@google.com>
      Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
      baf05aa9
  5. 04 Mar, 2012 1 commit
    • Paul Gortmaker's avatar
      bug: consolidate BUILD_BUG_ON with other bug code · 35edd910
      Paul Gortmaker authored
      The support for BUILD_BUG in linux/kernel.h predates the
      addition of linux/bug.h -- with this chunk off separate,
      you can run into situations where a person gets a compile
      fail even when they've included linux/bug.h, like this:
      
          CC      lib/string.o
        lib/string.c: In function 'strlcat':
        lib/string.c:225:2: error: implicit declaration of function 'BUILD_BUG_ON'
        make[2]: *** [lib/string.o] Error 1
        $
        $ grep linux/bug.h lib/string.c
        #include <linux/bug.h>
        $
      
      Since the above violates the principle of least surprise, move
      the BUG chunks from kernel.h to bug.h so it is all together.
      Signed-off-by: default avatarPaul Gortmaker <paul.gortmaker@windriver.com>
      35edd910
  6. 16 Jun, 2009 1 commit
  7. 16 Jul, 2007 1 commit
    • Heiko Carstens's avatar
      generic bug: use show_regs() instead of dump_stack() · 608e2619
      Heiko Carstens authored
      The current generic bug implementation has a call to dump_stack() in case a
      WARN_ON(whatever) gets hit.  Since report_bug(), which calls dump_stack(),
      gets called from an exception handler we can do better: just pass the
      pt_regs structure to report_bug() and pass it to show_regs() in case of a
      warning.  This will give more debug informations like register contents,
      etc...  In addition this avoids some pointless lines that dump_stack()
      emits, since it includes a stack backtrace of the exception handler which
      is of no interest in case of a warning.  E.g.  on s390 the following lines
      are currently always present in a stack backtrace if dump_stack() gets
      called from report_bug():
      
       [<000000000001517a>] show_trace+0x92/0xe8)
       [<0000000000015270>] show_stack+0xa0/0xd0
       [<00000000000152ce>] dump_stack+0x2e/0x3c
       [<0000000000195450>] report_bug+0x98/0xf8
       [<0000000000016cc8>] illegal_op+0x1fc/0x21c
       [<00000000000227d6>] sysc_return+0x0/0x10
      Acked-by: default avatarJeremy Fitzhardinge <jeremy@goop.org>
      Acked-by: default avatarHaavard Skinnemoen <hskinnemoen@atmel.com>
      Cc: Andi Kleen <ak@suse.de>
      Cc: Kyle McMartin <kyle@parisc-linux.org>
      Cc: Paul Mackerras <paulus@samba.org>
      Cc: Paul Mundt <lethal@linux-sh.org>
      Cc: Martin Schwidefsky <schwidefsky@de.ibm.com>
      Signed-off-by: default avatarHeiko Carstens <heiko.carstens@de.ibm.com>
      Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
      608e2619
  8. 08 Dec, 2006 1 commit
    • Jeremy Fitzhardinge's avatar
      [PATCH] Generic BUG implementation · 7664c5a1
      Jeremy Fitzhardinge authored
      This patch adds common handling for kernel BUGs, for use by architectures as
      they wish.  The code is derived from arch/powerpc.
      
      The advantages of having common BUG handling are:
       - consistent BUG reporting across architectures
       - shared implementation of out-of-line file/line data
       - implement CONFIG_DEBUG_BUGVERBOSE consistently
      
      This means that in inline impact of BUG is just the illegal instruction
      itself, which is an improvement for i386 and x86-64.
      
      A BUG is represented in the instruction stream as an illegal instruction,
      which has file/line information associated with it.  This extra information is
      stored in the __bug_table section in the ELF file.
      
      When the kernel gets an illegal instruction, it first confirms it might
      possibly be from a BUG (ie, in kernel mode, the right illegal instruction).
      It then calls report_bug().  This searches __bug_table for a matching
      instruction pointer, and if found, prints the corresponding file/line
      information.  If report_bug() determines that it wasn't a BUG which caused the
      trap, it returns BUG_TRAP_TYPE_NONE.
      
      Some architectures (powerpc) implement WARN using the same mechanism; if the
      illegal instruction was the result of a WARN, then report_bug(Q) returns
      CONFIG_DEBUG_BUGVERBOSE; otherwise it returns BUG_TRAP_TYPE_BUG.
      
      lib/bug.c keeps a list of loaded modules which can be searched for __bug_table
      entries.  The architecture must call
      module_bug_finalize()/module_bug_cleanup() from its corresponding
      module_finalize/cleanup functions.
      
      Unsetting CONFIG_DEBUG_BUGVERBOSE will reduce the kernel size by some amount.
      At the very least, filename and line information will not be recorded for each
      but, but architectures may decide to store no extra information per BUG at
      all.
      
      Unfortunately, gcc doesn't have a general way to mark an asm() as noreturn, so
      architectures will generally have to include an infinite loop (or similar) in
      the BUG code, so that gcc knows execution won't continue beyond that point.
      gcc does have a __builtin_trap() operator which may be useful to achieve the
      same effect, unfortunately it cannot be used to actually implement the BUG
      itself, because there's no way to get the instruction's address for use in
      generating the __bug_table entry.
      
      [randy.dunlap@oracle.com: Handle BUG=n, GENERIC_BUG=n to prevent build errors]
      [bunk@stusta.de: include/linux/bug.h must always #include <linux/module.h]
      Signed-off-by: default avatarJeremy Fitzhardinge <jeremy@goop.org>
      Cc: Andi Kleen <ak@muc.de>
      Cc: Hugh Dickens <hugh@veritas.com>
      Cc: Michael Ellerman <michael@ellerman.id.au>
      Cc: Paul Mackerras <paulus@samba.org>
      Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
      Cc: Rusty Russell <rusty@rustcorp.com.au>
      Signed-off-by: default avatarAdrian Bunk <bunk@stusta.de>
      Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
      Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
      7664c5a1