[llvm] r266737 - IR: Require DICompositeType for ODR uniquing type map

Duncan P. N. Exon Smith via llvm-commits llvm-commits at lists.llvm.org
Tue Apr 19 07:42:56 PDT 2016


Author: dexonsmith
Date: Tue Apr 19 09:42:55 2016
New Revision: 266737

URL: http://llvm.org/viewvc/llvm-project?rev=266737&view=rev
Log:
IR: Require DICompositeType for ODR uniquing type map

Tighten up the API for debug info ODR type uniquing in LLVMContext.  The
only reason to allow other DIType subclasses is to make the unit tests
prettier :/.

Modified:
    llvm/trunk/include/llvm/IR/LLVMContext.h
    llvm/trunk/lib/AsmParser/LLParser.cpp
    llvm/trunk/lib/Bitcode/Reader/BitcodeReader.cpp
    llvm/trunk/lib/IR/LLVMContext.cpp
    llvm/trunk/lib/IR/LLVMContextImpl.h
    llvm/trunk/unittests/IR/LLVMContextTest.cpp

Modified: llvm/trunk/include/llvm/IR/LLVMContext.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/IR/LLVMContext.h?rev=266737&r1=266736&r2=266737&view=diff
==============================================================================
--- llvm/trunk/include/llvm/IR/LLVMContext.h (original)
+++ llvm/trunk/include/llvm/IR/LLVMContext.h Tue Apr 19 09:42:55 2016
@@ -26,7 +26,7 @@ class Twine;
 class Instruction;
 class Module;
 class MDString;
-class DIType;
+class DICompositeType;
 class SMDiagnostic;
 class DiagnosticInfo;
 template <typename T> class SmallVectorImpl;
@@ -121,16 +121,16 @@ public:
   void enableDebugTypeODRUniquing();
   void disableDebugTypeODRUniquing();
 
-  /// Get or insert the DIType mapped to the given string.
+  /// Get or insert the DICompositeType mapped to the given string.
   ///
-  /// Returns the address of the current \a DIType pointer mapped to \c S,
-  /// inserting a mapping to \c nullptr if \c S was not previously mapped.
-  /// This method has no effect (and returns \c nullptr instead of a valid
-  /// address) if \a isODRUniquingDebugTypes() is \c false.
+  /// Returns the address of the current \a DICompositeType pointer mapped to
+  /// \c S, inserting a mapping to \c nullptr if \c S was not previously
+  /// mapped.  This method has no effect (and returns \c nullptr instead of a
+  /// valid address) if \a isODRUniquingDebugTypes() is \c false.
   ///
   /// \post If \a isODRUniquingDebugTypes(), \c S will have a (possibly null)
   /// mapping.  \note The returned address is only valid until the next call.
-  DIType **getOrInsertODRUniquedType(const MDString &S);
+  DICompositeType **getOrInsertODRUniquedType(const MDString &S);
 
   typedef void (*InlineAsmDiagHandlerTy)(const SMDiagnostic&, void *Context,
                                          unsigned LocCookie);

Modified: llvm/trunk/lib/AsmParser/LLParser.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/AsmParser/LLParser.cpp?rev=266737&r1=266736&r2=266737&view=diff
==============================================================================
--- llvm/trunk/lib/AsmParser/LLParser.cpp (original)
+++ llvm/trunk/lib/AsmParser/LLParser.cpp Tue Apr 19 09:42:55 2016
@@ -3841,7 +3841,7 @@ bool LLParser::ParseDICompositeType(MDNo
 
   // If this isn't a forward declaration and it has a UUID, check for it in the
   // type map in the context.
-  DIType **MappedT = nullptr;
+  DICompositeType **MappedT = nullptr;
   if (!(flags.Val & DINode::FlagFwdDecl) && identifier.Val &&
       (MappedT = Context.getOrInsertODRUniquedType(*identifier.Val)) &&
       *MappedT) {
@@ -3857,7 +3857,7 @@ bool LLParser::ParseDICompositeType(MDNo
        size.Val, align.Val, offset.Val, flags.Val, elements.Val,
        runtimeLang.Val, vtableHolder.Val, templateParams.Val, identifier.Val));
   if (MappedT)
-    *MappedT = cast<DIType>(Result);
+    *MappedT = cast<DICompositeType>(Result);
   return false;
 }
 

Modified: llvm/trunk/lib/Bitcode/Reader/BitcodeReader.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Bitcode/Reader/BitcodeReader.cpp?rev=266737&r1=266736&r2=266737&view=diff
==============================================================================
--- llvm/trunk/lib/Bitcode/Reader/BitcodeReader.cpp (original)
+++ llvm/trunk/lib/Bitcode/Reader/BitcodeReader.cpp Tue Apr 19 09:42:55 2016
@@ -2192,12 +2192,12 @@ std::error_code BitcodeReader::parseMeta
       // mapping.
       unsigned Flags = Record[10];
       auto *Identifier = getMDString(Record[15]);
-      DIType **MappedT = nullptr;
+      DICompositeType **MappedT = nullptr;
       if (!(Flags & DINode::FlagFwdDecl) && Identifier)
         MappedT = Context.getOrInsertODRUniquedType(*Identifier);
 
       // Use the mapped type node, or create a new one if necessary.
-      DIType *CT = MappedT ? *MappedT : nullptr;
+      DICompositeType *CT = MappedT ? *MappedT : nullptr;
       if (!CT) {
         CT = GET_OR_DISTINCT(
             DICompositeType, Record[0],

Modified: llvm/trunk/lib/IR/LLVMContext.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/LLVMContext.cpp?rev=266737&r1=266736&r2=266737&view=diff
==============================================================================
--- llvm/trunk/lib/IR/LLVMContext.cpp (original)
+++ llvm/trunk/lib/IR/LLVMContext.cpp Tue Apr 19 09:42:55 2016
@@ -317,12 +317,13 @@ void LLVMContext::enableDebugTypeODRUniq
   if (pImpl->DITypeMap)
     return;
 
-  pImpl->DITypeMap = llvm::make_unique<DenseMap<const MDString *, DIType *>>();
+  pImpl->DITypeMap =
+      llvm::make_unique<DenseMap<const MDString *, DICompositeType *>>();
 }
 
 void LLVMContext::disableDebugTypeODRUniquing() { pImpl->DITypeMap.reset(); }
 
-DIType **LLVMContext::getOrInsertODRUniquedType(const MDString &S) {
+DICompositeType **LLVMContext::getOrInsertODRUniquedType(const MDString &S) {
   if (!isODRUniquingDebugTypes())
     return nullptr;
   return &(*pImpl->DITypeMap)[&S];

Modified: llvm/trunk/lib/IR/LLVMContextImpl.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/LLVMContextImpl.h?rev=266737&r1=266736&r2=266737&view=diff
==============================================================================
--- llvm/trunk/lib/IR/LLVMContextImpl.h (original)
+++ llvm/trunk/lib/IR/LLVMContextImpl.h Tue Apr 19 09:42:55 2016
@@ -1022,7 +1022,7 @@ public:
 #include "llvm/IR/Metadata.def"
 
   // Optional map for looking up composite types by identifier.
-  std::unique_ptr<DenseMap<const MDString *, DIType *>> DITypeMap;
+  std::unique_ptr<DenseMap<const MDString *, DICompositeType *>> DITypeMap;
 
   // MDNodes may be uniqued or not uniqued.  When they're not uniqued, they
   // aren't in the MDNodeSet, but they're still shared between objects, so no

Modified: llvm/trunk/unittests/IR/LLVMContextTest.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/IR/LLVMContextTest.cpp?rev=266737&r1=266736&r2=266737&view=diff
==============================================================================
--- llvm/trunk/unittests/IR/LLVMContextTest.cpp (original)
+++ llvm/trunk/unittests/IR/LLVMContextTest.cpp Tue Apr 19 09:42:55 2016
@@ -32,18 +32,20 @@ TEST(LLVMContextTest, getOrInsertODRUniq
 
   // Get the mapping.
   Context.enableDebugTypeODRUniquing();
-  DIType **Mapping = Context.getOrInsertODRUniquedType(S);
+  DICompositeType **Mapping = Context.getOrInsertODRUniquedType(S);
   ASSERT_TRUE(Mapping);
 
   // Create some type and add it to the mapping.
-  auto &BT =
-      *DIBasicType::get(Context, dwarf::DW_TAG_unspecified_type, S.getString());
-  *Mapping = &BT;
+  auto &CT = *DICompositeType::get(Context, dwarf::DW_TAG_class_type, "name",
+                                   nullptr, 0, nullptr, nullptr, 0, 0, 0, 0,
+                                   nullptr, 0, nullptr, nullptr, S.getString());
+  ASSERT_EQ(S.getString(), CT.getIdentifier());
+  *Mapping = &CT;
 
   // Check that we get it back.
   Mapping = Context.getOrInsertODRUniquedType(S);
   ASSERT_TRUE(Mapping);
-  EXPECT_EQ(&BT, *Mapping);
+  EXPECT_EQ(&CT, *Mapping);
 
   // Check that it's discarded with the type map.
   Context.disableDebugTypeODRUniquing();




More information about the llvm-commits mailing list