[llvm] r266549 - IR: Use an explicit map for debug info type uniquing

Teresa Johnson via llvm-commits llvm-commits at lists.llvm.org
Sun Apr 17 07:24:47 PDT 2016


Looks like this should also be done for ThinLTO, and your changes to
gold-plugin and llvm-link cover the ThinLTO case through those tools. I
think to cover the rest of the ThinLTO cases we need to call ensureDITypeMap()
in these cases:
1) For libLTO via ThinLTOCodeGenerator.cpp: where the backend threads are
created with new contexts in ThinLTOCodeGenerator::run
2) For opt, which can add the function import pass (maybe the same way you
have this done in llvm-link, by default with an option to disable?).
3) When launching backend threads in separate processes for distributed
builds, via the clang -fthinlto-index= option. I think we would call your
new routine in BackendUtil.cpp where it checks if
CodeGenOpts.ThinLTOIndexFile.empty and if so build the index.

Let me know if that sounds right, I can add the calls.

Thanks,
Teresa

On Sat, Apr 16, 2016 at 8:58 PM, Duncan P. N. Exon Smith via llvm-commits <
llvm-commits at lists.llvm.org> wrote:

> Author: dexonsmith
> Date: Sat Apr 16 22:58:21 2016
> New Revision: 266549
>
> URL: http://llvm.org/viewvc/llvm-project?rev=266549&view=rev
> Log:
> 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).
>
> Added:
>     llvm/trunk/test/Linker/Inputs/dicompositetype-unique.ll
>     llvm/trunk/test/Linker/dicompositetype-unique.ll
>     llvm/trunk/unittests/IR/LLVMContextTest.cpp
> Modified:
>     llvm/trunk/docs/LangRef.rst
>     llvm/trunk/include/llvm/IR/LLVMContext.h
>     llvm/trunk/lib/AsmParser/LLParser.cpp
>     llvm/trunk/lib/Bitcode/Reader/BitcodeReader.cpp
>     llvm/trunk/lib/IR/DebugInfoMetadata.cpp
>     llvm/trunk/lib/IR/LLVMContext.cpp
>     llvm/trunk/lib/IR/LLVMContextImpl.h
>     llvm/trunk/lib/LTO/LTOCodeGenerator.cpp
>     llvm/trunk/lib/Transforms/Utils/ValueMapper.cpp
>     llvm/trunk/tools/gold/gold-plugin.cpp
>     llvm/trunk/tools/llvm-link/llvm-link.cpp
>     llvm/trunk/unittests/IR/CMakeLists.txt
>
> Modified: llvm/trunk/docs/LangRef.rst
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/docs/LangRef.rst?rev=266549&r1=266548&r2=266549&view=diff
>
> ==============================================================================
> --- llvm/trunk/docs/LangRef.rst (original)
> +++ llvm/trunk/docs/LangRef.rst Sat Apr 16 22:58:21 2016
> @@ -4006,6 +4006,11 @@ identifier used for type merging between
>  can refer to composite types indirectly via a :ref:`metadata string
>  <metadata-string>` that matches their identifier.
>
> +For a given ``identifier:``, there should only be a single composite type
> that
> +does not have  ``flags: DIFlagFwdDecl`` set.  LLVM tools that link modules
> +together will unique such definitions at parse time via the
> ``identifier:``
> +field, even if the nodes are ``distinct``.
> +
>  .. code-block:: llvm
>
>      !0 = !DIEnumerator(name: "SixKind", value: 7)
>
> Modified: llvm/trunk/include/llvm/IR/LLVMContext.h
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/IR/LLVMContext.h?rev=266549&r1=266548&r2=266549&view=diff
>
> ==============================================================================
> --- llvm/trunk/include/llvm/IR/LLVMContext.h (original)
> +++ llvm/trunk/include/llvm/IR/LLVMContext.h Sat Apr 16 22:58:21 2016
> @@ -25,6 +25,8 @@ class StringRef;
>  class Twine;
>  class Instruction;
>  class Module;
> +class MDString;
> +class DIType;
>  class SMDiagnostic;
>  class DiagnosticInfo;
>  template <typename T> class SmallVectorImpl;
> @@ -113,6 +115,23 @@ public:
>    /// especially in release mode.
>    void setDiscardValueNames(bool Discard);
>
> +  /// Whether there is a string map for uniquing debug info types with
> +  /// identifiers across the context.  Off by default.
> +  bool hasDITypeMap() const;
> +  void ensureDITypeMap();
> +  void destroyDITypeMap();
> +
> +  /// Get or insert the DIType 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 hasDITypeMap() is \c false.
> +  ///
> +  /// \post If \a hasDITypeMap(), \c S will have a (possibly null)
> mapping.
> +  /// \note The returned address is only valid until the next call.
> +  DIType **getOrInsertDITypeMapping(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=266549&r1=266548&r2=266549&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/AsmParser/LLParser.cpp (original)
> +++ llvm/trunk/lib/AsmParser/LLParser.cpp Sat Apr 16 22:58:21 2016
> @@ -3839,11 +3839,25 @@ bool LLParser::ParseDICompositeType(MDNo
>    PARSE_MD_FIELDS();
>  #undef VISIT_MD_FIELDS
>
> +  // 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;
> +  if (!(flags.Val & DINode::FlagFwdDecl) && identifier.Val &&
> +      (MappedT = Context.getOrInsertDITypeMapping(*identifier.Val)) &&
> +      *MappedT) {
> +    Result = *MappedT;
> +    return false;
> +  }
> +
> +  // Create a new node, and save it in the context if it belongs in the
> type
> +  // map.
>    Result = GET_OR_DISTINCT(
>        DICompositeType,
>        (Context, tag.Val, name.Val, file.Val, line.Val, scope.Val,
> baseType.Val,
>         size.Val, align.Val, offset.Val, flags.Val, elements.Val,
>         runtimeLang.Val, vtableHolder.Val, templateParams.Val,
> identifier.Val));
> +  if (MappedT)
> +    *MappedT = cast<DIType>(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=266549&r1=266548&r2=266549&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Bitcode/Reader/BitcodeReader.cpp (original)
> +++ llvm/trunk/lib/Bitcode/Reader/BitcodeReader.cpp Sat Apr 16 22:58:21
> 2016
> @@ -2188,16 +2188,29 @@ std::error_code BitcodeReader::parseMeta
>        if (Record.size() != 16)
>          return error("Invalid record");
>
> -      MetadataList.assignValue(
> -          GET_OR_DISTINCT(DICompositeType, Record[0],
> -                          (Context, Record[1], getMDString(Record[2]),
> -                           getMDOrNull(Record[3]), Record[4],
> -                           getMDOrNull(Record[5]), getMDOrNull(Record[6]),
> -                           Record[7], Record[8], Record[9], Record[10],
> -                           getMDOrNull(Record[11]), Record[12],
> -                           getMDOrNull(Record[13]),
> getMDOrNull(Record[14]),
> -                           getMDString(Record[15]))),
> -          NextMetadataNo++);
> +      // If we have a UUID and this is not a forward declaration, lookup
> the
> +      // mapping.
> +      unsigned Flags = Record[10];
> +      auto *Identifier = getMDString(Record[15]);
> +      DIType **MappedT = nullptr;
> +      if (!(Flags & DINode::FlagFwdDecl) && Identifier)
> +        MappedT = Context.getOrInsertDITypeMapping(*Identifier);
> +
> +      // Use the mapped type node, or create a new one if necessary.
> +      DIType *CT = MappedT ? *MappedT : nullptr;
> +      if (!CT) {
> +        CT = GET_OR_DISTINCT(
> +            DICompositeType, Record[0],
> +            (Context, Record[1], getMDString(Record[2]),
> getMDOrNull(Record[3]),
> +             Record[4], getMDOrNull(Record[5]), getMDOrNull(Record[6]),
> +             Record[7], Record[8], Record[9], Flags,
> getMDOrNull(Record[11]),
> +             Record[12], getMDOrNull(Record[13]), getMDOrNull(Record[14]),
> +             Identifier));
> +        if (MappedT)
> +          *MappedT = CT;
> +      }
> +
> +      MetadataList.assignValue(CT, NextMetadataNo++);
>        break;
>      }
>      case bitc::METADATA_SUBROUTINE_TYPE: {
>
> Modified: llvm/trunk/lib/IR/DebugInfoMetadata.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/DebugInfoMetadata.cpp?rev=266549&r1=266548&r2=266549&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/IR/DebugInfoMetadata.cpp (original)
> +++ llvm/trunk/lib/IR/DebugInfoMetadata.cpp Sat Apr 16 22:58:21 2016
> @@ -254,6 +254,7 @@ DICompositeType *DICompositeType::getImp
>      Metadata *TemplateParams, MDString *Identifier, StorageType Storage,
>      bool ShouldCreate) {
>    assert(isCanonical(Name) && "Expected canonical MDString");
> +
>    DEFINE_GETIMPL_LOOKUP(
>        DICompositeType, (Tag, Name, File, Line, Scope, BaseType,
> SizeInBits,
>                          AlignInBits, OffsetInBits, Flags, Elements,
> RuntimeLang,
>
> Modified: llvm/trunk/lib/IR/LLVMContext.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/LLVMContext.cpp?rev=266549&r1=266548&r2=266549&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/IR/LLVMContext.cpp (original)
> +++ llvm/trunk/lib/IR/LLVMContext.cpp Sat Apr 16 22:58:21 2016
> @@ -311,6 +311,23 @@ bool LLVMContext::shouldDiscardValueName
>    return pImpl->DiscardValueNames;
>  }
>
> +bool LLVMContext::hasDITypeMap() const { return !!pImpl->DITypeMap; }
> +
> +void LLVMContext::ensureDITypeMap() {
> +  if (pImpl->DITypeMap)
> +    return;
> +
> +  pImpl->DITypeMap = llvm::make_unique<DenseMap<const MDString *, DIType
> *>>();
> +}
> +
> +void LLVMContext::destroyDITypeMap() { pImpl->DITypeMap.reset(); }
> +
> +DIType **LLVMContext::getOrInsertDITypeMapping(const MDString &S) {
> +  if (!hasDITypeMap())
> +    return nullptr;
> +  return &(*pImpl->DITypeMap)[&S];
> +}
> +
>  void LLVMContext::setDiscardValueNames(bool Discard) {
>    pImpl->DiscardValueNames = Discard;
>  }
>
> Modified: llvm/trunk/lib/IR/LLVMContextImpl.h
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/LLVMContextImpl.h?rev=266549&r1=266548&r2=266549&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/IR/LLVMContextImpl.h (original)
> +++ llvm/trunk/lib/IR/LLVMContextImpl.h Sat Apr 16 22:58:21 2016
> @@ -1022,6 +1022,9 @@ public:
>    DenseSet<CLASS *, CLASS##Info> CLASS##s;
>  #include "llvm/IR/Metadata.def"
>
> +  // Optional map for looking up composite types by identifier.
> +  std::unique_ptr<DenseMap<const MDString *, DIType *>> 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
>    // one object can destroy them.  This set allows us to at least destroy
> them
>
> Modified: llvm/trunk/lib/LTO/LTOCodeGenerator.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/LTO/LTOCodeGenerator.cpp?rev=266549&r1=266548&r2=266549&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/LTO/LTOCodeGenerator.cpp (original)
> +++ llvm/trunk/lib/LTO/LTOCodeGenerator.cpp Sat Apr 16 22:58:21 2016
> @@ -84,6 +84,7 @@ LTOCodeGenerator::LTOCodeGenerator(LLVMC
>      : Context(Context), MergedModule(new Module("ld-temp.o", Context)),
>        TheLinker(new Linker(*MergedModule)) {
>    Context.setDiscardValueNames(LTODiscardValueNames);
> +  Context.ensureDITypeMap();
>    initializeLTOPasses();
>  }
>
>
> Modified: llvm/trunk/lib/Transforms/Utils/ValueMapper.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Utils/ValueMapper.cpp?rev=266549&r1=266548&r2=266549&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Transforms/Utils/ValueMapper.cpp (original)
> +++ llvm/trunk/lib/Transforms/Utils/ValueMapper.cpp Sat Apr 16 22:58:21
> 2016
> @@ -15,6 +15,7 @@
>  #include "llvm/Transforms/Utils/ValueMapper.h"
>  #include "llvm/IR/CallSite.h"
>  #include "llvm/IR/Constants.h"
> +#include "llvm/IR/DebugInfoMetadata.h"
>  #include "llvm/IR/Function.h"
>  #include "llvm/IR/GlobalAlias.h"
>  #include "llvm/IR/GlobalVariable.h"
>
> Added: llvm/trunk/test/Linker/Inputs/dicompositetype-unique.ll
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Linker/Inputs/dicompositetype-unique.ll?rev=266549&view=auto
>
> ==============================================================================
> --- llvm/trunk/test/Linker/Inputs/dicompositetype-unique.ll (added)
> +++ llvm/trunk/test/Linker/Inputs/dicompositetype-unique.ll Sat Apr 16
> 22:58:21 2016
> @@ -0,0 +1,4 @@
> +!named = !{!0, !1}
> +
> +!0 = !DIFile(filename: "abc", directory: "/path/to")
> +!1 = !DICompositeType(tag: DW_TAG_class_type, name: "T2", identifier:
> "T", file: !0)
>
> Added: llvm/trunk/test/Linker/dicompositetype-unique.ll
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Linker/dicompositetype-unique.ll?rev=266549&view=auto
>
> ==============================================================================
> --- llvm/trunk/test/Linker/dicompositetype-unique.ll (added)
> +++ llvm/trunk/test/Linker/dicompositetype-unique.ll Sat Apr 16 22:58:21
> 2016
> @@ -0,0 +1,42 @@
> +; RUN: llvm-link -S -o - %s %S/Inputs/dicompositetype-unique.ll \
> +; RUN:   | FileCheck %s
> +; RUN: llvm-link -S -o - %S/Inputs/dicompositetype-unique.ll %s \
> +; RUN:   | FileCheck %s -check-prefix REVERSE
> +; RUN: llvm-link -disable-debug-info-type-map -S -o - %s
> %S/Inputs/dicompositetype-unique.ll \
> +; RUN:   | FileCheck %s -check-prefix NOMAP
> +
> +; Check that the bitcode reader handles this too.
> +; RUN: llvm-as -o %t1.bc <%s
> +; RUN: llvm-as -o %t2.bc <%S/Inputs/dicompositetype-unique.ll
> +; RUN: llvm-link -S -o - %t1.bc %t2.bc | FileCheck %s
> +; RUN: llvm-link -S -o - %t2.bc %t1.bc | FileCheck %s -check-prefix
> REVERSE
> +; RUN: llvm-link -disable-debug-info-type-map -S -o - %t1.bc %t2.bc \
> +; RUN:   | FileCheck %s -check-prefix NOMAP
> +
> +; Check that the type map will unique two DICompositeTypes.
> +
> +; CHECK:   !named = !{!0, !1, !0, !1}
> +; REVERSE: !named = !{!0, !1, !0, !1}
> +; NOMAP:   !named = !{!0, !1, !0, !2}
> +!named = !{!0, !1}
> +
> +; Check both directions.
> +; CHECK:        !1 = !DICompositeType(
> +; CHECK-SAME:                         name: "T1"
> +; CHECK-SAME:                         identifier: "T"
> +; CHECK-NOT:       identifier: "T"
> +; REVERSE:      !1 = !DICompositeType(
> +; REVERSE-SAME:                       name: "T2"
> +; REVERSE-SAME:                       identifier: "T"
> +; REVERSE-NOT:     identifier: "T"
> +
> +; These types are different, so we should get both copies when there is
> no map.
> +; NOMAP:        !1 = !DICompositeType(
> +; NOMAP-SAME:                         name: "T1"
> +; NOMAP-SAME:                         identifier: "T"
> +; NOMAP:        !2 = !DICompositeType(
> +; NOMAP-SAME:                         name: "T2"
> +; NOMAP-SAME:                         identifier: "T"
> +; NOMAP-NOT:       identifier: "T"
> +!0 = !DIFile(filename: "abc", directory: "/path/to")
> +!1 = !DICompositeType(tag: DW_TAG_class_type, name: "T1", identifier:
> "T", file: !0)
>
> Modified: llvm/trunk/tools/gold/gold-plugin.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/gold/gold-plugin.cpp?rev=266549&r1=266548&r2=266549&view=diff
>
> ==============================================================================
> --- llvm/trunk/tools/gold/gold-plugin.cpp (original)
> +++ llvm/trunk/tools/gold/gold-plugin.cpp Sat Apr 16 22:58:21 2016
> @@ -1110,6 +1110,7 @@ static void thinLTOBackendTask(claimed_f
>                                 raw_fd_ostream *OS, unsigned TaskID) {
>    // Need to use a separate context for each task
>    LLVMContext Context;
> +  Context.ensureDITypeMap(); // Merge debug info types.
>    Context.setDiagnosticHandler(diagnosticHandlerForContext, nullptr,
> true);
>
>    std::unique_ptr<llvm::Module> NewModule(new llvm::Module(File.name,
> Context));
> @@ -1231,6 +1232,7 @@ static ld_plugin_status allSymbolsReadHo
>    }
>
>    LLVMContext Context;
> +  Context.ensureDITypeMap(); // Merge debug info types.
>    Context.setDiagnosticHandler(diagnosticHandlerForContext, nullptr,
> true);
>
>    std::unique_ptr<Module> Combined(new Module("ld-temp.o", Context));
>
> Modified: llvm/trunk/tools/llvm-link/llvm-link.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-link/llvm-link.cpp?rev=266549&r1=266548&r2=266549&view=diff
>
> ==============================================================================
> --- llvm/trunk/tools/llvm-link/llvm-link.cpp (original)
> +++ llvm/trunk/tools/llvm-link/llvm-link.cpp Sat Apr 16 22:58:21 2016
> @@ -71,6 +71,10 @@ static cl::opt<bool>
>  Internalize("internalize", cl::desc("Internalize linked symbols"));
>
>  static cl::opt<bool>
> +    DisableDITypeMap("disable-debug-info-type-map",
> +                     cl::desc("Don't use a uniquing type map for debug
> info"));
> +
> +static cl::opt<bool>
>  OnlyNeeded("only-needed", cl::desc("Link only needed symbols"));
>
>  static cl::opt<bool>
> @@ -337,6 +341,9 @@ int main(int argc, char **argv) {
>    llvm_shutdown_obj Y;  // Call llvm_shutdown() on exit.
>    cl::ParseCommandLineOptions(argc, argv, "llvm linker\n");
>
> +  if (!DisableDITypeMap)
> +    Context.ensureDITypeMap();
> +
>    auto Composite = make_unique<Module>("llvm-link", Context);
>    Linker L(*Composite);
>
>
> Modified: llvm/trunk/unittests/IR/CMakeLists.txt
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/IR/CMakeLists.txt?rev=266549&r1=266548&r2=266549&view=diff
>
> ==============================================================================
> --- llvm/trunk/unittests/IR/CMakeLists.txt (original)
> +++ llvm/trunk/unittests/IR/CMakeLists.txt Sat Apr 16 22:58:21 2016
> @@ -16,6 +16,7 @@ set(IRSources
>    IRBuilderTest.cpp
>    InstructionsTest.cpp
>    IntrinsicsTest.cpp
> +  LLVMContextTest.cpp
>    LegacyPassManagerTest.cpp
>    MDBuilderTest.cpp
>    MetadataTest.cpp
>
> Added: llvm/trunk/unittests/IR/LLVMContextTest.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/IR/LLVMContextTest.cpp?rev=266549&view=auto
>
> ==============================================================================
> --- llvm/trunk/unittests/IR/LLVMContextTest.cpp (added)
> +++ llvm/trunk/unittests/IR/LLVMContextTest.cpp Sat Apr 16 22:58:21 2016
> @@ -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
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>



-- 
Teresa Johnson |  Software Engineer |  tejohnson at google.com |  408-460-2413
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20160417/a4a9a96e/attachment-0001.html>


More information about the llvm-commits mailing list