Patchwork [build] Move MD_UNWIND_SUPPORT to toplevel libgcc

login
register
mail settings
Submitter Rainer Orth
Date May 30, 2011, 3:43 p.m.
Message ID <yddr57gry79.fsf@manam.CeBiTec.Uni-Bielefeld.DE>
Download mbox | patch
Permalink /patch/97933/
State New
Headers show

Comments

Rainer Orth - May 30, 2011, 3:43 p.m.
Once the initial Solaris 2 toplevel libgcc move

	http://gcc.gnu.org/ml/gcc-patches/2011-05/msg00098.html

is complete, there are only two macros left that could be moved for my
targets: MD_UNWIND_SUPPORT (handled in this patch) and
ENABLE_EXECUTE_STACK (in a followup).

The following patch moves MD_UNWIND_SUPPORT and is pretty mechanical:

* It removes the macro in the gcc/config headers and poisons it in
  gcc/system.h.

* It introduces a new md_unwind_header variable in libgcc/config.host to
  capture the info.

* The three users of MD_UNWIND_SUPPORT are modified to unconditionally
  include a new md-unwind-support.h header which is created from the
  info in config.host: if md_unwind_header exists, it is included in
  md-unwind-support.h, otherwise the generated header is empty.

Bootstrapped without regressions on i386-pc-solaris2.11 and
sparc-sun-solaris2.11.

I'm Cc'ing the OS port maintainers if listed, but not the CPU port ones.

Given the straightforward nature of the patch, I'd really appreciate if
a build maintainer and global reviewer could approve it.

Thanks.
	Rainer


2011-05-29  Rainer Orth  <ro@CeBiTec.Uni-Bielefeld.DE>

	gcc:
	* config/alpha/linux.h (MD_UNWIND_SUPPORT): Remove.
	* config/alpha/osf5.h (MD_UNWIND_SUPPORT): Remove.
	* config/alpha/vms.h (MD_UNWIND_SUPPORT): Remove.
	* config/bfin/linux.h (MD_UNWIND_SUPPORT): Remove.
	* config/bfin/uclinux.h (MD_UNWIND_SUPPORT): Remove.
	* config/i386/linux.h (MD_UNWIND_SUPPORT): Remove.
	* config/i386/linux64.h (MD_UNWIND_SUPPORT): Remove.
	* config/i386/sol2.h (MD_UNWIND_SUPPORT): Remove.
	* config/i386/mingw32.h (MD_UNWIND_SUPPORT): Remove.
	* config/ia64/linux.h (MD_UNWIND_SUPPORT): Remove.
	* config/ia64/vms.h (MD_UNWIND_SUPPORT): Remove.
	* config/m68k/linux.h (MD_UNWIND_SUPPORT): Remove.
	* config/mips/linux.h (MD_UNWIND_SUPPORT): Remove.
	* config/pa/pa-hpux.h (MD_UNWIND_SUPPORT): Remove.
	* config/pa/pa32-linux.h (MD_UNWIND_SUPPORT): Remove.
	* config/rs6000/darwin.h (MD_UNWIND_SUPPORT): Remove.
	* config/rs6000/linux.h (MD_UNWIND_SUPPORT): Remove.
	* config/rs6000/linux64.h (MD_UNWIND_SUPPORT): Remove.
	* config/s390/linux.h (MD_UNWIND_SUPPORT): Remove.
	* config/s390/tpf.h (MD_UNWIND_SUPPORT): Remove.
	* config/sh/linux.h (MD_UNWIND_SUPPORT): Remove.
	* config/sparc/linux.h (MD_UNWIND_SUPPORT): Remove.
	* config/sparc/linux64.h (MD_UNWIND_SUPPORT): Remove.
	* config/sparc/sol2.h (MD_UNWIND_SUPPORT): Remove.
	* config/xtensa/linux.h (MD_UNWIND_SUPPORT): Remove.
	* config/alpha/linux-unwind.h: Move to ../libgcc/config/alpha.
	* config/alpha/osf5-unwind.h: Move to ../libgcc/config/alpha.
	* config/alpha/vms-unwind.h: Move to ../libgcc/config/alpha.
	* config/bfin/linux-unwind.h: Move to ../libgcc/config/bfin.
	* config/i386/linux-unwind.h: Move to ../libgcc/config/i386.
	* config/i386/sol2-unwind.h: Move to ../libgcc/config/i386.
	* config/i386/w32-unwind.h: Move to ../libgcc/config/i386.
	* config/ia64/linux-unwind.h: Move to ../libgcc/config/ia64.
	* config/ia64/vms-unwind.h: Move to ../libgcc/config/ia64.
	* config/m68k/linux-unwind.h: Move to ../libgcc/config/m68k.
	* config/mips/linux-unwind.h: Move to ../libgcc/config/mips.
	* config/pa/hpux-unwind.h: Move to ../libgcc/config/pa.
	* config/pa/linux-unwind.h: Move to ../libgcc/config/pa.
	* config/rs6000/darwin-unwind.h: Move to ../libgcc/config/rs6000.
	* config/rs6000/linux-unwind.h: Move to ../libgcc/config/rs6000.
	* config/s390/linux-unwind.h: Move to ../libgcc/config/s390.
	* config/s390/tpf-unwind.h: Move to ../libgcc/config/s390.
	* config/sh/linux-unwind.h: Move to ../libgcc/config/sh.
	* config/sparc/linux-unwind.h: Move to ../libgcc/config/sparc.
	* config/sparc/sol2-unwind.h: Move to ../libgcc/config/sparc.
	* config/xtensa/linux-unwind.h: Move to ../libgcc/config/xtensa.
	* system.h (MD_UNWIND_SUPPORT): Poison.
	* doc/tm.texi.in (Exception Handling, MD_UNWIND_SUPPORT): Remove.
	* doc/tm.texi: Regenerate.
	* unwind-dw2.c: Include md-unwind-support.h instead of
	MD_UNWIND_SUPPORT.
	* config/ia64/unwind-ia64.c: Likewise.
	* config/xtensa/unwind-dw2-xtensa.c: Likewise.

	libgcc:
	* config/alpha/linux-unwind.h: Move from ../gcc/config/alpha.
	* config/alpha/osf5-unwind.h: Move from ../gcc/config/alpha.
	* config/alpha/vms-unwind.h: Move from ../gcc/config/alpha.
	* config/bfin/linux-unwind.h: Move from ../gcc/config/bfin.
	* config/i386/linux-unwind.h: Move from ../gcc/config/i386.
	* config/i386/sol2-unwind.h: Move from ../gcc/config/i386.
	* config/i386/w32-unwind.h: Move from ../gcc/config/i386.
	* config/ia64/linux-unwind.h: Move from ../gcc/config/ia64.
	* config/ia64/vms-unwind.h: Move from ../gcc/config/ia64.
	* config/m68k/linux-unwind.h: Move from ../gcc/config/m68k.
	* config/mips/linux-unwind.h: Move from ../gcc/config/mips.
	* config/pa/hpux-unwind.h: Move from ../gcc/config/pa.
	* config/pa/linux-unwind.h: Move from ../gcc/config/pa.
	* config/rs6000/darwin-unwind.h: Move from ../gcc/config/rs6000.
	* config/rs6000/linux-unwind.h: Move from ../gcc/config/rs6000.
	* config/s390/linux-unwind.h: Move from ../gcc/config/s390.
	* config/s390/tpf-unwind.h: Move from ../gcc/config/s390.
	* config/sh/linux-unwind.h: Move from ../gcc/config/sh.
	* config/sparc/linux-unwind.h: Move from ../gcc/config/sparc.
	* config/sparc/sol2-unwind.h: Move from ../gcc/config/sparc.
	* config/xtensa/linux-unwind.h: Move from ../gcc/config/xtensa.
	* config.host (md_unwind_header): Document.
	Define.
	(alpha*-*-linux*, alpha*-dec-osf5.1*, alpha64-dec-*vms*,
	alpha*-dec-*vms*, bfin*-uclinux*, bfin*-linux-uclibc*,
	hppa*-*-linux*, hppa[12]*-*-hpux10*, hppa*64*-*-hpux11*,
	hppa[12]*-*-hpux11*): Set md_unwind_header.
	(i[34567]86-*-linux*): Handle i[34567]86-*-kopensolaris*-gnu.
	Set md_unwind_header.
	(x86_64-*-linux*, i[34567]86-*-solaris2*): Set md_unwind_header.
	(i[34567]86-*-cygwin*): Split from i[34567]86-*-mingw*.
	(i[34567]86-*-mingw*, ia64*-*-linux*, ia64-hp-*vms*,
	m68k-*-uclinux*, m68k-*-linux*, mips64*-*-linux*, mips*-*-linux*,
	powerpc-*-darwin*, powerpc-*-linux*, s390-*-linux*,
	s390x-*-linux*,  s390x-ibm-tpf*, sh*-*-linux*, sparc-*-linux*,
	sparc*-*-solaris2*, sparc64-*-linux*, xtensa*-*-linux*): Set
	md_unwind_header.
	* configure.ac (md_unwind_header): Substitute.
	* configure: Regenerate.
	* Makefile.in (md_unwind_header): New variable.
	(clean): Remove md-unwind-support.h.
	(md-unwind-support.h): New target.
	(libgcc-eh-static-objects, libgcc-eh-shared-objects,
	libgcc-eh-objects ): New variables
	Depend on md-unwind-support.
	(libgcc-eh-objects, libgcc-s-objects, libgcc-objects): Use them.
Paolo Bonzini - May 31, 2011, 9:02 a.m.
On 05/30/2011 05:43 PM, Rainer Orth wrote:
> +md-unwind-support.h: config.status
> +	if test -n "$(md_unwind_header)"; then \
> +	  echo "#include \"config/$(md_unwind_header)\"">  $@; \
> +	else \
> +	  :>  $@; \
> +	fi

Can you add a default file md-unwind-none.h and use

AC_CONFIG_LINKS([md-unwind-support.h:$md_unwind_header])

instead of this (and instead of AC_SUBST'ing the variable)?

> -libgcc-eh-objects += $(addsuffix $(objext),$(basename $(notdir $(LIB2ADDEHSTATIC))))
> -libgcc-s-objects += $(addsuffix _s$(objext),$(basename $(notdir $(LIB2ADDEHSHARED))))
> +libgcc-eh-static-objects := $(addsuffix $(objext),$(basename $(notdir $(LIB2ADDEHSTATIC))))
> +libgcc-eh-shared-objects := $(addsuffix _s$(objext),$(basename $(notdir $(LIB2ADDEHSHARED))))
> +
> +$(libgcc-eh-static-objects) $(libgcc-eh-shared-objects): md-unwind-support.h
> +
> +libgcc-eh-objects += $(libgcc-eh-static-objects)
> +libgcc-s-objects += $(libgcc-eh-shared-objects)

These changes to the dependencies should not be necessary, libgcc does 
automatic dependency tracking.

Also a good start, though.  Thanks for this work.

Paolo
Rainer Orth - May 31, 2011, 4:40 p.m.
Paolo Bonzini <bonzini@gnu.org> writes:

> On 05/30/2011 05:43 PM, Rainer Orth wrote:
>> +md-unwind-support.h: config.status
>> +	if test -n "$(md_unwind_header)"; then \
>> +	  echo "#include \"config/$(md_unwind_header)\"">  $@; \
>> +	else \
>> +	  :>  $@; \
>> +	fi
>
> Can you add a default file md-unwind-none.h and use
>
> AC_CONFIG_LINKS([md-unwind-support.h:$md_unwind_header])
>
> instead of this (and instead of AC_SUBST'ing the variable)?

Sure, will do.

>> -libgcc-eh-objects += $(addsuffix $(objext),$(basename $(notdir $(LIB2ADDEHSTATIC))))
>> -libgcc-s-objects += $(addsuffix _s$(objext),$(basename $(notdir $(LIB2ADDEHSHARED))))
>> +libgcc-eh-static-objects := $(addsuffix $(objext),$(basename $(notdir $(LIB2ADDEHSTATIC))))
>> +libgcc-eh-shared-objects := $(addsuffix _s$(objext),$(basename $(notdir $(LIB2ADDEHSHARED))))
>> +
>> +$(libgcc-eh-static-objects) $(libgcc-eh-shared-objects): md-unwind-support.h
>> +
>> +libgcc-eh-objects += $(libgcc-eh-static-objects)
>> +libgcc-s-objects += $(libgcc-eh-shared-objects)
>
> These changes to the dependencies should not be necessary, libgcc does
> automatic dependency tracking.

That's what I thought, but my bootstraps failed since there wasn't any
dependency that triggered the creation of the header.  That's when I
introduced this explicit dependency.

	Rainer
Mike Stump - May 31, 2011, 6:18 p.m.
On May 30, 2011, at 8:43 AM, Rainer Orth wrote:
> * The three users of MD_UNWIND_SUPPORT are modified to unconditionally
>  include a new md-unwind-support.h header which is created from the
>  info in config.host: if md_unwind_header exists, it is included in
>  md-unwind-support.h, otherwise the generated header is empty.

> diff --git a/gcc/config/rs6000/darwin.h b/gcc/config/rs6000/darwin.h
> --- a/gcc/config/rs6000/darwin.h
> +++ b/gcc/config/rs6000/darwin.h
> @@ -381,10 +381,6 @@ extern int darwin_emit_branch_islands;
> #include <stdbool.h>
> #endif
> 
> -#if !defined(__LP64__) && !defined(DARWIN_LIBSYSTEM_HAS_UNWIND)
> -#define MD_UNWIND_SUPPORT "config/rs6000/darwin-unwind.h"
> -#endif
> -

So, I'm wondering, can we just roll this check into the header, so instead of:

#if A
#include file
#endif

file:
bla

we have:

#include file

file:
#if A
bla
#endif

The advantages, any wrapping code is handled the exact same way.  Once this is done, then the transformation to port is identical to every other port.  Also, this general rule would apply to the other corner cases as well, if I read them right.

?

Oh, once this is done, I think:

/* libSystem contains unwind information for signal frames.  */
#define DARWIN_LIBSYSTEM_HAS_UNWIND

is only used by libgcc.  Does it have to move at the same time?  If so, then it needs moving.  If it doesn't have to move, you can leave it behind if you want, though my preference would be to move it.

I think the darwin bits are Ok with this change.
Rainer Orth - June 1, 2011, 4:01 p.m.
Mike Stump <mikestump@comcast.net> writes:

> On May 30, 2011, at 8:43 AM, Rainer Orth wrote:
>> * The three users of MD_UNWIND_SUPPORT are modified to unconditionally
>>  include a new md-unwind-support.h header which is created from the
>>  info in config.host: if md_unwind_header exists, it is included in
>>  md-unwind-support.h, otherwise the generated header is empty.
>
>> diff --git a/gcc/config/rs6000/darwin.h b/gcc/config/rs6000/darwin.h
>> --- a/gcc/config/rs6000/darwin.h
>> +++ b/gcc/config/rs6000/darwin.h
>> @@ -381,10 +381,6 @@ extern int darwin_emit_branch_islands;
>> #include <stdbool.h>
>> #endif
>> 
>> -#if !defined(__LP64__) && !defined(DARWIN_LIBSYSTEM_HAS_UNWIND)
>> -#define MD_UNWIND_SUPPORT "config/rs6000/darwin-unwind.h"
>> -#endif
>> -
>
> So, I'm wondering, can we just roll this check into the header, so instead of:
>
> #if A
> #include file
> #endif
>
> file:
> bla
>
> we have:
>
> #include file
>
> file:
> #if A
> bla
> #endif
>
> The advantages, any wrapping code is handled the exact same way.  Once this is done, then the transformation to port is identical to every other port.  Also, this general rule would apply to the other corner cases as well, if I read them right.
>
> ?

The problem with this approach is that some of the macros tested only
live in gcc, not libgcc once the libgcc sources no longer include tm.h
etc.  E.g. look at i386/mingw32.h:

#if !TARGET_64BIT_DEFAULT && !defined (TARGET_BI_ARCH)
#define MD_UNWIND_SUPPORT "config/i386/w32-unwind.h"
#endif

Both TARGET_64BIT_DEFAULT and TARGET_BI_ARCH live in gcc only, so at
least in the medium term, we need different tests here.

> Oh, once this is done, I think:
>
> /* libSystem contains unwind information for signal frames.  */
> #define DARWIN_LIBSYSTEM_HAS_UNWIND
>
> is only used by libgcc.  Does it have to move at the same time?  If so, then it needs moving.  If it doesn't have to move, you can leave it behind if you want, though my preference would be to move it.

It doesn't have to, but it could.  On the other hand, my question still
stands: DARWIN_LIBSYSTEM_HAS_UNWIND is defined in gcc/config/darwin9.h.
So if every release up to Darwin 8 on PowerPC is 32-bit only (I honestly
don't know), then we could just restrict rs6000/darwin-unwind.h to
darwin < 9 and be done with it, no need for the macros above.

> I think the darwin bits are Ok with this change.

I can certainly do it this way for now, but if we could do away with the
tests completely, that would be cleaner.

Thanks.
	Rainer
Mike Stump - June 1, 2011, 4:46 p.m.
On Jun 1, 2011, at 9:01 AM, Rainer Orth wrote:
> Both TARGET_64BIT_DEFAULT and TARGET_BI_ARCH live in gcc only, so at
> least in the medium term, we need different tests here.

Ah, ick.  Oh well...  The next more general rule would be something like: one can set a feature (implicit -D__GCC_DO_UNWIND_BLA) in the compiler when TARGET_64BIT_DEFAULT and TARGET_BI_ARCH are set a certain way, and then in libgcc, one can just test that feature directly.  Ick, I hate inventing feature names here...

> I can certainly do it this way for now, but if we could do away with the
> tests completely, that would be cleaner.

Agreed, though, I don't believe the test is superfluous.
Richard Henderson - June 1, 2011, 5:32 p.m.
On 06/01/2011 09:01 AM, Rainer Orth wrote:
> The problem with this approach is that some of the macros tested only
> live in gcc, not libgcc once the libgcc sources no longer include tm.h
> etc.  E.g. look at i386/mingw32.h:
> 
> #if !TARGET_64BIT_DEFAULT && !defined (TARGET_BI_ARCH)
> #define MD_UNWIND_SUPPORT "config/i386/w32-unwind.h"
> #endif
> 
> Both TARGET_64BIT_DEFAULT and TARGET_BI_ARCH live in gcc only, so at
> least in the medium term, we need different tests here.

For this specific case, surely neither isn't relevant.
Surely the proper test, in the target header, is simply 

#ifndef __MINGW64__

as one would write in normal user-level code.


r~
Kai Tietz - June 1, 2011, 5:40 p.m.
2011/6/1 Richard Henderson <rth@redhat.com>:
> On 06/01/2011 09:01 AM, Rainer Orth wrote:
>> The problem with this approach is that some of the macros tested only
>> live in gcc, not libgcc once the libgcc sources no longer include tm.h
>> etc.  E.g. look at i386/mingw32.h:
>>
>> #if !TARGET_64BIT_DEFAULT && !defined (TARGET_BI_ARCH)
>> #define MD_UNWIND_SUPPORT "config/i386/w32-unwind.h"
>> #endif
>>
>> Both TARGET_64BIT_DEFAULT and TARGET_BI_ARCH live in gcc only, so at
>> least in the medium term, we need different tests here.
>
> For this specific case, surely neither isn't relevant.
> Surely the proper test, in the target header, is simply
>
> #ifndef __MINGW64__
>
> as one would write in normal user-level code.
>
>
> r~

Yes, thanks.  Well, we would loose here the ability to build for
mingw-w64 dw2 support for 32-bit (to be compatible to mingw.org's
32-bit variant, as they want to use this dw2 unwinder), but mingw-w64
doesn't want dw2-unwind in general, as dw2-unwind has some issues
about throwing of VC generated code. So this test might be ok too.

Regards,
Kai
Rainer Orth - June 1, 2011, 5:51 p.m.
Mike Stump <mikestump@comcast.net> writes:

> On Jun 1, 2011, at 9:01 AM, Rainer Orth wrote:
>> Both TARGET_64BIT_DEFAULT and TARGET_BI_ARCH live in gcc only, so at
>> least in the medium term, we need different tests here.
>
> Ah, ick.  Oh well...  The next more general rule would be something like: one can set a feature (implicit -D__GCC_DO_UNWIND_BLA) in the compiler when TARGET_64BIT_DEFAULT and TARGET_BI_ARCH are set a certain way, and then in libgcc, one can just test that feature directly.  Ick, I hate inventing feature names here...

True, but only as a last resort.  Alternatively, one could try to
determine the feature with autoconf.

>> I can certainly do it this way for now, but if we could do away with the
>> tests completely, that would be cleaner.
>
> Agreed, though, I don't believe the test is superfluous.

You still haven't answered my question wrt. Darwin 8 vs. 64-bit on
PowerPC.  Perhaps we can do away with DARWIN_LIBSYSTEM_HAS_UNWIND
completely?

        Rainer
Mike Stump - June 1, 2011, 7:40 p.m.
On Jun 1, 2011, at 10:51 AM, Rainer Orth wrote:
>>> I can certainly do it this way for now, but if we could do away with the
>>> tests completely, that would be cleaner.
>> 
>> Agreed, though, I don't believe the test is superfluous.
> 
> You still haven't answered my question wrt. Darwin 8 vs. 64-bit on
> PowerPC.  Perhaps we can do away with DARWIN_LIBSYSTEM_HAS_UNWIND
> completely?

To quote my previous email:

>> I don't believe the test is superfluous.

This means that I can't say for sure that is is unneeded.  There was 64-bit support on darwin 8 as I recall.
IainS - June 1, 2011, 7:46 p.m.
On 1 Jun 2011, at 20:40, Mike Stump wrote:

> On Jun 1, 2011, at 10:51 AM, Rainer Orth wrote:
>>>> I can certainly do it this way for now, but if we could do away  
>>>> with the
>>>> tests completely, that would be cleaner.
>>>
>>> Agreed, though, I don't believe the test is superfluous.
>>
>> You still haven't answered my question wrt. Darwin 8 vs. 64-bit on
>> PowerPC.  Perhaps we can do away with DARWIN_LIBSYSTEM_HAS_UNWIND
>> completely?
>
> To quote my previous email:
>
>>> I don't believe the test is superfluous.
>
> This means that I can't say for sure that is is unneeded.  There was  
> 64-bit support on darwin 8 as I recall.

It was working last time I checked (around 3-ish months ago)...

Patch

diff --git a/gcc/config/alpha/linux.h b/gcc/config/alpha/linux.h
--- a/gcc/config/alpha/linux.h
+++ b/gcc/config/alpha/linux.h
@@ -1,7 +1,7 @@ 
 /* Definitions of target machine for GNU compiler,
    for Alpha Linux-based GNU systems.
    Copyright (C) 1996, 1997, 1998, 2002, 2003, 2004, 2005, 2006, 2007, 2009,
-   2010 Free Software Foundation, Inc.
+   2010, 2011 Free Software Foundation, Inc.
    Contributed by Richard Henderson.
 
 This file is part of GCC.
@@ -84,8 +84,6 @@  along with GCC; see the file COPYING3.  
 #define USE_LD_AS_NEEDED 1
 #endif
 
-#define MD_UNWIND_SUPPORT "config/alpha/linux-unwind.h"
-
 /* Define if long doubles should be mangled as 'g'.  */
 #define TARGET_ALTERNATE_LONG_DOUBLE_MANGLING
 
diff --git a/gcc/config/alpha/osf5.h b/gcc/config/alpha/osf5.h
--- a/gcc/config/alpha/osf5.h
+++ b/gcc/config/alpha/osf5.h
@@ -274,5 +274,3 @@  __enable_execute_stack (void *addr)					
 
 /* Handle #pragma extern_prefix.  */
 #define TARGET_HANDLE_PRAGMA_EXTERN_PREFIX 1
-
-#define MD_UNWIND_SUPPORT "config/alpha/osf5-unwind.h"
diff --git a/gcc/config/alpha/vms.h b/gcc/config/alpha/vms.h
--- a/gcc/config/alpha/vms.h
+++ b/gcc/config/alpha/vms.h
@@ -225,14 +225,6 @@  typedef struct {int num_args; enum avms_
 #define LINK_EH_SPEC "vms-dwarf2eh.o%s "
 #define LINK_GCC_C_SEQUENCE_SPEC "%G"
 
-#ifdef IN_LIBGCC2
-/* Get the definition for MD_FALLBACK_FRAME_STATE_FOR from a separate
-   file. This avoids having to recompile the world instead of libgcc only
-   when changes to this macro are exercised.  */
-
-#define MD_UNWIND_SUPPORT "config/alpha/vms-unwind.h"
-#endif
-
 #define ASM_OUTPUT_EXTERNAL(FILE, DECL, NAME) \
   avms_asm_output_external (FILE, DECL, NAME)
 
diff --git a/gcc/config/bfin/linux.h b/gcc/config/bfin/linux.h
--- a/gcc/config/bfin/linux.h
+++ b/gcc/config/bfin/linux.h
@@ -48,7 +48,5 @@  see the files COPYING3 and COPYING.RUNTI
    -dynamic-linker /lib/ld-uClibc.so.0} \
    %{static}} -init __init -fini __fini"
 
-#define MD_UNWIND_SUPPORT "config/bfin/linux-unwind.h"
-
 #undef TARGET_SUPPORTS_SYNC_CALLS
 #define TARGET_SUPPORTS_SYNC_CALLS 1
diff --git a/gcc/config/bfin/uclinux.h b/gcc/config/bfin/uclinux.h
--- a/gcc/config/bfin/uclinux.h
+++ b/gcc/config/bfin/uclinux.h
@@ -32,8 +32,6 @@  see the files COPYING3 and COPYING.RUNTI
   %{mfast-fp:-lbffastfp} %G %L %{mfast-fp:-lbffastfp} %G \
 "
 
-#define MD_UNWIND_SUPPORT "config/bfin/linux-unwind.h"
-
 /* Like the definition in gcc.c, but for purposes of uClinux, every link is
    static.  */
 #define MFWRAP_SPEC " %{fmudflap|fmudflapth: \
diff --git a/gcc/config/i386/linux.h b/gcc/config/i386/linux.h
--- a/gcc/config/i386/linux.h
+++ b/gcc/config/i386/linux.h
@@ -22,5 +22,3 @@  along with GCC; see the file COPYING3.  
 
 #define GNU_USER_LINK_EMULATION "elf_i386"
 #define GLIBC_DYNAMIC_LINKER "/lib/ld-linux.so.2"
-
-#define MD_UNWIND_SUPPORT "config/i386/linux-unwind.h"
diff --git a/gcc/config/i386/linux64.h b/gcc/config/i386/linux64.h
--- a/gcc/config/i386/linux64.h
+++ b/gcc/config/i386/linux64.h
@@ -26,5 +26,3 @@  see the files COPYING3 and COPYING.RUNTI
 
 #define GLIBC_DYNAMIC_LINKER32 "/lib/ld-linux.so.2"
 #define GLIBC_DYNAMIC_LINKER64 "/lib64/ld-linux-x86-64.so.2"
-
-#define MD_UNWIND_SUPPORT "config/i386/linux-unwind.h"
diff --git a/gcc/config/i386/mingw32.h b/gcc/config/i386/mingw32.h
--- a/gcc/config/i386/mingw32.h
+++ b/gcc/config/i386/mingw32.h
@@ -241,12 +241,6 @@  __enable_execute_stack (void *addr)					
 #include <windows.h>
 #endif
 
-/* For 64-bit Windows we can't use DW2 unwind info. Also for multilib
-   builds we can't use it, too.  */
-#if !TARGET_64BIT_DEFAULT && !defined (TARGET_BI_ARCH)
-#define MD_UNWIND_SUPPORT "config/i386/w32-unwind.h"
-#endif
-
 /* This matches SHLIB_SONAME and SHLIB_SOVERSION in t-cygming. */
 /* This matches SHLIB_SONAME and SHLIB_SOVERSION in t-cygwin. */
 #if DWARF2_UNWIND_INFO
diff --git a/gcc/config/i386/sol2.h b/gcc/config/i386/sol2.h
--- a/gcc/config/i386/sol2.h
+++ b/gcc/config/i386/sol2.h
@@ -171,5 +171,3 @@  along with GCC; see the file COPYING3.  
 
 #undef  PTRDIFF_TYPE
 #define PTRDIFF_TYPE "int"
-
-#define MD_UNWIND_SUPPORT "config/i386/sol2-unwind.h"
diff --git a/gcc/config/ia64/linux.h b/gcc/config/ia64/linux.h
--- a/gcc/config/ia64/linux.h
+++ b/gcc/config/ia64/linux.h
@@ -77,8 +77,6 @@  do {						\
 #undef LINK_EH_SPEC
 #define LINK_EH_SPEC ""
 
-#define MD_UNWIND_SUPPORT "config/ia64/linux-unwind.h"
-
 /* Put all *tf routines in libgcc.  */
 #undef LIBGCC2_HAS_TF_MODE
 #define LIBGCC2_HAS_TF_MODE 1
diff --git a/gcc/config/ia64/unwind-ia64.c b/gcc/config/ia64/unwind-ia64.c
--- a/gcc/config/ia64/unwind-ia64.c
+++ b/gcc/config/ia64/unwind-ia64.c
@@ -1,7 +1,7 @@ 
 /* Subroutines needed for unwinding IA-64 standard format stack frame
    info for exception handling.
    Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2004, 2005, 2006,
-   2009  Free Software Foundation, Inc.
+   2009, 2011  Free Software Foundation, Inc.
    Contributed by Andrew MacLeod  <amacleod@cygnus.com>
 	          Andrew Haley  <aph@cygnus.com>
 		  David Mosberger-Tang <davidm@hpl.hp.com>
@@ -1767,9 +1767,7 @@  _Unwind_GetBSP (struct _Unwind_Context *
   return (_Unwind_Ptr) context->bsp;
 }
 
-#ifdef MD_UNWIND_SUPPORT
-#include MD_UNWIND_SUPPORT
-#endif
+#include "md-unwind-support.h"
 
 static _Unwind_Reason_Code
 uw_frame_state_for (struct _Unwind_Context *context, _Unwind_FrameState *fs)
diff --git a/gcc/config/ia64/vms.h b/gcc/config/ia64/vms.h
--- a/gcc/config/ia64/vms.h
+++ b/gcc/config/ia64/vms.h
@@ -185,8 +185,6 @@  typedef struct crtl_name_spec
 /* Define this to be nonzero if static stack checking is supported.  */
 #define STACK_CHECK_STATIC_BUILTIN 1
 
-#define MD_UNWIND_SUPPORT "config/ia64/vms-unwind.h"
-
 #define UNW_IVMS_MODE(HEADER) (((HEADER) >> 44) & 0x3L)
 #define MD_UNW_COMPATIBLE_PERSONALITY_P(HEADER) (!UNW_IVMS_MODE (HEADER))
 
diff --git a/gcc/config/m68k/linux.h b/gcc/config/m68k/linux.h
--- a/gcc/config/m68k/linux.h
+++ b/gcc/config/m68k/linux.h
@@ -235,5 +235,3 @@  along with GCC; see the file COPYING3.  
 
 #undef  WCHAR_TYPE_SIZE
 #define WCHAR_TYPE_SIZE BITS_PER_WORD
-
-#define MD_UNWIND_SUPPORT "config/m68k/linux-unwind.h"
diff --git a/gcc/config/mips/linux.h b/gcc/config/mips/linux.h
--- a/gcc/config/mips/linux.h
+++ b/gcc/config/mips/linux.h
@@ -99,8 +99,6 @@  along with GCC; see the file COPYING3.  
 %{!shared: \
   %{profile:-lc_p} %{!profile:-lc}}"
 
-#define MD_UNWIND_SUPPORT "config/mips/linux-unwind.h"
-
 #ifdef HAVE_AS_NO_SHARED
 /* Default to -mno-shared for non-PIC.  */
 # define NO_SHARED_SPECS \
diff --git a/gcc/config/pa/pa-hpux.h b/gcc/config/pa/pa-hpux.h
--- a/gcc/config/pa/pa-hpux.h
+++ b/gcc/config/pa/pa-hpux.h
@@ -1,6 +1,6 @@ 
 /* Definitions of target machine for GNU compiler, for HP-UX.
-   Copyright (C) 1991, 1995, 1996, 2002, 2003, 2004, 2007, 2008, 2009, 2010
-   Free Software Foundation, Inc.
+   Copyright (C) 1991, 1995, 1996, 2002, 2003, 2004, 2007, 2008, 2009,
+   2010, 2011 Free Software Foundation, Inc.
 
 This file is part of GCC.
 
@@ -115,5 +115,3 @@  along with GCC; see the file COPYING3.  
    compatibility with the HP-UX unwind library.  */
 #undef TARGET_HPUX_UNWIND_LIBRARY
 #define TARGET_HPUX_UNWIND_LIBRARY 1
-
-#define MD_UNWIND_SUPPORT "config/pa/hpux-unwind.h"
diff --git a/gcc/config/pa/pa32-linux.h b/gcc/config/pa/pa32-linux.h
--- a/gcc/config/pa/pa32-linux.h
+++ b/gcc/config/pa/pa32-linux.h
@@ -1,5 +1,5 @@ 
 /* Definitions for PA_RISC with ELF-32 format
-   Copyright (C) 2000, 2002, 2004, 2006, 2007, 2010
+   Copyright (C) 2000, 2002, 2004, 2006, 2007, 2010, 2011
    Free Software Foundation, Inc.
 
 This file is part of GCC.
@@ -63,5 +63,3 @@  call_ ## FUNC (void)					\
 
 #undef  WCHAR_TYPE_SIZE
 #define WCHAR_TYPE_SIZE BITS_PER_WORD
-
-#define MD_UNWIND_SUPPORT "config/pa/linux-unwind.h"
diff --git a/gcc/config/rs6000/darwin.h b/gcc/config/rs6000/darwin.h
--- a/gcc/config/rs6000/darwin.h
+++ b/gcc/config/rs6000/darwin.h
@@ -381,10 +381,6 @@  extern int darwin_emit_branch_islands;
 #include <stdbool.h>
 #endif
 
-#if !defined(__LP64__) && !defined(DARWIN_LIBSYSTEM_HAS_UNWIND)
-#define MD_UNWIND_SUPPORT "config/rs6000/darwin-unwind.h"
-#endif
-
 /* True, iff we're generating fast turn around debugging code.  When
    true, we arrange for function prologues to start with 5 nops so
    that gdb may insert code to redirect them, and for data to be
diff --git a/gcc/config/rs6000/linux.h b/gcc/config/rs6000/linux.h
--- a/gcc/config/rs6000/linux.h
+++ b/gcc/config/rs6000/linux.h
@@ -113,8 +113,6 @@ 
 
 #define TARGET_POSIX_IO
 
-#define MD_UNWIND_SUPPORT "config/rs6000/linux-unwind.h"
-
 #ifdef TARGET_LIBC_PROVIDES_SSP
 /* ppc32 glibc provides __stack_chk_guard in -0x7008(2).  */
 #define TARGET_THREAD_SSP_OFFSET	-0x7008
diff --git a/gcc/config/rs6000/linux64.h b/gcc/config/rs6000/linux64.h
--- a/gcc/config/rs6000/linux64.h
+++ b/gcc/config/rs6000/linux64.h
@@ -539,8 +539,6 @@  extern int dot_symbols;
 #define USE_LD_AS_NEEDED 1
 #endif
 
-#define MD_UNWIND_SUPPORT "config/rs6000/linux-unwind.h"
-
 #ifdef TARGET_LIBC_PROVIDES_SSP
 /* ppc32 glibc provides __stack_chk_guard in -0x7008(2),
    ppc64 glibc provides it at -0x7010(13).  */
diff --git a/gcc/config/s390/linux.h b/gcc/config/s390/linux.h
--- a/gcc/config/s390/linux.h
+++ b/gcc/config/s390/linux.h
@@ -79,8 +79,6 @@  along with GCC; see the file COPYING3.  
 
 #define TARGET_ASM_FILE_END file_end_indicate_exec_stack
 
-#define MD_UNWIND_SUPPORT "config/s390/linux-unwind.h"
-
 #ifdef TARGET_LIBC_PROVIDES_SSP
 /* s390 glibc provides __stack_chk_guard in 0x14(tp),
    s390x glibc provides it at 0x28(tp).  */
diff --git a/gcc/config/s390/tpf.h b/gcc/config/s390/tpf.h
--- a/gcc/config/s390/tpf.h
+++ b/gcc/config/s390/tpf.h
@@ -118,8 +118,6 @@  along with GCC; see the file COPYING3.  
    %{!shared:-shared} \
    %(entry_spec)"
 
-#define MD_UNWIND_SUPPORT "config/s390/tpf-unwind.h"
-
 /* IBM copies these libraries over with these names.  */
 #define MATH_LIBRARY "CLBM"
 #define LIBSTDCXX "CPP1"
diff --git a/gcc/config/sh/linux.h b/gcc/config/sh/linux.h
--- a/gcc/config/sh/linux.h
+++ b/gcc/config/sh/linux.h
@@ -114,8 +114,6 @@  along with GCC; see the file COPYING3.  
       }									\
   } while (0)
 
-#define MD_UNWIND_SUPPORT "config/sh/linux-unwind.h"
-
 /* For SH3 and SH4, we use a slot of the unwind frame which correspond
    to a fake register number 16 as a placeholder for the return address
    in MD_FALLBACK_FRAME_STATE_FOR and its content will be read with
diff --git a/gcc/config/sparc/linux.h b/gcc/config/sparc/linux.h
--- a/gcc/config/sparc/linux.h
+++ b/gcc/config/sparc/linux.h
@@ -141,8 +141,6 @@  do {									\
 /* Static stack checking is supported by means of probes.  */
 #define STACK_CHECK_STATIC_BUILTIN 1
 
-#define MD_UNWIND_SUPPORT "config/sparc/linux-unwind.h"
-
 /* Linux currently uses RMO in uniprocessor mode, which is equivalent to
    TMO, and TMO in multiprocessor mode.  But they reserve the right to
    change their minds.  */
diff --git a/gcc/config/sparc/linux64.h b/gcc/config/sparc/linux64.h
--- a/gcc/config/sparc/linux64.h
+++ b/gcc/config/sparc/linux64.h
@@ -261,8 +261,6 @@  do {									\
 /* Static stack checking is supported by means of probes.  */
 #define STACK_CHECK_STATIC_BUILTIN 1
 
-#define MD_UNWIND_SUPPORT "config/sparc/linux-unwind.h"
-
 /* Linux currently uses RMO in uniprocessor mode, which is equivalent to
    TMO, and TMO in multiprocessor mode.  But they reserve the right to
    change their minds.  */
diff --git a/gcc/config/sparc/sol2.h b/gcc/config/sparc/sol2.h
--- a/gcc/config/sparc/sol2.h
+++ b/gcc/config/sparc/sol2.h
@@ -196,5 +196,3 @@  along with GCC; see the file COPYING3.  
 
 /* Static stack checking is supported by means of probes.  */
 #define STACK_CHECK_STATIC_BUILTIN 1
-
-#define MD_UNWIND_SUPPORT "config/sparc/sol2-unwind.h"
diff --git a/gcc/config/xtensa/linux.h b/gcc/config/xtensa/linux.h
--- a/gcc/config/xtensa/linux.h
+++ b/gcc/config/xtensa/linux.h
@@ -64,5 +64,3 @@  along with GCC; see the file COPYING3.  
 
 #undef DBX_REGISTER_NUMBER
 
-#define MD_UNWIND_SUPPORT "config/xtensa/linux-unwind.h"
-
diff --git a/gcc/config/xtensa/unwind-dw2-xtensa.c b/gcc/config/xtensa/unwind-dw2-xtensa.c
--- a/gcc/config/xtensa/unwind-dw2-xtensa.c
+++ b/gcc/config/xtensa/unwind-dw2-xtensa.c
@@ -1,6 +1,6 @@ 
 /* DWARF2 exception handling and frame unwinding for Xtensa.
    Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006,
-   2007, 2008, 2009
+   2007, 2008, 2009, 2011
    Free Software Foundation, Inc.
 
    This file is part of GCC.
@@ -208,9 +208,7 @@  _Unwind_GetTextRelBase (struct _Unwind_C
   return (_Unwind_Ptr) context->bases.tbase;
 }
 
-#ifdef MD_UNWIND_SUPPORT
-#include MD_UNWIND_SUPPORT
-#endif
+#include "md-unwind-support.h"
 
 /* Extract any interesting information from the CIE for the translation
    unit F belongs to.  Return a pointer to the byte after the augmentation,
diff --git a/gcc/doc/tm.texi.in b/gcc/doc/tm.texi.in
--- a/gcc/doc/tm.texi.in
+++ b/gcc/doc/tm.texi.in
@@ -1,5 +1,5 @@ 
 @c Copyright (C) 1988,1989,1992,1993,1994,1995,1996,1997,1998,1999,2000,2001,
-@c 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
+@c 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011
 @c Free Software Foundation, Inc.
 @c This is part of the GCC manual.
 @c For copying conditions, see the file gcc.texi.
@@ -3361,11 +3361,6 @@  of bytes that the format occupies, @var{
 to be emitted.
 @end defmac
 
-@defmac MD_UNWIND_SUPPORT
-A string specifying a file to be #include'd in unwind-dw2.c.  The file
-so included typically defines @code{MD_FALLBACK_FRAME_STATE_FOR}.
-@end defmac
-
 @defmac MD_FALLBACK_FRAME_STATE_FOR (@var{context}, @var{fs})
 This macro allows the target to add CPU and operating system specific
 code to the call-frame unwinder for use when there is no unwind data
diff --git a/gcc/system.h b/gcc/system.h
--- a/gcc/system.h
+++ b/gcc/system.h
@@ -763,7 +763,8 @@  extern void fancy_abort (const char *, i
 
 /* Target macros only used for code built for the target, that have
    moved to libgcc-tm.h or have never been present elsewhere.  */
- #pragma GCC poison DECLARE_LIBRARY_RENAMES LIBGCC2_GNU_PREFIX
+ #pragma GCC poison DECLARE_LIBRARY_RENAMES LIBGCC2_GNU_PREFIX		\
+	MD_UNWIND_SUPPORT
 
 /* Other obsolete target macros, or macros that used to be in target
    headers and were not used, and may be obsolete or may never have
diff --git a/gcc/unwind-dw2.c b/gcc/unwind-dw2.c
--- a/gcc/unwind-dw2.c
+++ b/gcc/unwind-dw2.c
@@ -333,9 +333,7 @@  _Unwind_GetTextRelBase (struct _Unwind_C
 }
 #endif
 
-#ifdef MD_UNWIND_SUPPORT
-#include MD_UNWIND_SUPPORT
-#endif
+#include "md-unwind-support.h"
 
 /* Extract any interesting information from the CIE for the translation
    unit F belongs to.  Return a pointer to the byte after the augmentation,
diff --git a/libgcc/Makefile.in b/libgcc/Makefile.in
--- a/libgcc/Makefile.in
+++ b/libgcc/Makefile.in
@@ -40,6 +40,7 @@  enable_shared = @enable_shared@
 decimal_float = @decimal_float@
 enable_decimal_float = @enable_decimal_float@
 fixed_point = @fixed_point@
+md_unwind_header = @md_unwind_header@
 
 host_noncanonical = @host_noncanonical@
 target_noncanonical = @target_noncanonical@
@@ -117,7 +118,7 @@  installcheck:
 .PHONY: all clean
 
 clean:
-	-rm -f config.h stamp-h stmp-ldirs libgcc.map
+	-rm -f config.h stamp-h stmp-ldirs libgcc.map md-unwind-support.h
 	-rm -f *$(objext)
 	-rm -f *.dep
 	-rm -f *.a
@@ -139,6 +140,13 @@  config.h: stamp-h ; @true
 stamp-h: $(srcdir)/config.in config.status Makefile
 	CONFIG_FILES= CONFIG_HEADERS=config.h:$(srcdir)/config.in $(SHELL) ./config.status
 
+md-unwind-support.h: config.status
+	if test -n "$(md_unwind_header)"; then \
+	  echo "#include \"config/$(md_unwind_header)\"" > $@; \
+	else \
+	  : > $@; \
+	fi
+
 config.status: $(srcdir)/configure $(srcdir)/config.host
 	$(SHELL) ./config.status --recheck
 
@@ -715,8 +723,13 @@  c_flags := -fexceptions
 
 ifeq ($(enable_shared),yes)
 
-libgcc-eh-objects += $(addsuffix $(objext),$(basename $(notdir $(LIB2ADDEHSTATIC))))
-libgcc-s-objects += $(addsuffix _s$(objext),$(basename $(notdir $(LIB2ADDEHSHARED))))
+libgcc-eh-static-objects := $(addsuffix $(objext),$(basename $(notdir $(LIB2ADDEHSTATIC))))
+libgcc-eh-shared-objects := $(addsuffix _s$(objext),$(basename $(notdir $(LIB2ADDEHSHARED))))
+
+$(libgcc-eh-static-objects) $(libgcc-eh-shared-objects): md-unwind-support.h
+
+libgcc-eh-objects += $(libgcc-eh-static-objects)
+libgcc-s-objects += $(libgcc-eh-shared-objects)
 
 iter-items := $(sort $(LIB2ADDEHSTATIC) $(LIB2ADDEHSHARED))
 include $(iterator)
@@ -724,7 +737,11 @@  include $(iterator)
 else
 # Not shared.  LIB2ADDEH are added to libgcc.a.
 
-libgcc-objects += $(addsuffix $(objext),$(basename $(notdir $(LIB2ADDEH))))
+libgcc-eh-objects := $(addsuffix $(objext),$(basename $(notdir $(LIB2ADDEH))))
+
+$(libgcc-eh-objects): md-unwind-support.h
+
+libgcc-objects += $(libgcc-eh-objects)
 
 iter-items := $(LIB2ADDEH)
 include $(iterator)
diff --git a/libgcc/config.host b/libgcc/config.host
--- a/libgcc/config.host
+++ b/libgcc/config.host
@@ -50,6 +50,8 @@ 
 #			If either is set, EXTRA_PARTS and
 #			EXTRA_MULTILIB_PARTS inherited from the GCC
 #			subdirectory will be ignored.
+#  md_unwind_header	The name of a header file defining
+#			MD_FALLBACK_FRAME_STATE_FOR.
 #  tmake_file		A list of machine-description-specific
 #			makefile-fragments, if different from
 #			"$cpu_type/t-$cpu_type".
@@ -57,6 +59,7 @@ 
 asm_hidden_op=.hidden
 extra_parts=
 tmake_file=
+md_unwind_header=
 
 # Set default cpu_type so it can be updated in each machine entry.
 cpu_type=`echo ${host} | sed 's/-.*$//'`
@@ -210,6 +213,7 @@  case ${host} in
 alpha*-*-linux*)
 	tmake_file="${tmake_file} alpha/t-crtfm"
 	extra_parts="$extra_parts crtfastmath.o"
+	md_unwind_header=alpha/linux-unwind.h
 	;;
 alpha*-*-freebsd*)
 	;;
@@ -225,12 +229,15 @@  alpha*-dec-osf5.1*)
 	    ;;
 	esac
 	extra_parts="${extra_parts} qrnnd.o crtfastmath.o gthr-posix.o"
+	md_unwind_header=alpha/osf5-unwind.h
 	;;
 alpha64-dec-*vms*)
 	tmake_file="vms/t-vms vms/t-vms64 alpha/t-vms"
+	md_unwind_header=alpha/vms-unwind.h
 	;;
 alpha*-dec-*vms*)
 	tmake_file="vms/t-vms alpha/t-vms"
+	md_unwind_header=alpha/vms-unwind.h
 	;;
 arm-wrs-vxworks)
 	;;
@@ -261,11 +268,13 @@  avr-*-*)
 bfin*-elf*)
         ;;
 bfin*-uclinux*)
+	md_unwind_header=bfin/linux-unwind.h
         ;;
 bfin*-linux-uclibc*)
 	# No need to build crtbeginT.o on uClibc systems.  Should probably
 	# be moved to the OS specific section above.
 	extra_parts="crtbegin.o crtbeginS.o crtend.o crtendS.o"
+	md_unwind_header=bfin/linux-unwind.h
 	;;
 bfin*-*)
         ;;
@@ -289,12 +298,16 @@  h8300-*-elf*)
 hppa*64*-*-linux*)
 	;;
 hppa*-*-linux*)
+	md_unwind_header=pa/pa32-linux.h
 	;;
 hppa[12]*-*-hpux10*)
+	md_unwind_header=pa/hpux-unwind.h
 	;;
 hppa*64*-*-hpux11*)
+	md_unwind_header=pa/hpux-unwind.h
 	;;
 hppa[12]*-*-hpux11*)
+	md_unwind_header=pa/hpux-unwind.h
 	;;
 i[34567]86-*-darwin*)
 	;;
@@ -319,13 +332,15 @@  i[34567]86-*-openbsd2.*|i[34567]86-*open
 	;;
 i[34567]86-*-openbsd*)
 	;;
-i[34567]86-*-linux* | i[34567]86-*-kfreebsd*-gnu | i[34567]86-*-knetbsd*-gnu | i[34567]86-*-gnu*)
+i[34567]86-*-linux* | i[34567]86-*-kfreebsd*-gnu | i[34567]86-*-knetbsd*-gnu | i[34567]86-*-gnu* | i[34567]86-*-kopensolaris*-gnu)
 	extra_parts="$extra_parts crtprec32.o crtprec64.o crtprec80.o crtfastmath.o"
 	tmake_file="${tmake_file} i386/t-crtpc i386/t-crtfm"
+	md_unwind_header=i386/linux-unwind.h
 	;;
 x86_64-*-linux* | x86_64-*-kfreebsd*-gnu | x86_64-*-knetbsd*-gnu)
 	extra_parts="$extra_parts crtprec32.o crtprec64.o crtprec80.o crtfastmath.o"
 	tmake_file="${tmake_file} i386/t-crtpc i386/t-crtfm"
+	md_unwind_header=i386/linux-unwind.h
 	;;
 i[34567]86-pc-msdosdjgpp*)
 	;;
@@ -347,13 +362,19 @@  i[34567]86-*-rtems*)
 i[34567]86-*-solaris2*)
 	tmake_file="$tmake_file i386/t-crtfm"
 	extra_parts="$extra_parts crtfastmath.o"
+	md_unwind_header=i386/sol2-unwind.h
 	;;
 i[4567]86-wrs-vxworks|i[4567]86-wrs-vxworksae)
 	;;
-i[34567]86-*-cygwin* | i[34567]86-*-mingw*)
+i[34567]86-*-cygwin*)
 	extra_parts="crtbegin.o crtend.o crtfastmath.o"
 	tmake_file="i386/t-cygming i386/t-crtfm"
 	;;
+i[34567]86-*-mingw*)
+	extra_parts="crtbegin.o crtend.o crtfastmath.o"
+	tmake_file="i386/t-cygming i386/t-crtfm"
+	md_unwind_header=i386/w32-unwind.h
+	;;
 x86_64-*-mingw*)
 	;;
 i[34567]86-*-interix3*)
@@ -369,11 +390,13 @@  ia64*-*-freebsd*)
 ia64*-*-linux*)
 	extra_parts="crtbegin.o crtend.o crtbeginS.o crtendS.o crtfastmath.o"
 	tmake_file="ia64/t-ia64 t-softfp ia64/t-fprules-softfp ia64/t-softfp-compat"
+	md_unwind_header=ia64/linux-unwind.h
 	;;
 ia64*-*-hpux*)
 	;;
 ia64-hp-*vms*)
 	tmake_file="vms/t-vms vms/t-vms64 ia64/t-vms"
+	md_unwind_header=ia64/vms-unwind.h
 	;;
 iq2000*-*-elf*)
         ;;
@@ -400,10 +423,12 @@  m68k*-*-netbsdelf*)
 m68k*-*-openbsd*)
 	;;
 m68k-*-uclinux*)		# Motorola m68k/ColdFire running uClinux with uClibc
+	md_unwind_header=m68k/linux-unwind.h
 	;;
-m68k-*-linux*)		# Motorola m68k's running GNU/Linux
+m68k-*-linux*)			# Motorola m68k's running GNU/Linux
 				# with ELF format using glibc 2
 				# aka the GNU/Linux C library 6.
+	md_unwind_header=m68k/linux-unwind.h
 	;;
 m68k-*-rtems*)
 	;;
@@ -421,10 +446,12 @@  mips*-*-netbsd*)			# NetBSD/mips, either
 mips64*-*-linux*)
 	extra_parts="$extra_parts crtfastmath.o"
 	tmake_file="{$tmake_file} t-crtfm"
+	md_unwind_header=mips/linux-unwind.h
 	;;
 mips*-*-linux*)				# Linux MIPS, either endian.
 	extra_parts="$extra_parts crtfastmath.o"
 	tmake_file="{$tmake_file} t-crtfm"
+	md_unwind_header=mips/linux-unwind.h
 	;;
 mips*-*-openbsd*)
 	;;
@@ -469,6 +496,13 @@  pdp11-*-*)
 picochip-*-*)
         ;;
 powerpc-*-darwin*)
+	case ${host} in
+	*-*-darwin9* | *-*-darwin[12][0-9]*)
+	  ;;
+	*)
+	  md_unwind_header=rs6000/darwin-unwind.h
+	  ;;
+	esac
 	;;
 powerpc64-*-darwin*)
 	;;
@@ -495,6 +529,7 @@  powerpc-*-rtems*)
 	;;
 powerpc-*-linux* | powerpc64-*-linux*)
 	tmake_file="${tmake_file} rs6000/t-ppccomm rs6000/t-ldbl128 t-softfp"
+	md_unwind_header=rs6000/linux-unwind.h
 	;;
 powerpc-wrs-vxworks|powerpc-wrs-vxworksae)
 	;;
@@ -518,12 +553,15 @@  rx-*-elf)
 	;;
 s390-*-linux*)
 	tmake_file="${tmake_file} s390/t-crtstuff s390/t-linux s390/32/t-floattodi"
+	md_unwind_header=s390/linux-unwind.h
 	;;
 s390x-*-linux*)
 	tmake_file="${tmake_file} s390/t-crtstuff s390/t-linux"
+	md_unwind_header=s390/linux-unwind.h
 	;;
 s390x-ibm-tpf*)
 	tmake_file="${tmake_file} s390/t-crtstuff s390/t-tpf"
+	md_unwind_header-s390/tpf-unwind.h
 	;;
 score-*-elf)
         ;;
@@ -534,6 +572,7 @@  sh-*-elf* | sh[12346l]*-*-elf* | \
 	case ${host} in
 	sh*-*-linux*)
 		tmake_file="${tmake_file} sh/t-linux"
+		md_unwind_header=sh/unwind-linux.h
 		;;
 	esac
 	;;
@@ -559,6 +598,7 @@  sparc-*-elf*)
 sparc-*-linux*)		# SPARC's running GNU/Linux, libc6
 	extra_parts="$extra_parts crtfastmath.o"
 	tmake_file="${tmake_file} t-crtfm"
+	md_unwind_header=sparc/linux.h
 	;;
 sparc-*-rtems* | sparc64-*-rtems* )
 	tmake_file="sparc/t-elf t-crtin t-crtfm t-rtems"
@@ -567,6 +607,7 @@  sparc-*-rtems* | sparc64-*-rtems* )
 sparc*-*-solaris2*)
 	tmake_file="$tmake_file t-crtfm"
 	extra_parts="$extra_parts crtfastmath.o"
+	md_unwind_header=sparc/sol2-unwind.h
 	;;
 sparc64-*-elf*)
 	tmake_file="${tmake_file} t-crtin t-crtfm"
@@ -579,6 +620,7 @@  sparc64-*-freebsd*|ultrasparc-*-freebsd*
 sparc64-*-linux*)		# 64-bit SPARC's running GNU/Linux
 	extra_parts="$extra_parts crtfastmath.o"
 	tmake_file="${tmake_file} t-crtfm"
+	md_unwind_header=sparc/linux-unwind.h
 	;;
 sparc64-*-netbsd*)
 	;;
@@ -601,6 +643,7 @@  xstormy16-*-elf)
 xtensa*-*-elf*)
 	;;
 xtensa*-*-linux*)
+	md_unwind_header=xtensa/linux-unwind.h
 	;;
 am33_2.0-*-linux*)
 	extra_parts="crtbegin.o crtend.o crtbeginS.o crtendS.o"
diff --git a/gcc/config/alpha/linux-unwind.h b/libgcc/config/alpha/linux-unwind.h
rename from gcc/config/alpha/linux-unwind.h
rename to libgcc/config/alpha/linux-unwind.h
diff --git a/gcc/config/alpha/osf5-unwind.h b/libgcc/config/alpha/osf5-unwind.h
rename from gcc/config/alpha/osf5-unwind.h
rename to libgcc/config/alpha/osf5-unwind.h
diff --git a/gcc/config/alpha/vms-unwind.h b/libgcc/config/alpha/vms-unwind.h
rename from gcc/config/alpha/vms-unwind.h
rename to libgcc/config/alpha/vms-unwind.h
diff --git a/gcc/config/bfin/linux-unwind.h b/libgcc/config/bfin/linux-unwind.h
rename from gcc/config/bfin/linux-unwind.h
rename to libgcc/config/bfin/linux-unwind.h
diff --git a/gcc/config/i386/linux-unwind.h b/libgcc/config/i386/linux-unwind.h
rename from gcc/config/i386/linux-unwind.h
rename to libgcc/config/i386/linux-unwind.h
diff --git a/gcc/config/i386/sol2-unwind.h b/libgcc/config/i386/sol2-unwind.h
rename from gcc/config/i386/sol2-unwind.h
rename to libgcc/config/i386/sol2-unwind.h
diff --git a/gcc/config/i386/w32-unwind.h b/libgcc/config/i386/w32-unwind.h
rename from gcc/config/i386/w32-unwind.h
rename to libgcc/config/i386/w32-unwind.h
diff --git a/gcc/config/ia64/linux-unwind.h b/libgcc/config/ia64/linux-unwind.h
rename from gcc/config/ia64/linux-unwind.h
rename to libgcc/config/ia64/linux-unwind.h
diff --git a/gcc/config/ia64/vms-unwind.h b/libgcc/config/ia64/vms-unwind.h
rename from gcc/config/ia64/vms-unwind.h
rename to libgcc/config/ia64/vms-unwind.h
diff --git a/gcc/config/m68k/linux-unwind.h b/libgcc/config/m68k/linux-unwind.h
rename from gcc/config/m68k/linux-unwind.h
rename to libgcc/config/m68k/linux-unwind.h
diff --git a/gcc/config/mips/linux-unwind.h b/libgcc/config/mips/linux-unwind.h
rename from gcc/config/mips/linux-unwind.h
rename to libgcc/config/mips/linux-unwind.h
diff --git a/gcc/config/pa/hpux-unwind.h b/libgcc/config/pa/hpux-unwind.h
rename from gcc/config/pa/hpux-unwind.h
rename to libgcc/config/pa/hpux-unwind.h
diff --git a/gcc/config/pa/linux-unwind.h b/libgcc/config/pa/linux-unwind.h
rename from gcc/config/pa/linux-unwind.h
rename to libgcc/config/pa/linux-unwind.h
diff --git a/gcc/config/rs6000/darwin-unwind.h b/libgcc/config/rs6000/darwin-unwind.h
rename from gcc/config/rs6000/darwin-unwind.h
rename to libgcc/config/rs6000/darwin-unwind.h
diff --git a/gcc/config/rs6000/linux-unwind.h b/libgcc/config/rs6000/linux-unwind.h
rename from gcc/config/rs6000/linux-unwind.h
rename to libgcc/config/rs6000/linux-unwind.h
diff --git a/gcc/config/s390/linux-unwind.h b/libgcc/config/s390/linux-unwind.h
rename from gcc/config/s390/linux-unwind.h
rename to libgcc/config/s390/linux-unwind.h
diff --git a/gcc/config/s390/tpf-unwind.h b/libgcc/config/s390/tpf-unwind.h
rename from gcc/config/s390/tpf-unwind.h
rename to libgcc/config/s390/tpf-unwind.h
diff --git a/gcc/config/sh/linux-unwind.h b/libgcc/config/sh/linux-unwind.h
rename from gcc/config/sh/linux-unwind.h
rename to libgcc/config/sh/linux-unwind.h
diff --git a/gcc/config/sparc/linux-unwind.h b/libgcc/config/sparc/linux-unwind.h
rename from gcc/config/sparc/linux-unwind.h
rename to libgcc/config/sparc/linux-unwind.h
diff --git a/gcc/config/sparc/sol2-unwind.h b/libgcc/config/sparc/sol2-unwind.h
rename from gcc/config/sparc/sol2-unwind.h
rename to libgcc/config/sparc/sol2-unwind.h
diff --git a/gcc/config/xtensa/linux-unwind.h b/libgcc/config/xtensa/linux-unwind.h
rename from gcc/config/xtensa/linux-unwind.h
rename to libgcc/config/xtensa/linux-unwind.h
diff --git a/libgcc/configure.ac b/libgcc/configure.ac
--- a/libgcc/configure.ac
+++ b/libgcc/configure.ac
@@ -278,6 +278,7 @@  AC_SUBST(tmake_file)
 AC_SUBST(cpu_type)
 AC_SUBST(extra_parts)
 AC_SUBST(asm_hidden_op)
+AC_SUBST(md_unwind_header)
 
 # We need multilib support.
 AC_CONFIG_FILES([Makefile])