diff --git a/config/gcc-stl-wrapper.template.h b/config/gcc-stl-wrapper.template.h --- a/config/gcc-stl-wrapper.template.h +++ b/config/gcc-stl-wrapper.template.h @@ -22,21 +22,34 @@ #define NOMINMAX 1 #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 -#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 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. @@ -45,23 +58,8 @@ # 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 -#pragma GCC visibility push(default) -#include_next <${HEADER}> -#pragma GCC visibility pop - // 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 diff --git a/config/make-stl-wrappers.py b/config/make-stl-wrappers.py --- a/config/make-stl-wrappers.py +++ b/config/make-stl-wrappers.py @@ -25,28 +25,26 @@ 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 a/memory/mozalloc/mozalloc.h b/memory/mozalloc/mozalloc.h --- a/memory/mozalloc/mozalloc.h +++ b/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"