Add support for x86_64-*-gnu-* targets to build x86_64 gnumach/hurd

Message ID Y6nbJLinJtSPip+8@mars
State Accepted
Headers
Series Add support for x86_64-*-gnu-* targets to build x86_64 gnumach/hurd |

Checks

Context Check Description
snail/gcc-patch-check success Github commit url

Commit Message

Flavio Cruz Dec. 26, 2022, 5:34 p.m. UTC
  Tested by building a toolchain and compiling gnumach for x86_64 [1].
This is the basic version without unwind support which I think is only required to
implement exceptions.

[1] https://github.com/flavioc/cross-hurd/blob/master/bootstrap-kernel.sh.

---
 gcc/config.gcc                  |  5 ++++-
 gcc/config/i386/gnu64.h         | 40 +++++++++++++++++++++++++++++++++
 libgcc/config.host              |  8 ++++++-
 libgcc/config/i386/gnu-unwind.h | 10 +++++++++
 4 files changed, 61 insertions(+), 2 deletions(-)
 create mode 100644 gcc/config/i386/gnu64.h
  

Comments

Flavio Cruz Jan. 9, 2023, 6 p.m. UTC | #1
Friendly ping

On Mon, Dec 26, 2022 at 12:34 PM Flavio Cruz <flaviocruz@gmail.com> wrote:

> Tested by building a toolchain and compiling gnumach for x86_64 [1].
> This is the basic version without unwind support which I think is only
> required to
> implement exceptions.
>
> [1] https://github.com/flavioc/cross-hurd/blob/master/bootstrap-kernel.sh.
>
> ---
>  gcc/config.gcc                  |  5 ++++-
>  gcc/config/i386/gnu64.h         | 40 +++++++++++++++++++++++++++++++++
>  libgcc/config.host              |  8 ++++++-
>  libgcc/config/i386/gnu-unwind.h | 10 +++++++++
>  4 files changed, 61 insertions(+), 2 deletions(-)
>  create mode 100644 gcc/config/i386/gnu64.h
>
> diff --git a/gcc/config.gcc b/gcc/config.gcc
> index 95190233820..0e2b15768bf 100644
> --- a/gcc/config.gcc
> +++ b/gcc/config.gcc
> @@ -1955,7 +1955,7 @@ i[34567]86-*-linux* | i[34567]86-*-kfreebsd*-gnu |
> i[34567]86-*-gnu* | i[34567]8
>                 ;;
>         esac
>         ;;
> -x86_64-*-linux* | x86_64-*-kfreebsd*-gnu)
> +x86_64-*-linux* | x86_64-*-kfreebsd*-gnu | x86_64-*-gnu*)
>         tm_file="${tm_file} i386/unix.h i386/att.h elfos.h gnu-user.h
> glibc-stdint.h \
>                  i386/x86-64.h i386/gnu-user-common.h i386/gnu-user64.h"
>         case ${target} in
> @@ -1966,6 +1966,9 @@ x86_64-*-linux* | x86_64-*-kfreebsd*-gnu)
>         x86_64-*-kfreebsd*-gnu)
>                 tm_file="${tm_file} kfreebsd-gnu.h i386/kfreebsd-gnu64.h"
>                 ;;
> +       x86_64-*-gnu*)
> +               tm_file="${tm_file} gnu.h i386/gnu64.h"
> +               ;;
>         esac
>         tmake_file="${tmake_file} i386/t-linux64"
>         x86_multilibs="${with_multilib_list}"
> diff --git a/gcc/config/i386/gnu64.h b/gcc/config/i386/gnu64.h
> new file mode 100644
> index 00000000000..a1ecfaa1cdb
> --- /dev/null
> +++ b/gcc/config/i386/gnu64.h
> @@ -0,0 +1,40 @@
> +/* Configuration for an x86_64 running GNU with ELF as the target
> machine.  */
> +
> +/*
> +Copyright (C) 2022 Free Software Foundation, Inc.
> +
> +This file is part of GCC.
> +
> +GCC is free software: you can redistribute it and/or modify
> +it under the terms of the GNU General Public License as published by
> +the Free Software Foundation, either version 3 of the License, or
> +(at your option) any later version.
> +
> +GCC is distributed in the hope that it will be useful,
> +but WITHOUT ANY WARRANTY; without even the implied warranty of
> +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> +GNU General Public License for more details.
> +
> +You should have received a copy of the GNU General Public License
> +along with GCC.  If not, see <http://www.gnu.org/licenses/>.
> +*/
> +
> +#define GNU_USER_LINK_EMULATION32 "elf_i386"
> +#define GNU_USER_LINK_EMULATION64 "elf_x86_64"
> +#define GNU_USER_LINK_EMULATIONX32 "elf32_x86_64"
> +
> +#undef GNU_USER_DYNAMIC_LINKER
> +#define GNU_USER_DYNAMIC_LINKER32 "/lib/ld.so.1"
> +#define GNU_USER_DYNAMIC_LINKER64 "/lib/ld-x86-64.so.1"
> +#define GNU_USER_DYNAMIC_LINKERX32 "/lib/ld-x32.so.1"
> +
> +#undef STARTFILE_SPEC
> +#if defined HAVE_LD_PIE
> +#define STARTFILE_SPEC \
> +  "%{!shared:
> %{pg|p|profile:%{static:gcrt0.o%s;:gcrt1.o%s};pie:Scrt1.o%s;static:crt0.o%s;:crt1.o%s}}
> \
> +   crti.o%s
> %{static:crtbeginT.o%s;shared|pie:crtbeginS.o%s;:crtbegin.o%s}"
> +#else
> +#define STARTFILE_SPEC \
> +  "%{!shared:
> %{pg|p|profile:%{static:gcrt0.o%s;:gcrt1.o%s};static:crt0.o%s;:crt1.o%s}} \
> +   crti.o%s
> %{static:crtbeginT.o%s;shared|pie:crtbeginS.o%s;:crtbegin.o%s}"
> +#endif
> diff --git a/libgcc/config.host b/libgcc/config.host
> index eb23abe89f5..75fd1b778fe 100644
> --- a/libgcc/config.host
> +++ b/libgcc/config.host
> @@ -751,6 +751,12 @@ x86_64-*-kfreebsd*-gnu)
>         tmake_file="${tmake_file} i386/t-crtpc t-crtfm i386/t-crtstuff
> t-dfprules"
>         tm_file="${tm_file} i386/elf-lib.h"
>         ;;
> +x86_64-*-gnu*)
> +       extra_parts="$extra_parts crtprec32.o crtprec64.o crtprec80.o
> crtfastmath.o"
> +       tmake_file="${tmake_file} i386/t-crtpc t-crtfm i386/t-crtstuff
> t-dfprules"
> +       tm_file="${tm_file} i386/elf-lib.h"
> +       md_unwind_header=i386/gnu-unwind.h
> +       ;;
>  i[34567]86-pc-msdosdjgpp*)
>         ;;
>  i[34567]86-*-lynxos*)
> @@ -1523,7 +1529,7 @@ esac
>  case ${host} in
>  i[34567]86-*-linux* | x86_64-*-linux* | \
>    i[34567]86-*-kfreebsd*-gnu | x86_64-*-kfreebsd*-gnu | \
> -  i[34567]86-*-gnu*)
> +  i[34567]86-*-gnu* | x86_64-*-gnu*)
>         tmake_file="${tmake_file} t-tls i386/t-linux i386/t-msabi
> t-slibgcc-libgcc"
>         if test "$libgcc_cv_cfi" = "yes"; then
>                 tmake_file="${tmake_file} t-stack i386/t-stack-i386"
> diff --git a/libgcc/config/i386/gnu-unwind.h
> b/libgcc/config/i386/gnu-unwind.h
> index 25eb690e370..2cbfc40ea7e 100644
> --- a/libgcc/config/i386/gnu-unwind.h
> +++ b/libgcc/config/i386/gnu-unwind.h
> @@ -30,6 +30,14 @@ see the files COPYING3 and COPYING.RUNTIME
> respectively.  If not, see
>
>  #include <signal.h>
>
> +#ifdef __x86_64__
> +
> +/*
> + * TODO: support for 64 bits needs to be implemented.
> + */
> +
> +#else /* ifdef __x86_64__  */
> +
>  #define MD_FALLBACK_FRAME_STATE_FOR x86_gnu_fallback_frame_state
>
>  static _Unwind_Reason_Code
> @@ -138,4 +146,6 @@ x86_gnu_fallback_frame_state
>    return _URC_NO_REASON;
>  }
>
> +#endif /* ifdef __x86_64__  */
> +
>  #endif /* ifndef inhibit_libc */
> --
> 2.35.1
>
>
  
Flavio Cruz Jan. 25, 2023, 3:56 p.m. UTC | #2
Ping

On Mon, Jan 9, 2023 at 1:00 PM Flávio Cruz <flaviocruz@gmail.com> wrote:

> Friendly ping
>
> On Mon, Dec 26, 2022 at 12:34 PM Flavio Cruz <flaviocruz@gmail.com> wrote:
>
>> Tested by building a toolchain and compiling gnumach for x86_64 [1].
>> This is the basic version without unwind support which I think is only
>> required to
>> implement exceptions.
>>
>> [1] https://github.com/flavioc/cross-hurd/blob/master/bootstrap-kernel.sh
>> .
>>
>> ---
>>  gcc/config.gcc                  |  5 ++++-
>>  gcc/config/i386/gnu64.h         | 40 +++++++++++++++++++++++++++++++++
>>  libgcc/config.host              |  8 ++++++-
>>  libgcc/config/i386/gnu-unwind.h | 10 +++++++++
>>  4 files changed, 61 insertions(+), 2 deletions(-)
>>  create mode 100644 gcc/config/i386/gnu64.h
>>
>> diff --git a/gcc/config.gcc b/gcc/config.gcc
>> index 95190233820..0e2b15768bf 100644
>> --- a/gcc/config.gcc
>> +++ b/gcc/config.gcc
>> @@ -1955,7 +1955,7 @@ i[34567]86-*-linux* | i[34567]86-*-kfreebsd*-gnu |
>> i[34567]86-*-gnu* | i[34567]8
>>                 ;;
>>         esac
>>         ;;
>> -x86_64-*-linux* | x86_64-*-kfreebsd*-gnu)
>> +x86_64-*-linux* | x86_64-*-kfreebsd*-gnu | x86_64-*-gnu*)
>>         tm_file="${tm_file} i386/unix.h i386/att.h elfos.h gnu-user.h
>> glibc-stdint.h \
>>                  i386/x86-64.h i386/gnu-user-common.h i386/gnu-user64.h"
>>         case ${target} in
>> @@ -1966,6 +1966,9 @@ x86_64-*-linux* | x86_64-*-kfreebsd*-gnu)
>>         x86_64-*-kfreebsd*-gnu)
>>                 tm_file="${tm_file} kfreebsd-gnu.h i386/kfreebsd-gnu64.h"
>>                 ;;
>> +       x86_64-*-gnu*)
>> +               tm_file="${tm_file} gnu.h i386/gnu64.h"
>> +               ;;
>>         esac
>>         tmake_file="${tmake_file} i386/t-linux64"
>>         x86_multilibs="${with_multilib_list}"
>> diff --git a/gcc/config/i386/gnu64.h b/gcc/config/i386/gnu64.h
>> new file mode 100644
>> index 00000000000..a1ecfaa1cdb
>> --- /dev/null
>> +++ b/gcc/config/i386/gnu64.h
>> @@ -0,0 +1,40 @@
>> +/* Configuration for an x86_64 running GNU with ELF as the target
>> machine.  */
>> +
>> +/*
>> +Copyright (C) 2022 Free Software Foundation, Inc.
>> +
>> +This file is part of GCC.
>> +
>> +GCC is free software: you can redistribute it and/or modify
>> +it under the terms of the GNU General Public License as published by
>> +the Free Software Foundation, either version 3 of the License, or
>> +(at your option) any later version.
>> +
>> +GCC is distributed in the hope that it will be useful,
>> +but WITHOUT ANY WARRANTY; without even the implied warranty of
>> +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
>> +GNU General Public License for more details.
>> +
>> +You should have received a copy of the GNU General Public License
>> +along with GCC.  If not, see <http://www.gnu.org/licenses/>.
>> +*/
>> +
>> +#define GNU_USER_LINK_EMULATION32 "elf_i386"
>> +#define GNU_USER_LINK_EMULATION64 "elf_x86_64"
>> +#define GNU_USER_LINK_EMULATIONX32 "elf32_x86_64"
>> +
>> +#undef GNU_USER_DYNAMIC_LINKER
>> +#define GNU_USER_DYNAMIC_LINKER32 "/lib/ld.so.1"
>> +#define GNU_USER_DYNAMIC_LINKER64 "/lib/ld-x86-64.so.1"
>> +#define GNU_USER_DYNAMIC_LINKERX32 "/lib/ld-x32.so.1"
>> +
>> +#undef STARTFILE_SPEC
>> +#if defined HAVE_LD_PIE
>> +#define STARTFILE_SPEC \
>> +  "%{!shared:
>> %{pg|p|profile:%{static:gcrt0.o%s;:gcrt1.o%s};pie:Scrt1.o%s;static:crt0.o%s;:crt1.o%s}}
>> \
>> +   crti.o%s
>> %{static:crtbeginT.o%s;shared|pie:crtbeginS.o%s;:crtbegin.o%s}"
>> +#else
>> +#define STARTFILE_SPEC \
>> +  "%{!shared:
>> %{pg|p|profile:%{static:gcrt0.o%s;:gcrt1.o%s};static:crt0.o%s;:crt1.o%s}} \
>> +   crti.o%s
>> %{static:crtbeginT.o%s;shared|pie:crtbeginS.o%s;:crtbegin.o%s}"
>> +#endif
>> diff --git a/libgcc/config.host b/libgcc/config.host
>> index eb23abe89f5..75fd1b778fe 100644
>> --- a/libgcc/config.host
>> +++ b/libgcc/config.host
>> @@ -751,6 +751,12 @@ x86_64-*-kfreebsd*-gnu)
>>         tmake_file="${tmake_file} i386/t-crtpc t-crtfm i386/t-crtstuff
>> t-dfprules"
>>         tm_file="${tm_file} i386/elf-lib.h"
>>         ;;
>> +x86_64-*-gnu*)
>> +       extra_parts="$extra_parts crtprec32.o crtprec64.o crtprec80.o
>> crtfastmath.o"
>> +       tmake_file="${tmake_file} i386/t-crtpc t-crtfm i386/t-crtstuff
>> t-dfprules"
>> +       tm_file="${tm_file} i386/elf-lib.h"
>> +       md_unwind_header=i386/gnu-unwind.h
>> +       ;;
>>  i[34567]86-pc-msdosdjgpp*)
>>         ;;
>>  i[34567]86-*-lynxos*)
>> @@ -1523,7 +1529,7 @@ esac
>>  case ${host} in
>>  i[34567]86-*-linux* | x86_64-*-linux* | \
>>    i[34567]86-*-kfreebsd*-gnu | x86_64-*-kfreebsd*-gnu | \
>> -  i[34567]86-*-gnu*)
>> +  i[34567]86-*-gnu* | x86_64-*-gnu*)
>>         tmake_file="${tmake_file} t-tls i386/t-linux i386/t-msabi
>> t-slibgcc-libgcc"
>>         if test "$libgcc_cv_cfi" = "yes"; then
>>                 tmake_file="${tmake_file} t-stack i386/t-stack-i386"
>> diff --git a/libgcc/config/i386/gnu-unwind.h
>> b/libgcc/config/i386/gnu-unwind.h
>> index 25eb690e370..2cbfc40ea7e 100644
>> --- a/libgcc/config/i386/gnu-unwind.h
>> +++ b/libgcc/config/i386/gnu-unwind.h
>> @@ -30,6 +30,14 @@ see the files COPYING3 and COPYING.RUNTIME
>> respectively.  If not, see
>>
>>  #include <signal.h>
>>
>> +#ifdef __x86_64__
>> +
>> +/*
>> + * TODO: support for 64 bits needs to be implemented.
>> + */
>> +
>> +#else /* ifdef __x86_64__  */
>> +
>>  #define MD_FALLBACK_FRAME_STATE_FOR x86_gnu_fallback_frame_state
>>
>>  static _Unwind_Reason_Code
>> @@ -138,4 +146,6 @@ x86_gnu_fallback_frame_state
>>    return _URC_NO_REASON;
>>  }
>>
>> +#endif /* ifdef __x86_64__  */
>> +
>>  #endif /* ifndef inhibit_libc */
>> --
>> 2.35.1
>>
>>
>
> --
> Flávio Cruz / flaviocruz@gmail.com
>
  
Thomas Schwinge Jan. 26, 2023, 8:34 a.m. UTC | #3
Hi Flavio!

On 2022-12-26T12:34:28-0500, Flavio Cruz via Gcc-patches <gcc-patches@gcc.gnu.org> wrote:
> Tested by building a toolchain and compiling gnumach for x86_64

Oh, wow, so this is indeed happening, finally!  :-D

> This is the basic version without unwind support which I think is only required to
> implement exceptions.

ACK, this can all be tuned later.  We understand that ABI to be
completely unstable at this point.


Your patch generally looks good, and I'll drop it into my regular
x86_64-pc-linux-gnu testing, to verify that we don't accidentally break
things re 'x86_64-*-gnu*' matching (but I think we're safe).


As you don't have FSF Copyright Assignment on file for GCC (as far as I
can tell), are you either going to get that, or re-submit this patch with
DCO ('Signed-off-by:' tag), <https://gcc.gnu.org/contribute.html#legal>?


While at that, please also adjust:

> --- /dev/null
> +++ b/gcc/config/i386/gnu64.h
> @@ -0,0 +1,40 @@
> +/* Configuration for an x86_64 running GNU with ELF as the target machine.  */
> +
> +/*
> +Copyright (C) 2022 Free Software Foundation, Inc.

^ 2023 ;-)


Grüße
 Thomas
-----------------
Siemens Electronic Design Automation GmbH; Anschrift: Arnulfstraße 201, 80634 München; Gesellschaft mit beschränkter Haftung; Geschäftsführer: Thomas Heurung, Frank Thürauf; Sitz der Gesellschaft: München; Registergericht München, HRB 106955
  
Flavio Cruz Jan. 27, 2023, 6:49 a.m. UTC | #4
Tested by building a toolchain and compiling gnumach for x86_64 [1].
This is the basic version without unwind support which I think is only
required to implement exceptions.

[1]
https://github.com/flavioc/cross-hurd/blob/master/bootstrap-kernel.sh.

gcc/ChangeLog:
	* config.gcc: Recognize x86_64-*-gnu* targets and include
	i386/gnu64.h.
	* config/i386/gnu64.h: Define configuration for new target
	including ld.so location.

libgcc/ChangeLog:
	* config.host: Recognize x86_64-*-gnu* targets.
	* config/i386/gnu-unwind.h: Update to handle __x86_64__ with a
	TODO for now.

Signed-off-by: Flavio Cruz <flaviocruz@gmail.com>
---

On Thu, Jan 26, 2023 at 09:34:16AM +0100, Thomas Schwinge wrote:
>Hi Flavio!

Hi Thomas!

>
>On 2022-12-26T12:34:28-0500, Flavio Cruz via Gcc-patches <gcc-patches@gcc.gnu.org> wrote:
>> Tested by building a toolchain and compiling gnumach for x86_64
>
>Oh, wow, so this is indeed happening, finally!  :-D
>
>> This is the basic version without unwind support which I think is only required to
>> implement exceptions.
>
>ACK, this can all be tuned later.  We understand that ABI to be
>completely unstable at this point.
>
>
>Your patch generally looks good, and I'll drop it into my regular
>x86_64-pc-linux-gnu testing, to verify that we don't accidentally break
>things re 'x86_64-*-gnu*' matching (but I think we're safe).

That sounds good.

>
>
>As you don't have FSF Copyright Assignment on file for GCC (as far as I
>can tell), are you either going to get that, or re-submit this patch with
>DCO ('Signed-off-by:' tag), <https://gcc.gnu.org/contribute.html#legal>?

Yes, I think I have it for Hurd related projects but not GCC. Added Signed-off-by.

>
>
>While at that, please also adjust:
>
>> --- /dev/null
>> +++ b/gcc/config/i386/gnu64.h
>> @@ -0,0 +1,40 @@
>> +/* Configuration for an x86_64 running GNU with ELF as the target machine.  */
>> +
>> +/*
>> +Copyright (C) 2022 Free Software Foundation, Inc.
>
>^ 2023 ;-)

Done

Revisted patch is inlined below. Also added the ChangeLog details.

Thanks a lot for your help!

>
>
>Grüße
> Thomas
>-----------------
>Siemens Electronic Design Automation GmbH; Anschrift: Arnulfstraße 201, 80634 München; Gesellschaft mit beschränkter Haftung; Geschäftsführer: Thomas Heurung, Frank Thürauf; Sitz der Gesellschaft: München; Registergericht München, HRB 106955

  gcc/config.gcc                  |  5 ++++-
  gcc/config/i386/gnu64.h         | 40 +++++++++++++++++++++++++++++++++
  libgcc/config.host              |  8 ++++++-
  libgcc/config/i386/gnu-unwind.h | 10 +++++++++
  4 files changed, 61 insertions(+), 2 deletions(-)
  create mode 100644 gcc/config/i386/gnu64.h

diff --git a/gcc/config.gcc b/gcc/config.gcc
index 89f56047cfe..ff6166a429b 100644
--- a/gcc/config.gcc
+++ b/gcc/config.gcc
@@ -1971,7 +1971,7 @@ i[34567]86-*-linux* | i[34567]86-*-kfreebsd*-gnu | i[34567]86-*-gnu* | i[34567]8
  		;;
  	esac
  	;;
-x86_64-*-linux* | x86_64-*-kfreebsd*-gnu)
+x86_64-*-linux* | x86_64-*-kfreebsd*-gnu | x86_64-*-gnu*)
  	tm_file="${tm_file} i386/unix.h i386/att.h elfos.h gnu-user.h glibc-stdint.h \
  		 i386/x86-64.h i386/gnu-user-common.h i386/gnu-user64.h"
  	case ${target} in
@@ -1982,6 +1982,9 @@ x86_64-*-linux* | x86_64-*-kfreebsd*-gnu)
  	x86_64-*-kfreebsd*-gnu)
  		tm_file="${tm_file} kfreebsd-gnu.h i386/kfreebsd-gnu64.h"
  		;;
+	x86_64-*-gnu*)
+		tm_file="${tm_file} gnu.h i386/gnu64.h"
+		;;
  	esac
  	tmake_file="${tmake_file} i386/t-linux64"
  	x86_multilibs="${with_multilib_list}"
diff --git a/gcc/config/i386/gnu64.h b/gcc/config/i386/gnu64.h
new file mode 100644
index 00000000000..a411f0e802a
--- /dev/null
+++ b/gcc/config/i386/gnu64.h
@@ -0,0 +1,40 @@
+/* Configuration for an x86_64 running GNU with ELF as the target machine.  */
+
+/*
+Copyright (C) 2023 Free Software Foundation, Inc.
+
+This file is part of GCC.
+
+GCC is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+GCC is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GCC.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#define GNU_USER_LINK_EMULATION32 "elf_i386"
+#define GNU_USER_LINK_EMULATION64 "elf_x86_64"
+#define GNU_USER_LINK_EMULATIONX32 "elf32_x86_64"
+
+#undef GNU_USER_DYNAMIC_LINKER
+#define GNU_USER_DYNAMIC_LINKER32 "/lib/ld.so.1"
+#define GNU_USER_DYNAMIC_LINKER64 "/lib/ld-x86-64.so.1"
+#define GNU_USER_DYNAMIC_LINKERX32 "/lib/ld-x32.so.1"
+
+#undef	STARTFILE_SPEC
+#if defined HAVE_LD_PIE
+#define STARTFILE_SPEC \
+  "%{!shared: %{pg|p|profile:%{static:gcrt0.o%s;:gcrt1.o%s};pie:Scrt1.o%s;static:crt0.o%s;:crt1.o%s}} \
+   crti.o%s %{static:crtbeginT.o%s;shared|pie:crtbeginS.o%s;:crtbegin.o%s}"
+#else
+#define STARTFILE_SPEC \
+  "%{!shared: %{pg|p|profile:%{static:gcrt0.o%s;:gcrt1.o%s};static:crt0.o%s;:crt1.o%s}} \
+   crti.o%s %{static:crtbeginT.o%s;shared|pie:crtbeginS.o%s;:crtbegin.o%s}"
+#endif
diff --git a/libgcc/config.host b/libgcc/config.host
index 18fe2f9ea17..70d47e08e40 100644
--- a/libgcc/config.host
+++ b/libgcc/config.host
@@ -751,6 +751,12 @@ x86_64-*-kfreebsd*-gnu)
  	tmake_file="${tmake_file} i386/t-crtpc t-crtfm i386/t-crtstuff t-dfprules"
  	tm_file="${tm_file} i386/elf-lib.h"
  	;;
+x86_64-*-gnu*)
+	extra_parts="$extra_parts crtprec32.o crtprec64.o crtprec80.o crtfastmath.o"
+	tmake_file="${tmake_file} i386/t-crtpc t-crtfm i386/t-crtstuff t-dfprules"
+	tm_file="${tm_file} i386/elf-lib.h"
+	md_unwind_header=i386/gnu-unwind.h
+	;;
  i[34567]86-pc-msdosdjgpp*)
  	;;
  i[34567]86-*-lynxos*)
@@ -1523,7 +1529,7 @@ esac
  case ${host} in
  i[34567]86-*-linux* | x86_64-*-linux* | \
    i[34567]86-*-kfreebsd*-gnu | x86_64-*-kfreebsd*-gnu | \
-  i[34567]86-*-gnu*)
+  i[34567]86-*-gnu* | x86_64-*-gnu*)
  	tmake_file="${tmake_file} t-tls i386/t-linux i386/t-msabi t-slibgcc-libgcc"
  	if test "$libgcc_cv_cfi" = "yes"; then
  		tmake_file="${tmake_file} t-stack i386/t-stack-i386"
diff --git a/libgcc/config/i386/gnu-unwind.h b/libgcc/config/i386/gnu-unwind.h
index 7cb1c7aca4d..85aa2d61b63 100644
--- a/libgcc/config/i386/gnu-unwind.h
+++ b/libgcc/config/i386/gnu-unwind.h
@@ -30,6 +30,14 @@ see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
  
  #include <signal.h>
  
+#ifdef __x86_64__
+
+/*
+ * TODO: support for 64 bits needs to be implemented.
+ */
+
+#else /* ifdef __x86_64__  */
+
  #define MD_FALLBACK_FRAME_STATE_FOR x86_gnu_fallback_frame_state
  
  static _Unwind_Reason_Code
@@ -138,4 +146,6 @@ x86_gnu_fallback_frame_state
    return _URC_NO_REASON;
  }
  
+#endif /* ifdef __x86_64__  */
+
  #endif /* ifndef inhibit_libc */
  
Thomas Schwinge Jan. 30, 2023, 3:44 p.m. UTC | #5
Hi!

On 2023-01-27T21:15:01-0500, Flávio Cruz <flaviocruz@gmail.com> wrote:
> Not sure what happened, but here's the patch as an attachment. Thanks for
> your patience.

Thanks, that worked.  Without any changes now pushed to master branch in
commit 5f8950b403f6351f125d8281d2e7430a43e7d125
"Add support for x86_64-*-gnu-* targets to build x86_64 gnumach/hurd",
see attached.

I'll watch how x86_64 GNU/Hurd develops!  :-)


Grüße
 Thomas


> On Fri, Jan 27, 2023 at 4:16 PM Thomas Schwinge <thomas@codesourcery.com>
> wrote:
>
>> Hi Flavio!
>>
>> Sorry to bother you one last time (hopefully):
>>
>> On 2023-01-27T01:49:25-0500, Flavio Cruz <flaviocruz@gmail.com> wrote:
>> > On Thu, Jan 26, 2023 at 09:34:16AM +0100, Thomas Schwinge wrote:
>> >>As you don't have FSF Copyright Assignment on file for GCC (as far as I
>> >>can tell), are you either going to get that, or re-submit this patch with
>> >>DCO ('Signed-off-by:' tag), <https://gcc.gnu.org/contribute.html#legal>?
>> >
>> > Yes, I think I have it for Hurd related projects
>>
>> Yes.
>>
>> > but not GCC. Added Signed-off-by.
>>
>> ACK, thanks.
>>
>> > Revisted patch is inlined below. Also added the ChangeLog details.
>>
>> Thanks!
>>
>> If I 'git am' that one, I get:
>>
>>     warning: Patch sent with format=flowed; space at the end of lines might be lost.
>>     Applying: Add support for x86_64-*-gnu-* targets to build x86_64 gnumach/hurd
>>     error: corrupt patch at line 180
>>     Patch failed at 0001 Add support for x86_64-*-gnu-* targets to build x86_64 gnumach/hurd
>>     [...]
>>
>> That's due to:
>>
>>     Content-Type: text/plain; charset="iso-8859-1"; format=flowed
>>
>> Is it easy for you to re-send that "differently"?  (Or, just attach the
>> file generated by 'git format-patch'.)  If that's inconvenient, then I'll
>> fix it up manually, no worries.
>>
>>
>> Grüße
>>  Thomas


-----------------
Siemens Electronic Design Automation GmbH; Anschrift: Arnulfstraße 201, 80634 München; Gesellschaft mit beschränkter Haftung; Geschäftsführer: Thomas Heurung, Frank Thürauf; Sitz der Gesellschaft: München; Registergericht München, HRB 106955
  
Jan-Benedict Glaw Feb. 1, 2023, 6:19 p.m. UTC | #6
Hi Flávio and Thomas!

On Mon, 2023-01-30 16:44:29 +0100, Thomas Schwinge <thomas@codesourcery.com> wrote:
> On 2023-01-27T21:15:01-0500, Flávio Cruz <flaviocruz@gmail.com> wrote:
> > Not sure what happened, but here's the patch as an attachment. Thanks for
> > your patience.
> 
> Thanks, that worked.  Without any changes now pushed to master branch in
> commit 5f8950b403f6351f125d8281d2e7430a43e7d125
> "Add support for x86_64-*-gnu-* targets to build x86_64 gnumach/hurd",
> see attached.
> 
> I'll watch how x86_64 GNU/Hurd develops!  :-)

Please also add this target configuration to contrib/config-list.mk

Thanks,
  Jan-Benedict

--
  

Patch

diff --git a/gcc/config.gcc b/gcc/config.gcc
index 95190233820..0e2b15768bf 100644
--- a/gcc/config.gcc
+++ b/gcc/config.gcc
@@ -1955,7 +1955,7 @@  i[34567]86-*-linux* | i[34567]86-*-kfreebsd*-gnu | i[34567]86-*-gnu* | i[34567]8
 		;;
 	esac
 	;;
-x86_64-*-linux* | x86_64-*-kfreebsd*-gnu)
+x86_64-*-linux* | x86_64-*-kfreebsd*-gnu | x86_64-*-gnu*)
 	tm_file="${tm_file} i386/unix.h i386/att.h elfos.h gnu-user.h glibc-stdint.h \
 		 i386/x86-64.h i386/gnu-user-common.h i386/gnu-user64.h"
 	case ${target} in
@@ -1966,6 +1966,9 @@  x86_64-*-linux* | x86_64-*-kfreebsd*-gnu)
 	x86_64-*-kfreebsd*-gnu)
 		tm_file="${tm_file} kfreebsd-gnu.h i386/kfreebsd-gnu64.h"
 		;;
+	x86_64-*-gnu*)
+		tm_file="${tm_file} gnu.h i386/gnu64.h"
+		;;
 	esac
 	tmake_file="${tmake_file} i386/t-linux64"
 	x86_multilibs="${with_multilib_list}"
diff --git a/gcc/config/i386/gnu64.h b/gcc/config/i386/gnu64.h
new file mode 100644
index 00000000000..a1ecfaa1cdb
--- /dev/null
+++ b/gcc/config/i386/gnu64.h
@@ -0,0 +1,40 @@ 
+/* Configuration for an x86_64 running GNU with ELF as the target machine.  */
+
+/*
+Copyright (C) 2022 Free Software Foundation, Inc.
+
+This file is part of GCC.
+
+GCC is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+GCC is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GCC.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#define GNU_USER_LINK_EMULATION32 "elf_i386"
+#define GNU_USER_LINK_EMULATION64 "elf_x86_64"
+#define GNU_USER_LINK_EMULATIONX32 "elf32_x86_64"
+
+#undef GNU_USER_DYNAMIC_LINKER
+#define GNU_USER_DYNAMIC_LINKER32 "/lib/ld.so.1"
+#define GNU_USER_DYNAMIC_LINKER64 "/lib/ld-x86-64.so.1"
+#define GNU_USER_DYNAMIC_LINKERX32 "/lib/ld-x32.so.1"
+
+#undef	STARTFILE_SPEC
+#if defined HAVE_LD_PIE
+#define STARTFILE_SPEC \
+  "%{!shared: %{pg|p|profile:%{static:gcrt0.o%s;:gcrt1.o%s};pie:Scrt1.o%s;static:crt0.o%s;:crt1.o%s}} \
+   crti.o%s %{static:crtbeginT.o%s;shared|pie:crtbeginS.o%s;:crtbegin.o%s}"
+#else
+#define STARTFILE_SPEC \
+  "%{!shared: %{pg|p|profile:%{static:gcrt0.o%s;:gcrt1.o%s};static:crt0.o%s;:crt1.o%s}} \
+   crti.o%s %{static:crtbeginT.o%s;shared|pie:crtbeginS.o%s;:crtbegin.o%s}"
+#endif
diff --git a/libgcc/config.host b/libgcc/config.host
index eb23abe89f5..75fd1b778fe 100644
--- a/libgcc/config.host
+++ b/libgcc/config.host
@@ -751,6 +751,12 @@  x86_64-*-kfreebsd*-gnu)
 	tmake_file="${tmake_file} i386/t-crtpc t-crtfm i386/t-crtstuff t-dfprules"
 	tm_file="${tm_file} i386/elf-lib.h"
 	;;
+x86_64-*-gnu*)
+	extra_parts="$extra_parts crtprec32.o crtprec64.o crtprec80.o crtfastmath.o"
+	tmake_file="${tmake_file} i386/t-crtpc t-crtfm i386/t-crtstuff t-dfprules"
+	tm_file="${tm_file} i386/elf-lib.h"
+	md_unwind_header=i386/gnu-unwind.h
+	;;
 i[34567]86-pc-msdosdjgpp*)
 	;;
 i[34567]86-*-lynxos*)
@@ -1523,7 +1529,7 @@  esac
 case ${host} in
 i[34567]86-*-linux* | x86_64-*-linux* | \
   i[34567]86-*-kfreebsd*-gnu | x86_64-*-kfreebsd*-gnu | \
-  i[34567]86-*-gnu*)
+  i[34567]86-*-gnu* | x86_64-*-gnu*)
 	tmake_file="${tmake_file} t-tls i386/t-linux i386/t-msabi t-slibgcc-libgcc"
 	if test "$libgcc_cv_cfi" = "yes"; then
 		tmake_file="${tmake_file} t-stack i386/t-stack-i386"
diff --git a/libgcc/config/i386/gnu-unwind.h b/libgcc/config/i386/gnu-unwind.h
index 25eb690e370..2cbfc40ea7e 100644
--- a/libgcc/config/i386/gnu-unwind.h
+++ b/libgcc/config/i386/gnu-unwind.h
@@ -30,6 +30,14 @@  see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
 
 #include <signal.h>
 
+#ifdef __x86_64__
+
+/*
+ * TODO: support for 64 bits needs to be implemented.
+ */
+
+#else /* ifdef __x86_64__  */
+
 #define MD_FALLBACK_FRAME_STATE_FOR x86_gnu_fallback_frame_state
 
 static _Unwind_Reason_Code
@@ -138,4 +146,6 @@  x86_gnu_fallback_frame_state
   return _URC_NO_REASON;
 }
 
+#endif /* ifdef __x86_64__  */
+
 #endif /* ifndef inhibit_libc */