diff --git a/gcc/ada/adaint.c b/gcc/ada/adaint.c index 595abf87d65..c836566803d 100644 --- a/gcc/ada/adaint.c +++ b/gcc/ada/adaint.c @@ -279,6 +279,12 @@ char __gnat_dir_separator = DIR_SEPARATOR; char __gnat_path_separator = PATH_SEPARATOR; +#ifdef __DJGPP__ +int __gnat_is_djgpp = 1; +#else +int __gnat_is_djgpp = 0; +#endif + /* The GNAT_LIBRARY_TEMPLATE contains a list of expressions that define the base filenames that libraries specified with -lsomelib options may have. This is used by GNATMAKE to check whether an executable @@ -578,7 +584,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. */ diff --git a/gcc/ada/gcc-interface/Make-lang.in b/gcc/ada/gcc-interface/Make-lang.in index acbe2b877ca..4962b36ee2e 100644 --- a/gcc/ada/gcc-interface/Make-lang.in +++ b/gcc/ada/gcc-interface/Make-lang.in @@ -1077,7 +1077,7 @@ ada/generated/gnatvsn.ads: ada/gnatvsn.ads BASE-VER ada/GNAT_DATE s=`cat $(srcdir)/BASE-VER | sed -e "s/\([0-9]*\)\.\([0-9]*\)\..*/-\1\2/g"`; \ d=`if test -f $(srcdir)/ada/GNAT_DATE; then \ cat $(srcdir)/ada/GNAT_DATE; else date +%Y%m%d; fi`; \ - cat $< | sed -e "/Version/s/(\([0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]\).*)/($$d$$s)/g" >$@ + cat $< | sed -e "/Version/s/(\([0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]\).*)/($$d$$s)/g" | tr -d \\\015 >$@ ada/gnatvsn.o : ada/gnatvsn.adb ada/generated/gnatvsn.ads $(CC) -c $(ALL_ADAFLAGS) -Iada/generated -I../ada/generated $(ADA_INCLUDES) $< $(ADA_OUTPUT_OPTION) diff --git a/gcc/ada/libgnarl/s-taprop__dummy.adb b/gcc/ada/libgnarl/s-taprop__dummy.adb index bd6387d821c..0cb49e3f553 100644 --- a/gcc/ada/libgnarl/s-taprop__dummy.adb +++ b/gcc/ada/libgnarl/s-taprop__dummy.adb @@ -41,7 +41,7 @@ pragma Polling (Off); package body System.Task_Primitives.Operations is use System.Tasking; - use System.Parameters; +-- use System.Parameters; pragma Warnings (Off); -- Turn off warnings since so many unreferenced parameters diff --git a/gcc/ada/libgnat/s-os_lib.adb b/gcc/ada/libgnat/s-os_lib.adb index 258cd64d312..3943a15458b 100644 --- a/gcc/ada/libgnat/s-os_lib.adb +++ b/gcc/ada/libgnat/s-os_lib.adb @@ -71,7 +71,7 @@ package body System.OS_Lib is -- The following are used by Create_Temp_File - First_Temp_File_Name : constant String := "GNAT-TEMP-000000.TMP"; + First_Temp_File_Name : constant String := "GA000000.TMP"; -- Used to initialize Current_Temp_File_Name and Temp_File_Name_Last_Digit Current_Temp_File_Name : String := First_Temp_File_Name; @@ -2259,9 +2259,10 @@ package body System.OS_Lib is -- * Check the drive letter -- * Remove all double-quotes - if On_Windows then + if On_Windows + and then Is_Djgpp = 0 + then -- Replace all '/' by '\' - for Index in 1 .. End_Path loop if Path_Buffer (Index) = '/' then Path_Buffer (Index) := Directory_Separator; diff --git a/gcc/ada/libgnat/s-os_lib.ads b/gcc/ada/libgnat/s-os_lib.ads index 99406e9a77d..a35507806a6 100644 --- a/gcc/ada/libgnat/s-os_lib.ads +++ b/gcc/ada/libgnat/s-os_lib.ads @@ -1091,9 +1091,12 @@ package System.OS_Lib is Path_Separator : constant Character; -- The character to separate paths in an environment variable value + Is_Djgpp : constant Integer; + private pragma Import (C, Path_Separator, "__gnat_path_separator"); pragma Import (C, Directory_Separator, "__gnat_dir_separator"); + pragma Import (C, Is_Djgpp, "__gnat_is_djgpp"); pragma Import (C, Current_Time, "__gnat_current_time"); pragma Import (C, Current_Process_Id, "__gnat_current_process_id"); diff --git a/gcc/collect2.c b/gcc/collect2.c index f8a5ce45994..2c3a612d49f 100644 --- a/gcc/collect2.c +++ b/gcc/collect2.c @@ -1180,18 +1180,27 @@ main (int argc, char **argv) *ld1++ = *ld2++ = ld_file_name; /* Make temp file names. */ + +#ifdef __DJGPP__ +#define CDTOR_C_NAME ".ctc" +#define CDTOR_O_NAME ".cto" +#else +#define CDTOR_C_NAME ".cdtor.c" +#define CDTOR_O_NAME ".cdtor.o" +#endif + if (save_temps) { - c_file = concat (output_file, ".cdtor.c", NULL); - o_file = concat (output_file, ".cdtor.o", NULL); + c_file = concat (output_file, CDTOR_C_NAME, NULL); + o_file = concat (output_file, CDTOR_O_NAME, NULL); #ifdef COLLECT_EXPORT_LIST export_file = concat (output_file, ".x", NULL); #endif } else { - c_file = make_temp_file (".cdtor.c"); - o_file = make_temp_file (".cdtor.o"); + c_file = make_temp_file (CDTOR_C_NAME); + o_file = make_temp_file (CDTOR_O_NAME); #ifdef COLLECT_EXPORT_LIST export_file = make_temp_file (".x"); #endif diff --git a/gcc/config/i386/djgpp.c b/gcc/config/i386/djgpp.c index ba6c2d4d3a4..88cf1e6506e 100644 --- a/gcc/config/i386/djgpp.c +++ b/gcc/config/i386/djgpp.c @@ -36,6 +36,8 @@ i386_djgpp_asm_named_section(const char *name, unsigned int flags, *f++ = 'w'; if (flags & SECTION_CODE) *f++ = 'x'; + if (flags & SECTION_BSS) + *f++ = 'b'; /* LTO sections need 1-byte alignment to avoid confusing the zlib decompression algorithm with trailing zero pad bytes. */ diff --git a/gcc/config/i386/xm-djgpp.h b/gcc/config/i386/xm-djgpp.h index 299ef0a4810..a376a3f9146 100644 --- a/gcc/config/i386/xm-djgpp.h +++ b/gcc/config/i386/xm-djgpp.h @@ -30,6 +30,8 @@ along with GCC; see the file COPYING3. If not see #undef NATIVE_SYSTEM_HEADER_DIR #define NATIVE_SYSTEM_HEADER_DIR "/dev/env/DJDIR/include/" +//#undef PREFIX_INCLUDE_DIR + /* Search for as.exe and ld.exe in DJGPP's binary directory. */ #undef MD_EXEC_PREFIX #define MD_EXEC_PREFIX "/dev/env/DJDIR/bin/" @@ -107,6 +109,11 @@ along with GCC; see the file COPYING3. If not see (PATH) = xstrdup (fixed_path); \ } +/* Rename libstdc++ to libstdcxx as the first name is not valid for DOS */ +#define LIBSTDCXX "stdcxx" +#define LIBSTDCXX_PROFILE "stdcxx" +#define LIBSTDCXX_STATIC "stdcxx" + #undef MAX_OFILE_ALIGNMENT #define MAX_OFILE_ALIGNMENT 128 diff --git a/gcc/gcov-tool.c b/gcc/gcov-tool.c index f8f1cb5d29b..bd26e1f2443 100644 --- a/gcc/gcov-tool.c +++ b/gcc/gcov-tool.c @@ -56,11 +56,18 @@ static bool verbose; /* Remove file NAME if it has a gcda suffix. */ +#ifdef __DJGPP__ +static int +unlink_gcda_file (const char *name, + struct stat *status ATTRIBUTE_UNUSED, + int type ATTRIBUTE_UNUSED) +#else static int unlink_gcda_file (const char *name, const struct stat *status ATTRIBUTE_UNUSED, int type ATTRIBUTE_UNUSED, struct FTW *ftwbuf ATTRIBUTE_UNUSED) +#endif { int ret = 0; int len = strlen (name); @@ -82,7 +89,11 @@ static int unlink_profile_dir (const char *path ATTRIBUTE_UNUSED) { #if HAVE_FTW_H +#ifdef __DJGPP__ + return ftw(path, unlink_gcda_file, 64); +#else return nftw(path, unlink_gcda_file, 64, FTW_DEPTH | FTW_PHYS); +#endif #else return -1; #endif diff --git a/gcc/ggc-common.c b/gcc/ggc-common.c index 0d528cf455c..c6d4134bb36 100644 --- a/gcc/ggc-common.c +++ b/gcc/ggc-common.c @@ -31,6 +31,12 @@ along with GCC; see the file COPYING3. If not see #include "plugin.h" #include "options.h" +#ifdef __DJGPP__ +extern "C" { +#include +} +#endif + /* When set, ggc_collect will do collection. */ bool ggc_force_collect; diff --git a/gcc/ginclude/float.h b/gcc/ginclude/float.h index 9c4b0385568..986639a3bc9 100644 --- a/gcc/ginclude/float.h +++ b/gcc/ginclude/float.h @@ -25,6 +25,10 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see * ISO C Standard: 5.2.4.2.2 Characteristics of floating types */ +#ifdef __DJGPP__ +#include_next +#endif + #ifndef _FLOAT_H___ #define _FLOAT_H___ diff --git a/include/libiberty.h b/include/libiberty.h index 141cb886a85..e2462fc3332 100644 --- a/include/libiberty.h +++ b/include/libiberty.h @@ -108,6 +108,7 @@ extern int countargv (char * const *); #if defined (__GNU_LIBRARY__ ) || defined (__linux__) \ || defined (__FreeBSD__) || defined (__OpenBSD__) || defined (__NetBSD__) \ || defined (__CYGWIN__) || defined (__CYGWIN32__) || defined (__MINGW32__) \ + || defined (__DJGPP__) \ || defined (__DragonFly__) || defined (HAVE_DECL_BASENAME) extern char *basename (const char *) ATTRIBUTE_RETURNS_NONNULL ATTRIBUTE_NONNULL(1); #else diff --git a/libcpp/files.c b/libcpp/files.c index 260e787c329..d8a63d43bea 100644 --- a/libcpp/files.c +++ b/libcpp/files.c @@ -747,6 +747,10 @@ read_file_guts (cpp_reader *pfile, _cpp_file *file, location_t loc) cpp_error_at (pfile, CPP_DL_WARNING, loc, "%s is shorter than expected", file->path); +/* For DOS we should handle DOS EOF character (0x1A, ^Z). It is + only done if it is really the last character of the file */ + if (total>0 && buf[total-1]==0x1A) total--; + file->buffer = _cpp_convert_input (pfile, CPP_OPTION (pfile, input_charset), buf, size + 16, total, diff --git a/libcpp/lex.c b/libcpp/lex.c index 665297af776..90e58ff26de 100644 --- a/libcpp/lex.c +++ b/libcpp/lex.c @@ -502,6 +502,13 @@ init_vectorized_lexer (void) search_line_fast_type impl = search_line_acc_char; int minimum = 0; +// [FIXME][DJGPP] Using SSE here causes preprocessor to randomly +// [FIXME][DJGPP] fail when run under Windows 10 32 bit (and maybe +// [FIXME][DJGPP] some other systems (I have observed similar +// [FIXME][DJGPP] behavior earlier with DJGPP v2.03p2 under Windows +// [FIXME][DJGPP] Vista +#ifndef __DJGPP__ + #if defined(__SSE4_2__) minimum = 3; #elif defined(__SSE2__) @@ -528,6 +535,8 @@ init_vectorized_lexer (void) impl = search_line_mmx; } +#endif // __DJGPP__ + search_line_fast = impl; } diff --git a/libcpp/macro.c b/libcpp/macro.c index 2573f316bf5..9f3b3e7f8de 100644 --- a/libcpp/macro.c +++ b/libcpp/macro.c @@ -612,17 +612,22 @@ _cpp_builtin_macro_text (cpp_reader *pfile, cpp_hashnode *node, && pfile->cb.get_source_date_epoch != NULL) pfile->source_date_epoch = pfile->cb.get_source_date_epoch (pfile); - if (pfile->source_date_epoch >= (time_t) 0) - tb = gmtime (&pfile->source_date_epoch); - else - { - /* (time_t) -1 is a legitimate value for "number of seconds - since the Epoch", so we have to do a little dance to - distinguish that from a genuine error. */ - errno = 0; - tt = time (NULL); - if (tt != (time_t)-1 || errno == 0) - tb = localtime (&tt); + switch (pfile->source_date_epoch) + { + default: + tb = gmtime (&pfile->source_date_epoch); + break; + + case (time_t) -1: + case (time_t) -2: + /* (time_t) -1 is a legitimate value for "number of seconds + since the Epoch", so we have to do a little dance to + distinguish that from a genuine error. */ + errno = 0; + tt = time (NULL); + if (tt != (time_t)-1 || errno == 0) + tb = localtime (&tt); + break; } if (tb) diff --git a/libffi/src/x86/sysv.S b/libffi/src/x86/sysv.S index 78f245bda07..1ae18b248a7 100644 --- a/libffi/src/x86/sysv.S +++ b/libffi/src/x86/sysv.S @@ -822,7 +822,7 @@ ENDF(C(__x86.get_pc_thunk.dx)) #ifdef __APPLE__ .section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support EHFrame0: -#elif defined(X86_WIN32) +#elif defined(X86_WIN32) || defined(__DJGPP__) .section .eh_frame,"r" #elif defined(HAVE_AS_X86_64_UNWIND_SECTION_TYPE) .section .eh_frame,EH_FRAME_FLAGS,@unwind diff --git a/libgcc/libgcov-util.c b/libgcc/libgcov-util.c index fff54c6a3f6..c4879c6bf99 100644 --- a/libgcc/libgcov-util.c +++ b/libgcc/libgcov-util.c @@ -390,7 +390,11 @@ read_gcda_file (const char *filename) static int ftw_read_file (const char *filename, +#ifdef __DJGPP__ + struct stat *status ATTRIBUTE_UNUSED, +#else const struct stat *status ATTRIBUTE_UNUSED, +#endif int type) { int filename_len; diff --git a/libgfortran/intrinsics/chmod.c b/libgfortran/intrinsics/chmod.c index 7377834be69..7480d3ce17e 100644 --- a/libgfortran/intrinsics/chmod.c +++ b/libgfortran/intrinsics/chmod.c @@ -442,7 +442,7 @@ clause_done: if ((ugo[2] || honor_umask) && !rwxXstugo[8]) file_mode = (file_mode & ~(S_IROTH | S_IWOTH | S_IXOTH)) | (new_mode & (S_IROTH | S_IWOTH | S_IXOTH)); -#ifndef __VXWORKS__ +#if !defined(__VXWORKS__) && !defined(__DJGPP__) if (is_dir && rwxXstugo[5]) file_mode |= S_ISVTX; else if (!is_dir) @@ -454,7 +454,7 @@ clause_done: { /* Clear '-'. */ file_mode &= ~new_mode; -#if !defined( __MINGW32__) && !defined (__VXWORKS__) +#if !defined( __MINGW32__) && !defined (__VXWORKS__) && !defined(__DJGPP__) if (rwxXstugo[5] || !is_dir) file_mode &= ~S_ISVTX; #endif @@ -462,7 +462,7 @@ clause_done: else if (set_mode == 3) { file_mode |= new_mode; -#if !defined (__MINGW32__) && !defined (__VXWORKS__) +#if !defined (__MINGW32__) && !defined (__VXWORKS__) && !defined(__DJGPP__) if (rwxXstugo[5] && is_dir) file_mode |= S_ISVTX; else if (!is_dir) diff --git a/libgfortran/intrinsics/execute_command_line.c b/libgfortran/intrinsics/execute_command_line.c index 6d7b8fc658e..ac7e0054c2f 100644 --- a/libgfortran/intrinsics/execute_command_line.c +++ b/libgfortran/intrinsics/execute_command_line.c @@ -98,7 +98,7 @@ execute_command_line (const char *command, bool wait, int *exitstat, set_cmdstat (cmdstat, EXEC_NOERROR); -#if defined(HAVE_SIGACTION) && defined(HAVE_WAITPID) +#if defined(HAVE_SIGACTION) && defined(HAVE_WAITPID) && !defined(__DJGPP__) static bool sig_init_saved; bool sig_init = __atomic_load_n (&sig_init_saved, __ATOMIC_RELAXED); if (!sig_init) diff --git a/libgfortran/io/unix.c b/libgfortran/io/unix.c index 563c7cb64cc..e8d681735ba 100644 --- a/libgfortran/io/unix.c +++ b/libgfortran/io/unix.c @@ -221,6 +221,9 @@ typedef struct } unix_stream; +#ifdef __DJGPP__ +#include +#endif /* fix_fd()-- Given a file descriptor, make sure it is not one of the standard descriptors, returning a non-standard descriptor. If the @@ -1222,8 +1225,13 @@ tempfile_open (const char *tempdir, char **fname) char *template = xmalloc (tempdirlen + 23); #ifdef HAVE_MKSTEMP +#ifdef __DJGPP__ + /* Default filename is too long for DOS */ + snprintf (template, tempdirlen + 23, "%s/gfXXXXXX", tempdir); +#else snprintf (template, tempdirlen + 23, "%s%sgfortrantmpXXXXXX", tempdir, slash); +#endif #ifdef HAVE_UMASK /* Temporarily set the umask such that the file has 0600 permissions. */ @@ -1589,6 +1597,13 @@ open_external (st_parameter_open *opp, unit_flags *flags) return NULL; fd = fix_fd (fd); +#ifdef __DJGPP__ + if (flags->form == FORM_UNFORMATTED) + { + setmode (fd, O_BINARY); + } +#endif + if (open_share (opp, fd, flags) < 0) return NULL; diff --git a/libiberty/make-relative-prefix.c b/libiberty/make-relative-prefix.c index e3f9f920df4..836de31c156 100644 --- a/libiberty/make-relative-prefix.c +++ b/libiberty/make-relative-prefix.c @@ -65,6 +65,7 @@ relative prefix can be found, return @code{NULL}. #include "ansidecl.h" #include "libiberty.h" +#include "filenames.h" #ifndef R_OK #define R_OK 4 @@ -340,7 +341,7 @@ make_relative_prefix_1 (const char *progname, const char *bin_prefix, { for (i = 0; i < bin_num; i++) { - if (strcmp (prog_dirs[i], bin_dirs[i]) != 0) + if (FILENAME_CMP (prog_dirs[i], bin_dirs[i]) != 0) break; } @@ -356,7 +357,7 @@ make_relative_prefix_1 (const char *progname, const char *bin_prefix, n = (prefix_num < bin_num) ? prefix_num : bin_num; for (common = 0; common < n; common++) { - if (strcmp (bin_dirs[common], prefix_dirs[common]) != 0) + if (FILENAME_CMP (bin_dirs[common], prefix_dirs[common]) != 0) break; } diff --git a/libiberty/make-temp-file.c b/libiberty/make-temp-file.c index cb08c27af6f..d7701e4b38a 100644 --- a/libiberty/make-temp-file.c +++ b/libiberty/make-temp-file.c @@ -47,6 +47,7 @@ Boston, MA 02110-1301, USA. */ #endif #include "libiberty.h" +#include "filenames.h" extern int mkstemps (char *, int); /* '/' works just fine on MS-DOS based systems. */ @@ -142,7 +143,8 @@ choose_tmpdir (void) len = strlen (base); tmpdir = XNEWVEC (char, len + 2); strcpy (tmpdir, base); - tmpdir[len] = DIR_SEPARATOR; + if (len>0 && !IS_DIR_SEPARATOR(tmpdir[len-1])) + tmpdir[len] = DIR_SEPARATOR; tmpdir[len+1] = '\0'; memoized_tmpdir = tmpdir; #else /* defined(_WIN32) && !defined(__CYGWIN__) */ diff --git a/libiberty/simple-object-elf.c b/libiberty/simple-object-elf.c index 37e73348cb7..0d6f84c1ed3 100644 --- a/libiberty/simple-object-elf.c +++ b/libiberty/simple-object-elf.c @@ -1293,7 +1293,9 @@ simple_object_elf_copy_lto_debug_sections (simple_object_read *sobj, } if (new_i - 1 >= SHN_LORESERVE) { +#ifdef ENOTSUP *err = ENOTSUP; +#endif return "Too many copied sections"; } eow->shdrs = XNEWVEC (unsigned char, shdr_size * (new_i - 1)); diff --git a/libquadmath/printf/quadmath-printf.h b/libquadmath/printf/quadmath-printf.h index 32ebcec928c..96498b7c408 100644 --- a/libquadmath/printf/quadmath-printf.h +++ b/libquadmath/printf/quadmath-printf.h @@ -29,7 +29,8 @@ Boston, MA 02110-1301, USA. */ #ifdef HAVE_CTYPE_H #include #endif -#ifdef HAVE_WCHAR_H +#if defined(HAVE_WCHAR_H) && !defined(__DJGPP__) +/* DJGPP wchar.h is not good enough */ #include #endif #ifdef HAVE_WCTYPE_H @@ -44,7 +45,7 @@ Boston, MA 02110-1301, USA. */ #include "quadmath-imp.h" #include "gmp-impl.h" -#ifdef HAVE_WCHAR_H +#if defined(HAVE_WCHAR_H) && !defined(__DJGPP__) #define L_(x) L##x #else #define L_(x) x diff --git a/libstdc++-v3/config/os/djgpp/ctype_configure_char.cc b/libstdc++-v3/config/os/djgpp/ctype_configure_char.cc index 8562c8f52b0..775756ede3f 100644 --- a/libstdc++-v3/config/os/djgpp/ctype_configure_char.cc +++ b/libstdc++-v3/config/os/djgpp/ctype_configure_char.cc @@ -45,7 +45,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION ctype::ctype(__c_locale, const mask* __table, bool __del, size_t __refs) : facet(__refs), _M_del(__table != 0 && __del), - _M_toupper(__dj_ctype_toupper), _M_tolower(__dj_ctype_tolower), + _M_toupper(__dj_ctype_toupper+1), _M_tolower(__dj_ctype_tolower+1), _M_table(__table ? __table : classic_table()) { memset(_M_widen, 0, sizeof(_M_widen)); @@ -56,7 +56,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION ctype::ctype(const mask* __table, bool __del, size_t __refs) : facet(__refs), _M_del(__table != 0 && __del), - _M_toupper(__dj_ctype_toupper), _M_tolower(__dj_ctype_tolower), + _M_toupper(__dj_ctype_toupper+1), _M_tolower(__dj_ctype_tolower+1), _M_table(__table ? __table : classic_table()) { memset(_M_widen, 0, sizeof(_M_widen)); diff --git a/libstdc++-v3/config/os/djgpp/error_constants.h b/libstdc++-v3/config/os/djgpp/error_constants.h index 8f947e69e37..d80a5811ca7 100644 --- a/libstdc++-v3/config/os/djgpp/error_constants.h +++ b/libstdc++-v3/config/os/djgpp/error_constants.h @@ -33,6 +33,15 @@ #include #include +#ifndef EOPNOTSUPP +// Use same value as in wat3222br6.zip file net/watt/sys/djgpp.err +#define EOPNOTSUPP 52 +#endif + +#ifndef ENOTSUP +#define ENOTSUP 101 +#endif + namespace std _GLIBCXX_VISIBILITY(default) { _GLIBCXX_BEGIN_NAMESPACE_VERSION @@ -118,9 +127,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION // not_connected = ENOTCONN, not_enough_memory = ENOMEM, -#ifdef ENOTSUP not_supported = ENOTSUP, -#endif #ifdef ECANCELED operation_canceled = ECANCELED, @@ -128,7 +135,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION // operation_in_progress = EINPROGRESS, operation_not_permitted = EPERM, -// operation_not_supported = EOPNOTSUPP, + operation_not_supported = EOPNOTSUPP, // operation_would_block = EWOULDBLOCK, #ifdef EOWNERDEAD diff --git a/libstdc++-v3/include/experimental/bits/fs_path.h b/libstdc++-v3/include/experimental/bits/fs_path.h index 69b823a3466..2d005b875e4 100644 --- a/libstdc++-v3/include/experimental/bits/fs_path.h +++ b/libstdc++-v3/include/experimental/bits/fs_path.h @@ -53,6 +53,11 @@ # include #endif +#if defined(__DJGPP__) +# define _GLIBCXX_FILESYSTEM_IS_DJGPP 1 +# include +#endif + namespace std _GLIBCXX_VISIBILITY(default) { _GLIBCXX_BEGIN_NAMESPACE_VERSION @@ -516,6 +521,8 @@ namespace __detail { #ifdef _GLIBCXX_FILESYSTEM_IS_WINDOWS return __ch == L'/' || __ch == preferred_separator; +#elif defined(_GLIBCXX_FILESYSTEM_IS_DJGPP) + return __ch == '/' || __ch == '\\'; #else return __ch == '/'; #endif @@ -964,6 +971,9 @@ namespace __detail #ifdef _GLIBCXX_FILESYSTEM_IS_WINDOWS std::replace(_M_pathname.begin(), _M_pathname.end(), L'/', preferred_separator); +#elif defined(_GLIBCXX_FILESYSTEM_IS_DJGPP) + std::replace(_M_pathname.begin(), _M_pathname.end(), '\\', + preferred_separator); #endif return *this; } @@ -1187,7 +1197,7 @@ namespace __detail inline bool path::is_absolute() const { -#ifdef _GLIBCXX_FILESYSTEM_IS_WINDOWS +#if defined(_GLIBCXX_FILESYSTEM_IS_WINDOWS) || defined(_GLIBCXX_FILESYSTEM_IS_DJGPP) return has_root_name() && has_root_directory(); #else return has_root_directory(); diff --git a/libstdc++-v3/src/c++11/shared_ptr.cc b/libstdc++-v3/src/c++11/shared_ptr.cc index 162dd6db2f4..2d4108ed64b 100644 --- a/libstdc++-v3/src/c++11/shared_ptr.cc +++ b/libstdc++-v3/src/c++11/shared_ptr.cc @@ -35,7 +35,11 @@ namespace __gnu_internal _GLIBCXX_VISIBILITY(hidden) get_mutex(unsigned char i) { // increase alignment to put each lock on a separate cache line +#ifdef __DJGPP__ + struct M : __gnu_cxx::__mutex { }; +#else struct alignas(64) M : __gnu_cxx::__mutex { }; +#endif static M m[mask + 1]; return m[i]; } diff --git a/libstdc++-v3/src/filesystem/path.cc b/libstdc++-v3/src/filesystem/path.cc index 59eeadc2c0d..158936910bd 100644 --- a/libstdc++-v3/src/filesystem/path.cc +++ b/libstdc++-v3/src/filesystem/path.cc @@ -408,8 +408,13 @@ path::_M_split_cmpts() _M_add_root_dir(0); ++pos; } -#ifdef _GLIBCXX_FILESYSTEM_IS_WINDOWS +#if defined(_GLIBCXX_FILESYSTEM_IS_WINDOWS) \ + || defined(_GLIBCXX_FILESYSTEM_IS_DJGPP) +#ifdef __DJGPP__ + else if (len > 1 && _M_pathname[1] == ':') +#else else if (len > 1 && _M_pathname[1] == L':') +#endif { // got disk designator if (len == 2)