public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
* [PING][PATCH] LoongArch: initial ada support on linux
@ 2023-08-25  4:46 Yang Yujie
  2023-08-25  5:55 ` Yujie Yang
                   ` (2 more replies)
  0 siblings, 3 replies; 8+ messages in thread
From: Yang Yujie @ 2023-08-25  4:46 UTC (permalink / raw)
  To: gcc-patches
  Cc: charlet, ebotcazou, poulhies, derodat, xuchenghua, chenglulu, Yang Yujie

gcc/ChangeLog:

	* ada/Makefile.rtl: Add LoongArch support.
	* ada/libgnarl/s-linux__loongarch.ads: New.
	* ada/libgnat/system-linux-loongarch.ads: New.
	* config/loongarch/loongarch.h: mark normalized options
	passed from driver to gnat1 as explicit for multilib.
---
 gcc/ada/Makefile.rtl                       |  49 +++++++
 gcc/ada/libgnarl/s-linux__loongarch.ads    | 134 +++++++++++++++++++
 gcc/ada/libgnat/system-linux-loongarch.ads | 145 +++++++++++++++++++++
 gcc/config/loongarch/loongarch.h           |   4 +-
 4 files changed, 330 insertions(+), 2 deletions(-)
 create mode 100644 gcc/ada/libgnarl/s-linux__loongarch.ads
 create mode 100644 gcc/ada/libgnat/system-linux-loongarch.ads

diff --git a/gcc/ada/Makefile.rtl b/gcc/ada/Makefile.rtl
index 96306f8cc9a..3f63c4893fd 100644
--- a/gcc/ada/Makefile.rtl
+++ b/gcc/ada/Makefile.rtl
@@ -2111,6 +2111,55 @@ ifeq ($(strip $(filter-out cygwin% mingw32% pe,$(target_os))),)
   LIBRARY_VERSION := $(LIB_VERSION)
 endif
 
+# LoongArch Linux
+ifeq ($(strip $(filter-out loongarch% linux%,$(target_cpu) $(target_os))),)
+  LIBGNAT_TARGET_PAIRS = \
+  a-exetim.adb<libgnarl/a-exetim__posix.adb \
+  a-exetim.ads<libgnarl/a-exetim__default.ads \
+  a-intnam.ads<libgnarl/a-intnam__linux.ads \
+  a-nallfl.ads<libgnat/a-nallfl__wraplf.ads \
+  a-synbar.adb<libgnarl/a-synbar__posix.adb \
+  a-synbar.ads<libgnarl/a-synbar__posix.ads \
+  s-inmaop.adb<libgnarl/s-inmaop__posix.adb \
+  s-intman.adb<libgnarl/s-intman__posix.adb \
+  s-linux.ads<libgnarl/s-linux__loongarch.ads \
+  s-mudido.adb<libgnarl/s-mudido__affinity.adb \
+  s-osinte.ads<libgnarl/s-osinte__linux.ads \
+  s-osinte.adb<libgnarl/s-osinte__posix.adb \
+  s-osprim.adb<libgnat/s-osprim__posix.adb \
+  s-taprop.adb<libgnarl/s-taprop__linux.adb \
+  s-tasinf.ads<libgnarl/s-tasinf__linux.ads \
+  s-tasinf.adb<libgnarl/s-tasinf__linux.adb \
+  s-tpopsp.adb<libgnarl/s-tpopsp__tls.adb \
+  s-taspri.ads<libgnarl/s-taspri__posix.ads \
+  g-sercom.adb<libgnat/g-sercom__linux.adb \
+  $(TRASYM_DWARF_UNIX_PAIRS) \
+  $(GNATRTL_128BIT_PAIRS) \
+  s-tsmona.adb<libgnat/s-tsmona__linux.adb \
+  $(ATOMICS_TARGET_PAIRS) \
+  $(ATOMICS_BUILTINS_TARGET_PAIRS) \
+  system.ads<libgnat/system-linux-loongarch.ads
+
+  TOOLS_TARGET_PAIRS = indepsw.adb<indepsw-gnu.adb
+
+  EXTRA_GNATRTL_NONTASKING_OBJS += $(TRASYM_DWARF_UNIX_OBJS)
+  EXTRA_GNATRTL_NONTASKING_OBJS += $(GNATRTL_128BIT_OBJS)
+  EXTRA_GNATRTL_TASKING_OBJS = s-linux.o a-exetim.o
+
+  EH_MECHANISM = -gcc
+  THREADSLIB = -lpthread
+  MISCLIB = -ldl
+  GNATLIB_SHARED = gnatlib-shared-dual
+  GMEM_LIB = gmemlib
+  LIBRARY_VERSION := $(LIB_VERSION)
+  # Temporarily disable strict alignment -- for some reason, it causes
+  # infinite loops during stack unwinding (libgcc) and indefinite hang
+  # in some futex system calls.
+  GNATLIBCFLAGS := $(GNATLIBCFLAGS) -mno-strict-align
+  GNATLIBCFLAGS_FOR_C := $(GNATLIBCFLAGS_FOR_C) -mno-strict-align
+endif
+
+
 # Mips Linux
 ifeq ($(strip $(filter-out mips% linux%,$(target_cpu) $(target_os))),)
   LIBGNAT_TARGET_PAIRS = \
diff --git a/gcc/ada/libgnarl/s-linux__loongarch.ads b/gcc/ada/libgnarl/s-linux__loongarch.ads
new file mode 100644
index 00000000000..9773ec0ad36
--- /dev/null
+++ b/gcc/ada/libgnarl/s-linux__loongarch.ads
@@ -0,0 +1,134 @@
+------------------------------------------------------------------------------
+--                                                                          --
+--                GNU ADA RUN-TIME LIBRARY (GNARL) COMPONENTS               --
+--                                                                          --
+--                          S Y S T E M .  L I N U X                        --
+--                                                                          --
+--                                  S p e c                                 --
+--                                                                          --
+--             Copyright (C) 2009-2023, Free Software Foundation, Inc.      --
+--                                                                          --
+-- GNARL is free software; you can  redistribute it  and/or modify it under --
+-- terms of the  GNU General Public License as published  by the Free Soft- --
+-- ware  Foundation;  either version 3,  or (at your option) any later ver- --
+-- sion.  GNAT is distributed in the hope that it will be useful, but WITH- --
+-- OUT ANY WARRANTY;  without even the  implied warranty of MERCHANTABILITY --
+-- or FITNESS FOR A PARTICULAR PURPOSE.                                     --
+--                                                                          --
+-- As a special exception under Section 7 of GPL version 3, you are granted --
+-- additional permissions described in the GCC Runtime Library Exception,   --
+-- version 3.1, as published by the Free Software Foundation.               --
+--                                                                          --
+-- You should have received a copy of the GNU General Public License and    --
+-- a copy of the GCC Runtime Library Exception along with this program;     --
+-- see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see    --
+-- <http://www.gnu.org/licenses/>.                                          --
+--                                                                          --
+------------------------------------------------------------------------------
+
+--  This is the LoongArch version of this package
+
+--  This package encapsulates cpu specific differences between implementations
+--  of GNU/Linux, in order to share s-osinte-linux.ads.
+
+--  PLEASE DO NOT add any with-clauses to this package or remove the pragma
+--  Preelaborate. This package is designed to be a bottom-level (leaf) package
+
+with Interfaces.C;
+with System.Parameters;
+
+package System.Linux is
+   pragma Preelaborate;
+
+   ----------
+   -- Time --
+   ----------
+
+   subtype int         is Interfaces.C.int;
+   subtype long        is Interfaces.C.long;
+   subtype suseconds_t is Interfaces.C.long;
+   type time_t is range -2 ** (System.Parameters.time_t_bits - 1)
+     .. 2 ** (System.Parameters.time_t_bits - 1) - 1;
+   subtype clockid_t   is Interfaces.C.int;
+
+   type timespec is record
+      tv_sec  : time_t;
+      tv_nsec : long;
+   end record;
+   pragma Convention (C, timespec);
+
+   type timeval is record
+      tv_sec  : time_t;
+      tv_usec : suseconds_t;
+   end record;
+   pragma Convention (C, timeval);
+
+   -----------
+   -- Errno --
+   -----------
+
+   EAGAIN    : constant := 11;
+   EINTR     : constant := 4;
+   EINVAL    : constant := 22;
+   ENOMEM    : constant := 12;
+   EPERM     : constant := 1;
+   ETIMEDOUT : constant := 110;
+
+   -------------
+   -- Signals --
+   -------------
+
+   SIGHUP     : constant := 1; --  hangup
+   SIGINT     : constant := 2; --  interrupt (rubout)
+   SIGQUIT    : constant := 3; --  quit (ASCD FS)
+   SIGILL     : constant := 4; --  illegal instruction (not reset)
+   SIGTRAP    : constant := 5; --  trace trap (not reset)
+   SIGIOT     : constant := 6; --  IOT instruction
+   SIGABRT    : constant := 6; --  used by abort, replace SIGIOT in the  future
+   SIGBUS     : constant := 7; --  bus error
+   SIGFPE     : constant := 8; --  floating point exception
+   SIGKILL    : constant := 9; --  kill (cannot be caught or ignored)
+   SIGUSR1    : constant := 10; --  user defined signal 1
+   SIGSEGV    : constant := 11; --  segmentation violation
+   SIGUSR2    : constant := 12; --  user defined signal 2
+   SIGPIPE    : constant := 13; --  write on a pipe with no one to read it
+   SIGALRM    : constant := 14; --  alarm clock
+   SIGTERM    : constant := 15; --  software termination signal from kill
+   SIGSTKFLT  : constant := 16; --  coprocessor stack fault (Linux)
+   SIGCLD     : constant := 17; --  alias for SIGCHLD
+   SIGCHLD    : constant := 17; --  child status change
+   SIGCONT    : constant := 18; --  stopped process has been continued
+   SIGSTOP    : constant := 19; --  stop (cannot be caught or ignored)
+   SIGTSTP    : constant := 20; --  user stop requested from tty
+   SIGTTIN    : constant := 21; --  background tty read attempted
+   SIGTTOU    : constant := 22; --  background tty write attempted
+   SIGURG     : constant := 23; --  urgent condition on IO channel
+   SIGXCPU    : constant := 24; --  CPU time limit exceeded
+   SIGXFSZ    : constant := 25; --  filesize limit exceeded
+   SIGVTALRM  : constant := 26; --  virtual timer expired
+   SIGPROF    : constant := 27; --  profiling timer expired
+   SIGWINCH   : constant := 28; --  window size change
+   SIGPOLL    : constant := 29; --  pollable event occurred
+   SIGIO      : constant := 29; --  I/O now possible (4.2 BSD)
+   SIGPWR     : constant := 30; --  power-fail restart
+   SIGSYS     : constant := 31; --  bad system call
+   SIG32      : constant := 32; --  glibc internal signal
+   SIG33      : constant := 33; --  glibc internal signal
+   SIG34      : constant := 34; --  glibc internal signal
+
+   --  These don't exist for Linux/LoongArch.  The constants are present
+   --  so that we can continue to use a-intnam-linux.ads.
+   SIGLOST    : constant := 0; --  File lock lost
+   SIGUNUSED  : constant := 0; --  unused signal (GNU/Linux)
+   SIGEMT     : constant := 0; --  EMT
+
+   --  struct_sigaction offsets
+
+   sa_handler_pos : constant := 0;
+   sa_mask_pos    : constant := Standard'Address_Size / 8;
+   sa_flags_pos   : constant := 128 + sa_mask_pos;
+
+   SA_SIGINFO  : constant := 16#04#;
+   SA_ONSTACK  : constant := 16#08000000#;
+
+end System.Linux;
diff --git a/gcc/ada/libgnat/system-linux-loongarch.ads b/gcc/ada/libgnat/system-linux-loongarch.ads
new file mode 100644
index 00000000000..735f670411e
--- /dev/null
+++ b/gcc/ada/libgnat/system-linux-loongarch.ads
@@ -0,0 +1,145 @@
+------------------------------------------------------------------------------
+--                                                                          --
+--                        GNAT RUN-TIME COMPONENTS                          --
+--                                                                          --
+--                               S Y S T E M                                --
+--                                                                          --
+--                                 S p e c                                  --
+--                       (GNU-Linux/LoongArch Version)                      --
+--                                                                          --
+--          Copyright (C) 1992-2023, Free Software Foundation, Inc.         --
+--                                                                          --
+-- This specification is derived from the Ada Reference Manual for use with --
+-- GNAT. The copyright notice above, and the license provisions that follow --
+-- apply solely to the  contents of the part following the private keyword. --
+--                                                                          --
+-- GNAT is free software;  you can  redistribute it  and/or modify it under --
+-- terms of the  GNU General Public License as published  by the Free Soft- --
+-- ware  Foundation;  either version 3,  or (at your option) any later ver- --
+-- sion.  GNAT is distributed in the hope that it will be useful, but WITH- --
+-- OUT ANY WARRANTY;  without even the  implied warranty of MERCHANTABILITY --
+-- or FITNESS FOR A PARTICULAR PURPOSE.                                     --
+--                                                                          --
+-- As a special exception under Section 7 of GPL version 3, you are granted --
+-- additional permissions described in the GCC Runtime Library Exception,   --
+-- version 3.1, as published by the Free Software Foundation.               --
+--                                                                          --
+-- You should have received a copy of the GNU General Public License and    --
+-- a copy of the GCC Runtime Library Exception along with this program;     --
+-- see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see    --
+-- <http://www.gnu.org/licenses/>.                                          --
+--                                                                          --
+-- GNAT was originally developed  by the GNAT team at  New York University. --
+-- Extensive contributions were provided by Ada Core Technologies Inc.      --
+--                                                                          --
+------------------------------------------------------------------------------
+
+package System is
+   pragma Pure;
+   --  Note that we take advantage of the implementation permission to make
+   --  this unit Pure instead of Preelaborable; see RM 13.7.1(15). In Ada
+   --  2005, this is Pure in any case (AI-362).
+
+   pragma No_Elaboration_Code_All;
+   --  Allow the use of that restriction in units that WITH this unit
+
+   type Name is (SYSTEM_NAME_GNAT);
+   System_Name : constant Name := SYSTEM_NAME_GNAT;
+
+   --  System-Dependent Named Numbers
+
+   Min_Int             : constant := -2 ** (Standard'Max_Integer_Size - 1);
+   Max_Int             : constant :=  2 ** (Standard'Max_Integer_Size - 1) - 1;
+
+   Max_Binary_Modulus    : constant := 2 ** Standard'Max_Integer_Size;
+   Max_Nonbinary_Modulus : constant := 2 ** Integer'Size - 1;
+
+   Max_Base_Digits       : constant := Long_Long_Float'Digits;
+   Max_Digits            : constant := Long_Long_Float'Digits;
+
+   Max_Mantissa          : constant := Standard'Max_Integer_Size - 1;
+   Fine_Delta            : constant := 2.0 ** (-Max_Mantissa);
+
+   Tick                  : constant := 0.000_001;
+
+   --  Storage-related Declarations
+
+   type Address is private;
+   pragma Preelaborable_Initialization (Address);
+   Null_Address : constant Address;
+
+   Storage_Unit : constant := 8;
+   Word_Size    : constant := Standard'Word_Size;
+   Memory_Size  : constant := 2 ** Word_Size;
+
+   --  Address comparison
+
+   function "<"  (Left, Right : Address) return Boolean;
+   function "<=" (Left, Right : Address) return Boolean;
+   function ">"  (Left, Right : Address) return Boolean;
+   function ">=" (Left, Right : Address) return Boolean;
+   function "="  (Left, Right : Address) return Boolean;
+
+   pragma Import (Intrinsic, "<");
+   pragma Import (Intrinsic, "<=");
+   pragma Import (Intrinsic, ">");
+   pragma Import (Intrinsic, ">=");
+   pragma Import (Intrinsic, "=");
+
+   --  Other System-Dependent Declarations
+
+   type Bit_Order is (High_Order_First, Low_Order_First);
+   Default_Bit_Order : constant Bit_Order := Low_Order_First;
+   pragma Warnings (Off, Default_Bit_Order); -- kill constant condition warning
+
+   --  Priority-related Declarations (RM D.1)
+
+   Max_Priority           : constant Positive := 30;
+   Max_Interrupt_Priority : constant Positive := 31;
+
+   subtype Any_Priority       is Integer      range  0 .. 31;
+   subtype Priority           is Any_Priority range  0 .. 30;
+   subtype Interrupt_Priority is Any_Priority range 31 .. 31;
+
+   Default_Priority : constant Priority := 15;
+
+private
+
+   type Address is mod Memory_Size;
+   Null_Address : constant Address := 0;
+
+   --------------------------------------
+   -- System Implementation Parameters --
+   --------------------------------------
+
+   --  These parameters provide information about the target that is used
+   --  by the compiler. They are in the private part of System, where they
+   --  can be accessed using the special circuitry in the Targparm unit
+   --  whose source should be consulted for more detailed descriptions
+   --  of the individual switch values.
+
+   Backend_Divide_Checks     : constant Boolean := False;
+   Backend_Overflow_Checks   : constant Boolean := True;
+   Command_Line_Args         : constant Boolean := True;
+   Configurable_Run_Time     : constant Boolean := False;
+   Denorm                    : constant Boolean := True;
+   Duration_32_Bits          : constant Boolean := False;
+   Exit_Status_Supported     : constant Boolean := True;
+   Machine_Overflows         : constant Boolean := False;
+   Machine_Rounds            : constant Boolean := True;
+   Preallocated_Stacks       : constant Boolean := False;
+   Signed_Zeros              : constant Boolean := True;
+   Stack_Check_Default       : constant Boolean := False;
+   Stack_Check_Probes        : constant Boolean := True;
+   Stack_Check_Limits        : constant Boolean := False;
+   Support_Aggregates        : constant Boolean := True;
+   Support_Composite_Assign  : constant Boolean := True;
+   Support_Composite_Compare : constant Boolean := True;
+   Support_Long_Shifts       : constant Boolean := True;
+   Always_Compatible_Rep     : constant Boolean := False;
+   Suppress_Standard_Library : constant Boolean := False;
+   Use_Ada_Main_Program_Name : constant Boolean := False;
+   Frontend_Exceptions       : constant Boolean := False;
+   ZCX_By_Default            : constant Boolean := True;
+
+end System;
diff --git a/gcc/config/loongarch/loongarch.h b/gcc/config/loongarch/loongarch.h
index f8167875646..9887a7ac630 100644
--- a/gcc/config/loongarch/loongarch.h
+++ b/gcc/config/loongarch/loongarch.h
@@ -83,9 +83,9 @@ along with GCC; see the file COPYING3.  If not see
 /* CC1_SPEC is the set of arguments to pass to the compiler proper.  */
 
 #undef CC1_SPEC
-#define CC1_SPEC "\
+#define CC1_SPEC "%{,ada:-gnatea} %{m*} \
 %{G*} \
-%(subtarget_cc1_spec)"
+%(subtarget_cc1_spec) %{,ada:-gnatez}"
 
 /* Preprocessor specs.  */
 
-- 
2.42.0


^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PING][PATCH] LoongArch: initial ada support on linux
  2023-08-25  4:46 [PING][PATCH] LoongArch: initial ada support on linux Yang Yujie
@ 2023-08-25  5:55 ` Yujie Yang
  2023-08-31  3:31   ` chenglulu
  2023-08-31 13:09 ` Marc Poulhiès
  2023-09-01 13:52 ` Arnaud Charlet
  2 siblings, 1 reply; 8+ messages in thread
From: Yujie Yang @ 2023-08-25  5:55 UTC (permalink / raw)
  To: gcc-patches; +Cc: charlet, ebotcazou, poulhies, derodat, xuchenghua, chenglulu

Hi!

I'd like to ping this patch for acknowledgement from the Ada team.

We have successfully compiled a cross-native toolchain with Ada enabled
for loongarch64-linux-gnuf64 (or loongarch64-linux-gnu), and have run the
regtests with the following results:

While the failures are being worked on, we would like to merge this patch
first so we can have basic ada support for debian test-builds.

		=== gnat Summary ===

# of expected passes		3376
# of unexpected failures	1
# of expected failures		23
# of unsupported tests		25

FAIL: gnat.dg/prot7.adb (test for excess errors)

		=== acats Summary ===
# of expected passes		2325
# of unexpected failures	3

*** FAILURES: c35503d c35503f c4a007a

Sincerely,
Yujie


^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PING][PATCH] LoongArch: initial ada support on linux
  2023-08-25  5:55 ` Yujie Yang
@ 2023-08-31  3:31   ` chenglulu
  0 siblings, 0 replies; 8+ messages in thread
From: chenglulu @ 2023-08-31  3:31 UTC (permalink / raw)
  To: Yujie Yang, gcc-patches; +Cc: charlet, ebotcazou, poulhies, derodat, xuchenghua

ping?

在 2023/8/25 下午1:55, Yujie Yang 写道:
> Hi!
>
> I'd like to ping this patch for acknowledgement from the Ada team.
>
> We have successfully compiled a cross-native toolchain with Ada enabled
> for loongarch64-linux-gnuf64 (or loongarch64-linux-gnu), and have run the
> regtests with the following results:
>
> While the failures are being worked on, we would like to merge this patch
> first so we can have basic ada support for debian test-builds.
>
> 		=== gnat Summary ===
>
> # of expected passes		3376
> # of unexpected failures	1
> # of expected failures		23
> # of unsupported tests		25
>
> FAIL: gnat.dg/prot7.adb (test for excess errors)
>
> 		=== acats Summary ===
> # of expected passes		2325
> # of unexpected failures	3
>
> *** FAILURES: c35503d c35503f c4a007a
>
> Sincerely,
> Yujie


^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PING][PATCH] LoongArch: initial ada support on linux
  2023-08-25  4:46 [PING][PATCH] LoongArch: initial ada support on linux Yang Yujie
  2023-08-25  5:55 ` Yujie Yang
@ 2023-08-31 13:09 ` Marc Poulhiès
  2023-09-01  2:05   ` Yujie Yang
  2023-09-01 13:52 ` Arnaud Charlet
  2 siblings, 1 reply; 8+ messages in thread
From: Marc Poulhiès @ 2023-08-31 13:09 UTC (permalink / raw)
  To: Yang Yujie
  Cc: gcc-patches, charlet, ebotcazou, derodat, xuchenghua, chenglulu


Yang Yujie <yangyujie@loongson.cn> writes:

Hello Yujie,

> gcc/ChangeLog:
>
> 	* ada/Makefile.rtl: Add LoongArch support.
> 	* ada/libgnarl/s-linux__loongarch.ads: New.
> 	* ada/libgnat/system-linux-loongarch.ads: New.
> 	* config/loongarch/loongarch.h: mark normalized options
> 	passed from driver to gnat1 as explicit for multilib.
> ---
>  gcc/ada/Makefile.rtl                       |  49 +++++++
>  gcc/ada/libgnarl/s-linux__loongarch.ads    | 134 +++++++++++++++++++
>  gcc/ada/libgnat/system-linux-loongarch.ads | 145 +++++++++++++++++++++

The Ada part of the patch looks correct, thanks.

>  gcc/config/loongarch/loongarch.h           |   4 +-
>  4 files changed, 330 insertions(+), 2 deletions(-)
> diff --git a/gcc/config/loongarch/loongarch.h b/gcc/config/loongarch/loongarch.h
> index f8167875646..9887a7ac630 100644
> --- a/gcc/config/loongarch/loongarch.h
> +++ b/gcc/config/loongarch/loongarch.h
> @@ -83,9 +83,9 @@ along with GCC; see the file COPYING3.  If not see
>  /* CC1_SPEC is the set of arguments to pass to the compiler proper.  */
>
>  #undef CC1_SPEC
> -#define CC1_SPEC "\
> +#define CC1_SPEC "%{,ada:-gnatea} %{m*} \
>  %{G*} \
> -%(subtarget_cc1_spec)"
> +%(subtarget_cc1_spec) %{,ada:-gnatez}"
>
>  /* Preprocessor specs.  */

This is outside of ada/ (so I don't have a say on it), but I'm curious
about why you need to use -gnatea/-gnatez here?

Thanks,
Marc

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PING][PATCH] LoongArch: initial ada support on linux
  2023-08-31 13:09 ` Marc Poulhiès
@ 2023-09-01  2:05   ` Yujie Yang
  2023-09-05 11:23     ` Marc Poulhiès
  0 siblings, 1 reply; 8+ messages in thread
From: Yujie Yang @ 2023-09-01  2:05 UTC (permalink / raw)
  To: Marc Poulhiès
  Cc: Yang Yujie, gcc-patches, charlet, ebotcazou, derodat, xuchenghua,
	chenglulu

On Thu, Aug 31, 2023 at 03:09:52PM +0200, Marc Poulhiès wrote:
> 
> Yang Yujie <yangyujie@loongson.cn> writes:
> 
> Hello Yujie,
> 
> > gcc/ChangeLog:
> >
> > 	* ada/Makefile.rtl: Add LoongArch support.
> > 	* ada/libgnarl/s-linux__loongarch.ads: New.
> > 	* ada/libgnat/system-linux-loongarch.ads: New.
> > 	* config/loongarch/loongarch.h: mark normalized options
> > 	passed from driver to gnat1 as explicit for multilib.
> > ---
> >  gcc/ada/Makefile.rtl                       |  49 +++++++
> >  gcc/ada/libgnarl/s-linux__loongarch.ads    | 134 +++++++++++++++++++
> >  gcc/ada/libgnat/system-linux-loongarch.ads | 145 +++++++++++++++++++++
> 
> The Ada part of the patch looks correct, thanks.
> 
> >  gcc/config/loongarch/loongarch.h           |   4 +-
> >  4 files changed, 330 insertions(+), 2 deletions(-)
> > diff --git a/gcc/config/loongarch/loongarch.h b/gcc/config/loongarch/loongarch.h
> > index f8167875646..9887a7ac630 100644
> > --- a/gcc/config/loongarch/loongarch.h
> > +++ b/gcc/config/loongarch/loongarch.h
> > @@ -83,9 +83,9 @@ along with GCC; see the file COPYING3.  If not see
> >  /* CC1_SPEC is the set of arguments to pass to the compiler proper.  */
> >
> >  #undef CC1_SPEC
> > -#define CC1_SPEC "\
> > +#define CC1_SPEC "%{,ada:-gnatea} %{m*} \
> >  %{G*} \
> > -%(subtarget_cc1_spec)"
> > +%(subtarget_cc1_spec) %{,ada:-gnatez}"
> >
> >  /* Preprocessor specs.  */
> 
> This is outside of ada/ (so I don't have a say on it), but I'm curious
> about why you need to use -gnatea/-gnatez here?
> 
> Thanks,
> Marc

Hi Marc,

Thank you for the review!

We added -gnatea and -gnatez to CC1_SPECS for correct multilib handling,
and I believe this is currently specific to LoongArch.

LoongArch relies on the GCC driver (via self_specs rules) to generate a
canonicalized tuple of parameters that identifies the current target (ISA/ABI)
configuration, including the "-mabi=" option that corresponds to the selected
multilib variant.  Even if "-mabi=" itself is not given explicitly to gcc, it
may be fed to the compiler propers with values other than the default ABI.

For GNAT on LoongArch, it is necessary that -mabi= generated by driver
self-specs gets stored in the .ali file, otherwise the linker might
hit the wrong multilib variant by assuming the default ABI.  Using
-gnatea/-gnatez can mark the driver-generated "-mabi=" as "explicit",
so it is sure to be found in "A"-records of the generated *.ali file.

Currently, gnatmake only marks user-specified options as explicit with
-gnatea and -gnatez, but not others [gcc/ada/make.adb].  So I think it's
necessary to have these marks around our driver-canonicalized %{m*} tuple
as well.

(Not sure if we should also mark non-multilib-related options other than
"-mabi=" as explicit, but it doesn't seem to do any harm.)

Sincerely,
Yujie


^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PING][PATCH] LoongArch: initial ada support on linux
  2023-08-25  4:46 [PING][PATCH] LoongArch: initial ada support on linux Yang Yujie
  2023-08-25  5:55 ` Yujie Yang
  2023-08-31 13:09 ` Marc Poulhiès
@ 2023-09-01 13:52 ` Arnaud Charlet
  2023-09-04  2:19   ` Yang Yujie
  2 siblings, 1 reply; 8+ messages in thread
From: Arnaud Charlet @ 2023-09-01 13:52 UTC (permalink / raw)
  To: Yang Yujie
  Cc: gcc-patches, charlet, ebotcazou, poulhies, derodat, xuchenghua,
	chenglulu

> gcc/ChangeLog:
> 
> 	* ada/Makefile.rtl: Add LoongArch support.
> 	* ada/libgnarl/s-linux__loongarch.ads: New.
> 	* ada/libgnat/system-linux-loongarch.ads: New.
> 	* config/loongarch/loongarch.h: mark normalized options
> 	passed from driver to gnat1 as explicit for multilib.
> ---
> --- a/gcc/ada/Makefile.rtl
> +++ b/gcc/ada/Makefile.rtl
> @@ -2111,6 +2111,55 @@ ifeq ($(strip $(filter-out cygwin% mingw32% pe,$(target_os))),)
>    LIBRARY_VERSION := $(LIB_VERSION)
>  endif
>  
> +# LoongArch Linux
> +ifeq ($(strip $(filter-out loongarch% linux%,$(target_cpu) $(target_os))),)
> +  LIBGNAT_TARGET_PAIRS = \
> +  a-exetim.adb<libgnarl/a-exetim__posix.adb \
> +  a-exetim.ads<libgnarl/a-exetim__default.ads \
> +  a-intnam.ads<libgnarl/a-intnam__linux.ads \
> +  a-nallfl.ads<libgnat/a-nallfl__wraplf.ads \
> +  a-synbar.adb<libgnarl/a-synbar__posix.adb \
> +  a-synbar.ads<libgnarl/a-synbar__posix.ads \
> +  s-inmaop.adb<libgnarl/s-inmaop__posix.adb \
> +  s-intman.adb<libgnarl/s-intman__posix.adb \
> +  s-linux.ads<libgnarl/s-linux__loongarch.ads \
> +  s-mudido.adb<libgnarl/s-mudido__affinity.adb \
> +  s-osinte.ads<libgnarl/s-osinte__linux.ads \
> +  s-osinte.adb<libgnarl/s-osinte__posix.adb \
> +  s-osprim.adb<libgnat/s-osprim__posix.adb \
> +  s-taprop.adb<libgnarl/s-taprop__linux.adb \
> +  s-tasinf.ads<libgnarl/s-tasinf__linux.ads \
> +  s-tasinf.adb<libgnarl/s-tasinf__linux.adb \
> +  s-tpopsp.adb<libgnarl/s-tpopsp__tls.adb \
> +  s-taspri.ads<libgnarl/s-taspri__posix.ads \
> +  g-sercom.adb<libgnat/g-sercom__linux.adb \
> +  $(TRASYM_DWARF_UNIX_PAIRS) \
> +  $(GNATRTL_128BIT_PAIRS) \
> +  s-tsmona.adb<libgnat/s-tsmona__linux.adb \
> +  $(ATOMICS_TARGET_PAIRS) \
> +  $(ATOMICS_BUILTINS_TARGET_PAIRS) \
> +  system.ads<libgnat/system-linux-loongarch.ads
> +
> +  TOOLS_TARGET_PAIRS = indepsw.adb<indepsw-gnu.adb
> +
> +  EXTRA_GNATRTL_NONTASKING_OBJS += $(TRASYM_DWARF_UNIX_OBJS)
> +  EXTRA_GNATRTL_NONTASKING_OBJS += $(GNATRTL_128BIT_OBJS)
> +  EXTRA_GNATRTL_TASKING_OBJS = s-linux.o a-exetim.o
> +
> +  EH_MECHANISM = -gcc
> +  THREADSLIB = -lpthread
> +  MISCLIB = -ldl
> +  GNATLIB_SHARED = gnatlib-shared-dual
> +  GMEM_LIB = gmemlib
> +  LIBRARY_VERSION := $(LIB_VERSION)
> +  # Temporarily disable strict alignment -- for some reason, it causes
> +  # infinite loops during stack unwinding (libgcc) and indefinite hang
> +  # in some futex system calls.
> +  GNATLIBCFLAGS := $(GNATLIBCFLAGS) -mno-strict-align
> +  GNATLIBCFLAGS_FOR_C := $(GNATLIBCFLAGS_FOR_C) -mno-strict-align

Patch looks indeed OK.
A small nit above: I'd suggest using += instead of := $(XXX) to make things
clearer.

Arno

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PING][PATCH] LoongArch: initial ada support on linux
  2023-09-01 13:52 ` Arnaud Charlet
@ 2023-09-04  2:19   ` Yang Yujie
  0 siblings, 0 replies; 8+ messages in thread
From: Yang Yujie @ 2023-09-04  2:19 UTC (permalink / raw)
  To: Arnaud Charlet
  Cc: Yang Yujie, gcc-patches, ebotcazou, poulhies, derodat,
	xuchenghua, chenglulu

On Fri, Sep 01, 2023 at 01:52:16PM +0000, Arnaud Charlet wrote:

> A small nit above: I'd suggest using += instead of := $(XXX) to make things
> clearer.

Ok, will fix in v2.


^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PING][PATCH] LoongArch: initial ada support on linux
  2023-09-01  2:05   ` Yujie Yang
@ 2023-09-05 11:23     ` Marc Poulhiès
  0 siblings, 0 replies; 8+ messages in thread
From: Marc Poulhiès @ 2023-09-05 11:23 UTC (permalink / raw)
  To: Yujie Yang
  Cc: gcc-patches, charlet, ebotcazou, derodat, xuchenghua, chenglulu


Yujie Yang <yangyujie@loongson.cn> writes:
> Hi Marc,
>
> Thank you for the review!
>
> We added -gnatea and -gnatez to CC1_SPECS for correct multilib handling,
> and I believe this is currently specific to LoongArch.
>
> LoongArch relies on the GCC driver (via self_specs rules) to generate a
> canonicalized tuple of parameters that identifies the current target (ISA/ABI)
> configuration, including the "-mabi=" option that corresponds to the selected
> multilib variant.  Even if "-mabi=" itself is not given explicitly to gcc, it
> may be fed to the compiler propers with values other than the default ABI.
>
> For GNAT on LoongArch, it is necessary that -mabi= generated by driver
> self-specs gets stored in the .ali file, otherwise the linker might
> hit the wrong multilib variant by assuming the default ABI.  Using
> -gnatea/-gnatez can mark the driver-generated "-mabi=" as "explicit",
> so it is sure to be found in "A"-records of the generated *.ali file.

Hello Yujie,

Thanks for the explanation!

Marc

^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2023-09-05 11:25 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-08-25  4:46 [PING][PATCH] LoongArch: initial ada support on linux Yang Yujie
2023-08-25  5:55 ` Yujie Yang
2023-08-31  3:31   ` chenglulu
2023-08-31 13:09 ` Marc Poulhiès
2023-09-01  2:05   ` Yujie Yang
2023-09-05 11:23     ` Marc Poulhiès
2023-09-01 13:52 ` Arnaud Charlet
2023-09-04  2:19   ` Yang Yujie

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).