From fbee880cfbf4e63d6d2ad5c71c85ff8ead2074c4 Mon Sep 17 00:00:00 2001 From: Dan Gohman Date: Fri, 21 Mar 2008 23:38:23 +0000 Subject: [PATCH] Specialize FORCE_DEFINING_FILE_TO_BE_LINKED using a GCC trick to avoid using constructor calls for static objects. This reduces the number of objects requiring static constructors in a typical LLVM build by around 20%. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@48665 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/System/IncludeFile.h | 21 +++++++++++++++++---- lib/System/IncludeFile.cpp | 2 +- 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/include/llvm/System/IncludeFile.h b/include/llvm/System/IncludeFile.h index 7617373ad19..6103e44e4cf 100644 --- a/include/llvm/System/IncludeFile.h +++ b/include/llvm/System/IncludeFile.h @@ -26,16 +26,29 @@ /// /// And, foo.cp would use:
/// DEFINING_FILE_FOR(foo)
+#ifdef __GNUC__ +// If the `used' attribute is available, use it to create a variable +// with an initializer that will force the linking of the defining file. #define FORCE_DEFINING_FILE_TO_BE_LINKED(name) \ namespace llvm { \ - extern char name ## LinkVar; \ - static IncludeFile name ## LinkObj ( &name ## LinkVar ); \ + extern const char name ## LinkVar; \ + __attribute__((used)) static const char *const name ## LinkObj = \ + &name ## LinkVar; \ } +#else +// Otherwise use a constructor call. +#define FORCE_DEFINING_FILE_TO_BE_LINKED(name) \ + namespace llvm { \ + extern const char name ## LinkVar; \ + static const IncludeFile name ## LinkObj ( &name ## LinkVar ); \ + } +#endif /// This macro is the counterpart to FORCE_DEFINING_FILE_TO_BE_LINKED. It should /// be used in a .cpp file to define the name referenced in a header file that /// will cause linkage of the .cpp file. It should only be used at extern level. -#define DEFINING_FILE_FOR(name) namespace llvm { char name ## LinkVar; } +#define DEFINING_FILE_FOR(name) \ + namespace llvm { const char name ## LinkVar = 0; } namespace llvm { @@ -57,7 +70,7 @@ namespace llvm { /// static IncludeFile LinkMyModule(&LinkMyCodeStub);
/// @brief Class to ensure linking of corresponding object file. struct IncludeFile { - IncludeFile(void *); + explicit IncludeFile(const void *); }; } diff --git a/lib/System/IncludeFile.cpp b/lib/System/IncludeFile.cpp index d927e159591..8258d40326f 100644 --- a/lib/System/IncludeFile.cpp +++ b/lib/System/IncludeFile.cpp @@ -17,4 +17,4 @@ using namespace llvm; // This constructor is used to ensure linking of other modules. See the // llvm/System/IncludeFile.h header for details. -IncludeFile::IncludeFile(void*) {} +IncludeFile::IncludeFile(const void*) {}