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