22 Feb, 2013

6 commits

  • 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: Daniel Santos
    Cc: Andi Kleen
    Cc: Borislav Petkov
    Cc: David Rientjes
    Cc: Joe Perches
    Cc: Josh Triplett
    Cc: Paul Gortmaker
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Daniel Santos
     
  • 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: Daniel Santos
    Cc: Andi Kleen
    Cc: Borislav Petkov
    Cc: David Rientjes
    Cc: Joe Perches
    Cc: Josh Triplett
    Cc: Paul Gortmaker
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Daniel Santos
     
  • 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 /*/include/asm/bug.h being
    changed or not including linux/compiler.h for some reason.

    Signed-off-by: Daniel Santos
    Acked-by: Borislav Petkov
    Cc: Andi Kleen
    Cc: David Rientjes
    Cc: Joe Perches
    Cc: Josh Triplett
    Cc: Paul Gortmaker
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Daniel Santos
     
  • 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: Daniel Santos
    Cc: Andi Kleen
    Cc: Borislav Petkov
    Cc: David Rientjes
    Cc: Joe Perches
    Cc: Josh Triplett
    Cc: Paul Gortmaker
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Daniel Santos
     
  • 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: Daniel Santos
    Acked-by: Borislav Petkov
    Cc: Andi Kleen
    Cc: David Rientjes
    Cc: Joe Perches
    Cc: Josh Triplett
    Cc: Paul Gortmaker
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Daniel Santos
     
  • __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: Daniel Santos
    Acked-by: David Rientjes
    Acked-by: Borislav Petkov
    Cc: Andi Kleen
    Cc: Joe Perches
    Cc: Josh Triplett
    Cc: Paul Gortmaker
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Daniel Santos
     

27 Nov, 2012

1 commit

  • Commit baf05aa9271b ("bug: introduce BUILD_BUG_ON_INVALID() macro")
    introduces this macro only when _CHECKER_ is not defined. Define a
    silent macro in the else condition to fix following sparse warning:

    mm/filemap.c:395:9: error: undefined identifier 'BUILD_BUG_ON_INVALID'
    mm/filemap.c:396:9: error: undefined identifier 'BUILD_BUG_ON_INVALID'
    mm/filemap.c:397:9: error: undefined identifier 'BUILD_BUG_ON_INVALID'
    include/linux/mm.h:419:9: error: undefined identifier 'BUILD_BUG_ON_INVALID'
    include/linux/mm.h:419:9: error: not a function

    Signed-off-by: Tushar Behera
    Acked-by: Konstantin Khlebnikov
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Tushar Behera
     

30 May, 2012

1 commit

  • 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: Konstantin Khlebnikov
    Cc: Linus Torvalds
    Cc: Geert Uytterhoeven
    Cc: "H. Peter Anvin"
    Cc: Cong Wang
    Cc: Hugh Dickins
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Konstantin Khlebnikov
     

05 Mar, 2012

1 commit

  • 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
    $

    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: Paul Gortmaker

    Paul Gortmaker
     

17 Jun, 2009

1 commit

  • They're in linux/bug.h at present, which causes include order tangles. In
    particular, linux/bug.h cannot be used by linux/atomic.h because,
    according to Nikanth:

    linux/bug.h pulls in linux/module.h => linux/spinlock.h => asm/spinlock.h
    (which uses atomic_inc) => asm/atomic.h.

    bug.h is a pretty low-level thing and module.h is a higher-level thing,
    IMO.

    Cc: Nikanth Karthikesan
    Cc: Rusty Russell
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Andrew Morton
     

17 Jul, 2007

1 commit

  • 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():

    [] show_trace+0x92/0xe8)
    [] show_stack+0xa0/0xd0
    [] dump_stack+0x2e/0x3c
    [] report_bug+0x98/0xf8
    [] illegal_op+0x1fc/0x21c
    [] sysc_return+0x0/0x10

    Acked-by: Jeremy Fitzhardinge
    Acked-by: Haavard Skinnemoen
    Cc: Andi Kleen
    Cc: Kyle McMartin
    Cc: Paul Mackerras
    Cc: Paul Mundt
    Cc: Martin Schwidefsky
    Signed-off-by: Heiko Carstens
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Heiko Carstens
     

09 Dec, 2006

1 commit

  • 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
    Cc: Andi Kleen
    Cc: Hugh Dickens
    Cc: Michael Ellerman
    Cc: Paul Mackerras
    Cc: Benjamin Herrenschmidt
    Cc: Rusty Russell
    Signed-off-by: Adrian Bunk
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Jeremy Fitzhardinge