From owner-svn-ports-all@freebsd.org Wed Sep 7 21:47:24 2016 Return-Path: Delivered-To: svn-ports-all@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id A894FBD0F2B; Wed, 7 Sep 2016 21:47:24 +0000 (UTC) (envelope-from dim@FreeBSD.org) Received: from repo.freebsd.org (repo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id 7A8308F1; Wed, 7 Sep 2016 21:47:24 +0000 (UTC) (envelope-from dim@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id u87LlNNn090798; Wed, 7 Sep 2016 21:47:23 GMT (envelope-from dim@FreeBSD.org) Received: (from dim@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id u87LlN9U090795; Wed, 7 Sep 2016 21:47:23 GMT (envelope-from dim@FreeBSD.org) Message-Id: <201609072147.u87LlN9U090795@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: dim set sender to dim@FreeBSD.org using -f From: Dimitry Andric Date: Wed, 7 Sep 2016 21:47:23 +0000 (UTC) To: ports-committers@freebsd.org, svn-ports-all@freebsd.org, svn-ports-head@freebsd.org Subject: svn commit: r421523 - head/www/firefox/files X-SVN-Group: ports-head MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-ports-all@freebsd.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: SVN commit messages for the ports tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 07 Sep 2016 21:47:24 -0000 Author: dim (src committer) Date: Wed Sep 7 21:47:23 2016 New Revision: 421523 URL: https://svnweb.freebsd.org/changeset/ports/421523 Log: Make www/firefox build with libc++ 3.9.0, by adding patches for upstream bugs 1245076, 1268816 and, 1269171. Together, these solve a number of problems with Firefox's generated wrapper headers for the C++ standard library. Approved by: jbeich (maintainer) PR: 212431 Added: head/www/firefox/files/patch-bug1245076 (contents, props changed) head/www/firefox/files/patch-bug1268816 (contents, props changed) head/www/firefox/files/patch-bug1269171 (contents, props changed) Added: head/www/firefox/files/patch-bug1245076 ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ head/www/firefox/files/patch-bug1245076 Wed Sep 7 21:47:23 2016 (r421523) @@ -0,0 +1,74 @@ + +# HG changeset patch +# User Mike Hommey +# Date 1457596445 -32400 +# Node ID 55212130f19da3079167a6b0a5a0ed6689c9a71d +# Parent 27c94617d7064d566c24a42e11cd4c7ef725923d +Bug 1245076 - Don't include mozalloc.h from the cstdlib wrapper. r=froydnj + +Our STL wrappers do various different things, one of which is including +mozalloc.h for infallible operator new. mozalloc.h includes stdlib.h, +which, in libstdc++ >= 6 is now itself a wrapper around cstdlib, which +circles back to our STL wrapper. + +But of the things our STL wrappers do, including mozalloc.h is not one +that is necessary for cstdlib. So skip including mozalloc.h in our +cstdlib wrapper. + +Additionally, some C++ sources (in media/mtransport) are including +headers in an extern "C" block, which end up including stdlib.h, which +ends up including cstdlib because really, this is all C++, and our +wrapper pre-includes for mozalloc.h, which fails because templates +don't work inside extern "C". So, don't pre-include when we're not +including mozalloc.h. + + +diff --git config/gcc-stl-wrapper.template.h config/gcc-stl-wrapper.template.h +--- config/gcc-stl-wrapper.template.h ++++ config/gcc-stl-wrapper.template.h +@@ -12,33 +12,40 @@ + // compiling ObjC. + #if defined(__EXCEPTIONS) && __EXCEPTIONS && !(__OBJC__ && __GNUC__ && XP_IOS) + # error "STL code can only be used with -fno-exceptions" + #endif + + // Silence "warning: #include_next is a GCC extension" + #pragma GCC system_header + ++// Don't include mozalloc for cstdlib. See bug 1245076. ++#ifndef moz_dont_include_mozalloc_for_cstdlib ++# define moz_dont_include_mozalloc_for_cstdlib ++#endif ++#ifndef moz_dont_include_mozalloc_for_${HEADER} + // mozalloc.h wants ; break the cycle by always explicitly + // including here. NB: this is a tad sneaky. Sez the gcc docs: + // + // `#include_next' does not distinguish between and "file" + // inclusion, nor does it check that the file you specify has the + // same name as the current file. It simply looks for the file + // named, starting with the directory in the search path after the + // one where the current file was found. +-#include_next ++# include_next + + // See if we're in code that can use mozalloc. NB: this duplicates + // code in nscore.h because nscore.h pulls in prtypes.h, and chromium + // can't build with that being included before base/basictypes.h. +-#if !defined(XPCOM_GLUE) && !defined(NS_NO_XPCOM) && !defined(MOZ_NO_MOZALLOC) +-# include "mozilla/mozalloc.h" +-#else +-# error "STL code can only be used with infallible ::operator new()" ++# if !defined(XPCOM_GLUE) && !defined(NS_NO_XPCOM) && !defined(MOZ_NO_MOZALLOC) ++# include "mozilla/mozalloc.h" ++# else ++# error "STL code can only be used with infallible ::operator new()" ++# endif ++ + #endif + + #if defined(DEBUG) && !defined(_GLIBCXX_DEBUG) + // Enable checked iterators and other goodies + // + // FIXME/bug 551254: gcc's debug STL implementation requires -frtti. + // Figure out how to resolve this with -fno-rtti. Maybe build with + // -frtti in DEBUG builds? Added: head/www/firefox/files/patch-bug1268816 ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ head/www/firefox/files/patch-bug1268816 Wed Sep 7 21:47:23 2016 (r421523) @@ -0,0 +1,151 @@ + +# HG changeset patch +# User Lee Salzman +# Date 1461978185 14400 +# Node ID b622cbd9ba13d01abcb1d04684dcb39c22a08590 +# Parent f3a5c8b5e17073a1e68f079da93f8dbe10e454a9 +Bug 1268816 - allow Skia to use C++11 features on platforms that have them. r=froydnj + +diff --git config/stl-headers config/stl-headers +--- config/stl-headers ++++ config/stl-headers +@@ -29,16 +29,17 @@ iterator + limits + list + map + memory + ostream + set + stack + string ++type_traits + utility + vector + cassert + climits + cmath + cstdarg + cstdio + cstdlib +diff --git config/system-headers config/system-headers +--- config/system-headers ++++ config/system-headers +@@ -1109,16 +1109,17 @@ ThreadManagerTests.h + Threads.h + time.h + Timer.h + tlhelp32.h + ToolUtils.h + tr1/functional + trace.h + Traps.h ++type_traits + typeinfo + types.h + Types.h + UAppleEventsMgr.h + UAttachments.h + ucontext.h + uconv.h + UCursor.h +diff --git gfx/skia/skia/include/config/SkUserConfig.h gfx/skia/skia/include/config/SkUserConfig.h +--- gfx/skia/skia/include/config/SkUserConfig.h ++++ gfx/skia/skia/include/config/SkUserConfig.h +@@ -159,9 +159,20 @@ + #ifndef MOZ_IMPLICIT + # ifdef MOZ_CLANG_PLUGIN + # define MOZ_IMPLICIT __attribute__((annotate("moz_implicit"))) + # else + # define MOZ_IMPLICIT + # endif + #endif + ++/* Check if building with either MSVC, libc++, or a sufficiently recent version of libstdc++. +++ * On platforms like OS X 10.6 or older Android SDKs, we need to work around a lack of certain +++ * C++11 features. +++ */ ++#include "mozilla/Compiler.h" ++#if MOZ_IS_MSVC || MOZ_USING_LIBCXX || MOZ_LIBSTDCXX_VERSION_AT_LEAST(4, 8, 0) ++# define MOZ_SKIA_AVOID_CXX11 0 ++#else ++# define MOZ_SKIA_AVOID_CXX11 1 + #endif ++ ++#endif +diff --git gfx/skia/skia/include/private/SkTLogic.h gfx/skia/skia/include/private/SkTLogic.h +--- gfx/skia/skia/include/private/SkTLogic.h ++++ gfx/skia/skia/include/private/SkTLogic.h +@@ -24,7 +24,7 @@ + #include + #endif + +-#ifdef MOZ_SKIA ++#if MOZ_SKIA_AVOID_CXX11 + #include "mozilla/Move.h" + #include "mozilla/TypeTraits.h" + +@@ -32,23 +32,9 @@ + #include "mozilla/Function.h" + #endif + +-// In libc++, symbols such as std::forward may be defined in std::__1. +-// The _LIBCPP_BEGIN_NAMESPACE_STD and _LIBCPP_END_NAMESPACE_STD macros +-// will expand to the correct namespace. +-#ifdef _LIBCPP_BEGIN_NAMESPACE_STD +-#define MOZ_BEGIN_STD_NAMESPACE _LIBCPP_BEGIN_NAMESPACE_STD +-#define MOZ_END_STD_NAMESPACE _LIBCPP_END_NAMESPACE_STD +-#else +-#define MOZ_BEGIN_STD_NAMESPACE namespace std { +-#define MOZ_END_STD_NAMESPACE } +-#endif +- +-MOZ_BEGIN_STD_NAMESPACE ++namespace std { + using mozilla::Forward; + #define forward Forward +-MOZ_END_STD_NAMESPACE +- +-namespace std { + #if SKIA_IMPLEMENTATION + using mozilla::IntegralConstant; + using mozilla::IsEmpty; +@@ -73,7 +59,7 @@ template usi + + } + +-#else /* !MOZ_SKIA */ ++#else /* !MOZ_SKIA_AVOID_CXX11 */ + + #include + #include +@@ -178,7 +164,7 @@ template using + + } // namespace sknonstd + +-#endif /* MOZ_SKIA */ ++#endif /* MOZ_SKIA_AVOID_CXX11 */ + + // Just a pithier wrapper for enable_if_t. + #define SK_WHEN(condition, T) skstd::enable_if_t +diff --git gfx/skia/skia/include/private/SkUniquePtr.h gfx/skia/skia/include/private/SkUniquePtr.h +--- gfx/skia/skia/include/private/SkUniquePtr.h ++++ gfx/skia/skia/include/private/SkUniquePtr.h +@@ -7,17 +7,17 @@ + + #ifndef SkUniquePtr_DEFINED + #define SkUniquePtr_DEFINED + + #include "SkTLogic.h" + #include + #include + +-#ifdef MOZ_SKIA ++#if MOZ_SKIA_AVOID_CXX11 + #include "mozilla/UniquePtr.h" + + namespace std { + using mozilla::DefaultDelete; + using mozilla::UniquePtr; + } + + namespace skstd { Added: head/www/firefox/files/patch-bug1269171 ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ head/www/firefox/files/patch-bug1269171 Wed Sep 7 21:47:23 2016 (r421523) @@ -0,0 +1,258 @@ + +# HG changeset patch +# User Mike Hommey +# Date 1463557039 -32400 +# Node ID 68da139d0866977c0ada86319fa94388f2255446 +# Parent a640e6fa8ab9977fb6c5bcf63dc4daca6699477b +Bug 1269171 - Change how mozalloc.h is hooked in STL wrappers. r=froydnj + +Since the introduction of the STL wrappers, they have included +mozalloc.h, and multiple times, we've hit header reentrancy problems, +and worked around them as best as we could. + +Taking a step back, all mozalloc.h does is: +- declare moz_* allocator functions. +- define inline implementations of various operator new/delete variants. + +The first only requires the functions to be declared before they are used, +so mozalloc.h only needs to be included before anything that would use +those functions. + +The second doesn't actually require a specific order, as long as the +declaration for those functions comes before their use, and they are +either declared in or implicitly by the C++ compiler. + +So all in all, it doesn't matter that mozalloc.h is included before the +wrapped STL headers. What matters is that it's included when STL headers +are included. So arrange things such that mozalloc.h is included after +the first wrapped STL header is fully preprocessed (and all its includes +have been included). + + +diff --git config/gcc-stl-wrapper.template.h config/gcc-stl-wrapper.template.h +--- config/gcc-stl-wrapper.template.h ++++ config/gcc-stl-wrapper.template.h +@@ -12,56 +12,54 @@ + // compiling ObjC. + #if defined(__EXCEPTIONS) && __EXCEPTIONS && !(__OBJC__ && __GNUC__ && XP_IOS) + # error "STL code can only be used with -fno-exceptions" + #endif + + // Silence "warning: #include_next is a GCC extension" + #pragma GCC system_header + +-// Don't include mozalloc for cstdlib. See bug 1245076. +-#ifndef moz_dont_include_mozalloc_for_cstdlib +-# define moz_dont_include_mozalloc_for_cstdlib +-#endif +-#ifndef moz_dont_include_mozalloc_for_${HEADER} +-// mozalloc.h wants ; break the cycle by always explicitly +-// including here. NB: this is a tad sneaky. Sez the gcc docs: +-// +-// `#include_next' does not distinguish between and "file" +-// inclusion, nor does it check that the file you specify has the +-// same name as the current file. It simply looks for the file +-// named, starting with the directory in the search path after the +-// one where the current file was found. +-# include_next +- +-// See if we're in code that can use mozalloc. NB: this duplicates +-// code in nscore.h because nscore.h pulls in prtypes.h, and chromium +-// can't build with that being included before base/basictypes.h. +-# if !defined(XPCOM_GLUE) && !defined(NS_NO_XPCOM) && !defined(MOZ_NO_MOZALLOC) +-# include "mozilla/mozalloc.h" +-# else +-# error "STL code can only be used with infallible ::operator new()" +-# endif +- +-#endif +- + #if defined(DEBUG) && !defined(_GLIBCXX_DEBUG) + // Enable checked iterators and other goodies + // + // FIXME/bug 551254: gcc's debug STL implementation requires -frtti. + // Figure out how to resolve this with -fno-rtti. Maybe build with + // -frtti in DEBUG builds? + // + // # define _GLIBCXX_DEBUG 1 + #endif + ++// Don't include mozalloc for cstdlib. See bug 1245076. ++#ifndef moz_dont_include_mozalloc_for_cstdlib ++# define moz_dont_include_mozalloc_for_cstdlib ++#endif ++ ++// Include mozalloc after the STL header and all other headers it includes ++// have been preprocessed. ++#if !defined(MOZ_INCLUDE_MOZALLOC_H) && \ ++ !defined(moz_dont_include_mozalloc_for_${HEADER}) ++# define MOZ_INCLUDE_MOZALLOC_H ++# define MOZ_INCLUDE_MOZALLOC_H_FROM_${HEADER} ++#endif ++ + #pragma GCC visibility push(default) + #include_next <${HEADER}> + #pragma GCC visibility pop + ++#ifdef MOZ_INCLUDE_MOZALLOC_H_FROM_${HEADER} ++// See if we're in code that can use mozalloc. NB: this duplicates ++// code in nscore.h because nscore.h pulls in prtypes.h, and chromium ++// can't build with that being included before base/basictypes.h. ++# if !defined(XPCOM_GLUE) && !defined(NS_NO_XPCOM) && !defined(MOZ_NO_MOZALLOC) ++# include "mozilla/mozalloc.h" ++# else ++# error "STL code can only be used with infallible ::operator new()" ++# endif ++#endif ++ + // gcc calls a __throw_*() function from bits/functexcept.h when it + // wants to "throw an exception". functexcept exists nominally to + // support -fno-exceptions, but since we'll always use the system + // libstdc++, and it's compiled with exceptions, then in practice + // these __throw_*() functions will always throw exceptions (shades of + // -fshort-wchar). We don't want that and so define our own inlined + // __throw_*(). + #ifndef mozilla_throw_gcc_h +diff --git config/make-stl-wrappers.py config/make-stl-wrappers.py +--- config/make-stl-wrappers.py ++++ config/make-stl-wrappers.py +@@ -25,28 +25,26 @@ def header_path(header, compiler): + def is_comment(line): + return re.match(r'\s*#.*', line) + + def main(outdir, compiler, template_file, header_list_file): + if not os.path.isdir(outdir): + os.mkdir(outdir) + + template = open(template_file, 'r').read() +- path_to_new = header_path('new', compiler) + + for header in open(header_list_file, 'r'): + header = header.rstrip() + if 0 == len(header) or is_comment(header): + continue + + path = header_path(header, compiler) + with FileAvoidWrite(os.path.join(outdir, header)) as f: + f.write(string.Template(template).substitute(HEADER=header, +- HEADER_PATH=path, +- NEW_HEADER_PATH=path_to_new)) ++ HEADER_PATH=path)) + + + if __name__ == '__main__': + if 5 != len(sys.argv): + print("""Usage: + python {0} OUT_DIR ('msvc'|'gcc') TEMPLATE_FILE HEADER_LIST_FILE + """.format(sys.argv[0]), file=sys.stderr) + sys.exit(1) +diff --git config/msvc-stl-wrapper.template.h config/msvc-stl-wrapper.template.h +--- config/msvc-stl-wrapper.template.h ++++ config/msvc-stl-wrapper.template.h +@@ -3,45 +3,33 @@ + */ + /* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + + #ifndef mozilla_${HEADER}_h + #define mozilla_${HEADER}_h + +-#ifndef MOZ_HAVE_INCLUDED_ALLOC +-#define MOZ_HAVE_INCLUDED_ALLOC +- + #if _HAS_EXCEPTIONS + # error "STL code can only be used with -fno-exceptions" + #endif + ++// Include mozalloc after the STL header and all other headers it includes ++// have been preprocessed. ++#if !defined(MOZ_INCLUDE_MOZALLOC_H) ++# define MOZ_INCLUDE_MOZALLOC_H ++# define MOZ_INCLUDE_MOZALLOC_H_FROM_${HEADER} ++#endif ++ + // Code built with !_HAS_EXCEPTIONS calls std::_Throw(), but the win2k + // CRT doesn't export std::_Throw(). So we define it. + #ifndef mozilla_Throw_h + # include "mozilla/throw_msvc.h" + #endif + +-// Code might include before other wrapped headers, but +-// includes and so we want to wrap it. But mozalloc.h +-// wants also, so we break the cycle by always explicitly +-// including here. +-#include <${NEW_HEADER_PATH}> +- +-// See if we're in code that can use mozalloc. NB: this duplicates +-// code in nscore.h because nscore.h pulls in prtypes.h, and chromium +-// can't build with that being included before base/basictypes.h. +-#if !defined(XPCOM_GLUE) && !defined(NS_NO_XPCOM) && !defined(MOZ_NO_MOZALLOC) +-# include "mozilla/mozalloc.h" +-#else +-# error "STL code can only be used with infallible ::operator new()" +-#endif +-#endif /* MOZ_HAVE_INCLUDED_ALLOC */ +- + #ifdef _DEBUG + // From + // http://msdn.microsoft.com/en-us/library/aa985982%28VS.80%29.aspx + // and + // http://msdn.microsoft.com/en-us/library/aa985965%28VS.80%29.aspx + // there appear to be two types of STL container checking. The + // former is enabled by -D_DEBUG (which is implied by -MDd or -MTd), and + // looks to be full generation/mutation checked iterators as done by +@@ -70,9 +58,20 @@ + // but that's OK because we're not throwing them. + #pragma warning( push ) + #pragma warning( disable : 4275 4530 ) + + #include <${HEADER_PATH}> + + #pragma warning( pop ) + ++#ifdef MOZ_INCLUDE_MOZALLOC_H_FROM_${HEADER} ++// See if we're in code that can use mozalloc. NB: this duplicates ++// code in nscore.h because nscore.h pulls in prtypes.h, and chromium ++// can't build with that being included before base/basictypes.h. ++# if !defined(XPCOM_GLUE) && !defined(NS_NO_XPCOM) && !defined(MOZ_NO_MOZALLOC) ++# include "mozilla/mozalloc.h" ++# else ++# error "STL code can only be used with infallible ::operator new()" ++# endif ++#endif ++ + #endif // if mozilla_${HEADER}_h +diff --git memory/mozalloc/mozalloc.h memory/mozalloc/mozalloc.h +--- memory/mozalloc/mozalloc.h ++++ memory/mozalloc/mozalloc.h +@@ -7,20 +7,27 @@ + + #ifndef mozilla_mozalloc_h + #define mozilla_mozalloc_h + + /* + * https://bugzilla.mozilla.org/show_bug.cgi?id=427099 + */ + +-#include +-#include + #if defined(__cplusplus) + # include ++// Since libstdc++ 6, including the C headers (e.g. stdlib.h) instead of the ++// corresponding C++ header (e.g. cstdlib) can cause confusion in C++ code ++// using things defined there. Specifically, with stdlib.h, the use of abs() ++// in gfx/graphite2/src/inc/UtfCodec.h somehow ends up picking the wrong abs() ++# include ++# include ++#else ++# include ++# include + #endif + + #if defined(__cplusplus) + #include "mozilla/fallible.h" + #include "mozilla/TemplateLib.h" + #endif + #include "mozilla/Attributes.h" + #include "mozilla/Types.h"