[lld] r234631 - [Mips] Use std::call_once for thread safe initialization

Simon Atanasyan simon at atanasyan.com
Fri Apr 10 13:55:04 PDT 2015


Author: atanasyan
Date: Fri Apr 10 15:55:04 2015
New Revision: 234631

URL: http://llvm.org/viewvc/llvm-project?rev=234631&view=rev
Log:
[Mips] Use std::call_once for thread safe initialization

The commit is inspired by r234628. Thanks Rui for the idea.

Modified:
    lld/trunk/lib/ReaderWriter/ELF/Mips/MipsTargetHandler.h

Modified: lld/trunk/lib/ReaderWriter/ELF/Mips/MipsTargetHandler.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/Mips/MipsTargetHandler.h?rev=234631&r1=234630&r2=234631&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/ELF/Mips/MipsTargetHandler.h (original)
+++ lld/trunk/lib/ReaderWriter/ELF/Mips/MipsTargetHandler.h Fri Apr 10 15:55:04 2015
@@ -49,16 +49,17 @@ public:
 
   /// \brief Get '_gp' symbol atom layout.
   AtomLayout *getGP() {
-    if (!_gpAtom.hasValue())
-      _gpAtom = this->findAbsoluteAtom("_gp");
-    return *_gpAtom;
+    std::call_once(_gpOnce,
+                   [this]() { _gpAtom = this->findAbsoluteAtom("_gp"); });
+    return _gpAtom;
   }
 
   /// \brief Get '_gp_disp' symbol atom layout.
   AtomLayout *getGPDisp() {
-    if (!_gpDispAtom.hasValue())
+    std::call_once(_gpDispOnce, [this]() {
       _gpDispAtom = this->findAbsoluteAtom("_gp_disp");
-    return *_gpDispAtom;
+    });
+    return _gpDispAtom;
   }
 
   /// \brief Return the section order for a input section
@@ -82,8 +83,10 @@ protected:
 private:
   MipsGOTSection<ELFT> *_gotSection;
   MipsPLTSection<ELFT> *_pltSection;
-  llvm::Optional<AtomLayout *> _gpAtom;
-  llvm::Optional<AtomLayout *> _gpDispAtom;
+  AtomLayout *_gpAtom = nullptr;
+  AtomLayout *_gpDispAtom = nullptr;
+  std::once_flag _gpOnce;
+  std::once_flag _gpDispOnce;
 };
 
 /// \brief TargetHandler for Mips





More information about the llvm-commits mailing list