From f5cb6279a6e6dff3075b24d35075df204e7066b4 Mon Sep 17 00:00:00 2001 From: David Blaikie Date: Mon, 14 Dec 2015 07:42:00 +0000 Subject: [llvm-dwp] Deduplicate type units It's O(N^2) because it does a simple walk through the existing types to find duplicates, but that will be fixed in a follow-up commit to use a mapping data structure of some kind. llvm-svn: 255482 --- llvm/tools/llvm-dwp/llvm-dwp.cpp | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) (limited to 'llvm/tools/llvm-dwp/llvm-dwp.cpp') diff --git a/llvm/tools/llvm-dwp/llvm-dwp.cpp b/llvm/tools/llvm-dwp/llvm-dwp.cpp index 5d95a751f71..5fb1c52330f 100644 --- a/llvm/tools/llvm-dwp/llvm-dwp.cpp +++ b/llvm/tools/llvm-dwp/llvm-dwp.cpp @@ -148,24 +148,30 @@ static void addAllTypes(MCStreamer &Out, uint32_t Offset = 0; DataExtractor Data(Types, true, 0); while (Data.isValidOffset(Offset)) { - TypeIndexEntries.push_back(CUEntry); - auto &Entry = TypeIndexEntries.back(); + UnitIndexEntry Entry = CUEntry; // Zero out the debug_info contribution Entry.Contributions[0] = {}; auto &C = Entry.Contributions[DW_SECT_TYPES - DW_SECT_INFO]; - C.Offset = TypesOffset + Offset; + C.Offset = TypesOffset; auto PrevOffset = Offset; // Length of the unit, including the 4 byte length field. C.Length = Data.getU32(&Offset) + 4; - Out.EmitBytes(Types.substr(Offset - 4, C.Length)); - TypesOffset += C.Length; - Data.getU16(&Offset); // Version Data.getU32(&Offset); // Abbrev offset Data.getU8(&Offset); // Address size Entry.Signature = Data.getU64(&Offset); Offset = PrevOffset + C.Length; + + if (any_of(TypeIndexEntries, [&](const UnitIndexEntry &E) { + return E.Signature == Entry.Signature; + })) + continue; + + Out.EmitBytes(Types.substr(PrevOffset, C.Length)); + TypesOffset += C.Length; + + TypeIndexEntries.push_back(Entry); } } -- cgit v1.2.3