diff --git a/.compat-sap-c++-9.metadata b/.compat-sap-c++-9.metadata
new file mode 100644
index 0000000..3c3b50d
--- /dev/null
+++ b/.compat-sap-c++-9.metadata
@@ -0,0 +1 @@
+186c672996b17fd7ea17a188a2ed927d9e52a835 SOURCES/gcc-9.1.1-20190605.tar.xz
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..76596d0
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1 @@
+SOURCES/gcc-9.1.1-20190605.tar.xz
diff --git a/SOURCES/gcc9-Wno-format-security.patch b/SOURCES/gcc9-Wno-format-security.patch
new file mode 100644
index 0000000..cb21e5d
--- /dev/null
+++ b/SOURCES/gcc9-Wno-format-security.patch
@@ -0,0 +1,27 @@
+2017-02-25  Jakub Jelinek  <jakub@redhat.com>
+
+	* configure.ac: When adding -Wno-format, also add -Wno-format-security.
+	* configure: Regenerated.
+
+--- gcc/configure.ac.jj	2017-02-13 12:20:53.000000000 +0100
++++ gcc/configure.ac	2017-02-25 12:42:32.859175403 +0100
+@@ -481,7 +481,7 @@ AC_ARG_ENABLE(build-format-warnings,
+   AS_HELP_STRING([--disable-build-format-warnings],[don't use -Wformat while building GCC]),
+   [],[enable_build_format_warnings=yes])
+ AS_IF([test $enable_build_format_warnings = no],
+-      [wf_opt=-Wno-format],[wf_opt=])
++      [wf_opt="-Wno-format -Wno-format-security"],[wf_opt=])
+ ACX_PROG_CXX_WARNING_OPTS(
+ 	m4_quote(m4_do([-W -Wall -Wno-narrowing -Wwrite-strings ],
+ 		       [-Wcast-qual $wf_opt])), [loose_warn])
+--- gcc/configure.jj	2017-02-13 12:20:52.000000000 +0100
++++ gcc/configure	2017-02-25 12:42:50.041946391 +0100
+@@ -6647,7 +6647,7 @@ else
+ fi
+ 
+ if test $enable_build_format_warnings = no; then :
+-  wf_opt=-Wno-format
++  wf_opt="-Wno-format -Wno-format-security"
+ else
+   wf_opt=
+ fi
diff --git a/SOURCES/gcc9-d-shared-libphobos.patch b/SOURCES/gcc9-d-shared-libphobos.patch
new file mode 100644
index 0000000..392d631
--- /dev/null
+++ b/SOURCES/gcc9-d-shared-libphobos.patch
@@ -0,0 +1,20 @@
+2019-01-17  Jakub Jelinek  <jakub@redhat.com>
+
+	* d-spec.cc (lang_specific_driver): Make -shared-libphobos
+	the default rather than -static-libphobos.
+
+--- gcc/d/d-spec.cc.jj	2019-01-01 12:37:49.502444257 +0100
++++ gcc/d/d-spec.cc	2019-01-17 17:09:45.364949246 +0100
+@@ -405,9 +405,9 @@ lang_specific_driver (cl_decoded_option
+   /* Add `-lgphobos' if we haven't already done so.  */
+   if (phobos_library != PHOBOS_NOLINK && need_phobos)
+     {
+-      /* Default to static linking.  */
+-      if (phobos_library != PHOBOS_DYNAMIC)
+-	phobos_library = PHOBOS_STATIC;
++      /* Default to shared linking.  */
++      if (phobos_library != PHOBOS_STATIC)
++	phobos_library = PHOBOS_DYNAMIC;
+ 
+ #ifdef HAVE_LD_STATIC_DYNAMIC
+       if (phobos_library == PHOBOS_DYNAMIC && static_link)
diff --git a/SOURCES/gcc9-foffload-default.patch b/SOURCES/gcc9-foffload-default.patch
new file mode 100644
index 0000000..ac462f1
--- /dev/null
+++ b/SOURCES/gcc9-foffload-default.patch
@@ -0,0 +1,122 @@
+2019-01-17  Jakub Jelinek  <jakub@redhat.com>
+
+	* gcc.c (offload_targets_default): New variable.
+	(process_command): Set it if -foffload is defaulted.
+	(driver::maybe_putenv_OFFLOAD_TARGETS): Add OFFLOAD_TARGET_DEFAULT=1
+	into environment if -foffload has been defaulted.
+	* lto-wrapper.c (OFFLOAD_TARGET_DEFAULT_ENV): Define.
+	(compile_offload_image): If OFFLOAD_TARGET_DEFAULT
+	is in the environment, don't fail if corresponding mkoffload
+	can't be found.
+	(compile_images_for_offload_targets): Likewise.  Free and clear
+	offload_names if no valid offload is found.
+libgomp/
+	* target.c (gomp_load_plugin_for_device): If a plugin can't be
+	dlopened, assume it has no devices silently.
+
+--- gcc/gcc.c.jj	2017-01-17 10:28:40.000000000 +0100
++++ gcc/gcc.c	2017-01-20 16:26:29.649962902 +0100
+@@ -290,6 +290,10 @@ static const char *spec_host_machine = D
+ 
+ static char *offload_targets = NULL;
+ 
++/* Set to true if -foffload has not been used and offload_targets
++   is set to the configured in default.  */
++static bool offload_targets_default;
++
+ /* Nonzero if cross-compiling.
+    When -b is used, the value comes from the `specs' file.  */
+ 
+@@ -4457,7 +4461,10 @@ process_command (unsigned int decoded_op
+   /* If the user didn't specify any, default to all configured offload
+      targets.  */
+   if (ENABLE_OFFLOADING && offload_targets == NULL)
+-    handle_foffload_option (OFFLOAD_TARGETS);
++    {
++      handle_foffload_option (OFFLOAD_TARGETS);
++      offload_targets_default = true;
++    }
+ 
+   if (output_file
+       && strcmp (output_file, "-") != 0
+@@ -7693,6 +7700,8 @@ driver::maybe_putenv_OFFLOAD_TARGETS ()
+       obstack_grow (&collect_obstack, offload_targets,
+ 		    strlen (offload_targets) + 1);
+       xputenv (XOBFINISH (&collect_obstack, char *));
++      if (offload_targets_default)
++	  xputenv ("OFFLOAD_TARGET_DEFAULT=1");
+     }
+ 
+   free (offload_targets);
+--- gcc/lto-wrapper.c.jj	2017-01-01 12:45:34.000000000 +0100
++++ gcc/lto-wrapper.c	2017-01-20 16:34:18.294016997 +0100
+@@ -52,6 +52,7 @@ along with GCC; see the file COPYING3.
+ /* Environment variable, used for passing the names of offload targets from GCC
+    driver to lto-wrapper.  */
+ #define OFFLOAD_TARGET_NAMES_ENV	"OFFLOAD_TARGET_NAMES"
++#define OFFLOAD_TARGET_DEFAULT_ENV	"OFFLOAD_TARGET_DEFAULT"
+ 
+ enum lto_mode_d {
+   LTO_MODE_NONE,			/* Not doing LTO.  */
+@@ -820,6 +821,12 @@ compile_offload_image (const char *targe
+ 	break;
+       }
+ 
++  if (!compiler && getenv (OFFLOAD_TARGET_DEFAULT_ENV))
++    {
++      free_array_of_ptrs ((void **) paths, n_paths);
++      return NULL;
++    }
++
+   if (!compiler)
+     fatal_error (input_location,
+ 		 "could not find %s in %s (consider using %<-B%>)\n",
+@@ -883,6 +890,7 @@ compile_images_for_offload_targets (unsi
+   unsigned num_targets = parse_env_var (target_names, &names, NULL);
+ 
+   int next_name_entry = 0;
++  bool hsa_seen = false;
+   const char *compiler_path = getenv ("COMPILER_PATH");
+   if (!compiler_path)
+     goto out;
+@@ -895,18 +903,26 @@ compile_images_for_offload_targets (unsi
+       /* HSA does not use LTO-like streaming and a different compiler, skip
+ 	 it. */
+       if (strcmp (names[i], "hsa") == 0)
+-	continue;
++	{
++	  hsa_seen = true;
++	  continue;
++	}
+ 
+       offload_names[next_name_entry]
+ 	= compile_offload_image (names[i], compiler_path, in_argc, in_argv,
+ 				 compiler_opts, compiler_opt_count,
+ 				 linker_opts, linker_opt_count);
+       if (!offload_names[next_name_entry])
+-	fatal_error (input_location,
+-		     "problem with building target image for %s\n", names[i]);
++	continue;
+       next_name_entry++;
+     }
+ 
++  if (next_name_entry == 0 && !hsa_seen)
++    {
++      free (offload_names);
++      offload_names = NULL;
++    }
++
+  out:
+   free_array_of_ptrs ((void **) names, num_targets);
+ }
+--- libgomp/target.c.jj	2017-01-01 12:45:52.000000000 +0100
++++ libgomp/target.c	2017-01-20 20:12:13.756710875 +0100
+@@ -2356,7 +2356,7 @@ gomp_load_plugin_for_device (struct gomp
+ 
+   void *plugin_handle = dlopen (plugin_name, RTLD_LAZY);
+   if (!plugin_handle)
+-    goto dl_fail;
++    return 0;
+ 
+   /* Check if all required functions are available in the plugin and store
+      their handlers.  None of the symbols can legitimately be NULL,
diff --git a/SOURCES/gcc9-hack.patch b/SOURCES/gcc9-hack.patch
new file mode 100644
index 0000000..ba80c24
--- /dev/null
+++ b/SOURCES/gcc9-hack.patch
@@ -0,0 +1,126 @@
+--- libada/Makefile.in.jj	2019-01-09 13:01:18.015608205 +0100
++++ libada/Makefile.in	2019-01-11 18:16:23.441726931 +0100
+@@ -71,18 +71,40 @@ version := $(shell @get_gcc_base_ver@ $(
+ libsubdir := $(libdir)/gcc/$(target_noncanonical)/$(version)$(MULTISUBDIR)
+ ADA_RTS_DIR=$(GCC_DIR)/ada/rts$(subst /,_,$(MULTISUBDIR))
+ 
++DEFAULTMULTIFLAGS :=
++ifeq ($(MULTISUBDIR),)
++targ:=$(subst -, ,$(target))
++arch:=$(word 1,$(targ))
++ifeq ($(words $(targ)),2)
++osys:=$(word 2,$(targ))
++else
++osys:=$(word 3,$(targ))
++endif
++ifeq ($(strip $(filter-out i%86 x86_64 powerpc% ppc% s390% sparc% linux%, $(arch) $(osys))),)
++ifeq ($(shell $(CC) $(CFLAGS) -print-multi-os-directory),../lib64)
++DEFAULTMULTIFLAGS := -m64
++else
++ifeq ($(strip $(filter-out s390%, $(arch))),)
++DEFAULTMULTIFLAGS := -m31
++else
++DEFAULTMULTIFLAGS := -m32
++endif
++endif
++endif
++endif
++
+ # exeext should not be used because it's the *host* exeext.  We're building
+ # a *target* library, aren't we?!?  Likewise for CC.  Still, provide bogus
+ # definitions just in case something slips through the safety net provided
+ # by recursive make invocations in gcc/ada/Makefile.in
+ LIBADA_FLAGS_TO_PASS = \
+         "MAKEOVERRIDES=" \
+-        "LDFLAGS=$(LDFLAGS)" \
++        "LDFLAGS=$(LDFLAGS) $(DEFAULTMULTIFLAGS)" \
+         "LN_S=$(LN_S)" \
+         "SHELL=$(SHELL)" \
+-        "GNATLIBFLAGS=$(GNATLIBFLAGS) $(MULTIFLAGS)" \
+-        "GNATLIBCFLAGS=$(GNATLIBCFLAGS) $(MULTIFLAGS)" \
+-        "GNATLIBCFLAGS_FOR_C=$(GNATLIBCFLAGS_FOR_C) $(MULTIFLAGS)" \
++        "GNATLIBFLAGS=$(GNATLIBFLAGS) $(MULTIFLAGS) $(DEFAULTMULTIFLAGS)" \
++        "GNATLIBCFLAGS=$(GNATLIBCFLAGS) $(MULTIFLAGS) $(DEFAULTMULTIFLAGS)" \
++        "GNATLIBCFLAGS_FOR_C=$(GNATLIBCFLAGS_FOR_C) $(MULTIFLAGS) $(DEFAULTMULTIFLAGS)" \
+         "PICFLAG_FOR_TARGET=$(PICFLAG)" \
+         "THREAD_KIND=$(THREAD_KIND)" \
+         "TRACE=$(TRACE)" \
+@@ -93,7 +115,7 @@ LIBADA_FLAGS_TO_PASS = \
+         "exeext=.exeext.should.not.be.used " \
+ 	'CC=the.host.compiler.should.not.be.needed' \
+ 	"GCC_FOR_TARGET=$(CC)" \
+-        "CFLAGS=$(CFLAGS)"
++        "CFLAGS=$(CFLAGS) $(DEFAULTMULTIFLAGS)"
+ 
+ .PHONY: libada gnatlib gnatlib-shared gnatlib-sjlj gnatlib-zcx osconstool
+ 
+--- config-ml.in.jj	2019-01-09 12:50:16.646501448 +0100
++++ config-ml.in	2019-01-11 18:16:23.442726914 +0100
+@@ -511,6 +511,8 @@ multi-do:
+ 				ADAFLAGS="$(ADAFLAGS) $${flags}" \
+ 				prefix="$(prefix)" \
+ 				exec_prefix="$(exec_prefix)" \
++				mandir="$(mandir)" \
++				infodir="$(infodir)" \
+ 				GOCFLAGS="$(GOCFLAGS) $${flags}" \
+ 				GDCFLAGS="$(GDCFLAGS) $${flags}" \
+ 				CXXFLAGS="$(CXXFLAGS) $${flags}" \
+--- libcpp/macro.c.jj	2019-01-09 13:01:21.420552123 +0100
++++ libcpp/macro.c	2019-01-11 18:18:17.736876285 +0100
+@@ -3256,8 +3256,6 @@ static cpp_macro *
+ create_iso_definition (cpp_reader *pfile)
+ {
+   bool following_paste_op = false;
+-  const char *paste_op_error_msg =
+-    N_("'##' cannot appear at either end of a macro expansion");
+   unsigned int num_extra_tokens = 0;
+   unsigned nparms = 0;
+   cpp_hashnode **params = NULL;
+@@ -3382,7 +3380,9 @@ create_iso_definition (cpp_reader *pfile
+ 	     function-like macros, but not at the end.  */
+ 	  if (following_paste_op)
+ 	    {
+-	      cpp_error (pfile, CPP_DL_ERROR, paste_op_error_msg);
++	      cpp_error (pfile, CPP_DL_ERROR,
++			 "'##' cannot appear at either end of a macro "
++			 "expansion");
+ 	      goto out;
+ 	    }
+ 	  if (!vaopt_tracker.completed ())
+@@ -3397,7 +3397,9 @@ create_iso_definition (cpp_reader *pfile
+ 	     function-like macros, but not at the beginning.  */
+ 	  if (macro->count == 1)
+ 	    {
+-	      cpp_error (pfile, CPP_DL_ERROR, paste_op_error_msg);
++	      cpp_error (pfile, CPP_DL_ERROR,
++			 "'##' cannot appear at either end of a macro "
++			 "expansion");
+ 	      goto out;
+ 	    }
+ 
+--- libcpp/expr.c.jj	2019-01-09 13:01:22.415535734 +0100
++++ libcpp/expr.c	2019-01-11 18:16:23.444726882 +0100
+@@ -788,16 +788,17 @@ cpp_classify_number (cpp_reader *pfile,
+       if ((result & CPP_N_WIDTH) == CPP_N_LARGE
+ 	  && CPP_OPTION (pfile, cpp_warn_long_long))
+         {
+-          const char *message = CPP_OPTION (pfile, cplusplus) 
+-				? N_("use of C++11 long long integer constant")
+-		                : N_("use of C99 long long integer constant");
+-
+ 	  if (CPP_OPTION (pfile, c99))
+             cpp_warning_with_line (pfile, CPP_W_LONG_LONG, virtual_location,
+-				   0, message);
++				   0, CPP_OPTION (pfile, cplusplus)
++				      ? N_("use of C++11 long long integer constant")
++				      : N_("use of C99 long long integer constant"));
+           else
+             cpp_pedwarning_with_line (pfile, CPP_W_LONG_LONG,
+-				      virtual_location, 0, message);
++				      virtual_location, 0,
++				      CPP_OPTION (pfile, cplusplus)
++				      ? N_("use of C++11 long long integer constant")
++				      : N_("use of C99 long long integer constant"));
+         }
+ 
+       result |= CPP_N_INTEGER;
diff --git a/SOURCES/gcc9-i386-libgomp.patch b/SOURCES/gcc9-i386-libgomp.patch
new file mode 100644
index 0000000..520561e
--- /dev/null
+++ b/SOURCES/gcc9-i386-libgomp.patch
@@ -0,0 +1,11 @@
+--- libgomp/configure.tgt.jj	2008-01-10 20:53:48.000000000 +0100
++++ libgomp/configure.tgt	2008-03-27 12:44:51.000000000 +0100
+@@ -67,7 +67,7 @@ if test $enable_linux_futex = yes; then
+ 	    ;;
+ 	  *)
+ 	    if test -z "$with_arch"; then
+-	      XCFLAGS="${XCFLAGS} -march=i486 -mtune=${target_cpu}"
++	      XCFLAGS="${XCFLAGS} -march=i486 -mtune=generic"
+ 	    fi
+ 	esac
+ 	;;
diff --git a/SOURCES/gcc9-libgomp-omp_h-multilib.patch b/SOURCES/gcc9-libgomp-omp_h-multilib.patch
new file mode 100644
index 0000000..d0e98d1
--- /dev/null
+++ b/SOURCES/gcc9-libgomp-omp_h-multilib.patch
@@ -0,0 +1,17 @@
+2008-06-09  Jakub Jelinek  <jakub@redhat.com>
+
+	* omp.h.in (omp_nest_lock_t): Fix up for Linux multilibs.
+
+--- libgomp/omp.h.in.jj	2008-06-09 13:34:05.000000000 +0200
++++ libgomp/omp.h.in	2008-06-09 13:34:48.000000000 +0200
+@@ -42,8 +42,8 @@ typedef struct
+ 
+ typedef struct
+ {
+-  unsigned char _x[@OMP_NEST_LOCK_SIZE@] 
+-    __attribute__((__aligned__(@OMP_NEST_LOCK_ALIGN@)));
++  unsigned char _x[8 + sizeof (void *)] 
++    __attribute__((__aligned__(sizeof (void *))));
+ } omp_nest_lock_t;
+ #endif
+ 
diff --git a/SOURCES/gcc9-libtool-no-rpath.patch b/SOURCES/gcc9-libtool-no-rpath.patch
new file mode 100644
index 0000000..466c661
--- /dev/null
+++ b/SOURCES/gcc9-libtool-no-rpath.patch
@@ -0,0 +1,27 @@
+libtool sucks.
+--- ltmain.sh.jj	2007-12-07 14:53:21.000000000 +0100
++++ ltmain.sh	2008-09-05 21:51:48.000000000 +0200
+@@ -5394,6 +5394,7 @@ EOF
+ 	  rpath="$finalize_rpath"
+ 	  test "$mode" != relink && rpath="$compile_rpath$rpath"
+ 	  for libdir in $rpath; do
++	    case "$libdir" in /usr/lib|/usr/lib64|/usr/lib/../lib|/usr/lib/../lib64) continue;; esac
+ 	    if test -n "$hardcode_libdir_flag_spec"; then
+ 	      if test -n "$hardcode_libdir_separator"; then
+ 		if test -z "$hardcode_libdirs"; then
+@@ -6071,6 +6072,7 @@ EOF
+       rpath=
+       hardcode_libdirs=
+       for libdir in $compile_rpath $finalize_rpath; do
++	case "$libdir" in /usr/lib|/usr/lib64|/usr/lib/../lib|/usr/lib/../lib64) continue;; esac
+ 	if test -n "$hardcode_libdir_flag_spec"; then
+ 	  if test -n "$hardcode_libdir_separator"; then
+ 	    if test -z "$hardcode_libdirs"; then
+@@ -6120,6 +6122,7 @@ EOF
+       rpath=
+       hardcode_libdirs=
+       for libdir in $finalize_rpath; do
++	case "$libdir" in /usr/lib|/usr/lib64|/usr/lib/../lib|/usr/lib/../lib64) continue;; esac
+ 	if test -n "$hardcode_libdir_flag_spec"; then
+ 	  if test -n "$hardcode_libdir_separator"; then
+ 	    if test -z "$hardcode_libdirs"; then
diff --git a/SOURCES/gcc9-no-add-needed.patch b/SOURCES/gcc9-no-add-needed.patch
new file mode 100644
index 0000000..5817299
--- /dev/null
+++ b/SOURCES/gcc9-no-add-needed.patch
@@ -0,0 +1,37 @@
+2010-02-08  Roland McGrath  <roland@redhat.com>
+
+	* config/gnu-user.h (LINK_EH_SPEC): Pass --no-add-needed to the linker.
+	* config/alpha/elf.h (LINK_EH_SPEC): Likewise.
+	* config/ia64/linux.h (LINK_EH_SPEC): Likewise.
+
+--- gcc/config/alpha/elf.h.jj	2011-01-03 12:52:31.118056764 +0100
++++ gcc/config/alpha/elf.h	2011-01-04 18:14:10.931874160 +0100
+@@ -168,5 +168,5 @@ extern int alpha_this_gpdisp_sequence_nu
+    I imagine that other systems will catch up.  In the meantime, it
+    doesn't harm to make sure that the data exists to be used later.  */
+ #if defined(HAVE_LD_EH_FRAME_HDR)
+-#define LINK_EH_SPEC "%{!static|static-pie:--eh-frame-hdr} "
++#define LINK_EH_SPEC "--no-add-needed %{!static|static-pie:--eh-frame-hdr} "
+ #endif
+--- gcc/config/ia64/linux.h.jj	2011-01-03 13:02:11.462994522 +0100
++++ gcc/config/ia64/linux.h	2011-01-04 18:14:10.931874160 +0100
+@@ -76,7 +76,7 @@ do {						\
+    Signalize that because we have fde-glibc, we don't need all C shared libs
+    linked against -lgcc_s.  */
+ #undef LINK_EH_SPEC
+-#define LINK_EH_SPEC ""
++#define LINK_EH_SPEC "--no-add-needed "
+ 
+ #undef TARGET_INIT_LIBFUNCS
+ #define TARGET_INIT_LIBFUNCS ia64_soft_fp_init_libfuncs
+--- gcc/config/gnu-user.h.jj	2011-01-03 12:53:03.739057299 +0100
++++ gcc/config/gnu-user.h	2011-01-04 18:14:10.932814884 +0100
+@@ -106,7 +106,7 @@ see the files COPYING3 and COPYING.RUNTI
+ #define LIB_SPEC GNU_USER_TARGET_LIB_SPEC
+ 
+ #if defined(HAVE_LD_EH_FRAME_HDR)
+-#define LINK_EH_SPEC "%{!static|static-pie:--eh-frame-hdr} "
++#define LINK_EH_SPEC "--no-add-needed %{!static|static-pie:--eh-frame-hdr} "
+ #endif
+ 
+ #define GNU_USER_TARGET_LINK_GCC_C_SEQUENCE_SPEC \
diff --git a/SOURCES/gcc9-rh1574936.patch b/SOURCES/gcc9-rh1574936.patch
new file mode 100644
index 0000000..32db990
--- /dev/null
+++ b/SOURCES/gcc9-rh1574936.patch
@@ -0,0 +1,31 @@
+crt files and statically linked libgcc objects cause false positives
+in annobin coverage, so we add the assembler flag to generate notes
+for them.
+
+The patch also adds notes to libgcc_s.so, but this is harmless because
+these notes only confer that there is no other annobin markup.
+
+2018-07-25  Florian Weimer  <fweimer@redhat.com>
+
+	* Makefile.in (LIBGCC2_CFLAGS, CRTSTUFF_CFLAGS): Add
+	-Wa,--generate-missing-build-notes=yes.
+
+--- libgcc/Makefile.in	2018-01-13 13:05:41.000000000 +0100
++++ libgcc/Makefile.in	2018-07-25 13:15:02.036226940 +0200
+@@ -244,6 +244,7 @@
+ LIBGCC2_CFLAGS = -O2 $(LIBGCC2_INCLUDES) $(GCC_CFLAGS) $(HOST_LIBGCC2_CFLAGS) \
+ 		 $(LIBGCC2_DEBUG_CFLAGS) -DIN_LIBGCC2 \
+ 		 -fbuilding-libgcc -fno-stack-protector \
++		 -Wa,--generate-missing-build-notes=yes \
+ 		 $(INHIBIT_LIBC_CFLAGS)
+ 
+ # Additional options to use when compiling libgcc2.a.
+@@ -297,6 +298,7 @@
+   $(NO_PIE_CFLAGS) -finhibit-size-directive -fno-inline -fno-exceptions \
+   -fno-zero-initialized-in-bss -fno-toplevel-reorder -fno-tree-vectorize \
+   -fbuilding-libgcc -fno-stack-protector $(FORCE_EXPLICIT_EH_REGISTRY) \
++  -Wa,--generate-missing-build-notes=yes \
+   $(INHIBIT_LIBC_CFLAGS)
+ 
+ # Extra flags to use when compiling crt{begin,end}.o.
+
diff --git a/SOURCES/gcc9-sparc-config-detection.patch b/SOURCES/gcc9-sparc-config-detection.patch
new file mode 100644
index 0000000..bb06b35
--- /dev/null
+++ b/SOURCES/gcc9-sparc-config-detection.patch
@@ -0,0 +1,40 @@
+--- gcc/config.gcc.jj	2008-04-24 15:42:46.000000000 -0500
++++ gcc/config.gcc	2008-04-24 15:44:51.000000000 -0500
+@@ -2790,7 +2790,7 @@ sparc-*-rtems*)
+ 	tm_file="${tm_file} dbxelf.h elfos.h sparc/sysv4.h sparc/sp-elf.h sparc/rtemself.h rtems.h newlib-stdint.h"
+ 	tmake_file="${tmake_file} sparc/t-sparc sparc/t-rtems"
+ 	;;
+-sparc-*-linux*)
++sparc-*-linux* | sparcv9-*-linux*)
+ 	tm_file="${tm_file} dbxelf.h elfos.h sparc/sysv4.h gnu-user.h linux.h glibc-stdint.h sparc/tso.h"
+ 	extra_options="${extra_options} sparc/long-double-switch.opt"
+ 	case ${target} in
+@@ -2844,7 +2844,7 @@ sparc64-*-rtems*)
+ 	extra_options="${extra_options}"
+ 	tmake_file="${tmake_file} sparc/t-sparc sparc/t-rtems-64"
+ 	;;
+-sparc64-*-linux*)
++sparc64*-*-linux*)
+ 	tm_file="sparc/biarch64.h ${tm_file} dbxelf.h elfos.h sparc/sysv4.h gnu-user.h linux.h glibc-stdint.h sparc/default64.h sparc/linux64.h sparc/tso.h"
+ 	extra_options="${extra_options} sparc/long-double-switch.opt"
+ 	tmake_file="${tmake_file} sparc/t-sparc sparc/t-linux64"
+--- libgcc/config.host.jj	2008-04-24 15:46:19.000000000 -0500
++++ libgcc/config.host	2008-04-24 15:46:49.000000000 -0500
+@@ -1002,7 +1002,7 @@ sparc-*-elf*)
+ 	tmake_file="${tmake_file} t-fdpbit t-crtfm"
+ 	extra_parts="$extra_parts crti.o crtn.o crtfastmath.o"
+ 	;;
+-sparc-*-linux*)		# SPARC's running GNU/Linux, libc6
++sparc-*-linux* | sparcv9-*-linux*)		# SPARC's running GNU/Linux, libc6
+ 	tmake_file="${tmake_file} t-crtfm"
+ 	if test "${host_address}" = 64; then
+ 		tmake_file="$tmake_file sparc/t-linux64"
+@@ -1050,7 +1050,7 @@ sparc64-*-freebsd*|ultrasparc-*-freebsd*
+ 	tmake_file="$tmake_file t-crtfm"
+ 	extra_parts="$extra_parts crtfastmath.o"
+ 	;;
+-sparc64-*-linux*)		# 64-bit SPARC's running GNU/Linux
++sparc64*-*-linux*)		# 64-bit SPARC's running GNU/Linux
+ 	extra_parts="$extra_parts crtfastmath.o"
+ 	tmake_file="${tmake_file} t-crtfm sparc/t-linux"
+ 	if test "${host_address}" = 64; then
diff --git a/SPECS/compat-sap-c++-9.spec b/SPECS/compat-sap-c++-9.spec
new file mode 100644
index 0000000..b8df3dd
--- /dev/null
+++ b/SPECS/compat-sap-c++-9.spec
@@ -0,0 +1,395 @@
+%global scl 1
+%global scl_prefix compat-sap-
+%global _root_prefix /opt/rh/SAP
+%global _root_infodir %{_root_prefix}/%{_infodir}
+%global _root_mandir %{_root_prefix}/%{_mandir}
+%{?scl:%global __strip strip}
+%{?scl:%global __objdump objdump}
+%global DATE 20190605
+%global SVNREV 271961
+%global gcc_version 9.1.1
+%global gcc_major 9
+# Note, gcc_release must be integer, if you want to add suffixes to
+# %%{release}, append them after %%{gcc_release} on Release: line.
+%global gcc_release 2
+%global _unpackaged_files_terminate_build 0
+%undefine _annotated_build
+%global multilib_64_archs sparc64 ppc64 s390x x86_64
+%ifarch %{ix86} x86_64 ppc ppc64 ppc64le ppc64p7 s390 s390x %{arm} aarch64
+%global attr_ifunc 1
+%else
+%global attr_ifunc 0
+%endif
+%ifarch x86_64
+%global multilib_32_arch i686
+%endif
+Summary: C++ compatibility runtime library for SAP applications
+Name: %{?scl_prefix}c++-9
+ExclusiveArch: x86_64 ppc64le
+Version: %{gcc_version}
+Release: %{gcc_release}.3%{?dist}
+# libgcc, libgfortran, libgomp, libstdc++ and crtstuff have
+# GCC Runtime Exception.
+License: GPLv3+ and GPLv3+ with exceptions and GPLv2+ with exceptions and LGPLv2+ and BSD
+Group: Development/Languages
+# The source for this package was pulled from upstream's vcs.  Use the
+# following commands to generate the tarball:
+# svn export svn://gcc.gnu.org/svn/gcc/branches/redhat/gcc-9-branch@%%{SVNREV} gcc-%%{version}-%%{DATE}
+# tar cf - gcc-%%{version}-%%{DATE} | xz -9e > gcc-%%{version}-%%{DATE}.tar.xz
+Source0: gcc-%{version}-%{DATE}.tar.xz
+URL: http://gcc.gnu.org
+BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
+# Need binutils with -pie support >= 2.14.90.0.4-4
+# Need binutils which can omit dot symbols and overlap .opd on ppc64 >= 2.15.91.0.2-4
+# Need binutils which handle -msecure-plt on ppc >= 2.16.91.0.2-2
+# Need binutils which support .weakref >= 2.16.91.0.3-1
+# Need binutils which support --hash-style=gnu >= 2.17.50.0.2-7
+# Need binutils which support mffgpr and mftgpr >= 2.17.50.0.2-8
+# Need binutils which support --build-id >= 2.17.50.0.17-3
+# Need binutils which support %gnu_unique_object >= 2.19.51.0.14
+# Need binutils which support .cfi_sections >= 2.19.51.0.14-33
+BuildRequires: binutils >= 2.19.51.0.14-33
+# While gcc doesn't include statically linked binaries, during testing
+# -static is used several times.
+BuildRequires: glibc-static
+BuildRequires: gcc, gcc-c++
+BuildRequires: zlib-devel, gettext, dejagnu, bison, flex, texinfo, sharutils, gcc-gfortran
+BuildRequires: /usr/bin/pod2man
+# For VTA guality testing
+BuildRequires: gdb
+# Make sure pthread.h doesn't contain __thread tokens
+# Make sure glibc supports stack protector
+# Make sure glibc supports DT_GNU_HASH
+BuildRequires: glibc-devel >= 2.4.90-13
+BuildRequires: elfutils-devel >= 0.147
+BuildRequires: elfutils-libelf-devel >= 0.147
+%ifarch ppc ppc64 ppc64le ppc64p7 s390 s390x sparc sparcv9 alpha
+# Make sure glibc supports TFmode long double
+BuildRequires: glibc >= 2.3.90-35
+%endif
+%ifarch %{multilib_64_archs} sparcv9 ppc
+# Ensure glibc{,-devel} is installed for both multilib arches
+BuildRequires: /lib/libc.so.6 /usr/lib/libc.so /lib64/libc.so.6 /usr/lib64/libc.so
+%endif
+%ifarch ia64
+BuildRequires: libunwind >= 0.98
+%endif
+# Need .eh_frame ld optimizations
+# Need proper visibility support
+# Need -pie support
+# Need --as-needed/--no-as-needed support
+# On ppc64, need omit dot symbols support and --non-overlapping-opd
+# Need binutils that owns /usr/bin/c++filt
+# Need binutils that support .weakref
+# Need binutils that supports --hash-style=gnu
+# Need binutils that support mffgpr/mftgpr
+# Need binutils which support --build-id >= 2.17.50.0.17-3
+# Need binutils which support %%gnu_unique_object >= 2.19.51.0.14
+# Need binutils which support .cfi_sections >= 2.19.51.0.14-33
+# Don't require this for compat-sap-c++ (#1491573).
+#Requires: binutils >= 2.19.51.0.14-33
+# Make sure gdb will understand DW_FORM_strp
+Conflicts: gdb < 5.1-2
+# Don't require this for compat-sap-c++ (#1491573).
+#Requires: glibc-devel >= 2.2.90-12
+%ifarch ppc ppc64 ppc64le ppc64p7 s390 s390x sparc sparcv9 alpha
+# Make sure glibc supports TFmode long double
+Requires: glibc >= 2.3.90-35
+%endif
+Requires: libgcc >= 4.1.2-43
+# Keep this for now.
+Requires: libgomp >= 4.4.4-13
+BuildRequires: gmp-devel >= 4.1.2-8
+BuildRequires: mpfr-devel >= 2.2.1
+%if 0%{?rhel} >= 7
+BuildRequires: libmpc-devel >= 0.8.1
+%endif
+AutoReq: true
+AutoProv: false
+# Don't provide this for compat-sap-c++ (#1491573).
+#%ifarch sparc64 ppc64 ppc64le s390x x86_64 ia64
+#Provides: liblto_plugin.so.0()(64bit)
+#%else
+#Provides: liblto_plugin.so.0
+#%endif
+%global oformat %{nil}
+%global oformat2 %{nil}
+%ifarch %{ix86}
+%global oformat OUTPUT_FORMAT(elf32-i386)
+%endif
+%ifarch x86_64
+%global oformat OUTPUT_FORMAT(elf64-x86-64)
+%global oformat2 OUTPUT_FORMAT(elf32-i386)
+%endif
+%ifarch ppc
+%global oformat OUTPUT_FORMAT(elf32-powerpc)
+%global oformat2 OUTPUT_FORMAT(elf64-powerpc)
+%endif
+%ifarch ppc64
+%global oformat OUTPUT_FORMAT(elf64-powerpc)
+%global oformat2 OUTPUT_FORMAT(elf32-powerpc)
+%endif
+%ifarch s390
+%global oformat OUTPUT_FORMAT(elf32-s390)
+%endif
+%ifarch s390x
+%global oformat OUTPUT_FORMAT(elf64-s390)
+%global oformat2 OUTPUT_FORMAT(elf32-s390)
+%endif
+%ifarch ia64
+%global oformat OUTPUT_FORMAT(elf64-ia64-little)
+%endif
+%ifarch ppc64le
+%global oformat OUTPUT_FORMAT(elf64-powerpcle)
+%endif
+%ifarch aarch64
+%global oformat OUTPUT_FORMAT(elf64-littleaarch64)
+%endif
+
+Patch0: gcc9-hack.patch
+Patch1: gcc9-i386-libgomp.patch
+Patch2: gcc9-sparc-config-detection.patch
+Patch3: gcc9-libgomp-omp_h-multilib.patch
+Patch4: gcc9-libtool-no-rpath.patch
+Patch7: gcc9-no-add-needed.patch
+Patch8: gcc9-foffload-default.patch
+Patch9: gcc9-Wno-format-security.patch
+Patch10: gcc9-rh1574936.patch
+Patch11: gcc9-d-shared-libphobos.patch
+
+%if 0%{?rhel} >= 7
+%global nonsharedver 48
+%else
+%global nonsharedver 44
+%endif
+
+%if 0%{?scl:1}
+%global _gnu %{nil}
+%else
+%global _gnu 7E
+%endif
+%ifarch sparcv9
+%global gcc_target_platform sparc64-%{_vendor}-%{_target_os}%{?_gnu}
+%endif
+%ifarch ppc
+%global gcc_target_platform ppc64-%{_vendor}-%{_target_os}%{?_gnu}
+%endif
+%ifnarch sparcv9 ppc
+%global gcc_target_platform %{_target_platform}
+%endif
+
+%description
+This package provides runtime compatibility libraries for use by SAP
+application binaries only.
+
+%prep
+%setup -q -n gcc-%{version}-%{DATE}
+%patch0 -p0 -b .hack~
+%patch1 -p0 -b .i386-libgomp~
+%patch2 -p0 -b .sparc-config-detection~
+%patch3 -p0 -b .libgomp-omp_h-multilib~
+%patch4 -p0 -b .libtool-no-rpath~
+%patch7 -p0 -b .no-add-needed~
+%patch8 -p0 -b .foffload-default~
+%patch9 -p0 -b .Wno-format-security~
+%if 0%{?fedora} >= 29 || 0%{?rhel} > 7
+%patch10 -p0 -b .rh1574936~
+%endif
+%patch11 -p0 -b .d-shared-libphobos~
+
+echo 'Red Hat %{version}-%{gcc_release}' > gcc/DEV-PHASE
+
+%if 0%{?rhel} == 6
+# Default to -gdwarf-3 rather than -gdwarf-4
+sed -i '/UInteger Var(dwarf_version)/s/Init(4)/Init(3)/' gcc/common.opt
+sed -i 's/\(may be either 2, 3 or 4; the default version is \)4\./\13./' gcc/doc/invoke.texi
+%endif
+
+cp -a libstdc++-v3/config/cpu/i{4,3}86/atomicity.h
+cp -a libstdc++-v3/config/cpu/i{4,3}86/opt
+
+./contrib/gcc_update --touch
+
+LC_ALL=C sed -i -e 's/\xa0/ /' gcc/doc/options.texi
+
+sed -i -e 's/Common Driver Var(flag_report_bug)/& Init(1)/' gcc/common.opt
+
+%ifarch ppc
+if [ -d libstdc++-v3/config/abi/post/powerpc64-linux-gnu ]; then
+  mkdir -p libstdc++-v3/config/abi/post/powerpc64-linux-gnu/64
+  mv libstdc++-v3/config/abi/post/powerpc64-linux-gnu/{,64/}baseline_symbols.txt
+  mv libstdc++-v3/config/abi/post/powerpc64-linux-gnu/{32/,}baseline_symbols.txt
+  rm -rf libstdc++-v3/config/abi/post/powerpc64-linux-gnu/32
+fi
+%endif
+%ifarch sparc
+if [ -d libstdc++-v3/config/abi/post/sparc64-linux-gnu ]; then
+  mkdir -p libstdc++-v3/config/abi/post/sparc64-linux-gnu/64
+  mv libstdc++-v3/config/abi/post/sparc64-linux-gnu/{,64/}baseline_symbols.txt
+  mv libstdc++-v3/config/abi/post/sparc64-linux-gnu/{32/,}baseline_symbols.txt
+  rm -rf libstdc++-v3/config/abi/post/sparc64-linux-gnu/32
+fi
+%endif
+
+%build
+
+# Undo the broken autoconf change in recent Fedora versions
+export CONFIG_SITE=NONE
+
+rm -fr obj-%{gcc_target_platform}
+mkdir obj-%{gcc_target_platform}
+cd obj-%{gcc_target_platform}
+
+%{?scl:PATH=%{_bindir}${PATH:+:${PATH}}}
+
+CC=gcc
+CXX=g++
+OPT_FLAGS=`echo %{optflags}|sed -e 's/\(-Wp,\)\?-D_FORTIFY_SOURCE=[12]//g'`
+OPT_FLAGS=`echo $OPT_FLAGS|sed -e 's/-m64//g;s/-m32//g;s/-m31//g'`
+OPT_FLAGS=`echo $OPT_FLAGS|sed -e 's/-mfpmath=sse/-mfpmath=sse -msse2/g'`
+OPT_FLAGS=`echo $OPT_FLAGS|sed -e 's/ -pipe / /g'`
+OPT_FLAGS=`echo $OPT_FLAGS|sed -e 's/-Werror=format-security/-Wformat-security/g'`
+%ifarch sparc
+OPT_FLAGS=`echo $OPT_FLAGS|sed -e 's/-mcpu=ultrasparc/-mtune=ultrasparc/g;s/-mcpu=v[78]//g'`
+%endif
+%ifarch %{ix86}
+OPT_FLAGS=`echo $OPT_FLAGS|sed -e 's/-march=i.86//g'`
+%endif
+OPT_FLAGS=`echo "$OPT_FLAGS" | sed -e 's/[[:blank:]]\+/ /g'`
+CONFIGURE_OPTS="\
+	--prefix=%{_prefix} --mandir=%{_mandir} --infodir=%{_infodir} \
+	--with-bugurl=http://bugzilla.redhat.com/bugzilla \
+	--enable-shared --enable-threads=posix --enable-checking=release \
+%ifarch ppc64le
+	--enable-targets=powerpcle-linux --disable-multilib \
+%else
+	--enable-multilib \
+%endif
+	--with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions \
+	--enable-gnu-unique-object \
+	--enable-linker-build-id --with-gcc-major-version-only \
+	--enable-plugin --with-linker-hash-style=gnu \
+	--enable-initfini-array \
+	--disable-libquadmath \
+	--disable-libsanitizer \
+	--disable-libvtv \
+	--disable-libgomp \
+	--disable-libitm \
+	--disable-libssp \
+	--disable-libatomic \
+	--disable-libcilkrts \
+	--without-isl \
+	--disable-libmpx \
+%if 0%{?rhel} >= 7
+%if %{attr_ifunc}
+	--enable-gnu-indirect-function \
+%endif
+%endif
+%ifarch ppc ppc64 ppc64le ppc64p7
+	--enable-secureplt \
+%endif
+%ifarch ppc ppc64 ppc64p7
+%if 0%{?rhel} >= 7
+	--with-cpu-32=power7 --with-tune-32=power7 --with-cpu-64=power7 --with-tune-64=power7 \
+%else
+	--with-cpu-32=power4 --with-tune-32=power6 --with-cpu-64=power4 --with-tune-64=power6 \
+%endif
+%endif
+%ifarch ppc64le
+	--with-cpu-32=power8 --with-tune-32=power8 --with-cpu-64=power8 --with-tune-64=power8 \
+%endif
+%ifarch ppc
+	--build=%{gcc_target_platform} --target=%{gcc_target_platform} --with-cpu=default32
+%endif
+%ifarch %{ix86} x86_64
+	--with-tune=generic \
+%endif
+%ifarch %{ix86}
+	--with-arch=i686 \
+%endif
+%ifarch x86_64
+	--with-arch_32=i686 \
+%endif
+	--build=%{gcc_target_platform} \
+	"
+
+CC="$CC" CXX="$CXX" CFLAGS="$OPT_FLAGS" \
+	CXXFLAGS="`echo " $OPT_FLAGS " | sed 's/ -Wall / /g;s/ -fexceptions / /g' \
+		  | sed 's/ -Wformat-security / -Wformat -Wformat-security /'`" \
+	XCFLAGS="$OPT_FLAGS" TCFLAGS="$OPT_FLAGS" \
+	../configure --enable-bootstrap \
+	--enable-languages=c,c++,lto \
+	$CONFIGURE_OPTS
+
+
+make %{?_smp_mflags} BOOT_CFLAGS="$OPT_FLAGS"
+
+%install
+rm -fr %{buildroot}
+
+%{?scl:PATH=%{_bindir}${PATH:+:${PATH}}}
+mkdir -p %{buildroot}%{_root_prefix}/%{_lib}
+cd obj-%{gcc_target_platform}
+./gcc/xgcc -v 2> %{buildroot}%{_root_prefix}/%{_lib}/README9
+
+cp %{gcc_target_platform}/libstdc++-v3/src/.libs/libstdc++.so.6.0.* %{buildroot}%{_root_prefix}/%{_lib}/compat-sap-c++-%{gcc_version}.so
+cd %{buildroot}%{_root_prefix}/%{_lib}/
+ln -sf compat-sap-c++-%{gcc_version}.so %{buildroot}%{_root_prefix}/%{_lib}/compat-sap-c++-9.so
+
+%check
+cd obj-%{gcc_target_platform}
+
+%{?scl:PATH=%{_bindir}${PATH:+:${PATH}}}
+
+# run the tests.
+make %{?_smp_mflags} -k check RUNTESTFLAGS="--target_board=unix/'{,-fstack-protector}'" || :
+( LC_ALL=C ../contrib/test_summary -t || : ) 2>&1 | sed -n '/^cat.*EOF/,/^EOF/{/^cat.*EOF/d;/^EOF/d;/^LAST_UPDATED:/d;p;}' > testresults
+rm -rf gcc/testsuite.prev
+mv gcc/testsuite{,.prev}
+rm -f gcc/site.exp
+make %{?_smp_mflags} -C gcc -k check-gcc check-g++ ALT_CC_UNDER_TEST=gcc ALT_CXX_UNDER_TEST=g++ RUNTESTFLAGS="--target_board=unix/'{,-fstack-protector}' compat.exp struct-layout-1.exp" || :
+mv gcc/testsuite/gcc/gcc.sum{,.sent}
+mv gcc/testsuite/g++/g++.sum{,.sent}
+( LC_ALL=C ../contrib/test_summary -o -t || : ) 2>&1 | sed -n '/^cat.*EOF/,/^EOF/{/^cat.*EOF/d;/^EOF/d;/^LAST_UPDATED:/d;p;}' > testresults2
+rm -rf gcc/testsuite.compat
+mv gcc/testsuite{,.compat}
+mv gcc/testsuite{.prev,}
+echo ====================TESTING=========================
+cat testresults
+echo ===`gcc --version | head -1` compatibility tests====
+cat testresults2
+echo ====================TESTING END=====================
+mkdir testlogs-%{_target_platform}-%{version}-%{release}
+for i in `find . -name \*.log | grep -F testsuite/ | grep -v 'config.log\|acats.*/tests/'`; do
+  ln $i testlogs-%{_target_platform}-%{version}-%{release}/ || :
+done
+for i in `find gcc/testsuite.compat -name \*.log | grep -v 'config.log\|acats.*/tests/'`; do
+  ln $i testlogs-%{_target_platform}-%{version}-%{release}/`basename $i`.compat || :
+done
+tar cf - testlogs-%{_target_platform}-%{version}-%{release} | bzip2 -9c \
+  | uuencode testlogs-%{_target_platform}.tar.bz2 || :
+rm -rf testlogs-%{_target_platform}-%{version}-%{release}
+
+%clean
+rm -rf %{buildroot}
+
+%files
+%defattr(-,root,root,-)
+%dir %{_root_prefix}
+%dir %{_root_prefix}/%{_lib}
+%{_root_prefix}/%{_lib}/compat-sap-c++-%{gcc_version}.so
+%{_root_prefix}/%{_lib}/compat-sap-c++-9.so
+%{_root_prefix}/%{_lib}/README9
+
+%changelog
+* Tue Jan 14 2020 Marek Polacek <polacek@redhat.com> 9.1.1-2.3
+- use -Wformat in CXXFLAGS (#1729983)
+
+* Fri Jun  7 2019 Marek Polacek <polacek@redhat.com> 9.1.1-2.2
+- bump for rebuild
+
+* Thu Jun  6 2019 Marek Polacek <polacek@redhat.com> 9.1.1-2.1
+- update from Fedora
+
+* Fri May  3 2019 Marek Polacek <polacek@redhat.com> 9.1.1-2.1
+- new package