aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/Bitcode/Reader/BitcodeReader.cpp
diff options
context:
space:
mode:
authorDuncan P. N. Exon Smith <dexonsmith@apple.com>2016-04-19 18:00:19 +0000
committerDuncan P. N. Exon Smith <dexonsmith@apple.com>2016-04-19 18:00:19 +0000
commit9738602869dda75509a0f3782cd6639f9e3927c4 (patch)
tree7930467116f656492380f6cef7c78a9f8aa3f1b7 /llvm/lib/Bitcode/Reader/BitcodeReader.cpp
parent40a34c2e2af8eaabfac246c9801af09a4e478dc1 (diff)
downloadllvm-9738602869dda75509a0f3782cd6639f9e3927c4.zip
llvm-9738602869dda75509a0f3782cd6639f9e3927c4.tar.gz
llvm-9738602869dda75509a0f3782cd6639f9e3927c4.tar.bz2
IR: Enable debug info type ODR uniquing for forward decls
Add a new method, DICompositeType::buildODRType, that will create or mutate the DICompositeType for a given ODR identifier, and use it in LLParser and BitcodeReader instead of DICompositeType::getODRType. The logic is as follows: - If there's no node, create one with the given arguments. - Else, if the current node is a forward declaration and the new arguments would create a definition, mutate the node to match the new arguments. - Else, return the old node. This adds a missing feature supported by the current DITypeIdentifierMap (which I'm slowly making redudant). The only remaining difference is that the DITypeIdentifierMap has a "the-last-one-wins" rule, whereas DICompositeType::buildODRType has a "the-first-one-wins" rule. For now I'm leaving behind DICompositeType::getODRType since it has obvious, low-level semantics that are convenient for unit testing. llvm-svn: 266786
Diffstat (limited to 'llvm/lib/Bitcode/Reader/BitcodeReader.cpp')
-rw-r--r--llvm/lib/Bitcode/Reader/BitcodeReader.cpp4
1 files changed, 2 insertions, 2 deletions
diff --git a/llvm/lib/Bitcode/Reader/BitcodeReader.cpp b/llvm/lib/Bitcode/Reader/BitcodeReader.cpp
index dba0fd4..9c65eec 100644
--- a/llvm/lib/Bitcode/Reader/BitcodeReader.cpp
+++ b/llvm/lib/Bitcode/Reader/BitcodeReader.cpp
@@ -2207,8 +2207,8 @@ std::error_code BitcodeReader::parseMetadata(bool ModuleLevel) {
Metadata *TemplateParams = getMDOrNull(Record[14]);
auto *Identifier = getMDString(Record[15]);
DICompositeType *CT = nullptr;
- if (!(Flags & DINode::FlagFwdDecl) && Identifier)
- CT = DICompositeType::getODRType(
+ if (Identifier)
+ CT = DICompositeType::buildODRType(
Context, *Identifier, Tag, Name, File, Line, Scope, BaseType,
SizeInBits, AlignInBits, OffsetInBits, Flags, Elements, RuntimeLang,
VTableHolder, TemplateParams);