[Ada] RISC-V: Initial riscv linux Ada port.

Message ID 20180705234444.5935-1-jimw@sifive.com
State New
Headers show
Series
  • [Ada] RISC-V: Initial riscv linux Ada port.
Related show

Commit Message

Jim Wilson July 5, 2018, 11:44 p.m.
I was asked about Ada support, so I tried cross building a native RISC-V Linux
Ada compiler, and it turned out to be possible with a little bit of work.  I
just started with the MIPS support, and then fixed everything that was
obviously wrong: endianness, error numbers, signal numbers, struct_sigaction
offsets, etc.

The result is good enough to bootstrap natively and seems to give reasonable
native testsuite results for a first attempt.  The machine I'm running on has
broken icache flushing, so trampolines won't work, and I suspect that is
causing a lot of the testsuite failures.  Here are the Ada testsuite results
I'm getting at the moment.

		=== acats Summary ===
# of expected passes		2138
# of unexpected failures	182

		=== gnat Summary ===

# of expected passes		2757
# of unexpected failures	26
# of expected failures		24
# of unsupported tests		25

Ada is a low priority side project for me, so if you want non-trivial changes
it may be a while before I can get to them.  There is a lot of other stuff
higher on my priority list at the moment, such as getting native gdb support
working.  If this isn't OK as is, then I'm willing to put work-in-progress
patches in a bug report or on a branch or something.

OK?

Jim

	gcc/ada/
	* Makefile.rtl: Add riscv*-linux* support.
	* libgnarl/s-linux__riscv.ads: New.
	* libgnat/system-linux-riscv.ads: New.
---
 gcc/ada/Makefile.rtl                   |  28 +++++
 gcc/ada/libgnarl/s-linux__riscv.ads    | 133 ++++++++++++++++++++++
 gcc/ada/libgnat/system-linux-riscv.ads | 147 +++++++++++++++++++++++++
 3 files changed, 308 insertions(+)
 create mode 100644 gcc/ada/libgnarl/s-linux__riscv.ads
 create mode 100644 gcc/ada/libgnat/system-linux-riscv.ads

-- 
2.17.1

Comments

Arnaud Charlet July 6, 2018, 7:16 a.m. | #1
> Ada is a low priority side project for me, so if you want non-trivial changes

> it may be a while before I can get to them.  There is a lot of other stuff

> higher on my priority list at the moment, such as getting native gdb support

> working.  If this isn't OK as is, then I'm willing to put work-in-progress

> patches in a bug report or on a branch or something.

> 

> OK?


This is OK, thanks.

> Jim

> 

> 	gcc/ada/

> 	* Makefile.rtl: Add riscv*-linux* support.

> 	* libgnarl/s-linux__riscv.ads: New.

> 	* libgnat/system-linux-riscv.ads: New.
Eric Botcazou July 6, 2018, 7:49 a.m. | #2
> The result is good enough to bootstrap natively and seems to give reasonable

> native testsuite results for a first attempt.  The machine I'm running on

> has broken icache flushing, so trampolines won't work, and I suspect that

> is causing a lot of the testsuite failures.


Ada doesn't use trampolines if you define...

> +   Always_Compatible_Rep     : constant Boolean := False;


...this to False.

-- 
Eric Botcazou
Eric Botcazou July 6, 2018, 7:55 a.m. | #3
> Ada doesn't use trampolines if you define...

> 

> > +   Always_Compatible_Rep     : constant Boolean := False;

> 

> ...this to False.


And also define TARGET_CUSTOM_FUNCTION_DESCRIPTORS for the architecture.

-- 
Eric Botcazou
Jim Wilson July 6, 2018, 5:29 p.m. | #4
On Fri, Jul 6, 2018 at 12:16 AM, Arnaud Charlet <charlet@adacore.com> wrote:
>> Ada is a low priority side project for me, so if you want non-trivial changes

>> it may be a while before I can get to them.  There is a lot of other stuff

>> higher on my priority list at the moment, such as getting native gdb support

>> working.  If this isn't OK as is, then I'm willing to put work-in-progress

>> patches in a bug report or on a branch or something.

>>

>> OK?

>

> This is OK, thanks.

>

>> Jim

>>

>>       gcc/ada/

>>       * Makefile.rtl: Add riscv*-linux* support.

>>       * libgnarl/s-linux__riscv.ads: New.

>>       * libgnat/system-linux-riscv.ads: New.


Committed.

Jim
Jim Wilson July 7, 2018, 3:44 p.m. | #5
On Fri, Jul 6, 2018 at 12:55 AM, Eric Botcazou <ebotcazou@adacore.com> wrote:
>> Ada doesn't use trampolines if you define...

>>

>> > +   Always_Compatible_Rep     : constant Boolean := False;

>>

>> ...this to False.

>

> And also define TARGET_CUSTOM_FUNCTION_DESCRIPTORS for the architecture.


I tried adding the missing definition.  I now get

                === acats Summary ===
# of expected passes            2320
# of unexpected failures        0

                === gnat Summary ===

# of expected passes            2779
# of unexpected failures        4
# of expected failures          24
# of unsupported tests          25

So yes, that solved my problem, and we have a working RISC-V Ada port
now.  Thanks for the help.

Jim
Arnaud Charlet July 7, 2018, 3:46 p.m. | #6
> I tried adding the missing definition.  I now get

> 

>                 === acats Summary ===

> # of expected passes            2320

> # of unexpected failures        0

> 

>                 === gnat Summary ===

> 

> # of expected passes            2779

> # of unexpected failures        4

> # of expected failures          24

> # of unsupported tests          25

> 

> So yes, that solved my problem, and we have a working RISC-V Ada port

> now.  Thanks for the help.


Great!
Eric Botcazou July 7, 2018, 4:41 p.m. | #7
> I tried adding the missing definition.  I now get

> 

>                 === acats Summary ===

> # of expected passes            2320

> # of unexpected failures        0

> 

>                 === gnat Summary ===

> 

> # of expected passes            2779

> # of unexpected failures        4

> # of expected failures          24

> # of unsupported tests          25

> 

> So yes, that solved my problem, and we have a working RISC-V Ada port

> now.  Thanks for the help.


You're welcome.  Are the 4 remaining failures related to stack checking?

-- 
Eric Botcazou
Jim Wilson July 7, 2018, 5:30 p.m. | #8
On Sat, Jul 7, 2018 at 9:41 AM, Eric Botcazou <ebotcazou@adacore.com> wrote:
> You're welcome.  Are the 4 remaining failures related to stack checking?


FAIL: gnat.dg/debug11.adb scan-assembler-times 0x5a.*DW_AT_discr_list 1
FAIL: gnat.dg/debug11.adb scan-assembler-times 0x80.*DW_AT_discr_list 1
FAIL: gnat.dg/trampoline4.adb scan-assembler GNU-stack.*x
FAIL: gnat.dg/warn5.adb (test for excess errors)

I haven't tried looking at the failures yet, and might not spend much
more time on this.  Two of them are debug related, and debug support
is a work in progress.  I need to finish the native riscv64-linux
support before we can do anything useful there, and I'd like to get
back to working on that as soon as possible.  The GNU-stack error
looks a little worrisome.  I'd expect a linux port to get GNU-stack
stuff right without much trouble.  The last one is
warn5.adb:29:30: warning: source alignment (4) < alignment of "Element_Type" (8)
Maybe something I copied from the mips linux port is wrong for riscv64 linux.

Jim
Eric Botcazou July 7, 2018, 10:35 p.m. | #9
> I haven't tried looking at the failures yet, and might not spend much

> more time on this.  Two of them are debug related, and debug support

> is a work in progress.  I need to finish the native riscv64-linux

> support before we can do anything useful there, and I'd like to get

> back to working on that as soon as possible.


No clue about debug11.adb, maybe Pierre-Marie could shed some light on it.

> The GNU-stack error looks a little worrisome.  I'd expect a linux port to

> get GNU-stack stuff right without much trouble.


The test checks that -ftrampolines forces the use of trampolines instead of 
descriptors.  If trampolines are generated on the stack for RISC-V, then the 
stack should be made executable when there are built.  Otherwise you can add 
the appropriate triplet to the dg-skip-if line.

In any case, that's benign since trampolines are not generated by default now.

> The last one is warn5.adb:29:30: warning: source alignment (4) < alignment

> of "Element_Type" (8) Maybe something I copied from the mips linux port is

> wrong for riscv64 linux.


No, this looks as expected, you just need to add the appropriate triplet to 
the list on line 29 when you have 15 seconds to kill.  Patchlet preapproved.

-- 
Eric Botcazou
Pierre-Marie de Rodat July 12, 2018, 3:56 p.m. | #10
On 07/08/2018 12:35 AM, Eric Botcazou wrote:
>> I haven't tried looking at the failures yet, and might not spend much

>> more time on this.  Two of them are debug related, and debug support

>> is a work in progress.  I need to finish the native riscv64-linux

>> support before we can do anything useful there, and I'd like to get

>> back to working on that as soon as possible.

> 

> No clue about debug11.adb, maybe Pierre-Marie could shed some light on it.


I don’t have much more to say than debug11.adb’s comment ;-)

> This testcase checks that in the DWARF description of the variant type

> below, the C discriminant is properly described as unsigned, hence the 0x5a

> ('Z') and 0x80 (128) values in the DW_AT_discr_list attribute. If it was

> described as signed, we would have instead 90 and -128.


I don’t have an Ada RISC-V compiler (nor binutils) to check right now: 
would it be possible to send the corresponding debug11.s and debug11.o? 
Hopefully we just have to enhance the regexps.

-- 
Pierre-Marie de Rodat
Jim Wilson July 12, 2018, 11:57 p.m. | #11
On Thu, Jul 12, 2018 at 8:56 AM, Pierre-Marie de Rodat
<derodat@adacore.com> wrote:
> I don’t have much more to say than debug11.adb’s comment ;-)

>

>> This testcase checks that in the DWARF description of the variant type

>> below, the C discriminant is properly described as unsigned, hence the

>> 0x5a

>> ('Z') and 0x80 (128) values in the DW_AT_discr_list attribute. If it was

>> described as signed, we would have instead 90 and -128.

>

> I don’t have an Ada RISC-V compiler (nor binutils) to check right now: would

> it be possible to send the corresponding debug11.s and debug11.o? Hopefully

> we just have to enhance the regexps.


I poked at this a little and noticed a difference between the x86_64
support and the RISC-V support.  The RISC-V C language port has char
as unsigned by default.  The x86_64 port has char signed by default.
If I add a -fsigned-char option, then the testcase works as expected
for RISC-V.  Curiously, the Ada compiler accepts -fsigned-char but not
-funsigned-char.  I tried hacking in a -funsigned-char flag, but when
I use it with the x86_64 port the result is still correct.  Maybe my
quick hack wasn't quite right.  Anyways, the default signedness of
char has something to do with the problem.

Jim
Pierre-Marie de Rodat July 13, 2018, 5:47 a.m. | #12
On 07/13/2018 01:57 AM, Jim Wilson wrote:
> I poked at this a little and noticed a difference between the x86_64

> support and the RISC-V support.  The RISC-V C language port has char

> as unsigned by default.  The x86_64 port has char signed by default.

> If I add a -fsigned-char option, then the testcase works as expected

> for RISC-V.  Curiously, the Ada compiler accepts -fsigned-char but not

> -funsigned-char.  I tried hacking in a -funsigned-char flag, but when

> I use it with the x86_64 port the result is still correct.  Maybe my

> quick hack wasn't quite right.  Anyways, the default signedness of

> char has something to do with the problem.


Ah, interesting! Last year, we installed specific code in the Ada front 
end and the DWARF back end to handle discrepancies between the 
INTEGER_TYPE signedness and the signedness to appear in debug info 
(https://gcc.gnu.org/git/?p=gcc.git;a=blob;f=gcc/dwarf2out.c;h=c2422e29658b6a101034318deed224271e6f1ca7;hb=HEAD#l24561), 
but ironically here, it seems that we don’t handle properly when 
everything is unsigned.

I think the current testcase should work on RISC-V even without 
-fsigned-char: Character’s debug type should be unsigned in all cases. 
Maybe for some reason we don’t create the correct debug type in the Ada 
front end… Do you think I can reproduce this with a x86_64-linux 
compiler targetting something like riscv-elf? I don’t have access to a 
RISC-V board on which to build GCC.

-- 
Pierre-Marie de Rodat
Eric Botcazou July 13, 2018, 10:16 a.m. | #13
> I poked at this a little and noticed a difference between the x86_64

> support and the RISC-V support.  The RISC-V C language port has char

> as unsigned by default.  The x86_64 port has char signed by default.

> If I add a -fsigned-char option, then the testcase works as expected

> for RISC-V.  Curiously, the Ada compiler accepts -fsigned-char but not

> -funsigned-char.


But it accepts -fno-signed-char, which is equivalent. :-)  In any case, I 
agree that it should also accept -funsigned-char, now done.

> I tried hacking in a -funsigned-char flag, but when

> I use it with the x86_64 port the result is still correct.  Maybe my

> quick hack wasn't quite right.  Anyways, the default signedness of

> char has something to do with the problem.


I don't seem to be able to reproduce the failure with a cross-compiler though 
so that's really weird.


	* gcc-interface/lang.opt (funsigned-char): New option.
	* gcc-interface/misc.c (gnat_handle_option): Accept it.
	* gcc-interface/utils.c (finish_character_type): Tweak comment.


-- 
Eric Botcazou
Index: gcc-interface/lang.opt
===================================================================
--- gcc-interface/lang.opt	(revision 262551)
+++ gcc-interface/lang.opt	(working copy)
@@ -80,6 +80,10 @@ fsigned-char
 Ada AdaWhy AdaSCIL
 Make \"char\" signed by default.
 
+funsigned-char
+Ada AdaWhy AdaSCIL
+Make \"char\" unsigned by default.
+
 gant
 Ada AdaWhy AdaSCIL Driver Joined Undocumented RejectNegative
 Catch typos.
Index: gcc-interface/misc.c
===================================================================
--- gcc-interface/misc.c	(revision 262551)
+++ gcc-interface/misc.c	(working copy)
@@ -170,6 +170,7 @@ gnat_handle_option (size_t scode, const
 
     case OPT_fshort_enums:
     case OPT_fsigned_char:
+    case OPT_funsigned_char:
       /* These are handled by the middle-end.  */
       break;
 
Index: gcc-interface/utils.c
===================================================================
--- gcc-interface/utils.c	(revision 262551)
+++ gcc-interface/utils.c	(working copy)
@@ -1684,7 +1684,7 @@ record_builtin_type (const char *name, t
   integral types are unsigned.
 
   Unfortunately the signedness of 'char' in C is implementation-defined
-  and GCC even has the option -fsigned-char to toggle it at run time.
+  and GCC even has the option -f{un}signed-char to toggle it at run time.
   Since GNAT's philosophy is to be compatible with C by default, to wit
   Interfaces.C.char is defined as a mere copy of Character, we may need
   to declare character types as signed types in GENERIC and generate the

Patch

diff --git a/gcc/ada/Makefile.rtl b/gcc/ada/Makefile.rtl
index f69170d9fe3..374c60b576e 100644
--- a/gcc/ada/Makefile.rtl
+++ b/gcc/ada/Makefile.rtl
@@ -2468,6 +2468,34 @@  ifeq ($(strip $(filter-out %x32 linux%,$(target_cpu) $(target_os))),)
   LIBRARY_VERSION := $(LIB_VERSION)
 endif
 
+# RISC-V Linux
+ifeq ($(strip $(filter-out riscv% linux%,$(target_cpu) $(target_os))),)
+  LIBGNAT_TARGET_PAIRS = \
+  a-intnam.ads<libgnarl/a-intnam__linux.ads \
+  s-inmaop.adb<libgnarl/s-inmaop__posix.adb \
+  s-intman.adb<libgnarl/s-intman__posix.adb \
+  s-linux.ads<libgnarl/s-linux__riscv.ads \
+  s-osinte.adb<libgnarl/s-osinte__posix.adb \
+  s-osinte.ads<libgnarl/s-osinte__linux.ads \
+  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-taspri.ads<libgnarl/s-taspri__posix-noaltstack.ads \
+  s-tpopsp.adb<libgnarl/s-tpopsp__posix-foreign.adb \
+  g-sercom.adb<libgnat/g-sercom__linux.adb \
+  system.ads<libgnat/system-linux-riscv.ads
+
+  TOOLS_TARGET_PAIRS = indepsw.adb<indepsw-gnu.adb
+
+  EXTRA_GNATRTL_TASKING_OBJS=s-linux.o
+  EH_MECHANISM=-gcc
+  THREADSLIB = -lpthread
+  GNATLIB_SHARED = gnatlib-shared-dual
+  GMEM_LIB = gmemlib
+  LIBRARY_VERSION := $(LIB_VERSION)
+endif
+
 # Darwin (Mac OS X)
 ifeq ($(strip $(filter-out darwin%,$(target_os))),)
   SO_OPTS = -shared-libgcc
diff --git a/gcc/ada/libgnarl/s-linux__riscv.ads b/gcc/ada/libgnarl/s-linux__riscv.ads
new file mode 100644
index 00000000000..74420f39f1b
--- /dev/null
+++ b/gcc/ada/libgnarl/s-linux__riscv.ads
@@ -0,0 +1,133 @@ 
+------------------------------------------------------------------------------
+--                                                                          --
+--                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-2018, 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 RISC-V 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;
+
+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;
+   subtype time_t      is Interfaces.C.long;
+   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 := 28; --  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
+
+   SIGLTHRRES : constant := 0; --  GNU/LinuxThreads restart signal
+   SIGLTHRCAN : constant := 0; --  GNU/LinuxThreads cancel signal
+   SIGLTHRDBG : constant := 0; --  GNU/LinuxThreads debugger signal
+
+   --  These don't exist for Linux/RISC-V.  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 := long'Size / 8;
+   sa_flags_pos   : constant := long'Size / 8 + 128;
+
+   SA_SIGINFO  : constant := 16#04#;
+   SA_ONSTACK  : constant := 16#08000000#;
+
+end System.Linux;
diff --git a/gcc/ada/libgnat/system-linux-riscv.ads b/gcc/ada/libgnat/system-linux-riscv.ads
new file mode 100644
index 00000000000..8e43b401450
--- /dev/null
+++ b/gcc/ada/libgnat/system-linux-riscv.ads
@@ -0,0 +1,147 @@ 
+------------------------------------------------------------------------------
+--                                                                          --
+--                        GNAT RUN-TIME COMPONENTS                          --
+--                                                                          --
+--                               S Y S T E M                                --
+--                                                                          --
+--                                 S p e c                                  --
+--                          (GNU-Linux/RISC-V Version)                      --
+--                                                                          --
+--          Copyright (C) 1992-2018, 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 := Long_Long_Integer'First;
+   Max_Int               : constant := Long_Long_Integer'Last;
+
+   Max_Binary_Modulus    : constant := 2 ** Long_Long_Integer'Size;
+   Max_Nonbinary_Modulus : constant := Integer'Last;
+
+   Max_Base_Digits       : constant := Long_Long_Float'Digits;
+   Max_Digits            : constant := Long_Long_Float'Digits;
+
+   Max_Mantissa          : constant := 63;
+   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;
+   Fractional_Fixed_Ops      : constant Boolean := False;
+   Frontend_Layout           : constant Boolean := False;
+   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;