diff mbox

[4/4,Ada,DJGPP] Ada support for DJGPP

Message ID 806771cb-6836-166d-5a68-5118d56c8b65@iki.fi
State New
Headers show

Commit Message

Andris Pavēnis Sept. 21, 2016, 5:22 p.m. UTC
On 09/04/2016 09:52 PM, Arnaud Charlet wrote:
>>> This last patch (4/4) contains DJGPP related changes to adaint.c
>>> (except one which belongs to patch 1/4).
> This patch is quite intrusive. Are all these changes really needed?

New version of patch is in attachment.
>>   char
>>   __gnat_get_default_identifier_character_set (void)
>>   {
>> +#if defined (__DJGPP__)
>> +  return 'p';
>> +#else
>>     return '1';
>> +#endif
>>   }
> Why is this needed?
Removed in updated version of patch
>> -#elif defined (_WIN32)
>> +#elif defined (__DJGPP__) || defined (_WIN32)
>>     /* args[0] must be quotes as it could contain a full pathname with spaces
>>     */
>>     char *args_0 = args[0];
>>     args[0] = (char *)xmalloc (strlen (args_0) + 3);
>> @@ -2606,6 +2630,12 @@ __gnat_portable_no_block_spawn (char *args[]
>> ATTRIBUTE_UNUSED)
>>     /* Not supported.  */
>>     return -1;
>>   
>> +#elif defined(__DJGPP__)
>> +  if (spawnvp (P_WAIT, args[0], args) != 0)
>> +    return -1;
>> +  else
>> +    return 0;
>> +
>>   #elif defined (_WIN32)
>>   
>>     HANDLE h = NULL;
>> @@ -2649,6 +2679,7 @@ __gnat_portable_wait (int *process_status)
>>   
>>     pid = win32_wait (&status);
>>   
>> +#elif defined (__DJGPP__)
>>   #else
> You can't add an empty #elif without explaining it with a proper
> comment.
Comment with explanation added in attached version of patch

Andris

Comments

Arnaud Charlet Sept. 25, 2016, 4:25 p.m. UTC | #1
>  int
>  __gnat_get_maximum_file_name_length (void)
>  {
> +#if defined (__DJGPP__)
> +  return (_use_lfn(".")) ? -1 : 8;
> +#else
>    return -1;
> +#endif
>  }

Is the above change really necessary? Would be nice to get rid of this
extra code. The rest looks OK to me.

Arno
Andris Pavēnis Sept. 25, 2016, 5:43 p.m. UTC | #2
On 09/25/2016 07:25 PM, Arnaud Charlet wrote:
>>   int
>>   __gnat_get_maximum_file_name_length (void)
>>   {
>> +#if defined (__DJGPP__)
>> +  return (_use_lfn(".")) ? -1 : 8;
>> +#else
>>     return -1;
>> +#endif
>>   }
> Is the above change really necessary? Would be nice to get rid of this
> extra code. The rest looks OK to me.
It is required for support of environment when LFN support is either not available or disabled for 
some reason (for example FreeDOS without LFN support loaded).

Andris
Arnaud Charlet Sept. 25, 2016, 6:10 p.m. UTC | #3
> >Is the above change really necessary? Would be nice to get rid of this
> >extra code. The rest looks OK to me.
> It is required for support of environment when LFN support is either
> not available or disabled for some reason (for example FreeDOS
> without LFN support loaded).

Does it matter for GNAT usage/users in practice?

Arno
Andris Pavēnis Sept. 26, 2016, 4:02 a.m. UTC | #4
On 09/25/2016 09:10 PM, Arnaud Charlet wrote:
>>> Is the above change really necessary? Would be nice to get rid of this
>>> extra code. The rest looks OK to me.
>> It is required for support of environment when LFN support is either
>> not available or disabled for some reason (for example FreeDOS
>> without LFN support loaded).
> Does it matter for GNAT usage/users in practice?
>
> Arno

It may. I do not actually have information about environments used by poeple using DJGPP build. I'm 
providing compiler packages for them.

There are actually 2 levels of non-LFN support for DJGPP port of CCC:

1) ability to run user compiled programs (the ones which are compatible with required restrictions) 
without LFN support

2) the ability to compile using GCC in such environment

Submitted patches only addresses level 1. I'm not sure I'll ever submit changes for level 2. 
Absence of these changes does not prevent bootstrapping GCC iwhen LFN is available (like in recent 
Windows versions).

Discussed change belongs to level 1 (ability to run compiled programs without LFN support available).

Andris
diff mbox

Patch

From 49015a63e708824dbd80fb90520c33b8e1607c43 Mon Sep 17 00:00:00 2001
From: Andris Pavenis <andris.pavenis@iki.fi>
Date: Thu, 15 Sep 2016 19:31:54 +0300
Subject: [PATCH 4/4] [DJGPP, Ada] Ada support

* ada/adaint.c: Include process.h, signal.h, dir.h and utime.h for DJGPP.
  ISALPHA: include <ctype.h> and define to isalpha for DJGPP when IN_RTS is defined.
  (DIR_SEPARATOR) define to '\\' for DJGPP.
  (__gnat_get_maximum_file_name_length): decide return value depending on
  availability of LFN for DJGPP
  (__gnat_get_file_names_case_sensitive): return 0 for DJGPP unless
  overriden in environment
  (__gnat_is_absolute_path): Support MS-DOS style absolute paths for DJGPP.
  (__gnat_portable_spawn): Use spewnvp for DJGPP.
  (__gnat_portable_no_block_spawn): Use spawnvp for DJGPP.
  (__gnat_portable_wait): Return 0 for DJGPP.



Signed-off-by: Andris Pavenis <andris.pavenis@iki.fi>
---
 gcc/ada/adaint.c | 43 ++++++++++++++++++++++++++++++++++++-------
 1 file changed, 36 insertions(+), 7 deletions(-)

diff --git a/gcc/ada/adaint.c b/gcc/ada/adaint.c
index f317865..ed49ed7 100644
--- a/gcc/ada/adaint.c
+++ b/gcc/ada/adaint.c
@@ -112,7 +112,18 @@ 
 extern "C" {
 #endif
 
-#if defined (__MINGW32__) || defined (__CYGWIN__)
+#if defined (__DJGPP__)
+
+/* For isalpha-like tests in the compiler, we're expected to resort to
+   safe-ctype.h/ISALPHA.  This isn't available for the runtime library
+   build, so we fallback on ctype.h/isalpha there.  */
+
+#ifdef IN_RTS
+#include <ctype.h>
+#define ISALPHA isalpha
+#endif
+
+#elif defined (__MINGW32__) || defined (__CYGWIN__)
 
 #include "mingw32.h"
 
@@ -165,11 +176,16 @@  UINT CurrentCCSEncoding;
 #include <sys/wait.h>
 #endif
 
-#if defined (_WIN32)
-
+#if defined (__DJGPP__)
 #include <process.h>
 #include <signal.h>
 #include <dir.h>
+#include <utime.h>
+#undef DIR_SEPARATOR
+#define DIR_SEPARATOR '\\'
+
+#elif defined (_WIN32)
+
 #include <windows.h>
 #include <accctrl.h>
 #include <aclapi.h>
@@ -538,7 +554,11 @@  __gnat_try_lock (char *dir, char *file)
 int
 __gnat_get_maximum_file_name_length (void)
 {
+#if defined (__DJGPP__)
+  return (_use_lfn(".")) ? -1 : 8;
+#else
   return -1;
+#endif
 }
 
 /* Return nonzero if file names are case sensitive.  */
@@ -560,7 +580,7 @@  __gnat_get_file_names_case_sensitive (void)
 	{
 	  /* By default, we suppose filesystems aren't case sensitive on
 	     Windows and Darwin (but they are on arm-darwin).  */
-#if defined (WINNT) \
+#if defined (WINNT) || defined (__DJGPP__) \
   || (defined (__APPLE__) && !(defined (__arm__) || defined (__arm64__)))
 	  file_names_case_sensitive_cache = 0;
 #else
@@ -576,7 +596,7 @@  __gnat_get_file_names_case_sensitive (void)
 int
 __gnat_get_env_vars_case_sensitive (void)
 {
-#if defined (WINNT)
+#if defined (WINNT) || defined (__DJGPP__)
  return 0;
 #else
  return 1;
@@ -1646,7 +1666,7 @@  __gnat_is_absolute_path (char *name, int length)
 #else
   return (length != 0) &&
      (*name == '/' || *name == DIR_SEPARATOR
-#if defined (WINNT)
+#if defined (WINNT) || defined(__DJGPP__)
       || (length > 1 && ISALPHA (name[0]) && name[1] == ':')
 #endif
 	  );
@@ -2234,7 +2254,7 @@  __gnat_portable_spawn (char *args[] ATTRIBUTE_UNUSED)
 #if defined (__vxworks) || defined(__PikeOS__)
   return -1;
 
-#elif defined (_WIN32)
+#elif defined (__DJGPP__) || defined (_WIN32)
   /* args[0] must be quotes as it could contain a full pathname with spaces */
   char *args_0 = args[0];
   args[0] = (char *)xmalloc (strlen (args_0) + 3);
@@ -2606,6 +2626,12 @@  __gnat_portable_no_block_spawn (char *args[] ATTRIBUTE_UNUSED)
   /* Not supported.  */
   return -1;
 
+#elif defined(__DJGPP__)
+  if (spawnvp (P_WAIT, args[0], args) != 0)
+    return -1;
+  else
+    return 0;
+
 #elif defined (_WIN32)
 
   HANDLE h = NULL;
@@ -2649,6 +2675,9 @@  __gnat_portable_wait (int *process_status)
 
   pid = win32_wait (&status);
 
+#elif defined (__DJGPP__)
+  /* Child process has already ended in case of DJGPP.
+     No need to do anything. Just return success. */
 #else
 
   pid = waitpid (-1, &status, 0);
-- 
2.7.4