diff --git a/gcc/ada/adaint.c b/gcc/ada/adaint.c index 3b0aea92c05..02013b9f01a 100644 --- a/gcc/ada/adaint.c +++ b/gcc/ada/adaint.c @@ -247,6 +247,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 @@ -553,7 +559,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 d51d3973b4d..3381e23116a 100644 --- a/gcc/ada/gcc-interface/Make-lang.in +++ b/gcc/ada/gcc-interface/Make-lang.in @@ -1066,7 +1066,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 e1bea2955ef..240fccdae39 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 b82bd3badb3..8e3d7bcacc1 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; @@ -2262,10 +2262,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 1e2ffa354a3..40d3b689bbd 100644 --- a/gcc/ada/libgnat/s-os_lib.ads +++ b/gcc/ada/libgnat/s-os_lib.ads @@ -1082,9 +1082,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/config/i386/djgpp.c b/gcc/config/i386/djgpp.c index f168eed6f06..d187c3a7452 100644 --- a/gcc/config/i386/djgpp.c +++ b/gcc/config/i386/djgpp.c @@ -47,3 +47,20 @@ i386_djgpp_asm_named_section(const char *name, unsigned int flags, fprintf (asm_out_file, "\t.section\t%s,\"%s\"\n", name, flagchars); } + +/* Kludge because of missing COFF support for early LTO debug. */ + +static enum debug_info_levels saved_debug_info_level; + +void +i386_djgpp_asm_lto_start (void) +{ + saved_debug_info_level = debug_info_level; + debug_info_level = DINFO_LEVEL_NONE; +} + +void +i386_djgpp_asm_lto_end (void) +{ + debug_info_level = saved_debug_info_level; +} diff --git a/gcc/config/i386/djgpp.h b/gcc/config/i386/djgpp.h index 42130edf95c..e95bc09bf69 100644 --- a/gcc/config/i386/djgpp.h +++ b/gcc/config/i386/djgpp.h @@ -160,8 +160,19 @@ along with GCC; see the file COPYING3. If not see #undef MAKE_DECL_ONE_ONLY #define MAKE_DECL_ONE_ONLY(DECL) (DECL_WEAK (DECL) = 1) +#undef TARGET_COFF +#define TARGET_COFF 1 + +/* Kludge because of missing COFF support for early LTO debug. */ +#undef TARGET_ASM_LTO_START +#define TARGET_ASM_LTO_START i386_djgpp_asm_lto_start +#undef TARGET_ASM_LTO_END +#define TARGET_ASM_LTO_END i386_djgpp_asm_lto_end + /* Function protypes for gcc/i386/djgpp.c */ void i386_djgpp_asm_named_section(const char *name, unsigned int flags, tree decl); +void i386_djgpp_asm_lto_start (void); +void i386_djgpp_asm_lto_end (void); diff --git a/gcc/config/i386/xm-djgpp.h b/gcc/config/i386/xm-djgpp.h index 02096925a88..066417f1d50 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/defaults.h b/gcc/defaults.h index 78a08a33f12..9035b333be8 100644 --- a/gcc/defaults.h +++ b/gcc/defaults.h @@ -1282,6 +1282,10 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see #define TARGET_PECOFF 0 #endif +#ifndef TARGET_COFF +#define TARGET_COFF 0 +#endif + #ifndef EH_RETURN_HANDLER_RTX #define EH_RETURN_HANDLER_RTX NULL #endif diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c index d94cf7dc928..9f6855e6695 100644 --- a/gcc/dwarf2out.c +++ b/gcc/dwarf2out.c @@ -31832,10 +31832,10 @@ dwarf2out_early_finish (const char *filename) /* Do not generate DWARF assembler now when not producing LTO bytecode. */ if ((!flag_generate_lto && !flag_generate_offload) - /* FIXME: Disable debug info generation for PE-COFF targets since the + /* FIXME: Disable debug info generation for (PE-)COFF targets since the copy_lto_debug_sections operation of the simple object support in libiberty is not implemented for them yet. */ - || TARGET_PECOFF) + || TARGET_PECOFF || TARGET_COFF) return; /* Now as we are going to output for LTO initialize sections and labels diff --git a/gcc/gcov-tool.c b/gcc/gcov-tool.c index 15fd710b18c..91d4c87b31b 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/ginclude/float.h b/gcc/ginclude/float.h index 96a360f305e..d24aa286421 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 dc09e791e41..72e535f3456 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 e8d21b28e62..964f06e3bf4 100644 --- a/libcpp/files.c +++ b/libcpp/files.c @@ -740,6 +740,10 @@ read_file_guts (cpp_reader *pfile, _cpp_file *file, source_location 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 37c365a3560..bf1daed392e 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 776af7bd00e..09217b472ae 100644 --- a/libcpp/macro.c +++ b/libcpp/macro.c @@ -516,17 +516,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 9cf56a82859..f30c593d04b 100644 --- a/libgcc/libgcov-util.c +++ b/libgcc/libgcov-util.c @@ -388,7 +388,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 1299159a7f1..e1bd7a1c633 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/io/unix.c b/libgfortran/io/unix.c index a8fd07a5f3b..385640ab903 100644 --- a/libgfortran/io/unix.c +++ b/libgfortran/io/unix.c @@ -210,6 +210,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 @@ -1190,8 +1193,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. */ @@ -1557,6 +1565,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 eebcff9957e..a9d92ee2247 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 @@ -337,7 +338,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; } @@ -353,7 +354,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 89faed7f09e..dd93cda1f03 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 021ce488c16..601db43cdce 100644 --- a/libiberty/simple-object-elf.c +++ b/libiberty/simple-object-elf.c @@ -1285,7 +1285,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/error_constants.h b/libstdc++-v3/config/os/djgpp/error_constants.h index 4e5590f9160..f78405afa03 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 _GLIBCXX_HAVE_ENOTSUP not_supported = ENOTSUP, -#endif #ifdef _GLIBCXX_HAVE_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 _GLIBCXX_HAVE_EOWNERDEAD diff --git a/libstdc++-v3/include/experimental/bits/fs_path.h b/libstdc++-v3/include/experimental/bits/fs_path.h index ada7c1791aa..1ec60b2ffc9 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 @@ -461,6 +466,8 @@ _GLIBCXX_BEGIN_NAMESPACE_CXX11 { #ifdef _GLIBCXX_FILESYSTEM_IS_WINDOWS return __ch == L'/' || __ch == preferred_separator; +#elif defined(_GLIBCXX_FILESYSTEM_IS_DJGPP) + return __ch == '/' || __ch == '\\'; #else return __ch == '/'; #endif @@ -831,6 +838,9 @@ _GLIBCXX_BEGIN_NAMESPACE_CXX11 #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; } diff --git a/libstdc++-v3/src/filesystem/path.cc b/libstdc++-v3/src/filesystem/path.cc index 899d94e0067..fdb0e9e071a 100644 --- a/libstdc++-v3/src/filesystem/path.cc +++ b/libstdc++-v3/src/filesystem/path.cc @@ -371,8 +371,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 _M_add_root_name(2);