<div dir="ltr"><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Fri, Nov 5, 2021 at 3:29 AM Vitaly Buka via llvm-commits <<a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><br>
Author: Vitaly Buka<br>
Date: 2021-11-04T19:29:06-07:00<br>
New Revision: 1caabbef8e8e73b3dd0cf1f15cf7417d75b7621c<br>
<br>
URL: <a href="https://github.com/llvm/llvm-project/commit/1caabbef8e8e73b3dd0cf1f15cf7417d75b7621c" rel="noreferrer" target="_blank">https://github.com/llvm/llvm-project/commit/1caabbef8e8e73b3dd0cf1f15cf7417d75b7621c</a><br>
DIFF: <a href="https://github.com/llvm/llvm-project/commit/1caabbef8e8e73b3dd0cf1f15cf7417d75b7621c.diff" rel="noreferrer" target="_blank">https://github.com/llvm/llvm-project/commit/1caabbef8e8e73b3dd0cf1f15cf7417d75b7621c.diff</a><br>
<br>
LOG: [OpaquePtr] Fix initialization-order-fiasco<br>
<br>
Asan detects it after D112732.<br></blockquote><div> </div><div>Can you please explain why this change is needed? (It would have been nice if that explanation was part of the commit message...)<br></div><div><br></div><div>Why do we now have both enableOpaquePointers() and setOpaquePointers(), as well as supportsTypedPointers() and getOpaquePointers()? These method pairs look redundant to me.<br></div><div><br></div><div>Regards,</div><div>Nikita</div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">

Added: <br>
<br>
<br>
Modified: <br>
    llvm/lib/IR/LLVMContext.cpp<br>
    llvm/lib/IR/LLVMContextImpl.cpp<br>
    llvm/lib/IR/LLVMContextImpl.h<br>
    llvm/lib/IR/Type.cpp<br>
<br>
Removed: <br>
<br>
<br>
<br>
################################################################################<br>
diff  --git a/llvm/lib/IR/LLVMContext.cpp b/llvm/lib/IR/LLVMContext.cpp<br>
index dce5d17c9eea..90716d9c81a6 100644<br>
--- a/llvm/lib/IR/LLVMContext.cpp<br>
+++ b/llvm/lib/IR/LLVMContext.cpp<br>
@@ -351,9 +351,9 @@ std::unique_ptr<DiagnosticHandler> LLVMContext::getDiagnosticHandler() {<br>
 void LLVMContext::enableOpaquePointers() const {<br>
   assert(pImpl->PointerTypes.empty() && pImpl->ASPointerTypes.empty() &&<br>
          "Must be called before creating any pointer types");<br>
-  pImpl->OpaquePointers = true;<br>
+  pImpl->setOpaquePointers(true);<br>
 }<br>
<br>
 bool LLVMContext::supportsTypedPointers() const {<br>
-  return !pImpl->OpaquePointers;<br>
+  return !pImpl->getOpaquePointers();<br>
 }<br>
<br>
diff  --git a/llvm/lib/IR/LLVMContextImpl.cpp b/llvm/lib/IR/LLVMContextImpl.cpp<br>
index 068bc58b6796..ebbf382aea38 100644<br>
--- a/llvm/lib/IR/LLVMContextImpl.cpp<br>
+++ b/llvm/lib/IR/LLVMContextImpl.cpp<br>
@@ -35,8 +35,7 @@ LLVMContextImpl::LLVMContextImpl(LLVMContext &C)<br>
       X86_FP80Ty(C, Type::X86_FP80TyID), FP128Ty(C, Type::FP128TyID),<br>
       PPC_FP128Ty(C, Type::PPC_FP128TyID), X86_MMXTy(C, Type::X86_MMXTyID),<br>
       X86_AMXTy(C, Type::X86_AMXTyID), Int1Ty(C, 1), Int8Ty(C, 8),<br>
-      Int16Ty(C, 16), Int32Ty(C, 32), Int64Ty(C, 64), Int128Ty(C, 128),<br>
-      OpaquePointers(OpaquePointersCL) {}<br>
+      Int16Ty(C, 16), Int32Ty(C, 32), Int64Ty(C, 64), Int128Ty(C, 128) {}<br>
<br>
 LLVMContextImpl::~LLVMContextImpl() {<br>
   // NOTE: We need to delete the contents of OwnedModules, but Module's dtor<br>
@@ -233,3 +232,11 @@ OptPassGate &LLVMContextImpl::getOptPassGate() const {<br>
 void LLVMContextImpl::setOptPassGate(OptPassGate& OPG) {<br>
   this->OPG = &OPG;<br>
 }<br>
+<br>
+bool LLVMContextImpl::getOpaquePointers() {<br>
+  if (LLVM_UNLIKELY(!(OpaquePointers.hasValue())))<br>
+    OpaquePointers = OpaquePointersCL;<br>
+  return *OpaquePointers;<br>
+}<br>
+<br>
+void LLVMContextImpl::setOpaquePointers(bool OP) { OpaquePointers = OP; }<br>
<br>
diff  --git a/llvm/lib/IR/LLVMContextImpl.h b/llvm/lib/IR/LLVMContextImpl.h<br>
index b17f581faaa6..d84714d9b1f1 100644<br>
--- a/llvm/lib/IR/LLVMContextImpl.h<br>
+++ b/llvm/lib/IR/LLVMContextImpl.h<br>
@@ -1461,10 +1461,7 @@ class LLVMContextImpl {<br>
   unsigned NamedStructTypesUniqueID = 0;<br>
<br>
   DenseMap<std::pair<Type *, uint64_t>, ArrayType*> ArrayTypes;<br>
-  DenseMap<std::pair<Type *, ElementCount>, VectorType*> VectorTypes;<br>
-  // TODO: clean up the following after we no longer support non-opaque pointer<br>
-  // types.<br>
-  bool OpaquePointers;<br>
+  DenseMap<std::pair<Type *, ElementCount>, VectorType *> VectorTypes;<br>
   DenseMap<Type*, PointerType*> PointerTypes;  // Pointers in AddrSpace = 0<br>
   DenseMap<std::pair<Type*, unsigned>, PointerType*> ASPointerTypes;<br>
<br>
@@ -1544,6 +1541,14 @@ class LLVMContextImpl {<br>
   /// The lifetime of the object must be guaranteed to extend as long as the<br>
   /// LLVMContext is used by compilation.<br>
   void setOptPassGate(OptPassGate&);<br>
+<br>
+  // TODO: clean up the following after we no longer support non-opaque pointer<br>
+  // types.<br>
+  bool getOpaquePointers();<br>
+  void setOpaquePointers(bool OP);<br>
+<br>
+private:<br>
+  Optional<bool> OpaquePointers;<br>
 };<br>
<br>
 } // end namespace llvm<br>
<br>
diff  --git a/llvm/lib/IR/Type.cpp b/llvm/lib/IR/Type.cpp<br>
index 0a28a001ef0d..d59d87ad631b 100644<br>
--- a/llvm/lib/IR/Type.cpp<br>
+++ b/llvm/lib/IR/Type.cpp<br>
@@ -733,7 +733,7 @@ PointerType *PointerType::get(Type *EltTy, unsigned AddressSpace) {<br>
   LLVMContextImpl *CImpl = EltTy->getContext().pImpl;<br>
<br>
   // Automatically convert typed pointers to opaque pointers.<br>
-  if (CImpl->OpaquePointers)<br>
+  if (CImpl->getOpaquePointers())<br>
     return get(EltTy->getContext(), AddressSpace);<br>
<br>
   // Since AddressSpace #0 is the common case, we special case it.<br>
@@ -747,7 +747,7 @@ PointerType *PointerType::get(Type *EltTy, unsigned AddressSpace) {<br>
<br>
 PointerType *PointerType::get(LLVMContext &C, unsigned AddressSpace) {<br>
   LLVMContextImpl *CImpl = C.pImpl;<br>
-  assert(CImpl->OpaquePointers &&<br>
+  assert(CImpl->getOpaquePointers() &&<br>
          "Can only create opaque pointers in opaque pointer mode");<br>
<br>
   // Since AddressSpace #0 is the common case, we special case it.<br>
<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a><br>
<a href="https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a><br>
</blockquote></div></div>