summarylogtreecommitdiffstats
diff options
context:
space:
mode:
authorJanez Zemva2018-07-28 09:12:00 +0200
committerJanez Zemva2018-07-28 09:12:00 +0200
commitefb381e466a9782c54ed47fdc3821cdccf952f3f (patch)
tree3315575e08fc4bdfe95c6886c1192abc0b4e27ec
parent014f051b10195a23c58b12b49939ca7abe3488b4 (diff)
downloadaur-efb381e466a9782c54ed47fdc3821cdccf952f3f.tar.gz
some fixes
-rw-r--r--.SRCINFO10
-rw-r--r--PKGBUILD16
-rw-r--r--gcc-djgpp.diff550
3 files changed, 567 insertions, 9 deletions
diff --git a/.SRCINFO b/.SRCINFO
index 9494bc57f6e4..1fb4b18c2c9a 100644
--- a/.SRCINFO
+++ b/.SRCINFO
@@ -1,7 +1,7 @@
pkgbase = dosbox-gcc
pkgdesc = djgpp cross-compiler for the dosbox environment
pkgver = 8.2.0
- pkgrel = 1
+ pkgrel = 2
url = http://gcc.gnu.org
arch = i686
arch = x86_64
@@ -20,12 +20,13 @@ pkgbase = dosbox-gcc
options = !strip
options = staticlibs
options = !emptydirs
- source = https://ftp.gnu.org/gnu/gcc/gcc-8.2.0/gcc-7.2.0.tar.xz
+ source = https://ftp.gnu.org/gnu/gcc/gcc-8.2.0/gcc-8.2.0.tar.xz
source = http://isl.gforge.inria.fr/isl-0.18.tar.xz
source = https://zlib.net/zlib-1.2.11.tar.gz"
source = http://www.delorie.com/pub/djgpp/current/v2/djcrx205.zip
- source = mkmake.bash
- source = watt32.pc
+ source = mkmake.bash
+ source = watt32.pc
+ source = gcc-djgpp.diff
source = lto.patch
sha256sums = SKIP
sha256sums = SKIP
@@ -33,6 +34,7 @@ pkgbase = dosbox-gcc
sha256sums = SKIP
sha256sums = SKIP
sha256sums = SKIP
+ sha256sums = SKIP
sha256sums = c03dbd61274e1ce14f84366abf348d75779bbd6e0bc32b9f4fd74f1ce54a5ef0
pkgname = dosbox-gcc
diff --git a/PKGBUILD b/PKGBUILD
index b5adda4fea72..c46334b14daa 100644
--- a/PKGBUILD
+++ b/PKGBUILD
@@ -10,7 +10,7 @@ _djver=2.05
_pthver=3.14
_zlver=1.2.11
_wattver="2.2-dev.10"
-pkgrel=1
+pkgrel=2
pkgdesc="djgpp cross-compiler for the dosbox environment"
arch=('i686' 'x86_64')
url="http://gcc.gnu.org"
@@ -27,6 +27,7 @@ source=("https://ftp.gnu.org/gnu/gcc/gcc-${pkgver}/gcc-$pkgver.tar.xz"
"http://www.watt-32.net/watt32s-${_wattver}.zip"
"mkmake.bash"
"watt32.pc"
+ "gcc-djgpp.diff"
"lto.patch")
sha256sums=('SKIP'
'SKIP'
@@ -35,6 +36,7 @@ sha256sums=('SKIP'
'SKIP'
'SKIP'
'SKIP'
+ 'SKIP'
'c03dbd61274e1ce14f84366abf348d75779bbd6e0bc32b9f4fd74f1ce54a5ef0')
noextract=("djcrx${_djver//./}.zip"
"watt32s-${_wattver}.zip")
@@ -97,6 +99,9 @@ prepare() {
# build the lto plugin
patch -Np0 < ../lto.patch
+ # Other DJGPP related changes
+ patch -Np1 < ../gcc-djgpp.diff
+
# extract bootstrap djcrx
mkdir -p ../gcc-build-$_target/lib/gcc/$_target/$pkgver
cd ../gcc-build-${_target}/lib/gcc/$_target/$pkgver
@@ -106,9 +111,9 @@ prepare() {
ln -fs /bin/true stubify
# monkeypatch libc to prepare for building without an ldscript
- echo '.comm __environ,16' > environ.s
- i586-pc-msdosdjgpp-as environ.s -o environ.o
- i586-pc-msdosdjgpp-ar q libc.a environ.o
+ # echo '.comm __environ,16' > environ.s
+ # i586-pc-msdosdjgpp-as environ.s -o environ.o
+ # i586-pc-msdosdjgpp-ar q libc.a environ.o
}
build() {
@@ -124,7 +129,7 @@ build() {
--disable-nls \
--enable-gold \
--enable-decimal-float \
- --enable-languages=c,c++,objc,obj-c++ \
+ --enable-languages=c,c++ \
--enable-shared --enable-static \
--with-system-zlib \
--with-arch=i586 \
@@ -132,6 +137,7 @@ build() {
--enable-threads \
--enable-libstdcxx-threads \
--enable-lto --disable-libgomp \
+ --enable-libstdcxx-filesystem-ts \
--disable-multilib --enable-checking=release
make all-gcc
diff --git a/gcc-djgpp.diff b/gcc-djgpp.diff
new file mode 100644
index 000000000000..961640c8dcf8
--- /dev/null
+++ b/gcc-djgpp.diff
@@ -0,0 +1,550 @@
+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/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/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 <float.h>
+ */
+
++#ifdef __DJGPP__
++#include_next <float.h>
++#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 <io.h>
++#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 <ctype.h>
+ #endif
+-#ifdef HAVE_WCHAR_H
++#if defined(HAVE_WCHAR_H) && !defined(__DJGPP__)
++/* DJGPP wchar.h is not good enough */
+ #include <wchar.h>
+ #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 <bits/c++config.h>
+ #include <cerrno>
+
++#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 <algorithm>
+ #endif
+
++#if defined(__DJGPP__)
++# define _GLIBCXX_FILESYSTEM_IS_DJGPP 1
++# include <algorithm>
++#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);