This can be helpful in cases where old modules for some reason
had not been cleaned when the location was still /boot/modules
and have ended up getting objcopy'd to /boot/kernel after the
location was changed.

* Record the expected kernel stack pointer along with the pcb_onfault
action. Adjust the trap code to only take the action if the frame's
stack pointer matches the recorded expected stack pointer.

Otherwise this might be a recursive trap and we definitely do NOT want
to execute the on-fault stuff in that situation.

* Prior to these changes recursive traps during uiomove()s could result
in a kernel stack so corrupt that finding the actual cause of the panic
becomes impossible. This is believed to be making life difficult for us
trying to track down a particular i386 panic.

* On x86-64 we had to increase the size of the pcb structure. kgdb on
kernel cores and live kernels will be effected (needs recompile).

* The info structure for the pmap_inval*() API is only initialized
conditionally as an optimization.

* There was a case where the info structure was being used without
first being initialized which matches reported panics (essentially
a pipe buffer page in kernel memory is swapped out and the faulted back
in during a uiomove).

Other than C++ code, the GCC offsetof builtin was never getting used.
The version that did get expanded could not be used for array
declarations on GCC 4.5 and later because it wasn't considered a
constant expression by those later GCC compilers.

The first symptom was seen when building world with GCC 4.6, but the
the offsetof expansion was finally identified as the cause of the
problem while discussion PostgreSQL 9.1 build failures on DragonFly.
Since DragonFly was the only platform exibiting the behavior, the
problem was narrowed down to the offsetof macro or the compiler itself.
Fixing the macro allowed the unpatched pgsql to compile.

In rare cases, the PROG target is intentionally redefined before
including bsd.prog.mk, but when that happens a target redefinition
warning is emitting. This adds a check for a pre-existing $PROG
target before attempting to define it.

It stops warnings from being emitted when loader and loader_tftp
are built.

The internal specs of gcc47 featured an hardcoded standard include
directory which prevented cross-target builds. The same mistake also
caused the "crosstools" compiler in a native build to look at the host
system includes instead of the world_{TARGET}/usr/includes directory.
As a result, the cross-build would break as soon as GCC47 was used to
build its own libraries.

A stage-specific prefix was added to the internal specs directory
definition that restored cross-target building capability.

There was a bootstrap problem with gcc47.
For systems without gcc47 (which is almost all of them), the buildworld
failed on the first gcc47 libraries which require gcc47 to build. The
gnu/lib/gcc47/csu target was duplicated and the makefile was attempting
to build it before gcc47 was installed.

Make has several evaluations that gcc47 believes will always
(without exception) evaluate to true or false. Likely gcc47 is not
detecting some cases correctly, so -Wno-address was passed to it.
However, -Werror overrides it, so NO_WERROR had to be set on this
Makefile.

The remaining GCC warnings will be left for swildner to handle.
The -Werror flag will be suppress for GCC47 until further notice.

With high job numbers, sometimes c++config.h would get included before
it finished getting generated. Solve this race by using "depend all"
which should ensure c++config.h gets generated before anything else
in libstdc++ starts to build.

Replace GCC 4.1 with GCC 4.7. The primary compiler remains GCC 4.4
and the source and makefiles for GCC 4.1 remain intact so it can be
brought back if necessary. All references to GCC 4.1 in documentation
where updated to reflect version 4.7.

The majority of these changes are new files required to build GCC on
DragonFly. They are identical to the lang/gcc-aux modifications. Of
interest:

1) The modification to c-format.c is a carry-over from GCC44. It
maintains support for the DragonFly-specific %b and %D conversions.
2) The modification to tree-inline.c is a carry-over from GCC44. It
maintains the suppression of "unlikely call" inline warnings.
3) The gcc driver was modified to strip out all the bad paths in its
search path. gcc -print-search-dirs is now short and accurate.

The following programs fail to build with gcc47 due to the new
unused-but-set-variable warning. They've been fixed in various ways.
The ones set with WARNS=3 suppress cast-qual warning
There is a single enum-compare error too.