diff options
| author | Benjamin Kramer <benny.kra@googlemail.com> | 2017-05-29 20:56:27 +0000 |
|---|---|---|
| committer | Benjamin Kramer <benny.kra@googlemail.com> | 2017-05-29 20:56:27 +0000 |
| commit | 74de08031f5d31da055eead7af9e22411cd794b4 (patch) | |
| tree | fa73f0680d9c31dd171d0ae574b5175b49dba266 | |
| parent | af66659d6b6431b784c02f9ce6433062cc97c96c (diff) | |
| download | bcm5719-llvm-74de08031f5d31da055eead7af9e22411cd794b4.tar.gz bcm5719-llvm-74de08031f5d31da055eead7af9e22411cd794b4.zip | |
[ManagedStatic] Avoid putting function pointers in template args.
This is super awkward, but GCC doesn't let us have template visible when
an argument is an inline function and -fvisibility-inlines-hidden is
used.
llvm-svn: 304175
| -rw-r--r-- | llvm/include/llvm/Support/ManagedStatic.h | 12 | ||||
| -rw-r--r-- | llvm/lib/Support/Timer.cpp | 8 | ||||
| -rw-r--r-- | llvm/unittests/Support/ManagedStatic.cpp | 17 |
3 files changed, 23 insertions, 14 deletions
diff --git a/llvm/include/llvm/Support/ManagedStatic.h b/llvm/include/llvm/Support/ManagedStatic.h index 9e193c1a469..b4bf3210cc7 100644 --- a/llvm/include/llvm/Support/ManagedStatic.h +++ b/llvm/include/llvm/Support/ManagedStatic.h @@ -20,7 +20,9 @@ namespace llvm { /// object_creator - Helper method for ManagedStatic. -template <class C> void *object_creator() { return new C(); } +template <class C> struct object_creator { + static void *call() { return new C(); } +}; /// object_deleter - Helper method for ManagedStatic. /// @@ -54,15 +56,15 @@ public: /// libraries that link in LLVM components) and for making destruction be /// explicit through the llvm_shutdown() function call. /// -template <class C, void *(*Creator)() = object_creator<C>, - void (*Deleter)(void *) = object_deleter<C>::call> +template <class C, class Creator = object_creator<C>, + class Deleter = object_deleter<C>> class ManagedStatic : public ManagedStaticBase { public: // Accessors. C &operator*() { void *Tmp = Ptr.load(std::memory_order_acquire); if (!Tmp) - RegisterManagedStatic(Creator, Deleter); + RegisterManagedStatic(Creator::call, Deleter::call); return *static_cast<C *>(Ptr.load(std::memory_order_relaxed)); } @@ -72,7 +74,7 @@ public: const C &operator*() const { void *Tmp = Ptr.load(std::memory_order_acquire); if (!Tmp) - RegisterManagedStatic(Creator, Deleter); + RegisterManagedStatic(Creator::call, Deleter::call); return *static_cast<C *>(Ptr.load(std::memory_order_relaxed)); } diff --git a/llvm/lib/Support/Timer.cpp b/llvm/lib/Support/Timer.cpp index ddcb057218d..dec6baf7bf4 100644 --- a/llvm/lib/Support/Timer.cpp +++ b/llvm/lib/Support/Timer.cpp @@ -73,9 +73,11 @@ std::unique_ptr<raw_fd_ostream> llvm::CreateInfoOutputFile() { } namespace { -void *CreateDefaultTimerGroup() { - return new TimerGroup("misc", "Miscellaneous Ungrouped Timers"); -} +struct CreateDefaultTimerGroup { + static void *call() { + return new TimerGroup("misc", "Miscellaneous Ungrouped Timers"); + } +}; } // namespace static ManagedStatic<TimerGroup, CreateDefaultTimerGroup> DefaultTimerGroup; static TimerGroup *getDefaultTimerGroup() { return &*DefaultTimerGroup; } diff --git a/llvm/unittests/Support/ManagedStatic.cpp b/llvm/unittests/Support/ManagedStatic.cpp index 96f9e92c6e0..4e2e93036a8 100644 --- a/llvm/unittests/Support/ManagedStatic.cpp +++ b/llvm/unittests/Support/ManagedStatic.cpp @@ -82,12 +82,17 @@ TEST(ManagedStaticTest, NestedStatics) { } // namespace NestedStatics namespace CustomCreatorDeletor { -void *CustomCreate() { - void *Mem = std::malloc(sizeof(int)); - *((int *)Mem) = 42; - return Mem; -} -static ManagedStatic<int, CustomCreate, std::free> Custom; +struct CustomCreate { + static void *call() { + void *Mem = std::malloc(sizeof(int)); + *((int *)Mem) = 42; + return Mem; + } +}; +struct CustomDelete { + static void call(void *P) { std::free(P); } +}; +static ManagedStatic<int, CustomCreate, CustomDelete> Custom; TEST(ManagedStaticTest, CustomCreatorDeletor) { EXPECT_EQ(42, *Custom); } |

