summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDuncan P. N. Exon Smith <dexonsmith@apple.com>2016-04-19 14:42:55 +0000
committerDuncan P. N. Exon Smith <dexonsmith@apple.com>2016-04-19 14:42:55 +0000
commit86f1bf98dc518177ed78c16fa97a18f3deaa12da (patch)
tree2adfab32ccf289f4b2b0236a451b50d47bb05abf
parent6145366510197e52862236960816c14b6e687004 (diff)
downloadbcm5719-llvm-86f1bf98dc518177ed78c16fa97a18f3deaa12da.tar.gz
bcm5719-llvm-86f1bf98dc518177ed78c16fa97a18f3deaa12da.zip
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 :/. llvm-svn: 266737
-rw-r--r--llvm/include/llvm/IR/LLVMContext.h14
-rw-r--r--llvm/lib/AsmParser/LLParser.cpp4
-rw-r--r--llvm/lib/Bitcode/Reader/BitcodeReader.cpp4
-rw-r--r--llvm/lib/IR/LLVMContext.cpp5
-rw-r--r--llvm/lib/IR/LLVMContextImpl.h2
-rw-r--r--llvm/unittests/IR/LLVMContextTest.cpp12
6 files changed, 22 insertions, 19 deletions
diff --git a/llvm/include/llvm/IR/LLVMContext.h b/llvm/include/llvm/IR/LLVMContext.h
index 2b0dfaf5598..8ef85f8932b 100644
--- a/llvm/include/llvm/IR/LLVMContext.h
+++ b/llvm/include/llvm/IR/LLVMContext.h
@@ -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);
diff --git a/llvm/lib/AsmParser/LLParser.cpp b/llvm/lib/AsmParser/LLParser.cpp
index 987ab5de967..c906b7b22db 100644
--- a/llvm/lib/AsmParser/LLParser.cpp
+++ b/llvm/lib/AsmParser/LLParser.cpp
@@ -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;
}
diff --git a/llvm/lib/Bitcode/Reader/BitcodeReader.cpp b/llvm/lib/Bitcode/Reader/BitcodeReader.cpp
index 1a83359b6e8..d454eb1fd4c 100644
--- a/llvm/lib/Bitcode/Reader/BitcodeReader.cpp
+++ b/llvm/lib/Bitcode/Reader/BitcodeReader.cpp
@@ -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],
diff --git a/llvm/lib/IR/LLVMContext.cpp b/llvm/lib/IR/LLVMContext.cpp
index e166a551ade..7c0d18d028a 100644
--- a/llvm/lib/IR/LLVMContext.cpp
+++ b/llvm/lib/IR/LLVMContext.cpp
@@ -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];
diff --git a/llvm/lib/IR/LLVMContextImpl.h b/llvm/lib/IR/LLVMContextImpl.h
index e1a5aa52cb9..15ac0309831 100644
--- a/llvm/lib/IR/LLVMContextImpl.h
+++ b/llvm/lib/IR/LLVMContextImpl.h
@@ -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
diff --git a/llvm/unittests/IR/LLVMContextTest.cpp b/llvm/unittests/IR/LLVMContextTest.cpp
index f1eeb05b1cb..028dc68827b 100644
--- a/llvm/unittests/IR/LLVMContextTest.cpp
+++ b/llvm/unittests/IR/LLVMContextTest.cpp
@@ -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();
OpenPOWER on IntegriCloud