From dc139405e14fad16628043d305804226366d17d4 Mon Sep 17 00:00:00 2001 From: Mike Hommey Date: Tue, 19 Nov 2013 13:45:31 +0900 Subject: [PATCH] Bug 938437 - Replace nsStaticXULComponents.cpp with smart use of sections. r=bsmedberg,irc-r=decoder --- toolkit/library/Makefile.in | 51 +--- .../StaticXULComponentsEnd.cpp | 4 + .../library/StaticXULComponentsEnd/moz.build | 11 + toolkit/library/StaticXULComponentsStart.cpp | 4 + toolkit/library/moz.build | 2 +- toolkit/library/nsStaticXULComponents.cpp | 267 ------------------ toolkit/toolkit.mozbuild | 1 + xpcom/components/Module.h | 17 +- xpcom/components/nsComponentManager.cpp | 20 +- 9 files changed, 51 insertions(+), 326 deletions(-) create mode 100644 toolkit/library/StaticXULComponentsEnd/StaticXULComponentsEnd.cpp create mode 100644 toolkit/library/StaticXULComponentsEnd/moz.build create mode 100644 toolkit/library/StaticXULComponentsStart.cpp delete mode 100644 toolkit/library/nsStaticXULComponents.cpp diff --git a/toolkit/library/Makefile.in b/toolkit/library/Makefile.in index 02c7eefa553e..9de89a088ae0 100644 --- a/toolkit/library/Makefile.in +++ b/toolkit/library/Makefile.in @@ -69,49 +69,6 @@ endif endif # component libraries -ifdef MOZ_JSDEBUGGER -DEFINES += -DMOZ_JSDEBUGGER -endif - -ifdef MOZ_PREF_EXTENSIONS -DEFINES += -DMOZ_PREF_EXTENSIONS -endif - -ifdef MOZ_AUTH_EXTENSION -DEFINES += -DMOZ_AUTH_EXTENSION -endif - -ifdef MOZ_PERMISSIONS -DEFINES += -DMOZ_PERMISSIONS -endif - -ifdef MOZ_UNIVERSALCHARDET -DEFINES += -DMOZ_UNIVERSALCHARDET -endif - -ifeq (,$(filter android gonk qt os2 cocoa windows,$(MOZ_WIDGET_TOOLKIT))) -ifdef MOZ_XUL -DEFINES += -DMOZ_FILEVIEW -endif -endif - -# Platform-specific icon channel stuff - supported mostly-everywhere -ifneq (,$(filter windows os2 mac cocoa gtk2 gtk3 qt android,$(MOZ_WIDGET_TOOLKIT))) -DEFINES += -DICON_DECODER -endif - -ifdef MOZ_SPELLCHECK -DEFINES += -DMOZ_SPELLCHECK -endif - -ifdef MOZ_ZIPWRITER -DEFINES += -DMOZ_ZIPWRITER -endif - -ifdef MOZ_GIO_COMPONENT -DEFINES += -DMOZ_GIO_COMPONENT -endif - ifdef MOZ_APP_COMPONENT_LIBS COMPONENT_LIBS += $(MOZ_APP_COMPONENT_LIBS) endif @@ -400,12 +357,6 @@ ifeq ($(MOZ_WIDGET_TOOLKIT),windows) OS_LIBS += $(call EXPAND_LIBNAME,usp10 oleaut32) endif -ifdef MOZ_DEBUG -ifdef ENABLE_TESTS -DEFINES += -DENABLE_LAYOUTDEBUG -endif -endif - ifeq (WINNT_1,$(OS_TARGET)_$(MOZ_PROFILE_USE)) # Wrap linker to measure peak virtual memory usage. LD := $(PYTHON) $(topsrcdir)/build/link.py $(CURDIR)/linker-vsize $(LD) @@ -444,3 +395,5 @@ endif $(FINAL_TARGET)/dependentlibs.list: dependentlibs.py $(SHARED_LIBRARY) $(wildcard $(if $(wildcard $(FINAL_TARGET)/dependentlibs.list),$(addprefix $(FINAL_TARGET)/,$(shell cat $(FINAL_TARGET)/dependentlibs.list)))) $(PYTHON) $< $(SHARED_LIBRARY) -L $(FINAL_TARGET) $(if $(TOOLCHAIN_PREFIX),$(addprefix -p ,$(TOOLCHAIN_PREFIX))) > $@ + +EXTRA_DSO_LDOPTS += $(call EXPAND_LIBNAME_PATH,StaticXULComponentsEnd,$(CURDIR)/StaticXULComponentsEnd) diff --git a/toolkit/library/StaticXULComponentsEnd/StaticXULComponentsEnd.cpp b/toolkit/library/StaticXULComponentsEnd/StaticXULComponentsEnd.cpp new file mode 100644 index 000000000000..015f8865df4b --- /dev/null +++ b/toolkit/library/StaticXULComponentsEnd/StaticXULComponentsEnd.cpp @@ -0,0 +1,4 @@ +#include "mozilla/Module.h" +#include "mozilla/NullPtr.h" + +NSMODULE_DEFN(end_kPStaticModules) = nullptr; diff --git a/toolkit/library/StaticXULComponentsEnd/moz.build b/toolkit/library/StaticXULComponentsEnd/moz.build new file mode 100644 index 000000000000..493bb7721e0e --- /dev/null +++ b/toolkit/library/StaticXULComponentsEnd/moz.build @@ -0,0 +1,11 @@ +# 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/. + +SOURCES += [ + 'StaticXULComponentsEnd.cpp', +] + +LIBRARY_NAME = 'StaticXULComponentsEnd' + +LIBXUL_LIBRARY = True diff --git a/toolkit/library/StaticXULComponentsStart.cpp b/toolkit/library/StaticXULComponentsStart.cpp new file mode 100644 index 000000000000..dc24b589459e --- /dev/null +++ b/toolkit/library/StaticXULComponentsStart.cpp @@ -0,0 +1,4 @@ +#include "mozilla/Module.h" +#include "mozilla/NullPtr.h" + +NSMODULE_DEFN(start_kPStaticModules) = nullptr; diff --git a/toolkit/library/moz.build b/toolkit/library/moz.build index b20253bfd391..435ef159f6b3 100644 --- a/toolkit/library/moz.build +++ b/toolkit/library/moz.build @@ -10,7 +10,7 @@ if CONFIG['MOZ_METRO'] and CONFIG['OS_ARCH'] == 'WINNT': LIBRARY_NAME = 'xul' SOURCES += [ - 'nsStaticXULComponents.cpp', + 'StaticXULComponentsStart.cpp', ] if CONFIG['OS_ARCH'] == 'WINNT': diff --git a/toolkit/library/nsStaticXULComponents.cpp b/toolkit/library/nsStaticXULComponents.cpp deleted file mode 100644 index ddc0699ec365..000000000000 --- a/toolkit/library/nsStaticXULComponents.cpp +++ /dev/null @@ -1,267 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/* 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/. */ - -#include "mozilla/Module.h" -#include "nsXPCOM.h" -#include "nsMemory.h" - -#ifdef MOZ_AUTH_EXTENSION -#define AUTH_MODULE MODULE(nsAuthModule) -#else -#define AUTH_MODULE -#endif - -#ifdef MOZ_PERMISSIONS -#define PERMISSIONS_MODULES \ - MODULE(nsCookieModule) \ - MODULE(nsPermissionsModule) -#else -#define PERMISSIONS_MODULES -#endif - -#ifdef MOZ_UNIVERSALCHARDET -#define UNIVERSALCHARDET_MODULE MODULE(nsUniversalCharDetModule) -#else -#define UNIVERSALCHARDET_MODULE -#endif - -#ifdef XP_WIN -# define WIDGET_MODULES MODULE(nsWidgetModule) -#elif defined(XP_MACOSX) -# define WIDGET_MODULES MODULE(nsWidgetMacModule) -#elif defined(XP_OS2) -# define WIDGET_MODULES MODULE(nsWidgetOS2Module) -#elif defined(MOZ_WIDGET_GTK) -# define WIDGET_MODULES MODULE(nsWidgetGtk2Module) -#elif defined(MOZ_WIDGET_QT) -# define WIDGET_MODULES MODULE(nsWidgetQtModule) -#elif defined(MOZ_WIDGET_ANDROID) -# define WIDGET_MODULES MODULE(nsWidgetAndroidModule) -#elif defined(MOZ_WIDGET_GONK) -# define WIDGET_MODULES MODULE(nsWidgetGonkModule) -#else -# error Unknown widget module. -#endif - -#ifdef ICON_DECODER -#define ICON_MODULE MODULE(nsIconDecoderModule) -#else -#define ICON_MODULE -#endif - -#ifdef MOZ_ENABLE_XREMOTE -#define XREMOTE_MODULES MODULE(RemoteServiceModule) -#else -#define XREMOTE_MODULES -#endif - -#ifdef MOZ_PREF_EXTENSIONS -#define SYSTEMPREF_MODULES MODULE(nsAutoConfigModule) -#else -#define SYSTEMPREF_MODULES -#endif - -#ifdef ENABLE_LAYOUTDEBUG -#define LAYOUT_DEBUG_MODULE MODULE(nsLayoutDebugModule) -#else -#define LAYOUT_DEBUG_MODULE -#endif - -#ifdef MOZ_JSDEBUGGER -#define JSDEBUGGER_MODULES \ - MODULE(JavaScript_Debugger) -#else -#define JSDEBUGGER_MODULES -#endif - -#if defined(MOZ_FILEVIEW) && defined(MOZ_XUL) -#define FILEVIEW_MODULE MODULE(nsFileViewModule) -#else -#define FILEVIEW_MODULE -#endif - -#ifdef MOZ_ZIPWRITER -#define ZIPWRITER_MODULE MODULE(ZipWriterModule) -#else -#define ZIPWRITER_MODULE -#endif - -#ifdef MOZ_PLACES -#define PLACES_MODULES \ - MODULE(nsPlacesModule) -#else -#define PLACES_MODULES -#endif - -#ifdef MOZ_XUL -#define XULENABLED_MODULES \ - MODULE(tkAutoCompleteModule) \ - MODULE(satchel) \ - MODULE(PKI) -#else -#define XULENABLED_MODULES -#endif - -#ifdef MOZ_SPELLCHECK -#define SPELLCHECK_MODULE MODULE(mozSpellCheckerModule) -#else -#define SPELLCHECK_MODULE -#endif - -#ifdef MOZ_XUL -#ifdef MOZ_WIDGET_GTK -#define UNIXPROXY_MODULE MODULE(nsUnixProxyModule) -#endif -#if defined(MOZ_WIDGET_QT) -#define UNIXPROXY_MODULE MODULE(nsUnixProxyModule) -#endif -#endif -#ifndef UNIXPROXY_MODULE -#define UNIXPROXY_MODULE -#endif - -#if defined(XP_MACOSX) -#define OSXPROXY_MODULE MODULE(nsOSXProxyModule) -#else -#define OSXPROXY_MODULE -#endif - -#if defined(XP_WIN) -#define WINDOWSPROXY_MODULE MODULE(nsWindowsProxyModule) -#else -#define WINDOWSPROXY_MODULE -#endif - -#if defined(MOZ_WIDGET_ANDROID) -#define ANDROIDPROXY_MODULE MODULE(nsAndroidProxyModule) -#else -#define ANDROIDPROXY_MODULE -#endif - -#if defined(BUILD_CTYPES) -#define JSCTYPES_MODULE MODULE(jsctypes) -#else -#define JSCTYPES_MODULE -#endif - -#ifndef MOZ_APP_COMPONENT_MODULES -#if defined(MOZ_APP_COMPONENT_INCLUDE) -#include MOZ_APP_COMPONENT_INCLUDE -#define MOZ_APP_COMPONENT_MODULES APP_COMPONENT_MODULES -#else -#define MOZ_APP_COMPONENT_MODULES -#endif -#endif - -#if defined(MOZ_ENABLE_PROFILER_SPS) -#define PROFILER_MODULE MODULE(nsProfilerModule) -#else -#define PROFILER_MODULE -#endif - -#if defined(MOZ_WEBRTC) -#define PEERCONNECTION_MODULE MODULE(peerconnection) -#else -#define PEERCONNECTION_MODULE -#endif - -#if defined(MOZ_GIO_COMPONENT) -#define GIO_MODULE MODULE(nsGIOModule) -#else -#define GIO_MODULE -#endif - -#if defined(MOZ_SYNTH_PICO) -#define SYNTH_PICO_MODULE MODULE(synthpico) -#else -#define SYNTH_PICO_MODULE -#endif - -#define XUL_MODULES \ - MODULE(nsUConvModule) \ - MODULE(nsI18nModule) \ - MODULE(nsChardetModule) \ - UNIVERSALCHARDET_MODULE \ - MODULE(necko) \ - PERMISSIONS_MODULES \ - AUTH_MODULE \ - MODULE(nsJarModule) \ - ZIPWRITER_MODULE \ - MODULE(StartupCacheModule) \ - MODULE(nsPrefModule) \ - MODULE(nsRDFModule) \ - MODULE(nsWindowDataSourceModule) \ - MODULE(nsParserModule) \ - MODULE(nsImageLib2Module) \ - MODULE(nsMediaSnifferModule) \ - MODULE(nsGfxModule) \ - PROFILER_MODULE \ - WIDGET_MODULES \ - ICON_MODULE \ - MODULE(nsPluginModule) \ - MODULE(nsLayoutModule) \ - MODULE(docshell_provider) \ - MODULE(embedcomponents) \ - MODULE(Browser_Embedding_Module) \ - MODULE(appshell) \ - MODULE(nsTransactionManagerModule) \ - MODULE(nsComposerModule) \ - MODULE(application) \ - MODULE(Apprunner) \ - MODULE(CommandLineModule) \ - FILEVIEW_MODULE \ - MODULE(mozStorageModule) \ - PLACES_MODULES \ - XULENABLED_MODULES \ - MODULE(nsToolkitCompsModule) \ - XREMOTE_MODULES \ - JSDEBUGGER_MODULES \ - MODULE(BOOT) \ - MODULE(NSS) \ - SYSTEMPREF_MODULES \ - SPELLCHECK_MODULE \ - LAYOUT_DEBUG_MODULE \ - UNIXPROXY_MODULE \ - OSXPROXY_MODULE \ - WINDOWSPROXY_MODULE \ - ANDROIDPROXY_MODULE \ - JSCTYPES_MODULE \ - MODULE(jsreflect) \ - MODULE(jsperf) \ - MODULE(identity) \ - MODULE(nsServicesCryptoModule) \ - MOZ_APP_COMPONENT_MODULES \ - MODULE(nsTelemetryModule) \ - MODULE(jsinspector) \ - MODULE(jsdebugger) \ - PEERCONNECTION_MODULE \ - GIO_MODULE \ - SYNTH_PICO_MODULE \ - MODULE(DiskSpaceWatcherModule) \ - /* end of list */ - -#define MODULE(_name) \ - NSMODULE_DECL(_name); - -XUL_MODULES - -#ifdef MOZ_WIDGET_GONK -MODULE(WifiProxyServiceModule) -#endif - -#undef MODULE - -#define MODULE(_name) \ - &NSMODULE_NAME(_name), - -extern const mozilla::Module *const *const kPStaticModules[] = { - XUL_MODULES -#ifdef MOZ_WIDGET_GONK -MODULE(WifiProxyServiceModule) -#endif - nullptr -}; - -#undef MODULE diff --git a/toolkit/toolkit.mozbuild b/toolkit/toolkit.mozbuild index 1bfbee8e53a9..bb4215a6a811 100644 --- a/toolkit/toolkit.mozbuild +++ b/toolkit/toolkit.mozbuild @@ -161,6 +161,7 @@ if CONFIG['MOZ_GIO_COMPONENT']: add_tier_dir('platform', app_libxul_dirs) add_tier_dir('platform', app_libxul_static_dirs, static=True) +add_tier_dir('platform', 'toolkit/library/StaticXULComponentsEnd') add_tier_dir('platform', 'toolkit/library') if CONFIG['MOZ_REPLACE_MALLOC']: diff --git a/xpcom/components/Module.h b/xpcom/components/Module.h index 27449291b13e..c6fa5f600ab6 100644 --- a/xpcom/components/Module.h +++ b/xpcom/components/Module.h @@ -105,8 +105,21 @@ struct Module #if defined(MOZILLA_INTERNAL_API) # define NSMODULE_NAME(_name) _name##_NSModule -# define NSMODULE_DECL(_name) extern mozilla::Module const *const NSMODULE_NAME(_name) -# define NSMODULE_DEFN(_name) NSMODULE_DECL(_name) +# if defined(_MSC_VER) +# pragma section(".kPStaticModules", read) +# pragma comment(linker, "/merge:.kPStaticModules=.rdata") +# define NSMODULE_SECTION __declspec(allocate(".kPStaticModules")) +# elif defined(__GNUC__) +# if defined(__ELF__) +# define NSMODULE_SECTION __attribute__((section(".kPStaticModules"), visibility("protected"))) +# elif defined(__MACH__) +# define NSMODULE_SECTION __attribute__((section("__DATA, .kPStaticModules"), visibility("default"))) +# endif +# endif +# if !defined(NSMODULE_SECTION) +# error Do not know how to define sections. +# endif +# define NSMODULE_DEFN(_name) extern NSMODULE_SECTION mozilla::Module const *const NSMODULE_NAME(_name) #else # define NSMODULE_NAME(_name) NSModule # define NSMODULE_DEFN(_name) extern "C" NS_EXPORT mozilla::Module const *const NSModule diff --git a/xpcom/components/nsComponentManager.cpp b/xpcom/components/nsComponentManager.cpp index b8b908be994d..f81f59a0d1da 100644 --- a/xpcom/components/nsComponentManager.cpp +++ b/xpcom/components/nsComponentManager.cpp @@ -79,10 +79,6 @@ using namespace mozilla; PRLogModuleInfo* nsComponentManagerLog = nullptr; -// defined in nsStaticXULComponents.cpp to contain all the components in -// libxul. -extern mozilla::Module const *const *const kPStaticModules[]; - #if 0 || defined (DEBUG_timeless) #define SHOW_DENIED_ON_SHUTDOWN #define SHOW_CI_ON_EXISTING_SERVICE @@ -322,6 +318,15 @@ nsComponentManagerImpl::nsComponentManagerImpl() nsTArray* nsComponentManagerImpl::sStaticModules; +NSMODULE_DEFN(start_kPStaticModules); +NSMODULE_DEFN(end_kPStaticModules); + +/* The content between start_kPStaticModules and end_kPStaticModules is gathered + * by the linker from various objects containing symbols in a specific section. + * ASAN considers (rightfully) the use of this content as a global buffer + * overflow. But this is a deliberate and well-considered choice, with no proper + * way to make ASAN happy. */ +MOZ_ASAN_BLACKLIST /* static */ void nsComponentManagerImpl::InitializeStaticModules() { @@ -329,9 +334,10 @@ nsComponentManagerImpl::InitializeStaticModules() return; sStaticModules = new nsTArray; - for (const mozilla::Module *const *const *staticModules = kPStaticModules; - *staticModules; ++staticModules) - sStaticModules->AppendElement(**staticModules); + for (const mozilla::Module *const *staticModules = &NSMODULE_NAME(start_kPStaticModules) + 1; + staticModules < &NSMODULE_NAME(end_kPStaticModules); ++staticModules) + if (*staticModules) // ASAN adds padding + sStaticModules->AppendElement(*staticModules); } nsTArray*