<div dir="ltr">For now I just put it behind an #if defined(_MSC_VER). At least that gives us bot coverage on the test.<div><br></div><div>I looked at isPodLike and that looks like it should work, but I'll need to enable that for MSVC first, otherwise the check will fail as currently written.</div></div><br><div class="gmail_quote"><div dir="ltr">On Thu, Dec 14, 2017 at 11:10 AM Craig Topper <<a href="mailto:craig.topper@gmail.com">craig.topper@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">Maybe switch to isPodLike?</div><div class="gmail_extra"></div><div class="gmail_extra"><br clear="all"><div><div class="m_7174152521294321541gmail_signature" data-smartmail="gmail_signature">~Craig</div></div></div><div class="gmail_extra">
<br><div class="gmail_quote">On Thu, Dec 14, 2017 at 11:08 AM, Zachary Turner <span dir="ltr"><<a href="mailto:zturner@google.com" target="_blank">zturner@google.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">I can just remove that check, just as fast as reverting.</div><div class="m_7174152521294321541HOEnZb"><div class="m_7174152521294321541h5"><br><div class="gmail_quote"><div dir="ltr">On Thu, Dec 14, 2017 at 11:07 AM Hans Wennborg <<a href="mailto:hans@chromium.org" target="_blank">hans@chromium.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Chromium bootstraps Clang with GCC 4.8.5, and all the bots are turning<br>
red. Can we revert while fixing?<br>
<br>
On Thu, Dec 14, 2017 at 11:03 AM, Craig Topper via llvm-commits<br>
<<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a>> wrote:<br>
> is_trivially_copyable is only available in libstdc++ starting from gcc 5. So<br>
> this coded doesn't build on gcc 4.8.5<br>
><br>
> ~Craig<br>
><br>
> On Thu, Dec 14, 2017 at 10:07 AM, Zachary Turner via llvm-commits<br>
> <<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a>> wrote:<br>
>><br>
>> Author: zturner<br>
>> Date: Thu Dec 14 10:07:04 2017<br>
>> New Revision: 320719<br>
>><br>
>> URL: <a href="http://llvm.org/viewvc/llvm-project?rev=320719&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project?rev=320719&view=rev</a><br>
>> Log:<br>
>> [COFF] Teach LLD to use the COFF .debug$H section.<br>
>><br>
>> This adds the /DEBUG:GHASH option to LLD which will look for<br>
>> the existence of .debug$H sections in linker inputs and use them<br>
>> to accelerate type merging. The clang-cl side has already been<br>
>> added, so this completes the work necessary to begin experimenting<br>
>> with this feature.<br>
>><br>
>> Differential Revision: <a href="https://reviews.llvm.org/D40980" rel="noreferrer" target="_blank">https://reviews.llvm.org/D40980</a><br>
>><br>
>> Modified:<br>
>> llvm/trunk/include/llvm/DebugInfo/CodeView/TypeHashing.h<br>
>> llvm/trunk/include/llvm/DebugInfo/CodeView/TypeStreamMerger.h<br>
>> llvm/trunk/include/llvm/Object/COFF.h<br>
>> llvm/trunk/lib/DebugInfo/CodeView/TypeHashing.cpp<br>
>> llvm/trunk/lib/DebugInfo/CodeView/TypeStreamMerger.cpp<br>
>><br>
>> Modified: llvm/trunk/include/llvm/DebugInfo/CodeView/TypeHashing.h<br>
>> URL:<br>
>> <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/CodeView/TypeHashing.h?rev=320719&r1=320718&r2=320719&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/CodeView/TypeHashing.h?rev=320719&r1=320718&r2=320719&view=diff</a><br>
>><br>
>> ==============================================================================<br>
>> --- llvm/trunk/include/llvm/DebugInfo/CodeView/TypeHashing.h (original)<br>
>> +++ llvm/trunk/include/llvm/DebugInfo/CodeView/TypeHashing.h Thu Dec 14<br>
>> 10:07:04 2017<br>
>> @@ -88,18 +88,39 @@ struct GloballyHashedType {<br>
>> ArrayRef<GloballyHashedType><br>
>> PreviousTypes,<br>
>> ArrayRef<GloballyHashedType><br>
>> PreviousIds);<br>
>><br>
>> + /// Given a sequence of bytes representing a record, compute a global<br>
>> hash for<br>
>> + /// this record. Due to the nature of global hashes incorporating the<br>
>> hashes<br>
>> + /// of referenced records, this function requires a list of types and<br>
>> ids<br>
>> + /// that RecordData might reference, indexable by TypeIndex.<br>
>> + static GloballyHashedType hashType(CVType Type,<br>
>> + ArrayRef<GloballyHashedType><br>
>> PreviousTypes,<br>
>> + ArrayRef<GloballyHashedType><br>
>> PreviousIds) {<br>
>> + return hashType(Type.RecordData, PreviousTypes, PreviousIds);<br>
>> + }<br>
>> +<br>
>> /// Given a sequence of combined type and ID records, compute global<br>
>> hashes<br>
>> /// for each of them, returning the results in a vector of hashed<br>
>> types.<br>
>> template <typename Range><br>
>> static std::vector<GloballyHashedType> hashTypes(Range &&Records) {<br>
>> std::vector<GloballyHashedType> Hashes;<br>
>> - Hashes.reserve(std::distance(std::begin(Records),<br>
>> std::end(Records)));<br>
>> for (const auto &R : Records)<br>
>> Hashes.push_back(hashType(R, Hashes, Hashes));<br>
>><br>
>> return Hashes;<br>
>> }<br>
>><br>
>> + /// Given a sequence of combined type and ID records, compute global<br>
>> hashes<br>
>> + /// for each of them, returning the results in a vector of hashed<br>
>> types.<br>
>> + template <typename Range><br>
>> + static std::vector<GloballyHashedType><br>
>> + hashIds(Range &&Records, ArrayRef<GloballyHashedType> TypeHashes) {<br>
>> + std::vector<GloballyHashedType> IdHashes;<br>
>> + for (const auto &R : Records)<br>
>> + IdHashes.push_back(hashType(R, TypeHashes, IdHashes));<br>
>> +<br>
>> + return IdHashes;<br>
>> + }<br>
>> +<br>
>> static std::vector<GloballyHashedType><br>
>> hashTypeCollection(TypeCollection &Types) {<br>
>> std::vector<GloballyHashedType> Hashes;<br>
>> @@ -109,6 +130,11 @@ struct GloballyHashedType {<br>
>> return Hashes;<br>
>> }<br>
>> };<br>
>> +static_assert(std::is_trivially_copyable<GloballyHashedType>::value,<br>
>> + "GloballyHashedType must be trivially copyable so that we<br>
>> can "<br>
>> + "reinterpret_cast arrays of hash data to arrays of "<br>
>> + "GloballyHashedType");<br>
>> +<br>
>> } // namespace codeview<br>
>><br>
>> template <> struct DenseMapInfo<codeview::LocallyHashedType> {<br>
>><br>
>> Modified: llvm/trunk/include/llvm/DebugInfo/CodeView/TypeStreamMerger.h<br>
>> URL:<br>
>> <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/CodeView/TypeStreamMerger.h?rev=320719&r1=320718&r2=320719&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/CodeView/TypeStreamMerger.h?rev=320719&r1=320718&r2=320719&view=diff</a><br>
>><br>
>> ==============================================================================<br>
>> --- llvm/trunk/include/llvm/DebugInfo/CodeView/TypeStreamMerger.h<br>
>> (original)<br>
>> +++ llvm/trunk/include/llvm/DebugInfo/CodeView/TypeStreamMerger.h Thu Dec<br>
>> 14 10:07:04 2017<br>
>> @@ -19,6 +19,8 @@ namespace llvm {<br>
>> namespace codeview {<br>
>><br>
>> class TypeIndex;<br>
>> +struct GloballyHashedType;<br>
>> +class GlobalTypeTableBuilder;<br>
>> class MergingTypeTableBuilder;<br>
>><br>
>> /// \brief Merge one set of type records into another. This method<br>
>> assumes<br>
>> @@ -83,6 +85,22 @@ Error mergeTypeAndIdRecords(MergingTypeT<br>
>> SmallVectorImpl<TypeIndex> &SourceToDest,<br>
>> const CVTypeArray &IdsAndTypes);<br>
>><br>
>> +Error mergeTypeAndIdRecords(GlobalTypeTableBuilder &DestIds,<br>
>> + GlobalTypeTableBuilder &DestTypes,<br>
>> + SmallVectorImpl<TypeIndex> &SourceToDest,<br>
>> + const CVTypeArray &IdsAndTypes,<br>
>> + ArrayRef<GloballyHashedType> Hashes);<br>
>> +<br>
>> +Error mergeTypeRecords(GlobalTypeTableBuilder &Dest,<br>
>> + SmallVectorImpl<TypeIndex> &SourceToDest,<br>
>> + const CVTypeArray &Types,<br>
>> + ArrayRef<GloballyHashedType> Hashes);<br>
>> +<br>
>> +Error mergeIdRecords(GlobalTypeTableBuilder &Dest, ArrayRef<TypeIndex><br>
>> Types,<br>
>> + SmallVectorImpl<TypeIndex> &SourceToDest,<br>
>> + const CVTypeArray &Ids,<br>
>> + ArrayRef<GloballyHashedType> Hashes);<br>
>> +<br>
>> } // end namespace codeview<br>
>> } // end namespace llvm<br>
>><br>
>><br>
>> Modified: llvm/trunk/include/llvm/Object/COFF.h<br>
>> URL:<br>
>> <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Object/COFF.h?rev=320719&r1=320718&r2=320719&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Object/COFF.h?rev=320719&r1=320718&r2=320719&view=diff</a><br>
>><br>
>> ==============================================================================<br>
>> --- llvm/trunk/include/llvm/Object/COFF.h (original)<br>
>> +++ llvm/trunk/include/llvm/Object/COFF.h Thu Dec 14 10:07:04 2017<br>
>> @@ -743,6 +743,12 @@ struct coff_resource_dir_table {<br>
>> support::ulittle16_t NumberOfIDEntries;<br>
>> };<br>
>><br>
>> +struct debug_h_header {<br>
>> + support::ulittle32_t Magic;<br>
>> + support::ulittle16_t Version;<br>
>> + support::ulittle16_t HashAlgorithm;<br>
>> +};<br>
>> +<br>
>> class COFFObjectFile : public ObjectFile {<br>
>> private:<br>
>> friend class ImportDirectoryEntryRef;<br>
>><br>
>> Modified: llvm/trunk/lib/DebugInfo/CodeView/TypeHashing.cpp<br>
>> URL:<br>
>> <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/DebugInfo/CodeView/TypeHashing.cpp?rev=320719&r1=320718&r2=320719&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/DebugInfo/CodeView/TypeHashing.cpp?rev=320719&r1=320718&r2=320719&view=diff</a><br>
>><br>
>> ==============================================================================<br>
>> --- llvm/trunk/lib/DebugInfo/CodeView/TypeHashing.cpp (original)<br>
>> +++ llvm/trunk/lib/DebugInfo/CodeView/TypeHashing.cpp Thu Dec 14 10:07:04<br>
>> 2017<br>
>> @@ -54,7 +54,7 @@ GloballyHashedType::hashType(ArrayRef<ui<br>
>> reinterpret_cast<const TypeIndex *>(RefData.data()), Ref.Count);<br>
>> for (TypeIndex TI : Indices) {<br>
>> ArrayRef<uint8_t> BytesToHash;<br>
>> - if (TI.isSimple() || TI.isNoneType()) {<br>
>> + if (TI.isSimple() || TI.isNoneType() || TI.toArrayIndex() >=<br>
>> Prev.size()) {<br>
>> const uint8_t *IndexBytes = reinterpret_cast<const uint8_t<br>
>> *>(&TI);<br>
>> BytesToHash = makeArrayRef(IndexBytes, sizeof(TypeIndex));<br>
>> } else {<br>
>><br>
>> Modified: llvm/trunk/lib/DebugInfo/CodeView/TypeStreamMerger.cpp<br>
>> URL:<br>
>> <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/DebugInfo/CodeView/TypeStreamMerger.cpp?rev=320719&r1=320718&r2=320719&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/DebugInfo/CodeView/TypeStreamMerger.cpp?rev=320719&r1=320718&r2=320719&view=diff</a><br>
>><br>
>> ==============================================================================<br>
>> --- llvm/trunk/lib/DebugInfo/CodeView/TypeStreamMerger.cpp (original)<br>
>> +++ llvm/trunk/lib/DebugInfo/CodeView/TypeStreamMerger.cpp Thu Dec 14<br>
>> 10:07:04 2017<br>
>> @@ -10,6 +10,7 @@<br>
>> #include "llvm/DebugInfo/CodeView/TypeStreamMerger.h"<br>
>> #include "llvm/ADT/SmallString.h"<br>
>> #include "llvm/ADT/StringExtras.h"<br>
>> +#include "llvm/DebugInfo/CodeView/GlobalTypeTableBuilder.h"<br>
>> #include "llvm/DebugInfo/CodeView/MergingTypeTableBuilder.h"<br>
>> #include "llvm/DebugInfo/CodeView/TypeIndex.h"<br>
>> #include "llvm/DebugInfo/CodeView/TypeIndexDiscovery.h"<br>
>> @@ -62,6 +63,7 @@ public:<br>
>><br>
>> static const TypeIndex Untranslated;<br>
>><br>
>> + // Local hashing entry points<br>
>> Error mergeTypesAndIds(MergingTypeTableBuilder &DestIds,<br>
>> MergingTypeTableBuilder &DestTypes,<br>
>> const CVTypeArray &IdsAndTypes);<br>
>> @@ -71,6 +73,18 @@ public:<br>
>> Error mergeTypeRecords(MergingTypeTableBuilder &Dest,<br>
>> const CVTypeArray &Types);<br>
>><br>
>> + // Global hashing entry points<br>
>> + Error mergeTypesAndIds(GlobalTypeTableBuilder &DestIds,<br>
>> + GlobalTypeTableBuilder &DestTypes,<br>
>> + const CVTypeArray &IdsAndTypes,<br>
>> + ArrayRef<GloballyHashedType> Hashes);<br>
>> + Error mergeIdRecords(GlobalTypeTableBuilder &Dest,<br>
>> + ArrayRef<TypeIndex> TypeSourceToDest,<br>
>> + const CVTypeArray &Ids,<br>
>> + ArrayRef<GloballyHashedType> Hashes);<br>
>> + Error mergeTypeRecords(GlobalTypeTableBuilder &Dest, const CVTypeArray<br>
>> &Types,<br>
>> + ArrayRef<GloballyHashedType> Hashes);<br>
>> +<br>
>> private:<br>
>> Error doit(const CVTypeArray &Types);<br>
>><br>
>> @@ -83,6 +97,14 @@ private:<br>
>> bool remapTypeIndex(TypeIndex &Idx);<br>
>> bool remapItemIndex(TypeIndex &Idx);<br>
>><br>
>> + bool hasTypeStream() const {<br>
>> + return (UseGlobalHashes) ? (!!DestGlobalTypeStream) :<br>
>> (!!DestTypeStream);<br>
>> + }<br>
>> +<br>
>> + bool hasIdStream() const {<br>
>> + return (UseGlobalHashes) ? (!!DestGlobalIdStream) : (!!DestIdStream);<br>
>> + }<br>
>> +<br>
>> ArrayRef<uint8_t> serializeRemapped(const RemappedType &Record);<br>
>><br>
>> bool remapIndices(RemappedType &Record, ArrayRef<TiReference> Refs);<br>
>> @@ -100,6 +122,8 @@ private:<br>
>><br>
>> Optional<Error> LastError;<br>
>><br>
>> + bool UseGlobalHashes = false;<br>
>> +<br>
>> bool IsSecondPass = false;<br>
>><br>
>> unsigned NumBadIndices = 0;<br>
>> @@ -109,6 +133,11 @@ private:<br>
>> MergingTypeTableBuilder *DestIdStream = nullptr;<br>
>> MergingTypeTableBuilder *DestTypeStream = nullptr;<br>
>><br>
>> + GlobalTypeTableBuilder *DestGlobalIdStream = nullptr;<br>
>> + GlobalTypeTableBuilder *DestGlobalTypeStream = nullptr;<br>
>> +<br>
>> + ArrayRef<GloballyHashedType> GlobalHashes;<br>
>> +<br>
>> // If we're only mapping id records, this array contains the mapping<br>
>> for<br>
>> // type records.<br>
>> ArrayRef<TypeIndex> TypeLookup;<br>
>> @@ -209,7 +238,7 @@ bool TypeStreamMerger::remapTypeIndex(Ty<br>
>> // special mapping from OldTypeStream -> NewTypeStream which was<br>
>> computed<br>
>> // externally. Regardless, we use this special map if and only if we<br>
>> are<br>
>> // doing an id-only mapping.<br>
>> - if (DestTypeStream == nullptr)<br>
>> + if (!hasTypeStream())<br>
>> return remapIndex(Idx, TypeLookup);<br>
>><br>
>> assert(TypeLookup.empty());<br>
>> @@ -217,13 +246,15 @@ bool TypeStreamMerger::remapTypeIndex(Ty<br>
>> }<br>
>><br>
>> bool TypeStreamMerger::remapItemIndex(TypeIndex &Idx) {<br>
>> - assert(DestIdStream);<br>
>> + assert(hasIdStream());<br>
>> return remapIndex(Idx, IndexMap);<br>
>> }<br>
>><br>
>> +// Local hashing entry points<br>
>> Error TypeStreamMerger::mergeTypeRecords(MergingTypeTableBuilder &Dest,<br>
>> const CVTypeArray &Types) {<br>
>> DestTypeStream = &Dest;<br>
>> + UseGlobalHashes = false;<br>
>><br>
>> return doit(Types);<br>
>> }<br>
>> @@ -233,6 +264,7 @@ Error TypeStreamMerger::mergeIdRecords(M<br>
>> const CVTypeArray &Ids) {<br>
>> DestIdStream = &Dest;<br>
>> TypeLookup = TypeSourceToDest;<br>
>> + UseGlobalHashes = false;<br>
>><br>
>> return doit(Ids);<br>
>> }<br>
>> @@ -242,6 +274,41 @@ Error TypeStreamMerger::mergeTypesAndIds<br>
>> const CVTypeArray &IdsAndTypes)<br>
>> {<br>
>> DestIdStream = &DestIds;<br>
>> DestTypeStream = &DestTypes;<br>
>> + UseGlobalHashes = false;<br>
>> + return doit(IdsAndTypes);<br>
>> +}<br>
>> +<br>
>> +// Global hashing entry points<br>
>> +Error TypeStreamMerger::mergeTypeRecords(GlobalTypeTableBuilder &Dest,<br>
>> + const CVTypeArray &Types,<br>
>> + ArrayRef<GloballyHashedType><br>
>> Hashes) {<br>
>> + DestGlobalTypeStream = &Dest;<br>
>> + UseGlobalHashes = true;<br>
>> + GlobalHashes = Hashes;<br>
>> +<br>
>> + return doit(Types);<br>
>> +}<br>
>> +<br>
>> +Error TypeStreamMerger::mergeIdRecords(GlobalTypeTableBuilder &Dest,<br>
>> + ArrayRef<TypeIndex><br>
>> TypeSourceToDest,<br>
>> + const CVTypeArray &Ids,<br>
>> + ArrayRef<GloballyHashedType><br>
>> Hashes) {<br>
>> + DestGlobalIdStream = &Dest;<br>
>> + TypeLookup = TypeSourceToDest;<br>
>> + UseGlobalHashes = true;<br>
>> + GlobalHashes = Hashes;<br>
>> +<br>
>> + return doit(Ids);<br>
>> +}<br>
>> +<br>
>> +Error TypeStreamMerger::mergeTypesAndIds(GlobalTypeTableBuilder &DestIds,<br>
>> + GlobalTypeTableBuilder<br>
>> &DestTypes,<br>
>> + const CVTypeArray &IdsAndTypes,<br>
>> + ArrayRef<GloballyHashedType><br>
>> Hashes) {<br>
>> + DestGlobalIdStream = &DestIds;<br>
>> + DestGlobalTypeStream = &DestTypes;<br>
>> + UseGlobalHashes = true;<br>
>> + GlobalHashes = Hashes;<br>
>> return doit(IdsAndTypes);<br>
>> }<br>
>><br>
>> @@ -286,18 +353,29 @@ Error TypeStreamMerger::remapAllTypes(co<br>
>> }<br>
>><br>
>> Error TypeStreamMerger::remapType(const CVType &Type) {<br>
>> - MergingTypeTableBuilder &Dest =<br>
>> - isIdRecord(Type.kind()) ? *DestIdStream : *DestTypeStream;<br>
>> -<br>
>> - RemappedType R(Type);<br>
>> - SmallVector<TiReference, 32> Refs;<br>
>> - discoverTypeIndices(Type.RecordData, Refs);<br>
>> - bool MappedAllIndices = remapIndices(R, Refs);<br>
>> - ArrayRef<uint8_t> Data = serializeRemapped(R);<br>
>> + auto DoSerialize = [this, Type]() -> ArrayRef<uint8_t> {<br>
>> + RemappedType R(Type);<br>
>> + SmallVector<TiReference, 32> Refs;<br>
>> + discoverTypeIndices(Type.RecordData, Refs);<br>
>> + if (!remapIndices(R, Refs))<br>
>> + return {};<br>
>> + return serializeRemapped(R);<br>
>> + };<br>
>><br>
>> TypeIndex DestIdx = Untranslated;<br>
>> - if (MappedAllIndices)<br>
>> - DestIdx = Dest.insertRecordBytes(Data);<br>
>> + if (UseGlobalHashes) {<br>
>> + GlobalTypeTableBuilder &Dest =<br>
>> + isIdRecord(Type.kind()) ? *DestGlobalIdStream :<br>
>> *DestGlobalTypeStream;<br>
>> + GloballyHashedType H = GlobalHashes[CurIndex.toArrayIndex()];<br>
>> + DestIdx = Dest.insertRecordAs(H, DoSerialize);<br>
>> + } else {<br>
>> + MergingTypeTableBuilder &Dest =<br>
>> + isIdRecord(Type.kind()) ? *DestIdStream : *DestTypeStream;<br>
>> +<br>
>> + auto Data = DoSerialize();<br>
>> + if (!Data.empty())<br>
>> + DestIdx = Dest.insertRecordBytes(Data);<br>
>> + }<br>
>> addMapping(DestIdx);<br>
>><br>
>> ++CurIndex;<br>
>> @@ -350,3 +428,28 @@ Error llvm::codeview::mergeTypeAndIdReco<br>
>> TypeStreamMerger M(SourceToDest);<br>
>> return M.mergeTypesAndIds(DestIds, DestTypes, IdsAndTypes);<br>
>> }<br>
>> +<br>
>> +Error llvm::codeview::mergeTypeAndIdRecords(<br>
>> + GlobalTypeTableBuilder &DestIds, GlobalTypeTableBuilder &DestTypes,<br>
>> + SmallVectorImpl<TypeIndex> &SourceToDest, const CVTypeArray<br>
>> &IdsAndTypes,<br>
>> + ArrayRef<GloballyHashedType> Hashes) {<br>
>> + TypeStreamMerger M(SourceToDest);<br>
>> + return M.mergeTypesAndIds(DestIds, DestTypes, IdsAndTypes, Hashes);<br>
>> +}<br>
>> +<br>
>> +Error llvm::codeview::mergeTypeRecords(GlobalTypeTableBuilder &Dest,<br>
>> + SmallVectorImpl<TypeIndex><br>
>> &SourceToDest,<br>
>> + const CVTypeArray &Types,<br>
>> + ArrayRef<GloballyHashedType><br>
>> Hashes) {<br>
>> + TypeStreamMerger M(SourceToDest);<br>
>> + return M.mergeTypeRecords(Dest, Types, Hashes);<br>
>> +}<br>
>> +<br>
>> +Error llvm::codeview::mergeIdRecords(GlobalTypeTableBuilder &Dest,<br>
>> + ArrayRef<TypeIndex> Types,<br>
>> + SmallVectorImpl<TypeIndex><br>
>> &SourceToDest,<br>
>> + const CVTypeArray &Ids,<br>
>> + ArrayRef<GloballyHashedType> Hashes)<br>
>> {<br>
>> + TypeStreamMerger M(SourceToDest);<br>
>> + return M.mergeIdRecords(Dest, Types, Ids, Hashes);<br>
>> +}<br>
>><br>
>><br>
>> _______________________________________________<br>
>> llvm-commits mailing list<br>
>> <a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a><br>
>> <a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a><br>
><br>
><br>
><br>
> _______________________________________________<br>
> llvm-commits mailing list<br>
> <a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a><br>
> <a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a><br>
><br>
</blockquote></div>
</div></div></blockquote></div><br></div></blockquote></div>