diff options
author | Dan Gohman <gohman@apple.com> | 2008-03-21 23:38:23 +0000 |
---|---|---|
committer | Dan Gohman <gohman@apple.com> | 2008-03-21 23:38:23 +0000 |
commit | 5bf51082ad699182d0333d5df42473a58f837507 (patch) | |
tree | 9c8a36e34af92cf6fa2eadf89a437f11c436c142 /include/llvm/System | |
parent | d0627015cec0b75f7044b7aef28f6e802e0f4648 (diff) | |
download | external_llvm-5bf51082ad699182d0333d5df42473a58f837507.zip external_llvm-5bf51082ad699182d0333d5df42473a58f837507.tar.gz external_llvm-5bf51082ad699182d0333d5df42473a58f837507.tar.bz2 |
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
Diffstat (limited to 'include/llvm/System')
-rw-r--r-- | include/llvm/System/IncludeFile.h | 21 |
1 files changed, 17 insertions, 4 deletions
diff --git a/include/llvm/System/IncludeFile.h b/include/llvm/System/IncludeFile.h index 7617373..6103e44 100644 --- a/include/llvm/System/IncludeFile.h +++ b/include/llvm/System/IncludeFile.h @@ -26,16 +26,29 @@ /// /// And, foo.cp would use:<br/> /// <tt>DEFINING_FILE_FOR(foo)</tt><br/> +#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 { /// <tt>static IncludeFile LinkMyModule(&LinkMyCodeStub);</tt><br/> /// @brief Class to ensure linking of corresponding object file. struct IncludeFile { - IncludeFile(void *); + explicit IncludeFile(const void *); }; } |