diff --git a/Makefile.in b/Makefile.in index 047be0255e2..0ba4dbaa0a2 100644 --- a/Makefile.in +++ b/Makefile.in @@ -1378,7 +1378,6 @@ dvi-host: maybe-dvi-itcl dvi-host: maybe-dvi-ld dvi-host: maybe-dvi-libbacktrace dvi-host: maybe-dvi-libcpp -dvi-host: maybe-dvi-libcody dvi-host: maybe-dvi-libdecnumber dvi-host: maybe-dvi-libgui dvi-host: maybe-dvi-libiberty @@ -1469,7 +1468,6 @@ pdf-host: maybe-pdf-itcl pdf-host: maybe-pdf-ld pdf-host: maybe-pdf-libbacktrace pdf-host: maybe-pdf-libcpp -pdf-host: maybe-pdf-libcody pdf-host: maybe-pdf-libdecnumber pdf-host: maybe-pdf-libgui pdf-host: maybe-pdf-libiberty @@ -1560,7 +1558,6 @@ html-host: maybe-html-itcl html-host: maybe-html-ld html-host: maybe-html-libbacktrace html-host: maybe-html-libcpp -html-host: maybe-html-libcody html-host: maybe-html-libdecnumber html-host: maybe-html-libgui html-host: maybe-html-libiberty @@ -1651,7 +1648,6 @@ TAGS-host: maybe-TAGS-itcl TAGS-host: maybe-TAGS-ld TAGS-host: maybe-TAGS-libbacktrace TAGS-host: maybe-TAGS-libcpp -TAGS-host: maybe-TAGS-libcody TAGS-host: maybe-TAGS-libdecnumber TAGS-host: maybe-TAGS-libgui TAGS-host: maybe-TAGS-libiberty @@ -1742,7 +1738,6 @@ install-info-host: maybe-install-info-itcl install-info-host: maybe-install-info-ld install-info-host: maybe-install-info-libbacktrace install-info-host: maybe-install-info-libcpp -install-info-host: maybe-install-info-libcody install-info-host: maybe-install-info-libdecnumber install-info-host: maybe-install-info-libgui install-info-host: maybe-install-info-libiberty @@ -1833,7 +1828,6 @@ install-pdf-host: maybe-install-pdf-itcl install-pdf-host: maybe-install-pdf-ld install-pdf-host: maybe-install-pdf-libbacktrace install-pdf-host: maybe-install-pdf-libcpp -install-pdf-host: maybe-install-pdf-libcody install-pdf-host: maybe-install-pdf-libdecnumber install-pdf-host: maybe-install-pdf-libgui install-pdf-host: maybe-install-pdf-libiberty @@ -1924,7 +1918,6 @@ install-html-host: maybe-install-html-itcl install-html-host: maybe-install-html-ld install-html-host: maybe-install-html-libbacktrace install-html-host: maybe-install-html-libcpp -install-html-host: maybe-install-html-libcody install-html-host: maybe-install-html-libdecnumber install-html-host: maybe-install-html-libgui install-html-host: maybe-install-html-libiberty diff --git a/configure.ac b/configure.ac index 088e735c5db..6e5dbf631c0 100644 --- a/configure.ac +++ b/configure.ac @@ -1465,12 +1465,12 @@ esac # C++11 compiler can still start the bootstrap. Otherwise, if building GCC, # require C++11 (or higher). if test "$enable_bootstrap:$GXX" = "yes:yes"; then - CXX="$CXX -std=c++11" + AX_CXX_COMPILE_STDCXX(11, [ext]) elif test "$have_compiler" = yes; then - AX_CXX_COMPILE_STDCXX(11) + AX_CXX_COMPILE_STDCXX(11, [ext]) if test "${build}" != "${host}"; then - AX_CXX_COMPILE_STDCXX(11, [], [], [_FOR_BUILD]) + AX_CXX_COMPILE_STDCXX(11, [ext], [], [_FOR_BUILD]) fi fi diff --git a/gcc/ada/adaint.c b/gcc/ada/adaint.c index 0a90c92402c..d1d0fc7b1fe 100644 --- a/gcc/ada/adaint.c +++ b/gcc/ada/adaint.c @@ -297,6 +297,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 @@ -596,7 +602,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 d88c354c9a4..88b81133168 100644 --- a/gcc/ada/gcc-interface/Make-lang.in +++ b/gcc/ada/gcc-interface/Make-lang.in @@ -1080,7 +1080,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 7e9093a58fc..84b80d3fd61 100644 --- a/gcc/ada/libgnarl/s-taprop__dummy.adb +++ b/gcc/ada/libgnarl/s-taprop__dummy.adb @@ -37,7 +37,7 @@ 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 93522bc13eb..f61e7965fdf 100644 --- a/gcc/ada/libgnat/s-os_lib.adb +++ b/gcc/ada/libgnat/s-os_lib.adb @@ -76,7 +76,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; @@ -2318,9 +2318,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 f786cca8143..756766d4e71 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/ada/s-oscons-tmplt.c b/gcc/ada/s-oscons-tmplt.c index 582c35ef7db..647ca3f88f4 100644 --- a/gcc/ada/s-oscons-tmplt.c +++ b/gcc/ada/s-oscons-tmplt.c @@ -121,7 +121,7 @@ pragma Style_Checks ("M32766"); **/ # include -#elif !defined(__MINGW32__) +#elif !defined(__MINGW32__) && !defined(__DJGPP__) #include #endif diff --git a/gcc/collect2.c b/gcc/collect2.c index bd371430ab7..e925d83b004 100644 --- a/gcc/collect2.c +++ b/gcc/collect2.c @@ -1189,18 +1189,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 4d9548aed8d..dca15602642 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 f53b348ad4b..fc17fc89f88 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/cp/mapper-client.cc b/gcc/cp/mapper-client.cc index b9e02168d55..0fb15fd0c7b 100644 --- a/gcc/cp/mapper-client.cc +++ b/gcc/cp/mapper-client.cc @@ -19,7 +19,7 @@ along with GCC; see the file COPYING3. If not see . */ #include "config.h" -#if defined (__unix__) +#if defined (__unix__) && !defined(__DJGPP__) // Solaris11's socket header used bcopy, which we poison. cody.hh // will include it later under the above check #include diff --git a/gcc/gcov-tool.c b/gcc/gcov-tool.c index 71bdfdaa1f0..31bd5b1733f 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 357bda13f97..db375610751 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 a0cbd7fb0d8..cf71ac8b695 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 f4c0fe11d6f..e1a28b83cce 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/libcody/cody.hh b/libcody/cody.hh index 789ce9e70b7..8794e4dd8e6 100644 --- a/libcody/cody.hh +++ b/libcody/cody.hh @@ -20,6 +20,12 @@ #endif #endif +// Do not use networking for DJGPP even if it defines __unix__ +#ifdef __DJGPP__ +#undef CODY_NETWORKING +#define CODY_NETWORKING 0 +#endif + // C++ #include #include diff --git a/libcpp/files.c b/libcpp/files.c index 6e20fc5887f..44fd90f83af 100644 --- a/libcpp/files.c +++ b/libcpp/files.c @@ -742,6 +742,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 06bcc31c87e..ae28ac4ff4b 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/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 bc7416d99bf..3a47764bfa5 100644 --- a/libgcc/libgcov-util.c +++ b/libgcc/libgcov-util.c @@ -389,7 +389,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/libgcc/libgcov.h b/libgcc/libgcov.h index 7b0d367ec52..a8be4f0be22 100644 --- a/libgcc/libgcov.h +++ b/libgcc/libgcov.h @@ -45,6 +45,11 @@ #include "libgcc_tm.h" #include "gcov.h" +#ifdef __DJGPP__ +#include +#undef HAVE_SYS_MMAN_H +#endif // __DJGPP__ + #if HAVE_SYS_MMAN_H #include #endif diff --git a/libgfortran/intrinsics/chmod.c b/libgfortran/intrinsics/chmod.c index 8b5140a05a3..6e7a2afb032 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 5d41667df9e..439738b6bf1 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 b127cf7a32d..f293cff6ae0 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 ef932ff022e..401800baa3d 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 7465cec5ea6..f60a441eb6a 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 a421177f0c2..c166621b931 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 8a63099c941..f3d4d7c7239 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 e538d38d9de..434de1601e4 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 @@ -122,16 +131,16 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION not_supported = ENOTSUP, #endif -#ifdef ECANCELED +#ifdef _GLIBCXX_HAVE_ECANCELED operation_canceled = ECANCELED, #endif // operation_in_progress = EINPROGRESS, operation_not_permitted = EPERM, -// operation_not_supported = EOPNOTSUPP, + operation_not_supported = EOPNOTSUPP, // operation_would_block = EWOULDBLOCK, -#ifdef EOWNERDEAD +#ifdef _GLIBCXX_HAVE_EOWNERDEAD owner_dead = EOWNERDEAD, #endif diff --git a/libstdc++-v3/include/experimental/bits/fs_path.h b/libstdc++-v3/include/experimental/bits/fs_path.h index 2df2bba3dcd..3a732171390 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 @@ -523,6 +528,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 @@ -971,6 +978,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; } @@ -1194,7 +1204,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 4678fbeffe2..18a68a16025 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 a935573740f..9cd2e9898b2 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)