OSDN Git Service

IR: Require DICompositeType for ODR uniquing type map
authorDuncan P. N. Exon Smith <dexonsmith@apple.com>
Tue, 19 Apr 2016 14:42:55 +0000 (14:42 +0000)
committerDuncan P. N. Exon Smith <dexonsmith@apple.com>
Tue, 19 Apr 2016 14:42:55 +0000 (14:42 +0000)
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 :/.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@266737 91177308-0d34-0410-b5e6-96231b3b80d8

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

index 2b0dfaf..8ef85f8 100644 (file)
@@ -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);
index 987ab5d..c906b7b 100644 (file)
@@ -3841,7 +3841,7 @@ bool LLParser::ParseDICompositeType(MDNode *&Result, bool IsDistinct) {
 
   // 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(MDNode *&Result, bool IsDistinct) {
        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;
 }
 
index 1a83359..d454eb1 100644 (file)
@@ -2192,12 +2192,12 @@ std::error_code BitcodeReader::parseMetadata(bool ModuleLevel) {
       // 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],
index e166a55..7c0d18d 100644 (file)
@@ -317,12 +317,13 @@ void LLVMContext::enableDebugTypeODRUniquing() {
   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];
index e1a5aa5..15ac030 100644 (file)
@@ -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
index f1eeb05..028dc68 100644 (file)
@@ -32,18 +32,20 @@ TEST(LLVMContextTest, getOrInsertODRUniquedType) {
 
   // 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();