public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
* [PATCH v2] LoongArch: initial ada support on linux
@ 2023-09-04  2:42 Yang Yujie
  2023-09-04  8:54 ` Arnaud Charlet
  2023-09-05  4:39 ` chenglulu
  0 siblings, 2 replies; 3+ messages in thread
From: Yang Yujie @ 2023-09-04  2:42 UTC (permalink / raw)
  To: gcc-patches; +Cc: charlet, poulhies, 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..852a3324388 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 += -mno-strict-align
+  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.36.0


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

* Re: [PATCH v2] LoongArch: initial ada support on linux
  2023-09-04  2:42 [PATCH v2] LoongArch: initial ada support on linux Yang Yujie
@ 2023-09-04  8:54 ` Arnaud Charlet
  2023-09-05  4:39 ` chenglulu
  1 sibling, 0 replies; 3+ messages in thread
From: Arnaud Charlet @ 2023-09-04  8:54 UTC (permalink / raw)
  To: Yang Yujie; +Cc: gcc-patches, charlet, poulhies, xuchenghua, chenglulu

OK, thanks.

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

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

* Re:[pushed] [PATCH v2] LoongArch: initial ada support on linux
  2023-09-04  2:42 [PATCH v2] LoongArch: initial ada support on linux Yang Yujie
  2023-09-04  8:54 ` Arnaud Charlet
@ 2023-09-05  4:39 ` chenglulu
  1 sibling, 0 replies; 3+ messages in thread
From: chenglulu @ 2023-09-05  4:39 UTC (permalink / raw)
  To: Yang Yujie, gcc-patches; +Cc: charlet, poulhies, xuchenghua

Pushed to r14-3669.

在 2023/9/4 上午10:42, 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..852a3324388 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 += -mno-strict-align
> +  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.  */
>   


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

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

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-09-04  2:42 [PATCH v2] LoongArch: initial ada support on linux Yang Yujie
2023-09-04  8:54 ` Arnaud Charlet
2023-09-05  4:39 ` chenglulu

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