bug-hurd
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH] Add support for x86_64-*-gnu-* targets (gcc)


From: Flavio Cruz
Subject: Re: [PATCH] Add support for x86_64-*-gnu-* targets (gcc)
Date: Wed, 21 Dec 2022 16:16:32 -0500

---

Thanks a lot for the reviews.

On Wed, Dec 21, 2022 at 12:32:04PM +0100, Samuel Thibault wrote:
Hello,

Flavio Cruz, le lun. 19 déc. 2022 17:05:08 -0500, a ecrit:
I'm looking for comments before sending it to the gcc mailing list.

diff --git a/gcc/config.gcc b/gcc/config.gcc
index 95190233820..1d76fe98f96 100644
--- a/gcc/config.gcc
+++ b/gcc/config.gcc
@@ -1955,6 +1955,10 @@ i[34567]86-*-linux* | i[34567]86-*-kfreebsd*-gnu | 
i[34567]86-*-gnu* | i[34567]8
                ;;
        esac
        ;;
+x86_64-*-gnu*)
+  tm_file="${tm_file} i386/unix.h i386/att.h dbxelf.h elfos.h gnu-user.h 
glibc-stdint.h \
+     i386/x86-64.h i386/gnu-user-common.h i386/gnu-user64.h gnu.h i386/gnu64.h"
+  ;;
 x86_64-*-linux* | x86_64-*-kfreebsd*-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"

Similary, this needs to go after all potential something-gnu triplets,
so better put it at the end.

Done. Note I added x86_64-*-linux*, x86_64-*-kfreebsd*-gnu and
x86_64-*gnu* together to make sure the multilib logic is similar.


diff --git a/gcc/config/i386/gnu64.h b/gcc/config/i386/gnu64.h
new file mode 100644
index 00000000000..c764437cb67
--- /dev/null
+++ b/gcc/config/i386/gnu64.h
@@ -0,0 +1,40 @@
+/* Configuration for an i386 running GNU with ELF as the target machine.  */

x86-64 rather than i386

Done


+
+/*
+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

I don't think you can to #undef GNU_USER_DYNAMIC_LINKER? It's already
undefed and redefined in gnu.h

Are you referring to i386/gnu.h? That is only included for i386.


+#define GNU_USER_DYNAMIC_LINKER32 "/lib/ld.so"
+#define GNU_USER_DYNAMIC_LINKER64 "/lib/ld-x86-64.so"
+#define GNU_USER_DYNAMIC_LINKERX32 "/lib/ld-x32.so"

I have been wondering over the years why we use ld.so, rather than
ld.so.1 (since the former is a symlink to the latter), and I don't see
any good reason for that, especially when the rest of the world doesn't
do that, and that keeps posing issues in packaging scripts etc.

So I'm thinking for the 64bit version we should probably not repeat the
mistake, and use ld-x86-64.so.1 and ld-x32.so.1?

Good point. Done.


diff --git a/libgcc/config.host b/libgcc/config.host
index eb23abe89f5..38da43edfa6 100644
--- a/libgcc/config.host
+++ b/libgcc/config.host
@@ -740,6 +740,12 @@ i[34567]86-*-gnu*)
        tm_file="${tm_file} i386/elf-lib.h"
        md_unwind_header=i386/gnu-unwind.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
+       ;;
 x86_64-*-linux*)
        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"

Similarly, move it to after kfreebsd-gnu.

Done.


diff --git a/libgcc/config/i386/gnu-unwind.h b/libgcc/config/i386/gnu-unwind.h
index 25eb690e370..b7574f9ac37 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 need to be implemented.
+ */
+
+#else /* ifdef __x86_64__  */
+
 #define MD_FALLBACK_FRAME_STATE_FOR x86_gnu_fallback_frame_state

 static _Unwind_Reason_Code

Yes, that should be fine for now.

Thanks!
Samuel

Attached the new version of the patch.


 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..e54abc0e860 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




reply via email to

[Prev in Thread] Current Thread [Next in Thread]