diff options
| author | Duncan P. N. Exon Smith <dexonsmith@apple.com> | 2016-04-17 03:58:21 +0000 |
|---|---|---|
| committer | Duncan P. N. Exon Smith <dexonsmith@apple.com> | 2016-04-17 03:58:21 +0000 |
| commit | 5ab2be094e9b1e75a91b214a214d07e58aacef53 (patch) | |
| tree | f95cbcc8b7e39181f9ae9e9983c5bed8c5f49496 /llvm/unittests | |
| parent | 05ebfd09382b8dc8cd26eaf8fb91fb73ce48290e (diff) | |
| download | bcm5719-llvm-5ab2be094e9b1e75a91b214a214d07e58aacef53.tar.gz bcm5719-llvm-5ab2be094e9b1e75a91b214a214d07e58aacef53.zip | |
IR: Use an explicit map for debug info type uniquing
Rather than relying on the structural equivalence of DICompositeType to
merge type definitions, use an explicit map on the LLVMContext that
LLParser and BitcodeReader consult when constructing new nodes.
Each non-forward-declaration DICompositeType with a non-empty
'identifier:' field is stored/loaded from the type map, and the first
definiton will "win".
This map is opt-in: clients that expect ODR types from different modules
to be merged must call LLVMContext::ensureDITypeMap.
- Clients that just happen to load more than one Module in the same
LLVMContext won't magically merge types.
- Clients (like LTO) that want to continue to merge types based on ODR
identifiers should opt-in immediately.
I have updated LTOCodeGenerator.cpp, the two "linking" spots in
gold-plugin.cpp, and llvm-link (unless -disable-debug-info-type-map) to
set this.
With this in place, it will be straightforward to remove the DITypeRef
concept (i.e., referencing types by their 'identifier:' string rather
than pointing at them directly).
llvm-svn: 266549
Diffstat (limited to 'llvm/unittests')
| -rw-r--r-- | llvm/unittests/IR/CMakeLists.txt | 1 | ||||
| -rw-r--r-- | llvm/unittests/IR/LLVMContextTest.cpp | 57 |
2 files changed, 58 insertions, 0 deletions
diff --git a/llvm/unittests/IR/CMakeLists.txt b/llvm/unittests/IR/CMakeLists.txt index c14fd2ff0e7..8e63af05e0b 100644 --- a/llvm/unittests/IR/CMakeLists.txt +++ b/llvm/unittests/IR/CMakeLists.txt @@ -16,6 +16,7 @@ set(IRSources IRBuilderTest.cpp InstructionsTest.cpp IntrinsicsTest.cpp + LLVMContextTest.cpp LegacyPassManagerTest.cpp MDBuilderTest.cpp MetadataTest.cpp diff --git a/llvm/unittests/IR/LLVMContextTest.cpp b/llvm/unittests/IR/LLVMContextTest.cpp new file mode 100644 index 00000000000..16cf0745e09 --- /dev/null +++ b/llvm/unittests/IR/LLVMContextTest.cpp @@ -0,0 +1,57 @@ +//===- LLVMContextTest.cpp - LLVMContext unit tests -----------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#include "llvm/IR/LLVMContext.h" +#include "llvm/IR/DebugInfoMetadata.h" +#include "gtest/gtest.h" +using namespace llvm; + +namespace { + +TEST(LLVMContextTest, ensureDITypeMap) { + LLVMContext Context; + EXPECT_FALSE(Context.hasDITypeMap()); + Context.ensureDITypeMap(); + EXPECT_TRUE(Context.hasDITypeMap()); + Context.destroyDITypeMap(); + EXPECT_FALSE(Context.hasDITypeMap()); +} + +TEST(LLVMContextTest, getOrInsertDITypeMapping) { + LLVMContext Context; + const MDString &S = *MDString::get(Context, "string"); + + // Without a type map, this should return null. + EXPECT_FALSE(Context.getOrInsertDITypeMapping(S)); + + // Get the mapping. + Context.ensureDITypeMap(); + DIType **Mapping = Context.getOrInsertDITypeMapping(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; + + // Check that we get it back. + Mapping = Context.getOrInsertDITypeMapping(S); + ASSERT_TRUE(Mapping); + EXPECT_EQ(&BT, *Mapping); + + // Check that it's discarded with the type map. + Context.destroyDITypeMap(); + EXPECT_FALSE(Context.getOrInsertDITypeMapping(S)); + + // And it shouldn't magically reappear... + Context.ensureDITypeMap(); + EXPECT_FALSE(*Context.getOrInsertDITypeMapping(S)); +} + +} // end namespace |

