]> Pileus Git - ~andy/linux/commitdiff
Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/sam/kbuild...
authorLinus Torvalds <torvalds@linux-foundation.org>
Sun, 14 Jun 2009 21:12:18 +0000 (14:12 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Sun, 14 Jun 2009 21:12:18 +0000 (14:12 -0700)
* 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/sam/kbuild-next: (53 commits)
  .gitignore: ignore *.lzma files
  kbuild: add generic --set-str option to scripts/config
  kbuild: simplify argument loop in scripts/config
  kbuild: handle non-existing options in scripts/config
  kallsyms: generalize text region handling
  kallsyms: support kernel symbols in Blackfin on-chip memory
  documentation: make version fix
  kbuild: fix a compile warning
  gitignore: Add GNU GLOBAL files to top .gitignore
  kbuild: fix delay in setlocalversion on readonly source
  README: fix misleading pointer to the defconf directory
  vmlinux.lds.h update
  kernel-doc: cleanup perl script
  Improve vmlinux.lds.h support for arch specific linker scripts
  kbuild: fix headers_exports with boolean expression
  kbuild/headers_check: refine extern check
  kbuild: fix "Argument list too long" error for "make headers_check",
  ignore *.patch files
  Remove bashisms from scripts
  menu: fix embedded menu presentation
  ...

1  2 
.gitignore
Documentation/Changes
Makefile
include/asm-generic/vmlinux.lds.h
init/Kconfig
scripts/kernel-doc

diff --combined .gitignore
index caa8395f63585ef2141f3479eefbf61bd558c376,e9950be749f42dbb40daa79b2424107d18cc38ba..cecb3b040cc17d22acdb9268e130a459e771608a
@@@ -3,7 -3,7 +3,7 @@@
  # subdirectories here. Add them in the ".gitignore" file
  # in that subdirectory instead.
  #
 -# NOTE! Please use 'git-ls-files -i --exclude-standard'
 +# NOTE! Please use 'git ls-files -i --exclude-standard'
  # command after changing this file, to see if there are
  # any tracked files which get ignored after the change.
  #
@@@ -25,6 -25,8 +25,8 @@@
  *.elf
  *.bin
  *.gz
+ *.lzma
+ *.patch
  
  #
  # Top-level generic files
@@@ -62,6 -64,12 +64,12 @@@ serie
  cscope.*
  ncscope.*
  
+ # gnu global files
+ GPATH
+ GRTAGS
+ GSYMS
+ GTAGS
  *.orig
  *~
  \#*#
diff --combined Documentation/Changes
index d21b3b5aa5438a7703f64f6a30a01df8fc84bc14,112e7657943eaf901e790a8a316e7a7725ccb7ba..664392481c840980090b6e79ec35753d3f6a9272
@@@ -29,7 -29,7 +29,7 @@@ hardware, for example, you probably nee
  isdn4k-utils.
  
  o  Gnu C                  3.2                     # gcc --version
- o  Gnu make               3.79.1                  # make --version
+ o  Gnu make               3.80                    # make --version
  o  binutils               2.12                    # ld -v
  o  util-linux             2.10o                   # fdformat --version
  o  module-init-tools      0.9.10                  # depmod -V
@@@ -48,7 -48,6 +48,7 @@@ o  procps                 3.2.
  o  oprofile               0.9                     # oprofiled --version
  o  udev                   081                     # udevinfo -V
  o  grub                   0.93                    # grub --version
 +o  mcelog               0.6
  
  Kernel compilation
  ==================
@@@ -62,7 -61,7 +62,7 @@@ computer
  Make
  ----
  
- You will need Gnu make 3.79.1 or later to build the kernel.
+ You will need Gnu make 3.80 or later to build the kernel.
  
  Binutils
  --------
@@@ -277,16 -276,6 +277,16 @@@ before running exportfs or mountd.  It 
  services be protected from the internet-at-large by a firewall where
  that is possible.
  
 +mcelog
 +------
 +
 +In Linux 2.6.31+ the i386 kernel needs to run the mcelog utility
 +as a regular cronjob similar to the x86-64 kernel to process and log
 +machine check events when CONFIG_X86_NEW_MCE is enabled. Machine check
 +events are errors reported by the CPU. Processing them is strongly encouraged.
 +All x86-64 kernels since 2.6.4 require the mcelog utility to
 +process machine checks.
 +
  Getting updated software
  ========================
  
@@@ -376,10 -365,6 +376,10 @@@ FUS
  ----
  o <http://sourceforge.net/projects/fuse>
  
 +mcelog
 +------
 +o <ftp://ftp.kernel.org/pub/linux/utils/cpu/mce/mcelog/>
 +
  Networking
  **********
  
diff --combined Makefile
index 03373bb703ca9cd4d8cde6403502357815b7e531,0c8ee91bc26ad425000ca4c108602e706dd55889..ea63667617f3543220eb4ffae6c915cfeb6aea3f
+++ b/Makefile
@@@ -1,7 -1,7 +1,7 @@@
  VERSION = 2
  PATCHLEVEL = 6
  SUBLEVEL = 30
 -EXTRAVERSION = -rc8
 +EXTRAVERSION =
  NAME = Man-Eating Seals of Antiquity
  
  # *DOCUMENTATION*
@@@ -35,10 -35,8 +35,8 @@@ MAKEFLAGS += -rR --no-print-director
  # To put more focus on warnings, be less verbose as default
  # Use 'make V=1' to see the full commands
  
- ifdef V
-   ifeq ("$(origin V)", "command line")
-     KBUILD_VERBOSE = $(V)
-   endif
+ ifeq ("$(origin V)", "command line")
+   KBUILD_VERBOSE = $(V)
  endif
  ifndef KBUILD_VERBOSE
    KBUILD_VERBOSE = 0
@@@ -54,10 -52,8 +52,8 @@@ endi
  # See the file "Documentation/sparse.txt" for more details, including
  # where to get the "sparse" utility.
  
- ifdef C
-   ifeq ("$(origin C)", "command line")
-     KBUILD_CHECKSRC = $(C)
-   endif
+ ifeq ("$(origin C)", "command line")
+   KBUILD_CHECKSRC = $(C)
  endif
  ifndef KBUILD_CHECKSRC
    KBUILD_CHECKSRC = 0
@@@ -69,12 -65,10 +65,10 @@@ endi
  ifdef SUBDIRS
    KBUILD_EXTMOD ?= $(SUBDIRS)
  endif
- ifdef M
-   ifeq ("$(origin M)", "command line")
-     KBUILD_EXTMOD := $(M)
-   endif
- endif
  
+ ifeq ("$(origin M)", "command line")
+   KBUILD_EXTMOD := $(M)
+ endif
  
  # kbuild supports saving output files in a separate directory.
  # To locate output files in a separate directory two syntaxes are supported.
@@@ -98,10 -92,8 +92,8 @@@ ifeq ($(KBUILD_SRC),
  
  # OK, Make called in directory where kernel src resides
  # Do we want to locate output files in a separate directory?
- ifdef O
-   ifeq ("$(origin O)", "command line")
-     KBUILD_OUTPUT := $(O)
-   endif
+ ifeq ("$(origin O)", "command line")
+   KBUILD_OUTPUT := $(O)
  endif
  
  # That's our default target when none is given on the command line
index f1736ca7922cb0022244087119f73a70e85f8b23,7381f701f3f3304c9334fc4c16afe0412550e07e..6bdba10fef4a51c88af6cb9fb154b32d885d2fa9
@@@ -1,4 -1,57 +1,57 @@@
- #include <linux/section-names.h>
+ /*
+  * Helper macros to support writing architecture specific
+  * linker scripts.
+  *
+  * A minimal linker scripts has following content:
+  * [This is a sample, architectures may have special requiriements]
+  *
+  * OUTPUT_FORMAT(...)
+  * OUTPUT_ARCH(...)
+  * ENTRY(...)
+  * SECTIONS
+  * {
+  *    . = START;
+  *    __init_begin = .;
+  *    HEAD_TEXT_SECTION
+  *    INIT_TEXT_SECTION(PAGE_SIZE)
+  *    INIT_DATA_SECTION(...)
+  *    PERCPU(PAGE_SIZE)
+  *    __init_end = .;
+  *
+  *    _stext = .;
+  *    TEXT_SECTION = 0
+  *    _etext = .;
+  *
+  *      _sdata = .;
+  *    RO_DATA_SECTION(PAGE_SIZE)
+  *    RW_DATA_SECTION(...)
+  *    _edata = .;
+  *
+  *    EXCEPTION_TABLE(...)
+  *    NOTES
+  *
+  *    __bss_start = .;
+  *    BSS_SECTION(0, 0)
+  *    __bss_stop = .;
+  *    _end = .;
+  *
+  *    /DISCARD/ : {
+  *            EXIT_TEXT
+  *            EXIT_DATA
+  *            EXIT_CALL
+  *    }
+  *    STABS_DEBUG
+  *    DWARF_DEBUG
+  * }
+  *
+  * [__init_begin, __init_end] is the init section that may be freed after init
+  * [_stext, _etext] is the text section
+  * [_sdata, _edata] is the data section
+  *
+  * Some of the included output section have their own set of constants.
+  * Examples are: [__initramfs_start, __initramfs_end] for initramfs and
+  *               [__nosave_begin, __nosave_end] for the nosave data
+  */
  
  #ifndef LOAD_OFFSET
  #define LOAD_OFFSET 0
  #define BRANCH_PROFILE()
  #endif
  
 -#ifdef CONFIG_EVENT_TRACER
 +#ifdef CONFIG_EVENT_TRACING
  #define FTRACE_EVENTS()       VMLINUX_SYMBOL(__start_ftrace_events) = .;      \
                        *(_ftrace_events)                               \
                        VMLINUX_SYMBOL(__stop_ftrace_events) = .;
        FTRACE_EVENTS()                                                 \
        TRACE_SYSCALLS()
  
- #define RO_DATA(align)                                                        \
+ /*
+  * Data section helpers
+  */
+ #define NOSAVE_DATA                                                   \
+       . = ALIGN(PAGE_SIZE);                                           \
+       VMLINUX_SYMBOL(__nosave_begin) = .;                             \
+       *(.data.nosave)                                                 \
+       . = ALIGN(PAGE_SIZE);                                           \
+       VMLINUX_SYMBOL(__nosave_end) = .;
+ #define PAGE_ALIGNED_DATA(page_align)                                 \
+       . = ALIGN(page_align);                                          \
+       *(.data.page_aligned)
+ #define READ_MOSTLY_DATA(align)                                               \
+       . = ALIGN(align);                                               \
+       *(.data.read_mostly)
+ #define CACHELINE_ALIGNED_DATA(align)                                 \
+       . = ALIGN(align);                                               \
+       *(.data.cacheline_aligned)
+ #define INIT_TASK(align)                                              \
+       . = ALIGN(align);                                               \
+       *(.data.init_task)
+ /*
+  * Read only Data
+  */
+ #define RO_DATA_SECTION(align)                                                \
        . = ALIGN((align));                                             \
        .rodata           : AT(ADDR(.rodata) - LOAD_OFFSET) {           \
                VMLINUX_SYMBOL(__start_rodata) = .;                     \
        }                                                               \
        . = ALIGN((align));
  
- /* RODATA provided for backward compatibility.
+ /* RODATA & RO_DATA provided for backward compatibility.
   * All archs are supposed to use RO_DATA() */
- #define RODATA RO_DATA(4096)
+ #define RODATA          RO_DATA_SECTION(4096)
+ #define RO_DATA(align)  RO_DATA_SECTION(align)
  
  #define SECURITY_INIT                                                 \
        .security_initcall.init : AT(ADDR(.security_initcall.init) - LOAD_OFFSET) { \
  #endif
  
  /* Section used for early init (in .S files) */
- #define HEAD_TEXT  *(HEAD_TEXT_SECTION)
+ #define HEAD_TEXT  *(.head.text)
+ #define HEAD_TEXT_SECTION                                                     \
+       .head.text : AT(ADDR(.head.text) - LOAD_OFFSET) {               \
+               HEAD_TEXT                                               \
+       }
+ /*
+  * Exception table
+  */
+ #define EXCEPTION_TABLE(align)                                                \
+       . = ALIGN(align);                                               \
+       __ex_table : AT(ADDR(__ex_table) - LOAD_OFFSET) {               \
+               VMLINUX_SYMBOL(__start___ex_table) = .;                 \
+               *(__ex_table)                                           \
+               VMLINUX_SYMBOL(__stop___ex_table) = .;                  \
+       }
+ /*
+  * Init task
+  */
+ #define INIT_TASK_DATA(align)                                         \
+       . = ALIGN(align);                                               \
+       .data.init_task : {                                             \
+               INIT_TASK                                               \
+       }
  
  /* init and exit section handling */
  #define INIT_DATA                                                     \
        *(.init.data)                                                   \
        DEV_DISCARD(init.data)                                          \
-       DEV_DISCARD(init.rodata)                                        \
        CPU_DISCARD(init.data)                                          \
-       CPU_DISCARD(init.rodata)                                        \
        MEM_DISCARD(init.data)                                          \
+       *(.init.rodata)                                                 \
+       DEV_DISCARD(init.rodata)                                        \
+       CPU_DISCARD(init.rodata)                                        \
        MEM_DISCARD(init.rodata)
  
  #define INIT_TEXT                                                     \
        CPU_DISCARD(exit.text)                                          \
        MEM_DISCARD(exit.text)
  
-               /* DWARF debug sections.
-               Symbols in the DWARF debugging sections are relative to
-               the beginning of the section so we begin them at 0.  */
+ #define EXIT_CALL                                                     \
+       *(.exitcall.exit)
+ /*
+  * bss (Block Started by Symbol) - uninitialized data
+  * zeroed during startup
+  */
+ #define SBSS                                                          \
+       .sbss : AT(ADDR(.sbss) - LOAD_OFFSET) {                         \
+               *(.sbss)                                                \
+               *(.scommon)                                             \
+       }
+ #define BSS(bss_align)                                                        \
+       . = ALIGN(bss_align);                                           \
+       .bss : AT(ADDR(.bss) - LOAD_OFFSET) {                           \
+               VMLINUX_SYMBOL(__bss_start) = .;                        \
+               *(.bss.page_aligned)                                    \
+               *(.dynbss)                                              \
+               *(.bss)                                                 \
+               *(COMMON)                                               \
+               VMLINUX_SYMBOL(__bss_stop) = .;                         \
+       }
+ /*
+  * DWARF debug sections.
+  * Symbols in the DWARF debugging sections are relative to
+  * the beginning of the section so we begin them at 0.
+  */
  #define DWARF_DEBUG                                                   \
                /* DWARF 1 */                                           \
                .debug          0 : { *(.debug) }                       \
                VMLINUX_SYMBOL(__stop_notes) = .;                       \
        }
  
+ #define INIT_SETUP(initsetup_align)                                   \
+               . = ALIGN(initsetup_align);                             \
+               VMLINUX_SYMBOL(__setup_start) = .;                      \
+               *(.init.setup)                                          \
+               VMLINUX_SYMBOL(__setup_end) = .;
  #define INITCALLS                                                     \
        *(.initcallearly.init)                                          \
        VMLINUX_SYMBOL(__early_initcall_end) = .;                       \
        *(.initcall7.init)                                              \
        *(.initcall7s.init)
  
+ #define INIT_CALLS                                                    \
+               VMLINUX_SYMBOL(__initcall_start) = .;                   \
+               INITCALLS                                               \
+               VMLINUX_SYMBOL(__initcall_end) = .;
+ #define CON_INITCALL                                                  \
+               VMLINUX_SYMBOL(__con_initcall_start) = .;               \
+               *(.con_initcall.init)                                   \
+               VMLINUX_SYMBOL(__con_initcall_end) = .;
+ #define SECURITY_INITCALL                                             \
+               VMLINUX_SYMBOL(__security_initcall_start) = .;          \
+               *(.security_initcall.init)                              \
+               VMLINUX_SYMBOL(__security_initcall_end) = .;
+ #ifdef CONFIG_BLK_DEV_INITRD
+ #define INIT_RAM_FS                                                   \
+       . = ALIGN(PAGE_SIZE);                                           \
+       VMLINUX_SYMBOL(__initramfs_start) = .;                          \
+       *(.init.ramfs)                                                  \
+       VMLINUX_SYMBOL(__initramfs_end) = .;
+ #else
+ #define INITRAMFS
+ #endif
  /**
   * PERCPU_VADDR - define output section for percpu area
   * @vaddr: explicit base address (optional)
                *(.data.percpu.shared_aligned)                          \
                VMLINUX_SYMBOL(__per_cpu_end) = .;                      \
        }
+ /*
+  * Definition of the high level *_SECTION macros
+  * They will fit only a subset of the architectures
+  */
+ /*
+  * Writeable data.
+  * All sections are combined in a single .data section.
+  * The sections following CONSTRUCTORS are arranged so their
+  * typical alignment matches.
+  * A cacheline is typical/always less than a PAGE_SIZE so
+  * the sections that has this restriction (or similar)
+  * is located before the ones requiring PAGE_SIZE alignment.
+  * NOSAVE_DATA starts and ends with a PAGE_SIZE alignment which
+  * matches the requirment of PAGE_ALIGNED_DATA.
+  *
+  * use 0 as page_align if page_aligned data is not used */
+ #define RW_DATA_SECTION(cacheline, nosave, pagealigned, inittask)     \
+       . = ALIGN(PAGE_SIZE);                                           \
+       .data : AT(ADDR(.data) - LOAD_OFFSET) {                         \
+               INIT_TASK(inittask)                                     \
+               CACHELINE_ALIGNED_DATA(cacheline)                       \
+               READ_MOSTLY_DATA(cacheline)                             \
+               DATA_DATA                                               \
+               CONSTRUCTORS                                            \
+               NOSAVE_DATA(nosave)                                     \
+               PAGE_ALIGNED_DATA(pagealigned)                          \
+       }
+ #define INIT_TEXT_SECTION(inittext_align)                             \
+       . = ALIGN(inittext_align);                                      \
+       .init.text : AT(ADDR(.init.text) - LOAD_OFFSET) {               \
+               VMLINUX_SYMBOL(_sinittext) = .;                         \
+               INIT_TEXT                                               \
+               VMLINUX_SYMBOL(_einittext) = .;                         \
+       }
+ #define INIT_DATA_SECTION(initsetup_align)                            \
+       .init.data : AT(ADDR(.init.data) - LOAD_OFFSET) {               \
+               INIT_DATA                                               \
+               INIT_SETUP(initsetup_align)                             \
+               INIT_CALLS                                              \
+               CON_INITCALL                                            \
+               SECURITY_INITCALL                                       \
+               INIT_RAM_FS                                             \
+       }
+ #define BSS_SECTION(sbss_align, bss_align)                            \
+       SBSS                                                            \
+       BSS(bss_align)                                                  \
+       . = ALIGN(4);
diff --combined init/Kconfig
index d3a50967c337a95622b52478f6e6382405dd6fc2,4389cee99db07d76918066e5c064ce3df0a21e9d..fed6dc31b0dae854c26ac29216fc5a08824eaa53
@@@ -302,14 -302,13 +302,14 @@@ config AUDITSYSCAL
  
  config AUDIT_TREE
        def_bool y
 -      depends on AUDITSYSCALL && INOTIFY
 +      depends on AUDITSYSCALL
 +      select INOTIFY
  
  menu "RCU Subsystem"
  
  choice
        prompt "RCU Implementation"
 -      default CLASSIC_RCU
 +      default TREE_RCU
  
  config CLASSIC_RCU
        bool "Classic RCU"
@@@ -809,14 -808,6 +809,6 @@@ config KALLSYMS_EXTRA_PAS
           you wait for kallsyms to be fixed.
  
  
- config STRIP_ASM_SYMS
-       bool "Strip assembler-generated symbols during link"
-       default n
-       help
-         Strip internal assembler-generated symbols during a link (symbols
-         that look like '.Lxxx') so they don't pollute the output of
-         get_wchan() and suchlike.
  config HOTPLUG
        bool "Support for hot-pluggable devices" if EMBEDDED
        default y
@@@ -934,42 -925,6 +926,42 @@@ config AI
            by some high performance threaded applications. Disabling
            this option saves about 7k.
  
 +config HAVE_PERF_COUNTERS
 +      bool
 +      help
 +        See tools/perf/design.txt for details.
 +
 +menu "Performance Counters"
 +
 +config PERF_COUNTERS
 +      bool "Kernel Performance Counters"
 +      depends on HAVE_PERF_COUNTERS
 +      select ANON_INODES
 +      help
 +        Enable kernel support for performance counter hardware.
 +
 +        Performance counters are special hardware registers available
 +        on most modern CPUs. These registers count the number of certain
 +        types of hw events: such as instructions executed, cachemisses
 +        suffered, or branches mis-predicted - without slowing down the
 +        kernel or applications. These registers can also trigger interrupts
 +        when a threshold number of events have passed - and can thus be
 +        used to profile the code that runs on that CPU.
 +
 +        The Linux Performance Counter subsystem provides an abstraction of
 +        these hardware capabilities, available via a system call. It
 +        provides per task and per CPU counters, and it provides event
 +        capabilities on top of those.
 +
 +        Say Y if unsure.
 +
 +config EVENT_PROFILE
 +      bool "Tracepoint profile sources"
 +      depends on PERF_COUNTERS && EVENT_TRACER
 +      default y
 +
 +endmenu
 +
  config VM_EVENT_COUNTERS
        default y
        bool "Enable VM event counters for /proc/vmstat" if EMBEDDED
@@@ -998,6 -953,14 +990,14 @@@ config SLUB_DEBU
          SLUB sysfs support. /sys/slab will not exist and there will be
          no support for cache validation etc.
  
+ config STRIP_ASM_SYMS
+       bool "Strip assembler-generated symbols during link"
+       default n
+       help
+         Strip internal assembler-generated symbols during a link (symbols
+         that look like '.Lxxx') so they don't pollute the output of
+         get_wchan() and suchlike.
  config COMPAT_BRK
        bool "Disable heap randomization"
        default y
diff --combined scripts/kernel-doc
index acd8c4a8e3e0b00f24eaf3331b70156becbecf60,5c58478eb914514e047e20cca8f69d5d64784964..a193fa3f5272fbdd95d979a59ed45fbc054211b7
@@@ -5,7 -5,7 +5,7 @@@ use strict
  ## Copyright (c) 1998 Michael Zucchi, All Rights Reserved        ##
  ## Copyright (C) 2000, 1  Tim Waugh <twaugh@redhat.com>          ##
  ## Copyright (C) 2001  Simon Huggins                             ##
- ## Copyright (C) 2005-2008  Randy Dunlap                         ##
+ ## Copyright (C) 2005-2009  Randy Dunlap                         ##
  ##                                                             ##
  ## #define enhancements by Armin Kuster <akuster@mvista.com>   ##
  ## Copyright (c) 2000 MontaVista Software, Inc.                        ##
@@@ -85,7 -85,7 +85,7 @@@
  #
  # /**
  #  * my_function
- #  **/
+ #  */
  #
  # If the Description: header tag is omitted, then there must be a blank line
  # after the last parameter specification.
  #  */
  # etc.
  #
- # Beside functions you can also write documentation for structs, unions,
+ # Besides functions you can also write documentation for structs, unions,
  # enums and typedefs. Instead of the function name you must write the name
  # of the declaration;  the struct/union/enum/typedef must always precede
  # the name. Nesting of declarations is not supported.
@@@ -223,7 -223,7 +223,7 @@@ sub usage 
  }
  
  # read arguments
- if ($#ARGV==-1) {
+ if ($#ARGV == -1) {
      usage();
  }
  
@@@ -240,12 -240,12 +240,12 @@@ my $man_date = ('January', 'February', 
    " " . ((localtime)[5]+1900);
  
  # Essentially these are globals
- # They probably want to be tidied up made more localised or summat.
- # CAVEAT EMPTOR!  Some of the others I localised may not want to be which
+ # They probably want to be tidied up, made more localised or something.
+ # CAVEAT EMPTOR!  Some of the others I localised may not want to be, which
  # could cause "use of undefined value" or other bugs.
- my ($function, %function_table,%parametertypes,$declaration_purpose);
- my ($type,$declaration_name,$return_type);
- my ($newsection,$newcontents,$prototype,$filelist, $brcount, %source_map);
+ my ($function, %function_table, %parametertypes, $declaration_purpose);
+ my ($type, $declaration_name, $return_type);
+ my ($newsection, $newcontents, $prototype, $filelist, $brcount, %source_map);
  
  if (defined($ENV{'KBUILD_VERBOSE'})) {
        $verbose = "$ENV{'KBUILD_VERBOSE'}";
@@@ -279,10 -279,10 +279,10 @@@ my $doc_special = "\@\%\$\&"
  my $doc_start = '^/\*\*\s*$'; # Allow whitespace at end of comment start.
  my $doc_end = '\*/';
  my $doc_com = '\s*\*\s*';
- my $doc_decl = $doc_com.'(\w+)';
- my $doc_sect = $doc_com.'(['.$doc_special.']?[\w\s]+):(.*)';
- my $doc_content = $doc_com.'(.*)';
- my $doc_block = $doc_com.'DOC:\s*(.*)?';
+ my $doc_decl = $doc_com . '(\w+)';
+ my $doc_sect = $doc_com . '([' . $doc_special . ']?[\w\s]+):(.*)';
+ my $doc_content = $doc_com . '(.*)';
+ my $doc_block = $doc_com . 'DOC:\s*(.*)?';
  
  my %constants;
  my %parameterdescs;
@@@ -485,12 -485,12 +485,12 @@@ sub output_enum_html(%) 
      my %args = %{$_[0]};
      my ($parameter);
      my $count;
-     print "<h2>enum ".$args{'enum'}."</h2>\n";
+     print "<h2>enum " . $args{'enum'} . "</h2>\n";
  
-     print "<b>enum ".$args{'enum'}."</b> {<br>\n";
+     print "<b>enum " . $args{'enum'} . "</b> {<br>\n";
      $count = 0;
      foreach $parameter (@{$args{'parameterlist'}}) {
-       print " <b>".$parameter."</b>";
+       print " <b>" . $parameter . "</b>";
        if ($count != $#{$args{'parameterlist'}}) {
            $count++;
            print ",\n";
      print "<h3>Constants</h3>\n";
      print "<dl>\n";
      foreach $parameter (@{$args{'parameterlist'}}) {
-       print "<dt><b>".$parameter."</b>\n";
+       print "<dt><b>" . $parameter . "</b>\n";
        print "<dd>";
        output_highlight($args{'parameterdescs'}{$parameter});
      }
@@@ -516,9 -516,9 +516,9 @@@ sub output_typedef_html(%) 
      my %args = %{$_[0]};
      my ($parameter);
      my $count;
-     print "<h2>typedef ".$args{'typedef'}."</h2>\n";
+     print "<h2>typedef " . $args{'typedef'} . "</h2>\n";
  
-     print "<b>typedef ".$args{'typedef'}."</b>\n";
+     print "<b>typedef " . $args{'typedef'} . "</b>\n";
      output_section_html(@_);
      print "<hr>\n";
  }
@@@ -528,8 -528,8 +528,8 @@@ sub output_struct_html(%) 
      my %args = %{$_[0]};
      my ($parameter);
  
-     print "<h2>".$args{'type'}." ".$args{'struct'}. " - " .$args{'purpose'}."</h2>\n";
-     print "<b>".$args{'type'}." ".$args{'struct'}."</b> {<br>\n";
+     print "<h2>" . $args{'type'} . " " . $args{'struct'} . " - " . $args{'purpose'} . "</h2>\n";
+     print "<b>" . $args{'type'} . " " . $args{'struct'} . "</b> {<br>\n";
      foreach $parameter (@{$args{'parameterlist'}}) {
        if ($parameter =~ /^#/) {
                print "$parameter<br>\n";
        $parameter_name =~ s/\[.*//;
  
        ($args{'parameterdescs'}{$parameter_name} ne $undescribed) || next;
-       print "<dt><b>".$parameter."</b>\n";
+       print "<dt><b>" . $parameter . "</b>\n";
        print "<dd>";
        output_highlight($args{'parameterdescs'}{$parameter_name});
      }
@@@ -576,9 -576,9 +576,9 @@@ sub output_function_html(%) 
      my ($parameter, $section);
      my $count;
  
-     print "<h2>" .$args{'function'}." - ".$args{'purpose'}."</h2>\n";
-     print "<i>".$args{'functiontype'}."</i>\n";
-     print "<b>".$args{'function'}."</b>\n";
+     print "<h2>" . $args{'function'} . " - " . $args{'purpose'} . "</h2>\n";
+     print "<i>" . $args{'functiontype'} . "</i>\n";
+     print "<b>" . $args{'function'} . "</b>\n";
      print "(";
      $count = 0;
      foreach $parameter (@{$args{'parameterlist'}}) {
            # pointer-to-function
            print "<i>$1</i><b>$parameter</b>) <i>($2)</i>";
        } else {
-           print "<i>".$type."</i> <b>".$parameter."</b>";
+           print "<i>" . $type . "</i> <b>" . $parameter . "</b>";
        }
        if ($count != $#{$args{'parameterlist'}}) {
            $count++;
        $parameter_name =~ s/\[.*//;
  
        ($args{'parameterdescs'}{$parameter_name} ne $undescribed) || next;
-       print "<dt><b>".$parameter."</b>\n";
+       print "<dt><b>" . $parameter . "</b>\n";
        print "<dd>";
        output_highlight($args{'parameterdescs'}{$parameter_name});
      }
@@@ -657,7 -657,7 +657,7 @@@ sub output_function_xml(%) 
      my $count;
      my $id;
  
-     $id = "API-".$args{'function'};
+     $id = "API-" . $args{'function'};
      $id =~ s/[^A-Za-z0-9]/-/g;
  
      print "<refentry id=\"$id\">\n";
      print " <date>$man_date</date>\n";
      print "</refentryinfo>\n";
      print "<refmeta>\n";
-     print " <refentrytitle><phrase>".$args{'function'}."</phrase></refentrytitle>\n";
+     print " <refentrytitle><phrase>" . $args{'function'} . "</phrase></refentrytitle>\n";
      print " <manvolnum>9</manvolnum>\n";
      print " <refmiscinfo class=\"version\">" . $kernelversion . "</refmiscinfo>\n";
      print "</refmeta>\n";
      print "<refnamediv>\n";
-     print " <refname>".$args{'function'}."</refname>\n";
+     print " <refname>" . $args{'function'} . "</refname>\n";
      print " <refpurpose>\n";
      print "  ";
      output_highlight ($args{'purpose'});
      print "<refsynopsisdiv>\n";
      print " <title>Synopsis</title>\n";
      print "  <funcsynopsis><funcprototype>\n";
-     print "   <funcdef>".$args{'functiontype'}." ";
-     print "<function>".$args{'function'}." </function></funcdef>\n";
+     print "   <funcdef>" . $args{'functiontype'} . " ";
+     print "<function>" . $args{'function'} . " </function></funcdef>\n";
  
      $count = 0;
      if ($#{$args{'parameterlist'}} >= 0) {
                print "   <paramdef>$1<parameter>$parameter</parameter>)\n";
                print "     <funcparams>$2</funcparams></paramdef>\n";
            } else {
-               print "   <paramdef>".$type;
+               print "   <paramdef>" . $type;
                print " <parameter>$parameter</parameter></paramdef>\n";
            }
        }
@@@ -734,7 -734,7 +734,7 @@@ sub output_struct_xml(%) 
      my ($parameter, $section);
      my $id;
  
-     $id = "API-struct-".$args{'struct'};
+     $id = "API-struct-" . $args{'struct'};
      $id =~ s/[^A-Za-z0-9]/-/g;
  
      print "<refentry id=\"$id\">\n";
      print " <date>$man_date</date>\n";
      print "</refentryinfo>\n";
      print "<refmeta>\n";
-     print " <refentrytitle><phrase>".$args{'type'}." ".$args{'struct'}."</phrase></refentrytitle>\n";
+     print " <refentrytitle><phrase>" . $args{'type'} . " " . $args{'struct'} . "</phrase></refentrytitle>\n";
      print " <manvolnum>9</manvolnum>\n";
      print " <refmiscinfo class=\"version\">" . $kernelversion . "</refmiscinfo>\n";
      print "</refmeta>\n";
      print "<refnamediv>\n";
-     print " <refname>".$args{'type'}." ".$args{'struct'}."</refname>\n";
+     print " <refname>" . $args{'type'} . " " . $args{'struct'} . "</refname>\n";
      print " <refpurpose>\n";
      print "  ";
      output_highlight ($args{'purpose'});
      print "<refsynopsisdiv>\n";
      print " <title>Synopsis</title>\n";
      print "  <programlisting>\n";
-     print $args{'type'}." ".$args{'struct'}." {\n";
+     print $args{'type'} . " " . $args{'struct'} . " {\n";
      foreach $parameter (@{$args{'parameterlist'}}) {
        if ($parameter =~ /^#/) {
            print "$parameter\n";
            # bitfield
            print "  $1 $parameter$2;\n";
        } else {
-           print "  ".$type." ".$parameter.";\n";
+           print "  " . $type . " " . $parameter . ";\n";
        }
      }
      print "};";
@@@ -824,7 -824,7 +824,7 @@@ sub output_enum_xml(%) 
      my $count;
      my $id;
  
-     $id = "API-enum-".$args{'enum'};
+     $id = "API-enum-" . $args{'enum'};
      $id =~ s/[^A-Za-z0-9]/-/g;
  
      print "<refentry id=\"$id\">\n";
      print " <date>$man_date</date>\n";
      print "</refentryinfo>\n";
      print "<refmeta>\n";
-     print " <refentrytitle><phrase>enum ".$args{'enum'}."</phrase></refentrytitle>\n";
+     print " <refentrytitle><phrase>enum " . $args{'enum'} . "</phrase></refentrytitle>\n";
      print " <manvolnum>9</manvolnum>\n";
      print " <refmiscinfo class=\"version\">" . $kernelversion . "</refmiscinfo>\n";
      print "</refmeta>\n";
      print "<refnamediv>\n";
-     print " <refname>enum ".$args{'enum'}."</refname>\n";
+     print " <refname>enum " . $args{'enum'} . "</refname>\n";
      print " <refpurpose>\n";
      print "  ";
      output_highlight ($args{'purpose'});
      print "<refsynopsisdiv>\n";
      print " <title>Synopsis</title>\n";
      print "  <programlisting>\n";
-     print "enum ".$args{'enum'}." {\n";
+     print "enum " . $args{'enum'} . " {\n";
      $count = 0;
      foreach $parameter (@{$args{'parameterlist'}}) {
        print "  $parameter";
@@@ -891,7 -891,7 +891,7 @@@ sub output_typedef_xml(%) 
      my ($parameter, $section);
      my $id;
  
-     $id = "API-typedef-".$args{'typedef'};
+     $id = "API-typedef-" . $args{'typedef'};
      $id =~ s/[^A-Za-z0-9]/-/g;
  
      print "<refentry id=\"$id\">\n";
      print " <date>$man_date</date>\n";
      print "</refentryinfo>\n";
      print "<refmeta>\n";
-     print " <refentrytitle><phrase>typedef ".$args{'typedef'}."</phrase></refentrytitle>\n";
+     print " <refentrytitle><phrase>typedef " . $args{'typedef'} . "</phrase></refentrytitle>\n";
      print " <manvolnum>9</manvolnum>\n";
      print "</refmeta>\n";
      print "<refnamediv>\n";
-     print " <refname>typedef ".$args{'typedef'}."</refname>\n";
+     print " <refname>typedef " . $args{'typedef'} . "</refname>\n";
      print " <refpurpose>\n";
      print "  ";
      output_highlight ($args{'purpose'});
  
      print "<refsynopsisdiv>\n";
      print " <title>Synopsis</title>\n";
-     print "  <synopsis>typedef ".$args{'typedef'}.";</synopsis>\n";
+     print "  <synopsis>typedef " . $args{'typedef'} . ";</synopsis>\n";
      print "</refsynopsisdiv>\n";
  
      output_section_xml(@_);
@@@ -963,15 -963,15 +963,15 @@@ sub output_function_gnome 
      my $count;
      my $id;
  
-     $id = $args{'module'}."-".$args{'function'};
+     $id = $args{'module'} . "-" . $args{'function'};
      $id =~ s/[^A-Za-z0-9]/-/g;
  
      print "<sect2>\n";
-     print " <title id=\"$id\">".$args{'function'}."</title>\n";
+     print " <title id=\"$id\">" . $args{'function'} . "</title>\n";
  
      print "  <funcsynopsis>\n";
-     print "   <funcdef>".$args{'functiontype'}." ";
-     print "<function>".$args{'function'}." ";
+     print "   <funcdef>" . $args{'functiontype'} . " ";
+     print "<function>" . $args{'function'} . " ";
      print "</function></funcdef>\n";
  
      $count = 0;
                print "   <paramdef>$1 <parameter>$parameter</parameter>)\n";
                print "     <funcparams>$2</funcparams></paramdef>\n";
            } else {
-               print "   <paramdef>".$type;
+               print "   <paramdef>" . $type;
                print " <parameter>$parameter</parameter></paramdef>\n";
            }
        }
@@@ -1043,13 -1043,13 +1043,13 @@@ sub output_function_man(%) 
      print ".TH \"$args{'function'}\" 9 \"$args{'function'}\" \"$man_date\" \"Kernel Hacker's Manual\" LINUX\n";
  
      print ".SH NAME\n";
-     print $args{'function'}." \\- ".$args{'purpose'}."\n";
+     print $args{'function'} . " \\- " . $args{'purpose'} . "\n";
  
      print ".SH SYNOPSIS\n";
      if ($args{'functiontype'} ne "") {
-       print ".B \"".$args{'functiontype'}."\" ".$args{'function'}."\n";
+       print ".B \"" . $args{'functiontype'} . "\" " . $args{'function'} . "\n";
      } else {
-       print ".B \"".$args{'function'}."\n";
+       print ".B \"" . $args{'function'} . "\n";
      }
      $count = 0;
      my $parenth = "(";
        $type = $args{'parametertypes'}{$parameter};
        if ($type =~ m/([^\(]*\(\*)\s*\)\s*\(([^\)]*)\)/) {
            # pointer-to-function
-           print ".BI \"".$parenth.$1."\" ".$parameter." \") (".$2.")".$post."\"\n";
+           print ".BI \"" . $parenth . $1 . "\" " . $parameter . " \") (" . $2 . ")" . $post . "\"\n";
        } else {
            $type =~ s/([^\*])$/$1 /;
-           print ".BI \"".$parenth.$type."\" ".$parameter." \"".$post."\"\n";
+           print ".BI \"" . $parenth . $type . "\" " . $parameter . " \"" . $post . "\"\n";
        }
        $count++;
        $parenth = "";
        my $parameter_name = $parameter;
        $parameter_name =~ s/\[.*//;
  
-       print ".IP \"".$parameter."\" 12\n";
+       print ".IP \"" . $parameter . "\" 12\n";
        output_highlight($args{'parameterdescs'}{$parameter_name});
      }
      foreach $section (@{$args{'sectionlist'}}) {
@@@ -1094,10 -1094,10 +1094,10 @@@ sub output_enum_man(%) 
      print ".TH \"$args{'module'}\" 9 \"enum $args{'enum'}\" \"$man_date\" \"API Manual\" LINUX\n";
  
      print ".SH NAME\n";
-     print "enum ".$args{'enum'}." \\- ".$args{'purpose'}."\n";
+     print "enum " . $args{'enum'} . " \\- " . $args{'purpose'} . "\n";
  
      print ".SH SYNOPSIS\n";
-     print "enum ".$args{'enum'}." {\n";
+     print "enum " . $args{'enum'} . " {\n";
      $count = 0;
      foreach my $parameter (@{$args{'parameterlist'}}) {
        print ".br\n.BI \"    $parameter\"\n";
        my $parameter_name = $parameter;
        $parameter_name =~ s/\[.*//;
  
-       print ".IP \"".$parameter."\" 12\n";
+       print ".IP \"" . $parameter . "\" 12\n";
        output_highlight($args{'parameterdescs'}{$parameter_name});
      }
      foreach $section (@{$args{'sectionlist'}}) {
@@@ -1131,13 -1131,13 +1131,13 @@@ sub output_struct_man(%) 
      my %args = %{$_[0]};
      my ($parameter, $section);
  
-     print ".TH \"$args{'module'}\" 9 \"".$args{'type'}." ".$args{'struct'}."\" \"$man_date\" \"API Manual\" LINUX\n";
+     print ".TH \"$args{'module'}\" 9 \"" . $args{'type'} . " " . $args{'struct'} . "\" \"$man_date\" \"API Manual\" LINUX\n";
  
      print ".SH NAME\n";
-     print $args{'type'}." ".$args{'struct'}." \\- ".$args{'purpose'}."\n";
+     print $args{'type'} . " " . $args{'struct'} . " \\- " . $args{'purpose'} . "\n";
  
      print ".SH SYNOPSIS\n";
-     print $args{'type'}." ".$args{'struct'}." {\n.br\n";
+     print $args{'type'} . " " . $args{'struct'} . " {\n.br\n";
  
      foreach my $parameter (@{$args{'parameterlist'}}) {
        if ($parameter =~ /^#/) {
        $type = $args{'parametertypes'}{$parameter};
        if ($type =~ m/([^\(]*\(\*)\s*\)\s*\(([^\)]*)\)/) {
            # pointer-to-function
-           print ".BI \"    ".$1."\" ".$parameter." \") (".$2.")"."\"\n;\n";
+           print ".BI \"    " . $1 . "\" " . $parameter . " \") (" . $2 . ")" . "\"\n;\n";
        } elsif ($type =~ m/^(.*?)\s*(:.*)/) {
            # bitfield
-           print ".BI \"    ".$1."\ \" ".$parameter.$2." \""."\"\n;\n";
+           print ".BI \"    " . $1 . "\ \" " . $parameter . $2 . " \"" . "\"\n;\n";
        } else {
            $type =~ s/([^\*])$/$1 /;
-           print ".BI \"    ".$type."\" ".$parameter." \""."\"\n;\n";
+           print ".BI \"    " . $type . "\" " . $parameter . " \"" . "\"\n;\n";
        }
        print "\n.br\n";
      }
        $parameter_name =~ s/\[.*//;
  
        ($args{'parameterdescs'}{$parameter_name} ne $undescribed) || next;
-       print ".IP \"".$parameter."\" 12\n";
+       print ".IP \"" . $parameter . "\" 12\n";
        output_highlight($args{'parameterdescs'}{$parameter_name});
      }
      foreach $section (@{$args{'sectionlist'}}) {
@@@ -1189,7 -1189,7 +1189,7 @@@ sub output_typedef_man(%) 
      print ".TH \"$args{'module'}\" 9 \"$args{'typedef'}\" \"$man_date\" \"API Manual\" LINUX\n";
  
      print ".SH NAME\n";
-     print "typedef ".$args{'typedef'}." \\- ".$args{'purpose'}."\n";
+     print "typedef " . $args{'typedef'} . " \\- " . $args{'purpose'} . "\n";
  
      foreach $section (@{$args{'sectionlist'}}) {
        print ".SH \"$section\"\n";
@@@ -1218,13 -1218,13 +1218,13 @@@ sub output_function_text(%) 
      my $start;
  
      print "Name:\n\n";
-     print $args{'function'}." - ".$args{'purpose'}."\n";
+     print $args{'function'} . " - " . $args{'purpose'} . "\n";
  
      print "\nSynopsis:\n\n";
      if ($args{'functiontype'} ne "") {
-       $start = $args{'functiontype'}." ".$args{'function'}." (";
+       $start = $args{'functiontype'} . " " . $args{'function'} . " (";
      } else {
-       $start = $args{'function'}." (";
+       $start = $args{'function'} . " (";
      }
      print $start;
  
        $type = $args{'parametertypes'}{$parameter};
        if ($type =~ m/([^\(]*\(\*)\s*\)\s*\(([^\)]*)\)/) {
            # pointer-to-function
-           print $1.$parameter.") (".$2;
+           print $1 . $parameter . ") (" . $2;
        } else {
-           print $type." ".$parameter;
+           print $type . " " . $parameter;
        }
        if ($count != $#{$args{'parameterlist'}}) {
            $count++;
        my $parameter_name = $parameter;
        $parameter_name =~ s/\[.*//;
  
-       print $parameter."\n\t".$args{'parameterdescs'}{$parameter_name}."\n";
+       print $parameter . "\n\t" . $args{'parameterdescs'}{$parameter_name} . "\n";
      }
      output_section_text(@_);
  }
@@@ -1276,8 -1276,8 +1276,8 @@@ sub output_enum_text(%) 
      my $count;
      print "Enum:\n\n";
  
-     print "enum ".$args{'enum'}." - ".$args{'purpose'}."\n\n";
-     print "enum ".$args{'enum'}." {\n";
+     print "enum " . $args{'enum'} . " - " . $args{'purpose'} . "\n\n";
+     print "enum " . $args{'enum'} . " {\n";
      $count = 0;
      foreach $parameter (@{$args{'parameterlist'}}) {
        print "\t$parameter";
      print "Constants:\n\n";
      foreach $parameter (@{$args{'parameterlist'}}) {
        print "$parameter\n\t";
-       print $args{'parameterdescs'}{$parameter}."\n";
+       print $args{'parameterdescs'}{$parameter} . "\n";
      }
  
      output_section_text(@_);
@@@ -1305,7 -1305,7 +1305,7 @@@ sub output_typedef_text(%) 
      my $count;
      print "Typedef:\n\n";
  
-     print "typedef ".$args{'typedef'}." - ".$args{'purpose'}."\n";
+     print "typedef " . $args{'typedef'} . " - " . $args{'purpose'} . "\n";
      output_section_text(@_);
  }
  
@@@ -1314,8 -1314,8 +1314,8 @@@ sub output_struct_text(%) 
      my %args = %{$_[0]};
      my ($parameter);
  
-     print $args{'type'}." ".$args{'struct'}." - ".$args{'purpose'}."\n\n";
-     print $args{'type'}." ".$args{'struct'}." {\n";
+     print $args{'type'} . " " . $args{'struct'} . " - " . $args{'purpose'} . "\n\n";
+     print $args{'type'} . " " . $args{'struct'} . " {\n";
      foreach $parameter (@{$args{'parameterlist'}}) {
        if ($parameter =~ /^#/) {
            print "$parameter\n";
            # bitfield
            print "\t$1 $parameter$2;\n";
        } else {
-           print "\t".$type." ".$parameter.";\n";
+           print "\t" . $type . " " . $parameter . ";\n";
        }
      }
      print "};\n\n";
  
        ($args{'parameterdescs'}{$parameter_name} ne $undescribed) || next;
        print "$parameter\n\t";
-       print $args{'parameterdescs'}{$parameter_name}."\n";
+       print $args{'parameterdescs'}{$parameter_name} . "\n";
      }
      print "\n";
      output_section_text(@_);
@@@ -1387,7 -1387,7 +1387,7 @@@ sub output_declaration 
  # generic output function - calls the right one based on current output mode.
  sub output_blockhead {
      no strict 'refs';
-     my $func = "output_blockhead_".$output_mode;
+     my $func = "output_blockhead_" . $output_mode;
      &$func(@_);
      $section_counter++;
  }
  sub dump_declaration($$) {
      no strict 'refs';
      my ($prototype, $file) = @_;
-     my $func = "dump_".$decl_type;
+     my $func = "dump_" . $decl_type;
      &$func(@_);
  }
  
@@@ -1645,7 -1645,7 +1645,7 @@@ sub push_parameter($$$) 
                    "or member '$param' not " .
                    "described in '$declaration_name'\n";
            }
-           print STDERR "Warning(${file}:$.):".
+           print STDERR "Warning(${file}:$.):" .
                         " No description found for parameter '$param'\n";
            ++$warnings;
        }
@@@ -1828,25 -1828,6 +1828,25 @@@ sub reset_state 
      $state = 0;
  }
  
 +sub tracepoint_munge($) {
 +      my $file = shift;
 +      my $tracepointname = 0;
 +      my $tracepointargs = 0;
 +
 +      if($prototype =~ m/TRACE_EVENT\((.*?),/) {
 +              $tracepointname = $1;
 +      }
 +      if($prototype =~ m/TP_PROTO\((.*?)\)/) {
 +              $tracepointargs = $1;
 +      }
 +      if (($tracepointname eq 0) || ($tracepointargs eq 0)) {
 +              print STDERR "Warning(${file}:$.): Unrecognized tracepoint format: \n".
 +                           "$prototype\n";
 +      } else {
 +              $prototype = "static inline void trace_$tracepointname($tracepointargs)";
 +      }
 +}
 +
  sub syscall_munge() {
        my $void = 0;
  
@@@ -1901,9 -1882,6 +1901,9 @@@ sub process_state3_function($$) 
        if ($prototype =~ /SYSCALL_DEFINE/) {
                syscall_munge();
        }
 +      if ($prototype =~ /TRACE_EVENT/) {
 +              tracepoint_munge($file);
 +      }
        dump_function($prototype, $file);
        reset_state();
      }
@@@ -1929,7 -1907,7 +1929,7 @@@ sub process_state3_type($$) 
            ($2 eq '{') && $brcount++;
            ($2 eq '}') && $brcount--;
            if (($2 eq ';') && ($brcount == 0)) {
-               dump_declaration($prototype,$file);
+               dump_declaration($prototype, $file);
                reset_state();
                last;
            }
@@@ -2106,7 -2084,7 +2106,7 @@@ sub process_file($) 
                    $section = $section_default;
                    $contents = "";
                } else {
-                   $contents .= $1."\n";
+                   $contents .= $1 . "\n";
                }
            } else {
                # i dont know - bad line?  ignore.