summaryrefslogtreecommitdiffstats
path: root/contrib/libs/llvm12/lib/DebugInfo/CodeView
diff options
context:
space:
mode:
authororivej <[email protected]>2022-02-10 16:45:01 +0300
committerDaniil Cherednik <[email protected]>2022-02-10 16:45:01 +0300
commit2d37894b1b037cf24231090eda8589bbb44fb6fc (patch)
treebe835aa92c6248212e705f25388ebafcf84bc7a1 /contrib/libs/llvm12/lib/DebugInfo/CodeView
parent718c552901d703c502ccbefdfc3c9028d608b947 (diff)
Restoring authorship annotation for <[email protected]>. Commit 2 of 2.
Diffstat (limited to 'contrib/libs/llvm12/lib/DebugInfo/CodeView')
-rw-r--r--contrib/libs/llvm12/lib/DebugInfo/CodeView/AppendingTypeTableBuilder.cpp224
-rw-r--r--contrib/libs/llvm12/lib/DebugInfo/CodeView/CVSymbolVisitor.cpp164
-rw-r--r--contrib/libs/llvm12/lib/DebugInfo/CodeView/CVTypeVisitor.cpp548
-rw-r--r--contrib/libs/llvm12/lib/DebugInfo/CodeView/CodeViewError.cpp98
-rw-r--r--contrib/libs/llvm12/lib/DebugInfo/CodeView/CodeViewRecordIO.cpp740
-rw-r--r--contrib/libs/llvm12/lib/DebugInfo/CodeView/ContinuationRecordBuilder.cpp502
-rw-r--r--contrib/libs/llvm12/lib/DebugInfo/CodeView/DebugChecksumsSubsection.cpp230
-rw-r--r--contrib/libs/llvm12/lib/DebugInfo/CodeView/DebugCrossExSubsection.cpp104
-rw-r--r--contrib/libs/llvm12/lib/DebugInfo/CodeView/DebugCrossImpSubsection.cpp192
-rw-r--r--contrib/libs/llvm12/lib/DebugInfo/CodeView/DebugFrameDataSubsection.cpp114
-rw-r--r--contrib/libs/llvm12/lib/DebugInfo/CodeView/DebugInlineeLinesSubsection.cpp250
-rw-r--r--contrib/libs/llvm12/lib/DebugInfo/CodeView/DebugLinesSubsection.cpp320
-rw-r--r--contrib/libs/llvm12/lib/DebugInfo/CodeView/DebugStringTableSubsection.cpp214
-rw-r--r--contrib/libs/llvm12/lib/DebugInfo/CodeView/DebugSubsection.cpp30
-rw-r--r--contrib/libs/llvm12/lib/DebugInfo/CodeView/DebugSubsectionRecord.cpp188
-rw-r--r--contrib/libs/llvm12/lib/DebugInfo/CodeView/DebugSubsectionVisitor.cpp188
-rw-r--r--contrib/libs/llvm12/lib/DebugInfo/CodeView/DebugSymbolRVASubsection.cpp70
-rw-r--r--contrib/libs/llvm12/lib/DebugInfo/CodeView/DebugSymbolsSubsection.cpp66
-rw-r--r--contrib/libs/llvm12/lib/DebugInfo/CodeView/EnumTables.cpp1096
-rw-r--r--contrib/libs/llvm12/lib/DebugInfo/CodeView/Formatters.cpp94
-rw-r--r--contrib/libs/llvm12/lib/DebugInfo/CodeView/GlobalTypeTableBuilder.cpp280
-rw-r--r--contrib/libs/llvm12/lib/DebugInfo/CodeView/LazyRandomTypeCollection.cpp558
-rw-r--r--contrib/libs/llvm12/lib/DebugInfo/CodeView/Line.cpp42
-rw-r--r--contrib/libs/llvm12/lib/DebugInfo/CodeView/MergingTypeTableBuilder.cpp304
-rw-r--r--contrib/libs/llvm12/lib/DebugInfo/CodeView/RecordName.cpp668
-rw-r--r--contrib/libs/llvm12/lib/DebugInfo/CodeView/RecordSerialization.cpp306
-rw-r--r--contrib/libs/llvm12/lib/DebugInfo/CodeView/SimpleTypeSerializer.cpp134
-rw-r--r--contrib/libs/llvm12/lib/DebugInfo/CodeView/StringsAndChecksums.cpp160
-rw-r--r--contrib/libs/llvm12/lib/DebugInfo/CodeView/SymbolDumper.cpp1358
-rw-r--r--contrib/libs/llvm12/lib/DebugInfo/CodeView/SymbolRecordHelpers.cpp186
-rw-r--r--contrib/libs/llvm12/lib/DebugInfo/CodeView/SymbolRecordMapping.cpp1116
-rw-r--r--contrib/libs/llvm12/lib/DebugInfo/CodeView/SymbolSerializer.cpp118
-rw-r--r--contrib/libs/llvm12/lib/DebugInfo/CodeView/TypeDumpVisitor.cpp1140
-rw-r--r--contrib/libs/llvm12/lib/DebugInfo/CodeView/TypeHashing.cpp160
-rw-r--r--contrib/libs/llvm12/lib/DebugInfo/CodeView/TypeIndex.cpp212
-rw-r--r--contrib/libs/llvm12/lib/DebugInfo/CodeView/TypeIndexDiscovery.cpp1044
-rw-r--r--contrib/libs/llvm12/lib/DebugInfo/CodeView/TypeRecordHelpers.cpp104
-rw-r--r--contrib/libs/llvm12/lib/DebugInfo/CodeView/TypeRecordMapping.cpp1418
-rw-r--r--contrib/libs/llvm12/lib/DebugInfo/CodeView/TypeStreamMerger.cpp990
-rw-r--r--contrib/libs/llvm12/lib/DebugInfo/CodeView/TypeTableCollection.cpp130
-rw-r--r--contrib/libs/llvm12/lib/DebugInfo/CodeView/ya.make114
41 files changed, 7987 insertions, 7987 deletions
diff --git a/contrib/libs/llvm12/lib/DebugInfo/CodeView/AppendingTypeTableBuilder.cpp b/contrib/libs/llvm12/lib/DebugInfo/CodeView/AppendingTypeTableBuilder.cpp
index 6aaa8f581dd..4d8b15530b9 100644
--- a/contrib/libs/llvm12/lib/DebugInfo/CodeView/AppendingTypeTableBuilder.cpp
+++ b/contrib/libs/llvm12/lib/DebugInfo/CodeView/AppendingTypeTableBuilder.cpp
@@ -1,112 +1,112 @@
-//===- AppendingTypeTableBuilder.cpp --------------------------------------===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-
-#include "llvm/DebugInfo/CodeView/AppendingTypeTableBuilder.h"
-#include "llvm/ADT/ArrayRef.h"
-#include "llvm/ADT/DenseSet.h"
-#include "llvm/ADT/STLExtras.h"
-#include "llvm/DebugInfo/CodeView/CodeView.h"
-#include "llvm/DebugInfo/CodeView/ContinuationRecordBuilder.h"
-#include "llvm/DebugInfo/CodeView/RecordSerialization.h"
-#include "llvm/DebugInfo/CodeView/TypeIndex.h"
-#include "llvm/Support/Allocator.h"
-#include "llvm/Support/BinaryByteStream.h"
-#include "llvm/Support/BinaryStreamWriter.h"
-#include "llvm/Support/Endian.h"
-#include "llvm/Support/Error.h"
-#include <algorithm>
-#include <cassert>
-#include <cstdint>
-#include <cstring>
-
-using namespace llvm;
-using namespace llvm::codeview;
-
-TypeIndex AppendingTypeTableBuilder::nextTypeIndex() const {
- return TypeIndex::fromArrayIndex(SeenRecords.size());
-}
-
-AppendingTypeTableBuilder::AppendingTypeTableBuilder(BumpPtrAllocator &Storage)
- : RecordStorage(Storage) {}
-
-AppendingTypeTableBuilder::~AppendingTypeTableBuilder() = default;
-
-Optional<TypeIndex> AppendingTypeTableBuilder::getFirst() {
- if (empty())
- return None;
-
- return TypeIndex(TypeIndex::FirstNonSimpleIndex);
-}
-
-Optional<TypeIndex> AppendingTypeTableBuilder::getNext(TypeIndex Prev) {
- if (++Prev == nextTypeIndex())
- return None;
- return Prev;
-}
-
-CVType AppendingTypeTableBuilder::getType(TypeIndex Index){
- return CVType(SeenRecords[Index.toArrayIndex()]);
-}
-
-StringRef AppendingTypeTableBuilder::getTypeName(TypeIndex Index) {
- llvm_unreachable("Method not implemented");
-}
-
-bool AppendingTypeTableBuilder::contains(TypeIndex Index) {
- if (Index.isSimple() || Index.isNoneType())
- return false;
-
- return Index.toArrayIndex() < SeenRecords.size();
-}
-
-uint32_t AppendingTypeTableBuilder::size() { return SeenRecords.size(); }
-
-uint32_t AppendingTypeTableBuilder::capacity() { return SeenRecords.size(); }
-
-ArrayRef<ArrayRef<uint8_t>> AppendingTypeTableBuilder::records() const {
- return SeenRecords;
-}
-
-void AppendingTypeTableBuilder::reset() { SeenRecords.clear(); }
-
-static ArrayRef<uint8_t> stabilize(BumpPtrAllocator &RecordStorage,
- ArrayRef<uint8_t> Record) {
- uint8_t *Stable = RecordStorage.Allocate<uint8_t>(Record.size());
- memcpy(Stable, Record.data(), Record.size());
- return ArrayRef<uint8_t>(Stable, Record.size());
-}
-
-TypeIndex
-AppendingTypeTableBuilder::insertRecordBytes(ArrayRef<uint8_t> &Record) {
- TypeIndex NewTI = nextTypeIndex();
- Record = stabilize(RecordStorage, Record);
- SeenRecords.push_back(Record);
- return NewTI;
-}
-
-TypeIndex
-AppendingTypeTableBuilder::insertRecord(ContinuationRecordBuilder &Builder) {
- TypeIndex TI;
- auto Fragments = Builder.end(nextTypeIndex());
- assert(!Fragments.empty());
- for (auto C : Fragments)
- TI = insertRecordBytes(C.RecordData);
- return TI;
-}
-
-bool AppendingTypeTableBuilder::replaceType(TypeIndex &Index, CVType Data,
- bool Stabilize) {
- assert(Index.toArrayIndex() < SeenRecords.size() &&
- "This function cannot be used to insert records!");
-
- ArrayRef<uint8_t> Record = Data.data();
- if (Stabilize)
- Record = stabilize(RecordStorage, Record);
- SeenRecords[Index.toArrayIndex()] = Record;
- return true;
-}
+//===- AppendingTypeTableBuilder.cpp --------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "llvm/DebugInfo/CodeView/AppendingTypeTableBuilder.h"
+#include "llvm/ADT/ArrayRef.h"
+#include "llvm/ADT/DenseSet.h"
+#include "llvm/ADT/STLExtras.h"
+#include "llvm/DebugInfo/CodeView/CodeView.h"
+#include "llvm/DebugInfo/CodeView/ContinuationRecordBuilder.h"
+#include "llvm/DebugInfo/CodeView/RecordSerialization.h"
+#include "llvm/DebugInfo/CodeView/TypeIndex.h"
+#include "llvm/Support/Allocator.h"
+#include "llvm/Support/BinaryByteStream.h"
+#include "llvm/Support/BinaryStreamWriter.h"
+#include "llvm/Support/Endian.h"
+#include "llvm/Support/Error.h"
+#include <algorithm>
+#include <cassert>
+#include <cstdint>
+#include <cstring>
+
+using namespace llvm;
+using namespace llvm::codeview;
+
+TypeIndex AppendingTypeTableBuilder::nextTypeIndex() const {
+ return TypeIndex::fromArrayIndex(SeenRecords.size());
+}
+
+AppendingTypeTableBuilder::AppendingTypeTableBuilder(BumpPtrAllocator &Storage)
+ : RecordStorage(Storage) {}
+
+AppendingTypeTableBuilder::~AppendingTypeTableBuilder() = default;
+
+Optional<TypeIndex> AppendingTypeTableBuilder::getFirst() {
+ if (empty())
+ return None;
+
+ return TypeIndex(TypeIndex::FirstNonSimpleIndex);
+}
+
+Optional<TypeIndex> AppendingTypeTableBuilder::getNext(TypeIndex Prev) {
+ if (++Prev == nextTypeIndex())
+ return None;
+ return Prev;
+}
+
+CVType AppendingTypeTableBuilder::getType(TypeIndex Index){
+ return CVType(SeenRecords[Index.toArrayIndex()]);
+}
+
+StringRef AppendingTypeTableBuilder::getTypeName(TypeIndex Index) {
+ llvm_unreachable("Method not implemented");
+}
+
+bool AppendingTypeTableBuilder::contains(TypeIndex Index) {
+ if (Index.isSimple() || Index.isNoneType())
+ return false;
+
+ return Index.toArrayIndex() < SeenRecords.size();
+}
+
+uint32_t AppendingTypeTableBuilder::size() { return SeenRecords.size(); }
+
+uint32_t AppendingTypeTableBuilder::capacity() { return SeenRecords.size(); }
+
+ArrayRef<ArrayRef<uint8_t>> AppendingTypeTableBuilder::records() const {
+ return SeenRecords;
+}
+
+void AppendingTypeTableBuilder::reset() { SeenRecords.clear(); }
+
+static ArrayRef<uint8_t> stabilize(BumpPtrAllocator &RecordStorage,
+ ArrayRef<uint8_t> Record) {
+ uint8_t *Stable = RecordStorage.Allocate<uint8_t>(Record.size());
+ memcpy(Stable, Record.data(), Record.size());
+ return ArrayRef<uint8_t>(Stable, Record.size());
+}
+
+TypeIndex
+AppendingTypeTableBuilder::insertRecordBytes(ArrayRef<uint8_t> &Record) {
+ TypeIndex NewTI = nextTypeIndex();
+ Record = stabilize(RecordStorage, Record);
+ SeenRecords.push_back(Record);
+ return NewTI;
+}
+
+TypeIndex
+AppendingTypeTableBuilder::insertRecord(ContinuationRecordBuilder &Builder) {
+ TypeIndex TI;
+ auto Fragments = Builder.end(nextTypeIndex());
+ assert(!Fragments.empty());
+ for (auto C : Fragments)
+ TI = insertRecordBytes(C.RecordData);
+ return TI;
+}
+
+bool AppendingTypeTableBuilder::replaceType(TypeIndex &Index, CVType Data,
+ bool Stabilize) {
+ assert(Index.toArrayIndex() < SeenRecords.size() &&
+ "This function cannot be used to insert records!");
+
+ ArrayRef<uint8_t> Record = Data.data();
+ if (Stabilize)
+ Record = stabilize(RecordStorage, Record);
+ SeenRecords[Index.toArrayIndex()] = Record;
+ return true;
+}
diff --git a/contrib/libs/llvm12/lib/DebugInfo/CodeView/CVSymbolVisitor.cpp b/contrib/libs/llvm12/lib/DebugInfo/CodeView/CVSymbolVisitor.cpp
index 153eda07908..48b9b0496ff 100644
--- a/contrib/libs/llvm12/lib/DebugInfo/CodeView/CVSymbolVisitor.cpp
+++ b/contrib/libs/llvm12/lib/DebugInfo/CodeView/CVSymbolVisitor.cpp
@@ -1,82 +1,82 @@
-//===- CVSymbolVisitor.cpp --------------------------------------*- C++ -*-===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-
-#include "llvm/DebugInfo/CodeView/CVSymbolVisitor.h"
-
-#include "llvm/DebugInfo/CodeView/CodeViewError.h"
-#include "llvm/DebugInfo/CodeView/SymbolVisitorCallbacks.h"
-
-using namespace llvm;
-using namespace llvm::codeview;
-
-CVSymbolVisitor::CVSymbolVisitor(SymbolVisitorCallbacks &Callbacks)
- : Callbacks(Callbacks) {}
-
-template <typename T>
-static Error visitKnownRecord(CVSymbol &Record,
- SymbolVisitorCallbacks &Callbacks) {
- SymbolRecordKind RK = static_cast<SymbolRecordKind>(Record.kind());
- T KnownRecord(RK);
- if (auto EC = Callbacks.visitKnownRecord(Record, KnownRecord))
- return EC;
- return Error::success();
-}
-
-static Error finishVisitation(CVSymbol &Record,
- SymbolVisitorCallbacks &Callbacks) {
- switch (Record.kind()) {
- default:
- if (auto EC = Callbacks.visitUnknownSymbol(Record))
- return EC;
- break;
-#define SYMBOL_RECORD(EnumName, EnumVal, Name) \
- case EnumName: { \
- if (auto EC = visitKnownRecord<Name>(Record, Callbacks)) \
- return EC; \
- break; \
- }
-#define SYMBOL_RECORD_ALIAS(EnumName, EnumVal, Name, AliasName) \
- SYMBOL_RECORD(EnumVal, EnumVal, AliasName)
-#include "llvm/DebugInfo/CodeView/CodeViewSymbols.def"
- }
-
- if (auto EC = Callbacks.visitSymbolEnd(Record))
- return EC;
-
- return Error::success();
-}
-
-Error CVSymbolVisitor::visitSymbolRecord(CVSymbol &Record) {
- if (auto EC = Callbacks.visitSymbolBegin(Record))
- return EC;
- return finishVisitation(Record, Callbacks);
-}
-
-Error CVSymbolVisitor::visitSymbolRecord(CVSymbol &Record, uint32_t Offset) {
- if (auto EC = Callbacks.visitSymbolBegin(Record, Offset))
- return EC;
- return finishVisitation(Record, Callbacks);
-}
-
-Error CVSymbolVisitor::visitSymbolStream(const CVSymbolArray &Symbols) {
- for (auto I : Symbols) {
- if (auto EC = visitSymbolRecord(I))
- return EC;
- }
- return Error::success();
-}
-
-Error CVSymbolVisitor::visitSymbolStream(const CVSymbolArray &Symbols,
- uint32_t InitialOffset) {
- for (auto I : Symbols) {
- if (auto EC = visitSymbolRecord(I, InitialOffset + Symbols.skew()))
- return EC;
- InitialOffset += I.length();
- }
- return Error::success();
-}
+//===- CVSymbolVisitor.cpp --------------------------------------*- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "llvm/DebugInfo/CodeView/CVSymbolVisitor.h"
+
+#include "llvm/DebugInfo/CodeView/CodeViewError.h"
+#include "llvm/DebugInfo/CodeView/SymbolVisitorCallbacks.h"
+
+using namespace llvm;
+using namespace llvm::codeview;
+
+CVSymbolVisitor::CVSymbolVisitor(SymbolVisitorCallbacks &Callbacks)
+ : Callbacks(Callbacks) {}
+
+template <typename T>
+static Error visitKnownRecord(CVSymbol &Record,
+ SymbolVisitorCallbacks &Callbacks) {
+ SymbolRecordKind RK = static_cast<SymbolRecordKind>(Record.kind());
+ T KnownRecord(RK);
+ if (auto EC = Callbacks.visitKnownRecord(Record, KnownRecord))
+ return EC;
+ return Error::success();
+}
+
+static Error finishVisitation(CVSymbol &Record,
+ SymbolVisitorCallbacks &Callbacks) {
+ switch (Record.kind()) {
+ default:
+ if (auto EC = Callbacks.visitUnknownSymbol(Record))
+ return EC;
+ break;
+#define SYMBOL_RECORD(EnumName, EnumVal, Name) \
+ case EnumName: { \
+ if (auto EC = visitKnownRecord<Name>(Record, Callbacks)) \
+ return EC; \
+ break; \
+ }
+#define SYMBOL_RECORD_ALIAS(EnumName, EnumVal, Name, AliasName) \
+ SYMBOL_RECORD(EnumVal, EnumVal, AliasName)
+#include "llvm/DebugInfo/CodeView/CodeViewSymbols.def"
+ }
+
+ if (auto EC = Callbacks.visitSymbolEnd(Record))
+ return EC;
+
+ return Error::success();
+}
+
+Error CVSymbolVisitor::visitSymbolRecord(CVSymbol &Record) {
+ if (auto EC = Callbacks.visitSymbolBegin(Record))
+ return EC;
+ return finishVisitation(Record, Callbacks);
+}
+
+Error CVSymbolVisitor::visitSymbolRecord(CVSymbol &Record, uint32_t Offset) {
+ if (auto EC = Callbacks.visitSymbolBegin(Record, Offset))
+ return EC;
+ return finishVisitation(Record, Callbacks);
+}
+
+Error CVSymbolVisitor::visitSymbolStream(const CVSymbolArray &Symbols) {
+ for (auto I : Symbols) {
+ if (auto EC = visitSymbolRecord(I))
+ return EC;
+ }
+ return Error::success();
+}
+
+Error CVSymbolVisitor::visitSymbolStream(const CVSymbolArray &Symbols,
+ uint32_t InitialOffset) {
+ for (auto I : Symbols) {
+ if (auto EC = visitSymbolRecord(I, InitialOffset + Symbols.skew()))
+ return EC;
+ InitialOffset += I.length();
+ }
+ return Error::success();
+}
diff --git a/contrib/libs/llvm12/lib/DebugInfo/CodeView/CVTypeVisitor.cpp b/contrib/libs/llvm12/lib/DebugInfo/CodeView/CVTypeVisitor.cpp
index 4f36c4a7198..dd6f75f97a4 100644
--- a/contrib/libs/llvm12/lib/DebugInfo/CodeView/CVTypeVisitor.cpp
+++ b/contrib/libs/llvm12/lib/DebugInfo/CodeView/CVTypeVisitor.cpp
@@ -1,274 +1,274 @@
-//===- CVTypeVisitor.cpp ----------------------------------------*- C++ -*-===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-
-#include "llvm/DebugInfo/CodeView/CVTypeVisitor.h"
-
-#include "llvm/DebugInfo/CodeView/CodeViewError.h"
-#include "llvm/DebugInfo/CodeView/TypeCollection.h"
-#include "llvm/DebugInfo/CodeView/TypeDeserializer.h"
-#include "llvm/DebugInfo/CodeView/TypeRecordMapping.h"
-#include "llvm/DebugInfo/CodeView/TypeVisitorCallbackPipeline.h"
-#include "llvm/Support/BinaryByteStream.h"
-#include "llvm/Support/BinaryStreamReader.h"
-
-using namespace llvm;
-using namespace llvm::codeview;
-
-
-template <typename T>
-static Error visitKnownRecord(CVType &Record, TypeVisitorCallbacks &Callbacks) {
- TypeRecordKind RK = static_cast<TypeRecordKind>(Record.kind());
- T KnownRecord(RK);
- if (auto EC = Callbacks.visitKnownRecord(Record, KnownRecord))
- return EC;
- return Error::success();
-}
-
-template <typename T>
-static Error visitKnownMember(CVMemberRecord &Record,
- TypeVisitorCallbacks &Callbacks) {
- TypeRecordKind RK = static_cast<TypeRecordKind>(Record.Kind);
- T KnownRecord(RK);
- if (auto EC = Callbacks.visitKnownMember(Record, KnownRecord))
- return EC;
- return Error::success();
-}
-
-static Error visitMemberRecord(CVMemberRecord &Record,
- TypeVisitorCallbacks &Callbacks) {
- if (auto EC = Callbacks.visitMemberBegin(Record))
- return EC;
-
- switch (Record.Kind) {
- default:
- if (auto EC = Callbacks.visitUnknownMember(Record))
- return EC;
- break;
-#define MEMBER_RECORD(EnumName, EnumVal, Name) \
- case EnumName: { \
- if (auto EC = visitKnownMember<Name##Record>(Record, Callbacks)) \
- return EC; \
- break; \
- }
-#define MEMBER_RECORD_ALIAS(EnumName, EnumVal, Name, AliasName) \
- MEMBER_RECORD(EnumVal, EnumVal, AliasName)
-#define TYPE_RECORD(EnumName, EnumVal, Name)
-#define TYPE_RECORD_ALIAS(EnumName, EnumVal, Name, AliasName)
-#include "llvm/DebugInfo/CodeView/CodeViewTypes.def"
- }
-
- if (auto EC = Callbacks.visitMemberEnd(Record))
- return EC;
-
- return Error::success();
-}
-
-namespace {
-
-class CVTypeVisitor {
-public:
- explicit CVTypeVisitor(TypeVisitorCallbacks &Callbacks);
-
- Error visitTypeRecord(CVType &Record, TypeIndex Index);
- Error visitTypeRecord(CVType &Record);
-
- /// Visits the type records in Data. Sets the error flag on parse failures.
- Error visitTypeStream(const CVTypeArray &Types);
- Error visitTypeStream(CVTypeRange Types);
- Error visitTypeStream(TypeCollection &Types);
-
- Error visitMemberRecord(CVMemberRecord Record);
- Error visitFieldListMemberStream(BinaryStreamReader &Stream);
-
-private:
- Error finishVisitation(CVType &Record);
-
- /// The interface to the class that gets notified of each visitation.
- TypeVisitorCallbacks &Callbacks;
-};
-
-CVTypeVisitor::CVTypeVisitor(TypeVisitorCallbacks &Callbacks)
- : Callbacks(Callbacks) {}
-
-Error CVTypeVisitor::finishVisitation(CVType &Record) {
- switch (Record.kind()) {
- default:
- if (auto EC = Callbacks.visitUnknownType(Record))
- return EC;
- break;
-#define TYPE_RECORD(EnumName, EnumVal, Name) \
- case EnumName: { \
- if (auto EC = visitKnownRecord<Name##Record>(Record, Callbacks)) \
- return EC; \
- break; \
- }
-#define TYPE_RECORD_ALIAS(EnumName, EnumVal, Name, AliasName) \
- TYPE_RECORD(EnumVal, EnumVal, AliasName)
-#define MEMBER_RECORD(EnumName, EnumVal, Name)
-#define MEMBER_RECORD_ALIAS(EnumName, EnumVal, Name, AliasName)
-#include "llvm/DebugInfo/CodeView/CodeViewTypes.def"
- }
-
- if (auto EC = Callbacks.visitTypeEnd(Record))
- return EC;
-
- return Error::success();
-}
-
-Error CVTypeVisitor::visitTypeRecord(CVType &Record, TypeIndex Index) {
- if (auto EC = Callbacks.visitTypeBegin(Record, Index))
- return EC;
-
- return finishVisitation(Record);
-}
-
-Error CVTypeVisitor::visitTypeRecord(CVType &Record) {
- if (auto EC = Callbacks.visitTypeBegin(Record))
- return EC;
-
- return finishVisitation(Record);
-}
-
-Error CVTypeVisitor::visitMemberRecord(CVMemberRecord Record) {
- return ::visitMemberRecord(Record, Callbacks);
-}
-
-/// Visits the type records in Data. Sets the error flag on parse failures.
-Error CVTypeVisitor::visitTypeStream(const CVTypeArray &Types) {
- for (auto I : Types) {
- if (auto EC = visitTypeRecord(I))
- return EC;
- }
- return Error::success();
-}
-
-Error CVTypeVisitor::visitTypeStream(CVTypeRange Types) {
- for (auto I : Types) {
- if (auto EC = visitTypeRecord(I))
- return EC;
- }
- return Error::success();
-}
-
-Error CVTypeVisitor::visitTypeStream(TypeCollection &Types) {
- Optional<TypeIndex> I = Types.getFirst();
- while (I) {
- CVType Type = Types.getType(*I);
- if (auto EC = visitTypeRecord(Type, *I))
- return EC;
- I = Types.getNext(*I);
- }
- return Error::success();
-}
-
-Error CVTypeVisitor::visitFieldListMemberStream(BinaryStreamReader &Reader) {
- TypeLeafKind Leaf;
- while (!Reader.empty()) {
- if (auto EC = Reader.readEnum(Leaf))
- return EC;
-
- CVMemberRecord Record;
- Record.Kind = Leaf;
- if (auto EC = ::visitMemberRecord(Record, Callbacks))
- return EC;
- }
-
- return Error::success();
-}
-
-struct FieldListVisitHelper {
- FieldListVisitHelper(TypeVisitorCallbacks &Callbacks, ArrayRef<uint8_t> Data,
- VisitorDataSource Source)
- : Stream(Data, llvm::support::little), Reader(Stream),
- Deserializer(Reader),
- Visitor((Source == VDS_BytesPresent) ? Pipeline : Callbacks) {
- if (Source == VDS_BytesPresent) {
- Pipeline.addCallbackToPipeline(Deserializer);
- Pipeline.addCallbackToPipeline(Callbacks);
- }
- }
-
- BinaryByteStream Stream;
- BinaryStreamReader Reader;
- FieldListDeserializer Deserializer;
- TypeVisitorCallbackPipeline Pipeline;
- CVTypeVisitor Visitor;
-};
-
-struct VisitHelper {
- VisitHelper(TypeVisitorCallbacks &Callbacks, VisitorDataSource Source)
- : Visitor((Source == VDS_BytesPresent) ? Pipeline : Callbacks) {
- if (Source == VDS_BytesPresent) {
- Pipeline.addCallbackToPipeline(Deserializer);
- Pipeline.addCallbackToPipeline(Callbacks);
- }
- }
-
- TypeDeserializer Deserializer;
- TypeVisitorCallbackPipeline Pipeline;
- CVTypeVisitor Visitor;
-};
-}
-
-Error llvm::codeview::visitTypeRecord(CVType &Record, TypeIndex Index,
- TypeVisitorCallbacks &Callbacks,
- VisitorDataSource Source) {
- VisitHelper V(Callbacks, Source);
- return V.Visitor.visitTypeRecord(Record, Index);
-}
-
-Error llvm::codeview::visitTypeRecord(CVType &Record,
- TypeVisitorCallbacks &Callbacks,
- VisitorDataSource Source) {
- VisitHelper V(Callbacks, Source);
- return V.Visitor.visitTypeRecord(Record);
-}
-
-Error llvm::codeview::visitTypeStream(const CVTypeArray &Types,
- TypeVisitorCallbacks &Callbacks,
- VisitorDataSource Source) {
- VisitHelper V(Callbacks, Source);
- return V.Visitor.visitTypeStream(Types);
-}
-
-Error llvm::codeview::visitTypeStream(CVTypeRange Types,
- TypeVisitorCallbacks &Callbacks) {
- VisitHelper V(Callbacks, VDS_BytesPresent);
- return V.Visitor.visitTypeStream(Types);
-}
-
-Error llvm::codeview::visitTypeStream(TypeCollection &Types,
- TypeVisitorCallbacks &Callbacks) {
- // When the internal visitor calls Types.getType(Index) the interface is
- // required to return a CVType with the bytes filled out. So we can assume
- // that the bytes will be present when individual records are visited.
- VisitHelper V(Callbacks, VDS_BytesPresent);
- return V.Visitor.visitTypeStream(Types);
-}
-
-Error llvm::codeview::visitMemberRecord(CVMemberRecord Record,
- TypeVisitorCallbacks &Callbacks,
- VisitorDataSource Source) {
- FieldListVisitHelper V(Callbacks, Record.Data, Source);
- return V.Visitor.visitMemberRecord(Record);
-}
-
-Error llvm::codeview::visitMemberRecord(TypeLeafKind Kind,
- ArrayRef<uint8_t> Record,
- TypeVisitorCallbacks &Callbacks) {
- CVMemberRecord R;
- R.Data = Record;
- R.Kind = Kind;
- return visitMemberRecord(R, Callbacks, VDS_BytesPresent);
-}
-
-Error llvm::codeview::visitMemberRecordStream(ArrayRef<uint8_t> FieldList,
- TypeVisitorCallbacks &Callbacks) {
- FieldListVisitHelper V(Callbacks, FieldList, VDS_BytesPresent);
- return V.Visitor.visitFieldListMemberStream(V.Reader);
-}
+//===- CVTypeVisitor.cpp ----------------------------------------*- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "llvm/DebugInfo/CodeView/CVTypeVisitor.h"
+
+#include "llvm/DebugInfo/CodeView/CodeViewError.h"
+#include "llvm/DebugInfo/CodeView/TypeCollection.h"
+#include "llvm/DebugInfo/CodeView/TypeDeserializer.h"
+#include "llvm/DebugInfo/CodeView/TypeRecordMapping.h"
+#include "llvm/DebugInfo/CodeView/TypeVisitorCallbackPipeline.h"
+#include "llvm/Support/BinaryByteStream.h"
+#include "llvm/Support/BinaryStreamReader.h"
+
+using namespace llvm;
+using namespace llvm::codeview;
+
+
+template <typename T>
+static Error visitKnownRecord(CVType &Record, TypeVisitorCallbacks &Callbacks) {
+ TypeRecordKind RK = static_cast<TypeRecordKind>(Record.kind());
+ T KnownRecord(RK);
+ if (auto EC = Callbacks.visitKnownRecord(Record, KnownRecord))
+ return EC;
+ return Error::success();
+}
+
+template <typename T>
+static Error visitKnownMember(CVMemberRecord &Record,
+ TypeVisitorCallbacks &Callbacks) {
+ TypeRecordKind RK = static_cast<TypeRecordKind>(Record.Kind);
+ T KnownRecord(RK);
+ if (auto EC = Callbacks.visitKnownMember(Record, KnownRecord))
+ return EC;
+ return Error::success();
+}
+
+static Error visitMemberRecord(CVMemberRecord &Record,
+ TypeVisitorCallbacks &Callbacks) {
+ if (auto EC = Callbacks.visitMemberBegin(Record))
+ return EC;
+
+ switch (Record.Kind) {
+ default:
+ if (auto EC = Callbacks.visitUnknownMember(Record))
+ return EC;
+ break;
+#define MEMBER_RECORD(EnumName, EnumVal, Name) \
+ case EnumName: { \
+ if (auto EC = visitKnownMember<Name##Record>(Record, Callbacks)) \
+ return EC; \
+ break; \
+ }
+#define MEMBER_RECORD_ALIAS(EnumName, EnumVal, Name, AliasName) \
+ MEMBER_RECORD(EnumVal, EnumVal, AliasName)
+#define TYPE_RECORD(EnumName, EnumVal, Name)
+#define TYPE_RECORD_ALIAS(EnumName, EnumVal, Name, AliasName)
+#include "llvm/DebugInfo/CodeView/CodeViewTypes.def"
+ }
+
+ if (auto EC = Callbacks.visitMemberEnd(Record))
+ return EC;
+
+ return Error::success();
+}
+
+namespace {
+
+class CVTypeVisitor {
+public:
+ explicit CVTypeVisitor(TypeVisitorCallbacks &Callbacks);
+
+ Error visitTypeRecord(CVType &Record, TypeIndex Index);
+ Error visitTypeRecord(CVType &Record);
+
+ /// Visits the type records in Data. Sets the error flag on parse failures.
+ Error visitTypeStream(const CVTypeArray &Types);
+ Error visitTypeStream(CVTypeRange Types);
+ Error visitTypeStream(TypeCollection &Types);
+
+ Error visitMemberRecord(CVMemberRecord Record);
+ Error visitFieldListMemberStream(BinaryStreamReader &Stream);
+
+private:
+ Error finishVisitation(CVType &Record);
+
+ /// The interface to the class that gets notified of each visitation.
+ TypeVisitorCallbacks &Callbacks;
+};
+
+CVTypeVisitor::CVTypeVisitor(TypeVisitorCallbacks &Callbacks)
+ : Callbacks(Callbacks) {}
+
+Error CVTypeVisitor::finishVisitation(CVType &Record) {
+ switch (Record.kind()) {
+ default:
+ if (auto EC = Callbacks.visitUnknownType(Record))
+ return EC;
+ break;
+#define TYPE_RECORD(EnumName, EnumVal, Name) \
+ case EnumName: { \
+ if (auto EC = visitKnownRecord<Name##Record>(Record, Callbacks)) \
+ return EC; \
+ break; \
+ }
+#define TYPE_RECORD_ALIAS(EnumName, EnumVal, Name, AliasName) \
+ TYPE_RECORD(EnumVal, EnumVal, AliasName)
+#define MEMBER_RECORD(EnumName, EnumVal, Name)
+#define MEMBER_RECORD_ALIAS(EnumName, EnumVal, Name, AliasName)
+#include "llvm/DebugInfo/CodeView/CodeViewTypes.def"
+ }
+
+ if (auto EC = Callbacks.visitTypeEnd(Record))
+ return EC;
+
+ return Error::success();
+}
+
+Error CVTypeVisitor::visitTypeRecord(CVType &Record, TypeIndex Index) {
+ if (auto EC = Callbacks.visitTypeBegin(Record, Index))
+ return EC;
+
+ return finishVisitation(Record);
+}
+
+Error CVTypeVisitor::visitTypeRecord(CVType &Record) {
+ if (auto EC = Callbacks.visitTypeBegin(Record))
+ return EC;
+
+ return finishVisitation(Record);
+}
+
+Error CVTypeVisitor::visitMemberRecord(CVMemberRecord Record) {
+ return ::visitMemberRecord(Record, Callbacks);
+}
+
+/// Visits the type records in Data. Sets the error flag on parse failures.
+Error CVTypeVisitor::visitTypeStream(const CVTypeArray &Types) {
+ for (auto I : Types) {
+ if (auto EC = visitTypeRecord(I))
+ return EC;
+ }
+ return Error::success();
+}
+
+Error CVTypeVisitor::visitTypeStream(CVTypeRange Types) {
+ for (auto I : Types) {
+ if (auto EC = visitTypeRecord(I))
+ return EC;
+ }
+ return Error::success();
+}
+
+Error CVTypeVisitor::visitTypeStream(TypeCollection &Types) {
+ Optional<TypeIndex> I = Types.getFirst();
+ while (I) {
+ CVType Type = Types.getType(*I);
+ if (auto EC = visitTypeRecord(Type, *I))
+ return EC;
+ I = Types.getNext(*I);
+ }
+ return Error::success();
+}
+
+Error CVTypeVisitor::visitFieldListMemberStream(BinaryStreamReader &Reader) {
+ TypeLeafKind Leaf;
+ while (!Reader.empty()) {
+ if (auto EC = Reader.readEnum(Leaf))
+ return EC;
+
+ CVMemberRecord Record;
+ Record.Kind = Leaf;
+ if (auto EC = ::visitMemberRecord(Record, Callbacks))
+ return EC;
+ }
+
+ return Error::success();
+}
+
+struct FieldListVisitHelper {
+ FieldListVisitHelper(TypeVisitorCallbacks &Callbacks, ArrayRef<uint8_t> Data,
+ VisitorDataSource Source)
+ : Stream(Data, llvm::support::little), Reader(Stream),
+ Deserializer(Reader),
+ Visitor((Source == VDS_BytesPresent) ? Pipeline : Callbacks) {
+ if (Source == VDS_BytesPresent) {
+ Pipeline.addCallbackToPipeline(Deserializer);
+ Pipeline.addCallbackToPipeline(Callbacks);
+ }
+ }
+
+ BinaryByteStream Stream;
+ BinaryStreamReader Reader;
+ FieldListDeserializer Deserializer;
+ TypeVisitorCallbackPipeline Pipeline;
+ CVTypeVisitor Visitor;
+};
+
+struct VisitHelper {
+ VisitHelper(TypeVisitorCallbacks &Callbacks, VisitorDataSource Source)
+ : Visitor((Source == VDS_BytesPresent) ? Pipeline : Callbacks) {
+ if (Source == VDS_BytesPresent) {
+ Pipeline.addCallbackToPipeline(Deserializer);
+ Pipeline.addCallbackToPipeline(Callbacks);
+ }
+ }
+
+ TypeDeserializer Deserializer;
+ TypeVisitorCallbackPipeline Pipeline;
+ CVTypeVisitor Visitor;
+};
+}
+
+Error llvm::codeview::visitTypeRecord(CVType &Record, TypeIndex Index,
+ TypeVisitorCallbacks &Callbacks,
+ VisitorDataSource Source) {
+ VisitHelper V(Callbacks, Source);
+ return V.Visitor.visitTypeRecord(Record, Index);
+}
+
+Error llvm::codeview::visitTypeRecord(CVType &Record,
+ TypeVisitorCallbacks &Callbacks,
+ VisitorDataSource Source) {
+ VisitHelper V(Callbacks, Source);
+ return V.Visitor.visitTypeRecord(Record);
+}
+
+Error llvm::codeview::visitTypeStream(const CVTypeArray &Types,
+ TypeVisitorCallbacks &Callbacks,
+ VisitorDataSource Source) {
+ VisitHelper V(Callbacks, Source);
+ return V.Visitor.visitTypeStream(Types);
+}
+
+Error llvm::codeview::visitTypeStream(CVTypeRange Types,
+ TypeVisitorCallbacks &Callbacks) {
+ VisitHelper V(Callbacks, VDS_BytesPresent);
+ return V.Visitor.visitTypeStream(Types);
+}
+
+Error llvm::codeview::visitTypeStream(TypeCollection &Types,
+ TypeVisitorCallbacks &Callbacks) {
+ // When the internal visitor calls Types.getType(Index) the interface is
+ // required to return a CVType with the bytes filled out. So we can assume
+ // that the bytes will be present when individual records are visited.
+ VisitHelper V(Callbacks, VDS_BytesPresent);
+ return V.Visitor.visitTypeStream(Types);
+}
+
+Error llvm::codeview::visitMemberRecord(CVMemberRecord Record,
+ TypeVisitorCallbacks &Callbacks,
+ VisitorDataSource Source) {
+ FieldListVisitHelper V(Callbacks, Record.Data, Source);
+ return V.Visitor.visitMemberRecord(Record);
+}
+
+Error llvm::codeview::visitMemberRecord(TypeLeafKind Kind,
+ ArrayRef<uint8_t> Record,
+ TypeVisitorCallbacks &Callbacks) {
+ CVMemberRecord R;
+ R.Data = Record;
+ R.Kind = Kind;
+ return visitMemberRecord(R, Callbacks, VDS_BytesPresent);
+}
+
+Error llvm::codeview::visitMemberRecordStream(ArrayRef<uint8_t> FieldList,
+ TypeVisitorCallbacks &Callbacks) {
+ FieldListVisitHelper V(Callbacks, FieldList, VDS_BytesPresent);
+ return V.Visitor.visitFieldListMemberStream(V.Reader);
+}
diff --git a/contrib/libs/llvm12/lib/DebugInfo/CodeView/CodeViewError.cpp b/contrib/libs/llvm12/lib/DebugInfo/CodeView/CodeViewError.cpp
index 40c45b1f077..69390c708f5 100644
--- a/contrib/libs/llvm12/lib/DebugInfo/CodeView/CodeViewError.cpp
+++ b/contrib/libs/llvm12/lib/DebugInfo/CodeView/CodeViewError.cpp
@@ -1,49 +1,49 @@
-//===- CodeViewError.cpp - Error extensions for CodeView --------*- C++ -*-===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-
-#include "llvm/DebugInfo/CodeView/CodeViewError.h"
-#include "llvm/Support/ErrorHandling.h"
-#include "llvm/Support/ManagedStatic.h"
-
-using namespace llvm;
-using namespace llvm::codeview;
-
-namespace {
-// FIXME: This class is only here to support the transition to llvm::Error. It
-// will be removed once this transition is complete. Clients should prefer to
-// deal with the Error value directly, rather than converting to error_code.
-class CodeViewErrorCategory : public std::error_category {
-public:
- const char *name() const noexcept override { return "llvm.codeview"; }
- std::string message(int Condition) const override {
- switch (static_cast<cv_error_code>(Condition)) {
- case cv_error_code::unspecified:
- return "An unknown CodeView error has occurred.";
- case cv_error_code::insufficient_buffer:
- return "The buffer is not large enough to read the requested number of "
- "bytes.";
- case cv_error_code::corrupt_record:
- return "The CodeView record is corrupted.";
- case cv_error_code::no_records:
- return "There are no records.";
- case cv_error_code::operation_unsupported:
- return "The requested operation is not supported.";
- case cv_error_code::unknown_member_record:
- return "The member record is of an unknown type.";
- }
- llvm_unreachable("Unrecognized cv_error_code");
- }
-};
-} // namespace
-
-static llvm::ManagedStatic<CodeViewErrorCategory> CodeViewErrCategory;
-const std::error_category &llvm::codeview::CVErrorCategory() {
- return *CodeViewErrCategory;
-}
-
-char CodeViewError::ID;
+//===- CodeViewError.cpp - Error extensions for CodeView --------*- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "llvm/DebugInfo/CodeView/CodeViewError.h"
+#include "llvm/Support/ErrorHandling.h"
+#include "llvm/Support/ManagedStatic.h"
+
+using namespace llvm;
+using namespace llvm::codeview;
+
+namespace {
+// FIXME: This class is only here to support the transition to llvm::Error. It
+// will be removed once this transition is complete. Clients should prefer to
+// deal with the Error value directly, rather than converting to error_code.
+class CodeViewErrorCategory : public std::error_category {
+public:
+ const char *name() const noexcept override { return "llvm.codeview"; }
+ std::string message(int Condition) const override {
+ switch (static_cast<cv_error_code>(Condition)) {
+ case cv_error_code::unspecified:
+ return "An unknown CodeView error has occurred.";
+ case cv_error_code::insufficient_buffer:
+ return "The buffer is not large enough to read the requested number of "
+ "bytes.";
+ case cv_error_code::corrupt_record:
+ return "The CodeView record is corrupted.";
+ case cv_error_code::no_records:
+ return "There are no records.";
+ case cv_error_code::operation_unsupported:
+ return "The requested operation is not supported.";
+ case cv_error_code::unknown_member_record:
+ return "The member record is of an unknown type.";
+ }
+ llvm_unreachable("Unrecognized cv_error_code");
+ }
+};
+} // namespace
+
+static llvm::ManagedStatic<CodeViewErrorCategory> CodeViewErrCategory;
+const std::error_category &llvm::codeview::CVErrorCategory() {
+ return *CodeViewErrCategory;
+}
+
+char CodeViewError::ID;
diff --git a/contrib/libs/llvm12/lib/DebugInfo/CodeView/CodeViewRecordIO.cpp b/contrib/libs/llvm12/lib/DebugInfo/CodeView/CodeViewRecordIO.cpp
index df7a78fcd2f..c272985cf2d 100644
--- a/contrib/libs/llvm12/lib/DebugInfo/CodeView/CodeViewRecordIO.cpp
+++ b/contrib/libs/llvm12/lib/DebugInfo/CodeView/CodeViewRecordIO.cpp
@@ -1,370 +1,370 @@
-//===- CodeViewRecordIO.cpp -------------------------------------*- C++ -*-===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-
-#include "llvm/DebugInfo/CodeView/CodeViewRecordIO.h"
-#include "llvm/DebugInfo/CodeView/CodeView.h"
-#include "llvm/DebugInfo/CodeView/RecordSerialization.h"
-#include "llvm/Support/BinaryStreamReader.h"
-#include "llvm/Support/BinaryStreamWriter.h"
-
-using namespace llvm;
-using namespace llvm::codeview;
-
-Error CodeViewRecordIO::beginRecord(Optional<uint32_t> MaxLength) {
- RecordLimit Limit;
- Limit.MaxLength = MaxLength;
- Limit.BeginOffset = getCurrentOffset();
- Limits.push_back(Limit);
- return Error::success();
-}
-
-Error CodeViewRecordIO::endRecord() {
- assert(!Limits.empty() && "Not in a record!");
- Limits.pop_back();
- // We would like to assert that we actually read / wrote all the bytes that we
- // expected to for this record, but unfortunately we can't do this. Some
- // producers such as MASM over-allocate for certain types of records and
- // commit the extraneous data, so when reading we can't be sure every byte
- // will have been read. And when writing we over-allocate temporarily since
- // we don't know how big the record is until we're finished writing it, so
- // even though we don't commit the extraneous data, we still can't guarantee
- // we're at the end of the allocated data.
-
- if (isStreaming()) {
- // For streaming mode, add padding to align with 4 byte boundaries for each
- // record
- uint32_t Align = getStreamedLen() % 4;
- if (Align == 0)
- return Error::success();
-
- int PaddingBytes = 4 - Align;
- while (PaddingBytes > 0) {
- char Pad = static_cast<uint8_t>(LF_PAD0 + PaddingBytes);
- StringRef BytesSR = StringRef(&Pad, sizeof(Pad));
- Streamer->emitBytes(BytesSR);
- --PaddingBytes;
- }
- resetStreamedLen();
- }
- return Error::success();
-}
-
-uint32_t CodeViewRecordIO::maxFieldLength() const {
- if (isStreaming())
- return 0;
-
- assert(!Limits.empty() && "Not in a record!");
-
- // The max length of the next field is the minimum of all lengths that would
- // be allowed by any of the sub-records we're in. In practice, we can only
- // ever be at most 1 sub-record deep (in a FieldList), but this works for
- // the general case.
- uint32_t Offset = getCurrentOffset();
- Optional<uint32_t> Min = Limits.front().bytesRemaining(Offset);
- for (auto X : makeArrayRef(Limits).drop_front()) {
- Optional<uint32_t> ThisMin = X.bytesRemaining(Offset);
- if (ThisMin.hasValue())
- Min = (Min.hasValue()) ? std::min(*Min, *ThisMin) : *ThisMin;
- }
- assert(Min.hasValue() && "Every field must have a maximum length!");
-
- return *Min;
-}
-
-Error CodeViewRecordIO::padToAlignment(uint32_t Align) {
- if (isReading())
- return Reader->padToAlignment(Align);
- return Writer->padToAlignment(Align);
-}
-
-Error CodeViewRecordIO::skipPadding() {
- assert(!isWriting() && "Cannot skip padding while writing!");
-
- if (Reader->bytesRemaining() == 0)
- return Error::success();
-
- uint8_t Leaf = Reader->peek();
- if (Leaf < LF_PAD0)
- return Error::success();
- // Leaf is greater than 0xf0. We should advance by the number of bytes in
- // the low 4 bits.
- unsigned BytesToAdvance = Leaf & 0x0F;
- return Reader->skip(BytesToAdvance);
-}
-
-Error CodeViewRecordIO::mapByteVectorTail(ArrayRef<uint8_t> &Bytes,
- const Twine &Comment) {
- if (isStreaming()) {
- emitComment(Comment);
- Streamer->emitBinaryData(toStringRef(Bytes));
- incrStreamedLen(Bytes.size());
- } else if (isWriting()) {
- if (auto EC = Writer->writeBytes(Bytes))
- return EC;
- } else {
- if (auto EC = Reader->readBytes(Bytes, Reader->bytesRemaining()))
- return EC;
- }
- return Error::success();
-}
-
-Error CodeViewRecordIO::mapByteVectorTail(std::vector<uint8_t> &Bytes,
- const Twine &Comment) {
- ArrayRef<uint8_t> BytesRef(Bytes);
- if (auto EC = mapByteVectorTail(BytesRef, Comment))
- return EC;
- if (!isWriting())
- Bytes.assign(BytesRef.begin(), BytesRef.end());
-
- return Error::success();
-}
-
-Error CodeViewRecordIO::mapInteger(TypeIndex &TypeInd, const Twine &Comment) {
- if (isStreaming()) {
- std::string TypeNameStr = Streamer->getTypeName(TypeInd);
- if (!TypeNameStr.empty())
- emitComment(Comment + ": " + TypeNameStr);
- else
- emitComment(Comment);
- Streamer->emitIntValue(TypeInd.getIndex(), sizeof(TypeInd.getIndex()));
- incrStreamedLen(sizeof(TypeInd.getIndex()));
- } else if (isWriting()) {
- if (auto EC = Writer->writeInteger(TypeInd.getIndex()))
- return EC;
- } else {
- uint32_t I;
- if (auto EC = Reader->readInteger(I))
- return EC;
- TypeInd.setIndex(I);
- }
- return Error::success();
-}
-
-Error CodeViewRecordIO::mapEncodedInteger(int64_t &Value,
- const Twine &Comment) {
- if (isStreaming()) {
- if (Value >= 0)
- emitEncodedUnsignedInteger(static_cast<uint64_t>(Value), Comment);
- else
- emitEncodedSignedInteger(Value, Comment);
- } else if (isWriting()) {
- if (Value >= 0) {
- if (auto EC = writeEncodedUnsignedInteger(static_cast<uint64_t>(Value)))
- return EC;
- } else {
- if (auto EC = writeEncodedSignedInteger(Value))
- return EC;
- }
- } else {
- APSInt N;
- if (auto EC = consume(*Reader, N))
- return EC;
- Value = N.getExtValue();
- }
-
- return Error::success();
-}
-
-Error CodeViewRecordIO::mapEncodedInteger(uint64_t &Value,
- const Twine &Comment) {
- if (isStreaming())
- emitEncodedUnsignedInteger(Value, Comment);
- else if (isWriting()) {
- if (auto EC = writeEncodedUnsignedInteger(Value))
- return EC;
- } else {
- APSInt N;
- if (auto EC = consume(*Reader, N))
- return EC;
- Value = N.getZExtValue();
- }
- return Error::success();
-}
-
-Error CodeViewRecordIO::mapEncodedInteger(APSInt &Value, const Twine &Comment) {
- if (isStreaming()) {
- if (Value.isSigned())
- emitEncodedSignedInteger(Value.getSExtValue(), Comment);
- else
- emitEncodedUnsignedInteger(Value.getZExtValue(), Comment);
- } else if (isWriting()) {
- if (Value.isSigned())
- return writeEncodedSignedInteger(Value.getSExtValue());
- return writeEncodedUnsignedInteger(Value.getZExtValue());
- } else
- return consume(*Reader, Value);
- return Error::success();
-}
-
-Error CodeViewRecordIO::mapStringZ(StringRef &Value, const Twine &Comment) {
- if (isStreaming()) {
- auto NullTerminatedString = StringRef(Value.data(), Value.size() + 1);
- emitComment(Comment);
- Streamer->emitBytes(NullTerminatedString);
- incrStreamedLen(NullTerminatedString.size());
- } else if (isWriting()) {
- // Truncate if we attempt to write too much.
- StringRef S = Value.take_front(maxFieldLength() - 1);
- if (auto EC = Writer->writeCString(S))
- return EC;
- } else {
- if (auto EC = Reader->readCString(Value))
- return EC;
- }
- return Error::success();
-}
-
-Error CodeViewRecordIO::mapGuid(GUID &Guid, const Twine &Comment) {
- constexpr uint32_t GuidSize = 16;
-
- if (isStreaming()) {
- StringRef GuidSR =
- StringRef((reinterpret_cast<const char *>(&Guid)), GuidSize);
- emitComment(Comment);
- Streamer->emitBytes(GuidSR);
- incrStreamedLen(GuidSize);
- return Error::success();
- }
-
- if (maxFieldLength() < GuidSize)
- return make_error<CodeViewError>(cv_error_code::insufficient_buffer);
-
- if (isWriting()) {
- if (auto EC = Writer->writeBytes(Guid.Guid))
- return EC;
- } else {
- ArrayRef<uint8_t> GuidBytes;
- if (auto EC = Reader->readBytes(GuidBytes, GuidSize))
- return EC;
- memcpy(Guid.Guid, GuidBytes.data(), GuidSize);
- }
- return Error::success();
-}
-
-Error CodeViewRecordIO::mapStringZVectorZ(std::vector<StringRef> &Value,
- const Twine &Comment) {
-
- if (!isReading()) {
- emitComment(Comment);
- for (auto V : Value) {
- if (auto EC = mapStringZ(V))
- return EC;
- }
- uint8_t FinalZero = 0;
- if (auto EC = mapInteger(FinalZero))
- return EC;
- } else {
- StringRef S;
- if (auto EC = mapStringZ(S))
- return EC;
- while (!S.empty()) {
- Value.push_back(S);
- if (auto EC = mapStringZ(S))
- return EC;
- };
- }
- return Error::success();
-}
-
-void CodeViewRecordIO::emitEncodedSignedInteger(const int64_t &Value,
- const Twine &Comment) {
- if (Value >= std::numeric_limits<int8_t>::min()) {
- Streamer->emitIntValue(LF_CHAR, 2);
- emitComment(Comment);
- Streamer->emitIntValue(Value, 1);
- incrStreamedLen(3);
- } else if (Value >= std::numeric_limits<int16_t>::min()) {
- Streamer->emitIntValue(LF_SHORT, 2);
- emitComment(Comment);
- Streamer->emitIntValue(Value, 2);
- incrStreamedLen(4);
- } else if (Value >= std::numeric_limits<int32_t>::min()) {
- Streamer->emitIntValue(LF_LONG, 2);
- emitComment(Comment);
- Streamer->emitIntValue(Value, 4);
- incrStreamedLen(6);
- } else {
- Streamer->emitIntValue(LF_QUADWORD, 2);
- emitComment(Comment);
- Streamer->emitIntValue(Value, 4);
- incrStreamedLen(6);
- }
-}
-
-void CodeViewRecordIO::emitEncodedUnsignedInteger(const uint64_t &Value,
- const Twine &Comment) {
- if (Value < LF_NUMERIC) {
- emitComment(Comment);
- Streamer->emitIntValue(Value, 2);
- incrStreamedLen(2);
- } else if (Value <= std::numeric_limits<uint16_t>::max()) {
- Streamer->emitIntValue(LF_USHORT, 2);
- emitComment(Comment);
- Streamer->emitIntValue(Value, 2);
- incrStreamedLen(4);
- } else if (Value <= std::numeric_limits<uint32_t>::max()) {
- Streamer->emitIntValue(LF_ULONG, 2);
- emitComment(Comment);
- Streamer->emitIntValue(Value, 4);
- incrStreamedLen(6);
- } else {
- Streamer->emitIntValue(LF_UQUADWORD, 2);
- emitComment(Comment);
- Streamer->emitIntValue(Value, 8);
- incrStreamedLen(6);
- }
-}
-
-Error CodeViewRecordIO::writeEncodedSignedInteger(const int64_t &Value) {
- if (Value >= std::numeric_limits<int8_t>::min()) {
- if (auto EC = Writer->writeInteger<uint16_t>(LF_CHAR))
- return EC;
- if (auto EC = Writer->writeInteger<int8_t>(Value))
- return EC;
- } else if (Value >= std::numeric_limits<int16_t>::min()) {
- if (auto EC = Writer->writeInteger<uint16_t>(LF_SHORT))
- return EC;
- if (auto EC = Writer->writeInteger<int16_t>(Value))
- return EC;
- } else if (Value >= std::numeric_limits<int32_t>::min()) {
- if (auto EC = Writer->writeInteger<uint16_t>(LF_LONG))
- return EC;
- if (auto EC = Writer->writeInteger<int32_t>(Value))
- return EC;
- } else {
- if (auto EC = Writer->writeInteger<uint16_t>(LF_QUADWORD))
- return EC;
- if (auto EC = Writer->writeInteger(Value))
- return EC;
- }
- return Error::success();
-}
-
-Error CodeViewRecordIO::writeEncodedUnsignedInteger(const uint64_t &Value) {
- if (Value < LF_NUMERIC) {
- if (auto EC = Writer->writeInteger<uint16_t>(Value))
- return EC;
- } else if (Value <= std::numeric_limits<uint16_t>::max()) {
- if (auto EC = Writer->writeInteger<uint16_t>(LF_USHORT))
- return EC;
- if (auto EC = Writer->writeInteger<uint16_t>(Value))
- return EC;
- } else if (Value <= std::numeric_limits<uint32_t>::max()) {
- if (auto EC = Writer->writeInteger<uint16_t>(LF_ULONG))
- return EC;
- if (auto EC = Writer->writeInteger<uint32_t>(Value))
- return EC;
- } else {
- if (auto EC = Writer->writeInteger<uint16_t>(LF_UQUADWORD))
- return EC;
- if (auto EC = Writer->writeInteger(Value))
- return EC;
- }
-
- return Error::success();
-}
+//===- CodeViewRecordIO.cpp -------------------------------------*- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "llvm/DebugInfo/CodeView/CodeViewRecordIO.h"
+#include "llvm/DebugInfo/CodeView/CodeView.h"
+#include "llvm/DebugInfo/CodeView/RecordSerialization.h"
+#include "llvm/Support/BinaryStreamReader.h"
+#include "llvm/Support/BinaryStreamWriter.h"
+
+using namespace llvm;
+using namespace llvm::codeview;
+
+Error CodeViewRecordIO::beginRecord(Optional<uint32_t> MaxLength) {
+ RecordLimit Limit;
+ Limit.MaxLength = MaxLength;
+ Limit.BeginOffset = getCurrentOffset();
+ Limits.push_back(Limit);
+ return Error::success();
+}
+
+Error CodeViewRecordIO::endRecord() {
+ assert(!Limits.empty() && "Not in a record!");
+ Limits.pop_back();
+ // We would like to assert that we actually read / wrote all the bytes that we
+ // expected to for this record, but unfortunately we can't do this. Some
+ // producers such as MASM over-allocate for certain types of records and
+ // commit the extraneous data, so when reading we can't be sure every byte
+ // will have been read. And when writing we over-allocate temporarily since
+ // we don't know how big the record is until we're finished writing it, so
+ // even though we don't commit the extraneous data, we still can't guarantee
+ // we're at the end of the allocated data.
+
+ if (isStreaming()) {
+ // For streaming mode, add padding to align with 4 byte boundaries for each
+ // record
+ uint32_t Align = getStreamedLen() % 4;
+ if (Align == 0)
+ return Error::success();
+
+ int PaddingBytes = 4 - Align;
+ while (PaddingBytes > 0) {
+ char Pad = static_cast<uint8_t>(LF_PAD0 + PaddingBytes);
+ StringRef BytesSR = StringRef(&Pad, sizeof(Pad));
+ Streamer->emitBytes(BytesSR);
+ --PaddingBytes;
+ }
+ resetStreamedLen();
+ }
+ return Error::success();
+}
+
+uint32_t CodeViewRecordIO::maxFieldLength() const {
+ if (isStreaming())
+ return 0;
+
+ assert(!Limits.empty() && "Not in a record!");
+
+ // The max length of the next field is the minimum of all lengths that would
+ // be allowed by any of the sub-records we're in. In practice, we can only
+ // ever be at most 1 sub-record deep (in a FieldList), but this works for
+ // the general case.
+ uint32_t Offset = getCurrentOffset();
+ Optional<uint32_t> Min = Limits.front().bytesRemaining(Offset);
+ for (auto X : makeArrayRef(Limits).drop_front()) {
+ Optional<uint32_t> ThisMin = X.bytesRemaining(Offset);
+ if (ThisMin.hasValue())
+ Min = (Min.hasValue()) ? std::min(*Min, *ThisMin) : *ThisMin;
+ }
+ assert(Min.hasValue() && "Every field must have a maximum length!");
+
+ return *Min;
+}
+
+Error CodeViewRecordIO::padToAlignment(uint32_t Align) {
+ if (isReading())
+ return Reader->padToAlignment(Align);
+ return Writer->padToAlignment(Align);
+}
+
+Error CodeViewRecordIO::skipPadding() {
+ assert(!isWriting() && "Cannot skip padding while writing!");
+
+ if (Reader->bytesRemaining() == 0)
+ return Error::success();
+
+ uint8_t Leaf = Reader->peek();
+ if (Leaf < LF_PAD0)
+ return Error::success();
+ // Leaf is greater than 0xf0. We should advance by the number of bytes in
+ // the low 4 bits.
+ unsigned BytesToAdvance = Leaf & 0x0F;
+ return Reader->skip(BytesToAdvance);
+}
+
+Error CodeViewRecordIO::mapByteVectorTail(ArrayRef<uint8_t> &Bytes,
+ const Twine &Comment) {
+ if (isStreaming()) {
+ emitComment(Comment);
+ Streamer->emitBinaryData(toStringRef(Bytes));
+ incrStreamedLen(Bytes.size());
+ } else if (isWriting()) {
+ if (auto EC = Writer->writeBytes(Bytes))
+ return EC;
+ } else {
+ if (auto EC = Reader->readBytes(Bytes, Reader->bytesRemaining()))
+ return EC;
+ }
+ return Error::success();
+}
+
+Error CodeViewRecordIO::mapByteVectorTail(std::vector<uint8_t> &Bytes,
+ const Twine &Comment) {
+ ArrayRef<uint8_t> BytesRef(Bytes);
+ if (auto EC = mapByteVectorTail(BytesRef, Comment))
+ return EC;
+ if (!isWriting())
+ Bytes.assign(BytesRef.begin(), BytesRef.end());
+
+ return Error::success();
+}
+
+Error CodeViewRecordIO::mapInteger(TypeIndex &TypeInd, const Twine &Comment) {
+ if (isStreaming()) {
+ std::string TypeNameStr = Streamer->getTypeName(TypeInd);
+ if (!TypeNameStr.empty())
+ emitComment(Comment + ": " + TypeNameStr);
+ else
+ emitComment(Comment);
+ Streamer->emitIntValue(TypeInd.getIndex(), sizeof(TypeInd.getIndex()));
+ incrStreamedLen(sizeof(TypeInd.getIndex()));
+ } else if (isWriting()) {
+ if (auto EC = Writer->writeInteger(TypeInd.getIndex()))
+ return EC;
+ } else {
+ uint32_t I;
+ if (auto EC = Reader->readInteger(I))
+ return EC;
+ TypeInd.setIndex(I);
+ }
+ return Error::success();
+}
+
+Error CodeViewRecordIO::mapEncodedInteger(int64_t &Value,
+ const Twine &Comment) {
+ if (isStreaming()) {
+ if (Value >= 0)
+ emitEncodedUnsignedInteger(static_cast<uint64_t>(Value), Comment);
+ else
+ emitEncodedSignedInteger(Value, Comment);
+ } else if (isWriting()) {
+ if (Value >= 0) {
+ if (auto EC = writeEncodedUnsignedInteger(static_cast<uint64_t>(Value)))
+ return EC;
+ } else {
+ if (auto EC = writeEncodedSignedInteger(Value))
+ return EC;
+ }
+ } else {
+ APSInt N;
+ if (auto EC = consume(*Reader, N))
+ return EC;
+ Value = N.getExtValue();
+ }
+
+ return Error::success();
+}
+
+Error CodeViewRecordIO::mapEncodedInteger(uint64_t &Value,
+ const Twine &Comment) {
+ if (isStreaming())
+ emitEncodedUnsignedInteger(Value, Comment);
+ else if (isWriting()) {
+ if (auto EC = writeEncodedUnsignedInteger(Value))
+ return EC;
+ } else {
+ APSInt N;
+ if (auto EC = consume(*Reader, N))
+ return EC;
+ Value = N.getZExtValue();
+ }
+ return Error::success();
+}
+
+Error CodeViewRecordIO::mapEncodedInteger(APSInt &Value, const Twine &Comment) {
+ if (isStreaming()) {
+ if (Value.isSigned())
+ emitEncodedSignedInteger(Value.getSExtValue(), Comment);
+ else
+ emitEncodedUnsignedInteger(Value.getZExtValue(), Comment);
+ } else if (isWriting()) {
+ if (Value.isSigned())
+ return writeEncodedSignedInteger(Value.getSExtValue());
+ return writeEncodedUnsignedInteger(Value.getZExtValue());
+ } else
+ return consume(*Reader, Value);
+ return Error::success();
+}
+
+Error CodeViewRecordIO::mapStringZ(StringRef &Value, const Twine &Comment) {
+ if (isStreaming()) {
+ auto NullTerminatedString = StringRef(Value.data(), Value.size() + 1);
+ emitComment(Comment);
+ Streamer->emitBytes(NullTerminatedString);
+ incrStreamedLen(NullTerminatedString.size());
+ } else if (isWriting()) {
+ // Truncate if we attempt to write too much.
+ StringRef S = Value.take_front(maxFieldLength() - 1);
+ if (auto EC = Writer->writeCString(S))
+ return EC;
+ } else {
+ if (auto EC = Reader->readCString(Value))
+ return EC;
+ }
+ return Error::success();
+}
+
+Error CodeViewRecordIO::mapGuid(GUID &Guid, const Twine &Comment) {
+ constexpr uint32_t GuidSize = 16;
+
+ if (isStreaming()) {
+ StringRef GuidSR =
+ StringRef((reinterpret_cast<const char *>(&Guid)), GuidSize);
+ emitComment(Comment);
+ Streamer->emitBytes(GuidSR);
+ incrStreamedLen(GuidSize);
+ return Error::success();
+ }
+
+ if (maxFieldLength() < GuidSize)
+ return make_error<CodeViewError>(cv_error_code::insufficient_buffer);
+
+ if (isWriting()) {
+ if (auto EC = Writer->writeBytes(Guid.Guid))
+ return EC;
+ } else {
+ ArrayRef<uint8_t> GuidBytes;
+ if (auto EC = Reader->readBytes(GuidBytes, GuidSize))
+ return EC;
+ memcpy(Guid.Guid, GuidBytes.data(), GuidSize);
+ }
+ return Error::success();
+}
+
+Error CodeViewRecordIO::mapStringZVectorZ(std::vector<StringRef> &Value,
+ const Twine &Comment) {
+
+ if (!isReading()) {
+ emitComment(Comment);
+ for (auto V : Value) {
+ if (auto EC = mapStringZ(V))
+ return EC;
+ }
+ uint8_t FinalZero = 0;
+ if (auto EC = mapInteger(FinalZero))
+ return EC;
+ } else {
+ StringRef S;
+ if (auto EC = mapStringZ(S))
+ return EC;
+ while (!S.empty()) {
+ Value.push_back(S);
+ if (auto EC = mapStringZ(S))
+ return EC;
+ };
+ }
+ return Error::success();
+}
+
+void CodeViewRecordIO::emitEncodedSignedInteger(const int64_t &Value,
+ const Twine &Comment) {
+ if (Value >= std::numeric_limits<int8_t>::min()) {
+ Streamer->emitIntValue(LF_CHAR, 2);
+ emitComment(Comment);
+ Streamer->emitIntValue(Value, 1);
+ incrStreamedLen(3);
+ } else if (Value >= std::numeric_limits<int16_t>::min()) {
+ Streamer->emitIntValue(LF_SHORT, 2);
+ emitComment(Comment);
+ Streamer->emitIntValue(Value, 2);
+ incrStreamedLen(4);
+ } else if (Value >= std::numeric_limits<int32_t>::min()) {
+ Streamer->emitIntValue(LF_LONG, 2);
+ emitComment(Comment);
+ Streamer->emitIntValue(Value, 4);
+ incrStreamedLen(6);
+ } else {
+ Streamer->emitIntValue(LF_QUADWORD, 2);
+ emitComment(Comment);
+ Streamer->emitIntValue(Value, 4);
+ incrStreamedLen(6);
+ }
+}
+
+void CodeViewRecordIO::emitEncodedUnsignedInteger(const uint64_t &Value,
+ const Twine &Comment) {
+ if (Value < LF_NUMERIC) {
+ emitComment(Comment);
+ Streamer->emitIntValue(Value, 2);
+ incrStreamedLen(2);
+ } else if (Value <= std::numeric_limits<uint16_t>::max()) {
+ Streamer->emitIntValue(LF_USHORT, 2);
+ emitComment(Comment);
+ Streamer->emitIntValue(Value, 2);
+ incrStreamedLen(4);
+ } else if (Value <= std::numeric_limits<uint32_t>::max()) {
+ Streamer->emitIntValue(LF_ULONG, 2);
+ emitComment(Comment);
+ Streamer->emitIntValue(Value, 4);
+ incrStreamedLen(6);
+ } else {
+ Streamer->emitIntValue(LF_UQUADWORD, 2);
+ emitComment(Comment);
+ Streamer->emitIntValue(Value, 8);
+ incrStreamedLen(6);
+ }
+}
+
+Error CodeViewRecordIO::writeEncodedSignedInteger(const int64_t &Value) {
+ if (Value >= std::numeric_limits<int8_t>::min()) {
+ if (auto EC = Writer->writeInteger<uint16_t>(LF_CHAR))
+ return EC;
+ if (auto EC = Writer->writeInteger<int8_t>(Value))
+ return EC;
+ } else if (Value >= std::numeric_limits<int16_t>::min()) {
+ if (auto EC = Writer->writeInteger<uint16_t>(LF_SHORT))
+ return EC;
+ if (auto EC = Writer->writeInteger<int16_t>(Value))
+ return EC;
+ } else if (Value >= std::numeric_limits<int32_t>::min()) {
+ if (auto EC = Writer->writeInteger<uint16_t>(LF_LONG))
+ return EC;
+ if (auto EC = Writer->writeInteger<int32_t>(Value))
+ return EC;
+ } else {
+ if (auto EC = Writer->writeInteger<uint16_t>(LF_QUADWORD))
+ return EC;
+ if (auto EC = Writer->writeInteger(Value))
+ return EC;
+ }
+ return Error::success();
+}
+
+Error CodeViewRecordIO::writeEncodedUnsignedInteger(const uint64_t &Value) {
+ if (Value < LF_NUMERIC) {
+ if (auto EC = Writer->writeInteger<uint16_t>(Value))
+ return EC;
+ } else if (Value <= std::numeric_limits<uint16_t>::max()) {
+ if (auto EC = Writer->writeInteger<uint16_t>(LF_USHORT))
+ return EC;
+ if (auto EC = Writer->writeInteger<uint16_t>(Value))
+ return EC;
+ } else if (Value <= std::numeric_limits<uint32_t>::max()) {
+ if (auto EC = Writer->writeInteger<uint16_t>(LF_ULONG))
+ return EC;
+ if (auto EC = Writer->writeInteger<uint32_t>(Value))
+ return EC;
+ } else {
+ if (auto EC = Writer->writeInteger<uint16_t>(LF_UQUADWORD))
+ return EC;
+ if (auto EC = Writer->writeInteger(Value))
+ return EC;
+ }
+
+ return Error::success();
+}
diff --git a/contrib/libs/llvm12/lib/DebugInfo/CodeView/ContinuationRecordBuilder.cpp b/contrib/libs/llvm12/lib/DebugInfo/CodeView/ContinuationRecordBuilder.cpp
index 52389956dce..799cffb7116 100644
--- a/contrib/libs/llvm12/lib/DebugInfo/CodeView/ContinuationRecordBuilder.cpp
+++ b/contrib/libs/llvm12/lib/DebugInfo/CodeView/ContinuationRecordBuilder.cpp
@@ -1,251 +1,251 @@
-#include "llvm/DebugInfo/CodeView/ContinuationRecordBuilder.h"
-
-using namespace llvm;
-using namespace llvm::codeview;
-
-namespace {
-struct ContinuationRecord {
- ulittle16_t Kind{uint16_t(TypeLeafKind::LF_INDEX)};
- ulittle16_t Size{0};
- ulittle32_t IndexRef{0xB0C0B0C0};
-};
-
-struct SegmentInjection {
- SegmentInjection(TypeLeafKind Kind) { Prefix.RecordKind = Kind; }
-
- ContinuationRecord Cont;
- RecordPrefix Prefix;
-};
-} // namespace
-
-static void addPadding(BinaryStreamWriter &Writer) {
- uint32_t Align = Writer.getOffset() % 4;
- if (Align == 0)
- return;
-
- int PaddingBytes = 4 - Align;
- while (PaddingBytes > 0) {
- uint8_t Pad = static_cast<uint8_t>(LF_PAD0 + PaddingBytes);
- cantFail(Writer.writeInteger(Pad));
- --PaddingBytes;
- }
-}
-
-static SegmentInjection InjectFieldList(TypeLeafKind::LF_FIELDLIST);
-static SegmentInjection InjectMethodOverloadList(TypeLeafKind::LF_METHODLIST);
-
-static constexpr uint32_t ContinuationLength = sizeof(ContinuationRecord);
-static constexpr uint32_t MaxSegmentLength =
- MaxRecordLength - ContinuationLength;
-
-static inline TypeLeafKind getTypeLeafKind(ContinuationRecordKind CK) {
- return (CK == ContinuationRecordKind::FieldList) ? LF_FIELDLIST
- : LF_METHODLIST;
-}
-
-ContinuationRecordBuilder::ContinuationRecordBuilder()
- : SegmentWriter(Buffer), Mapping(SegmentWriter) {}
-
-ContinuationRecordBuilder::~ContinuationRecordBuilder() {}
-
-void ContinuationRecordBuilder::begin(ContinuationRecordKind RecordKind) {
- assert(!Kind.hasValue());
- Kind = RecordKind;
- Buffer.clear();
- SegmentWriter.setOffset(0);
- SegmentOffsets.clear();
- SegmentOffsets.push_back(0);
- assert(SegmentWriter.getOffset() == 0);
- assert(SegmentWriter.getLength() == 0);
-
- const SegmentInjection *FLI =
- (RecordKind == ContinuationRecordKind::FieldList)
- ? &InjectFieldList
- : &InjectMethodOverloadList;
- const uint8_t *FLIB = reinterpret_cast<const uint8_t *>(FLI);
- InjectedSegmentBytes =
- ArrayRef<uint8_t>(FLIB, FLIB + sizeof(SegmentInjection));
-
- // Seed the first record with an appropriate record prefix.
- RecordPrefix Prefix(getTypeLeafKind(RecordKind));
- CVType Type(&Prefix, sizeof(Prefix));
- cantFail(Mapping.visitTypeBegin(Type));
-
- cantFail(SegmentWriter.writeObject(Prefix));
-}
-
-template <typename RecordType>
-void ContinuationRecordBuilder::writeMemberType(RecordType &Record) {
- assert(Kind.hasValue());
-
- uint32_t OriginalOffset = SegmentWriter.getOffset();
- CVMemberRecord CVMR;
- CVMR.Kind = static_cast<TypeLeafKind>(Record.getKind());
-
- // Member Records aren't length-prefixed, they only have a 2-byte TypeLeafKind
- // at the beginning.
- cantFail(SegmentWriter.writeEnum(CVMR.Kind));
-
- // Let the Mapping handle the rest.
- cantFail(Mapping.visitMemberBegin(CVMR));
- cantFail(Mapping.visitKnownMember(CVMR, Record));
- cantFail(Mapping.visitMemberEnd(CVMR));
-
- // Make sure it's padded to 4 bytes.
- addPadding(SegmentWriter);
- assert(getCurrentSegmentLength() % 4 == 0);
-
- // The maximum length of a single segment is 64KB minus the size to insert a
- // continuation. So if we are over that, inject a continuation between the
- // previous member and the member that was just written, then end the previous
- // segment after the continuation and begin a new one with the just-written
- // member.
- if (getCurrentSegmentLength() > MaxSegmentLength) {
- // We need to inject some bytes before the member we just wrote but after
- // the previous member. Save off the length of the member we just wrote so
- // that we can do some sanity checking on it.
- uint32_t MemberLength = SegmentWriter.getOffset() - OriginalOffset;
- (void) MemberLength;
- insertSegmentEnd(OriginalOffset);
- // Since this member now becomes a new top-level record, it should have
- // gotten a RecordPrefix injected, and that RecordPrefix + the member we
- // just wrote should now constitute the entirety of the current "new"
- // segment.
- assert(getCurrentSegmentLength() == MemberLength + sizeof(RecordPrefix));
- }
-
- assert(getCurrentSegmentLength() % 4 == 0);
- assert(getCurrentSegmentLength() <= MaxSegmentLength);
-}
-
-uint32_t ContinuationRecordBuilder::getCurrentSegmentLength() const {
- return SegmentWriter.getOffset() - SegmentOffsets.back();
-}
-
-void ContinuationRecordBuilder::insertSegmentEnd(uint32_t Offset) {
- uint32_t SegmentBegin = SegmentOffsets.back();
- (void)SegmentBegin;
- assert(Offset > SegmentBegin);
- assert(Offset - SegmentBegin <= MaxSegmentLength);
-
- // We need to make space for the continuation record. For now we can't fill
- // out the length or the TypeIndex of the back-reference, but we need the
- // space to at least be there.
- Buffer.insert(Offset, InjectedSegmentBytes);
-
- uint32_t NewSegmentBegin = Offset + ContinuationLength;
- uint32_t SegmentLength = NewSegmentBegin - SegmentOffsets.back();
- (void) SegmentLength;
-
- assert(SegmentLength % 4 == 0);
- assert(SegmentLength <= MaxRecordLength);
- SegmentOffsets.push_back(NewSegmentBegin);
-
- // Seek to the end so that we can keep writing against the new segment.
- SegmentWriter.setOffset(SegmentWriter.getLength());
- assert(SegmentWriter.bytesRemaining() == 0);
-}
-
-CVType ContinuationRecordBuilder::createSegmentRecord(
- uint32_t OffBegin, uint32_t OffEnd, Optional<TypeIndex> RefersTo) {
- assert(OffEnd - OffBegin <= USHRT_MAX);
-
- MutableArrayRef<uint8_t> Data = Buffer.data();
- Data = Data.slice(OffBegin, OffEnd - OffBegin);
-
- // Write the length to the RecordPrefix, making sure it does not include
- // sizeof(RecordPrefix.Length)
- RecordPrefix *Prefix = reinterpret_cast<RecordPrefix *>(Data.data());
- Prefix->RecordLen = Data.size() - sizeof(RecordPrefix::RecordLen);
-
- if (RefersTo.hasValue()) {
- auto Continuation = Data.take_back(ContinuationLength);
- ContinuationRecord *CR =
- reinterpret_cast<ContinuationRecord *>(Continuation.data());
- assert(CR->Kind == TypeLeafKind::LF_INDEX);
- assert(CR->IndexRef == 0xB0C0B0C0);
- CR->IndexRef = RefersTo->getIndex();
- }
-
- return CVType(Data);
-}
-
-std::vector<CVType> ContinuationRecordBuilder::end(TypeIndex Index) {
- RecordPrefix Prefix(getTypeLeafKind(*Kind));
- CVType Type(&Prefix, sizeof(Prefix));
- cantFail(Mapping.visitTypeEnd(Type));
-
- // We're now done, and we have a series of segments each beginning at an
- // offset specified in the SegmentOffsets array. We now need to iterate
- // over each segment and post-process them in the following two ways:
- // 1) Each top-level record has a RecordPrefix whose type is either
- // LF_FIELDLIST or LF_METHODLIST, but the Length field is still 0.
- // Those should all be set to the correct length now.
- // 2) Each continuation record has an IndexRef field which we set to the
- // magic value 0xB0C0B0C0. Now that the caller has told us the TypeIndex
- // they want this sequence to start from, we can go through and update
- // each one.
- //
- // Logically, the sequence of records we've built up looks like this:
- //
- // SegmentOffsets[0]: <Length> (Initially: uninitialized)
- // SegmentOffsets[0]+2: LF_FIELDLIST
- // SegmentOffsets[0]+4: Member[0]
- // SegmentOffsets[0]+?: ...
- // SegmentOffsets[0]+?: Member[4]
- // SegmentOffsets[1]-8: LF_INDEX
- // SegmentOffsets[1]-6: 0
- // SegmentOffsets[1]-4: <Type Index of Next Record> (Initially: 0xB0C0B0C0)
- //
- // SegmentOffsets[1]: <Length> (Initially: uninitialized)
- // SegmentOffsets[1]+2: LF_FIELDLIST
- // SegmentOffsets[1]+4: Member[0]
- // SegmentOffsets[1]+?: ...
- // SegmentOffsets[1]+?: Member[s]
- // SegmentOffsets[2]-8: LF_INDEX
- // SegmentOffsets[2]-6: 0
- // SegmentOffsets[2]-4: <Type Index of Next Record> (Initially: 0xB0C0B0C0)
- //
- // ...
- //
- // SegmentOffsets[N]: <Length> (Initially: uninitialized)
- // SegmentOffsets[N]+2: LF_FIELDLIST
- // SegmentOffsets[N]+4: Member[0]
- // SegmentOffsets[N]+?: ...
- // SegmentOffsets[N]+?: Member[t]
- //
- // And this is the way we have laid them out in the serialization buffer. But
- // we cannot actually commit them to the underlying stream this way, due to
- // the topological sorting requirement of a type stream (specifically,
- // TypeIndex references can only point backwards, not forwards). So the
- // sequence that we return to the caller contains the records in reverse
- // order, which is the proper order for committing the serialized records.
-
- std::vector<CVType> Types;
- Types.reserve(SegmentOffsets.size());
-
- auto SO = makeArrayRef(SegmentOffsets);
-
- uint32_t End = SegmentWriter.getOffset();
-
- Optional<TypeIndex> RefersTo;
- for (uint32_t Offset : reverse(SO)) {
- Types.push_back(createSegmentRecord(Offset, End, RefersTo));
-
- End = Offset;
- RefersTo = Index++;
- }
-
- Kind.reset();
- return Types;
-}
-
-// Explicitly instantiate the member function for each known type so that we can
-// implement this in the cpp file.
-#define TYPE_RECORD(EnumName, EnumVal, Name)
-#define TYPE_RECORD_ALIAS(EnumName, EnumVal, Name, AliasName)
-#define MEMBER_RECORD(EnumName, EnumVal, Name) \
- template void llvm::codeview::ContinuationRecordBuilder::writeMemberType( \
- Name##Record &Record);
-#define MEMBER_RECORD_ALIAS(EnumName, EnumVal, Name, AliasName)
-#include "llvm/DebugInfo/CodeView/CodeViewTypes.def"
+#include "llvm/DebugInfo/CodeView/ContinuationRecordBuilder.h"
+
+using namespace llvm;
+using namespace llvm::codeview;
+
+namespace {
+struct ContinuationRecord {
+ ulittle16_t Kind{uint16_t(TypeLeafKind::LF_INDEX)};
+ ulittle16_t Size{0};
+ ulittle32_t IndexRef{0xB0C0B0C0};
+};
+
+struct SegmentInjection {
+ SegmentInjection(TypeLeafKind Kind) { Prefix.RecordKind = Kind; }
+
+ ContinuationRecord Cont;
+ RecordPrefix Prefix;
+};
+} // namespace
+
+static void addPadding(BinaryStreamWriter &Writer) {
+ uint32_t Align = Writer.getOffset() % 4;
+ if (Align == 0)
+ return;
+
+ int PaddingBytes = 4 - Align;
+ while (PaddingBytes > 0) {
+ uint8_t Pad = static_cast<uint8_t>(LF_PAD0 + PaddingBytes);
+ cantFail(Writer.writeInteger(Pad));
+ --PaddingBytes;
+ }
+}
+
+static SegmentInjection InjectFieldList(TypeLeafKind::LF_FIELDLIST);
+static SegmentInjection InjectMethodOverloadList(TypeLeafKind::LF_METHODLIST);
+
+static constexpr uint32_t ContinuationLength = sizeof(ContinuationRecord);
+static constexpr uint32_t MaxSegmentLength =
+ MaxRecordLength - ContinuationLength;
+
+static inline TypeLeafKind getTypeLeafKind(ContinuationRecordKind CK) {
+ return (CK == ContinuationRecordKind::FieldList) ? LF_FIELDLIST
+ : LF_METHODLIST;
+}
+
+ContinuationRecordBuilder::ContinuationRecordBuilder()
+ : SegmentWriter(Buffer), Mapping(SegmentWriter) {}
+
+ContinuationRecordBuilder::~ContinuationRecordBuilder() {}
+
+void ContinuationRecordBuilder::begin(ContinuationRecordKind RecordKind) {
+ assert(!Kind.hasValue());
+ Kind = RecordKind;
+ Buffer.clear();
+ SegmentWriter.setOffset(0);
+ SegmentOffsets.clear();
+ SegmentOffsets.push_back(0);
+ assert(SegmentWriter.getOffset() == 0);
+ assert(SegmentWriter.getLength() == 0);
+
+ const SegmentInjection *FLI =
+ (RecordKind == ContinuationRecordKind::FieldList)
+ ? &InjectFieldList
+ : &InjectMethodOverloadList;
+ const uint8_t *FLIB = reinterpret_cast<const uint8_t *>(FLI);
+ InjectedSegmentBytes =
+ ArrayRef<uint8_t>(FLIB, FLIB + sizeof(SegmentInjection));
+
+ // Seed the first record with an appropriate record prefix.
+ RecordPrefix Prefix(getTypeLeafKind(RecordKind));
+ CVType Type(&Prefix, sizeof(Prefix));
+ cantFail(Mapping.visitTypeBegin(Type));
+
+ cantFail(SegmentWriter.writeObject(Prefix));
+}
+
+template <typename RecordType>
+void ContinuationRecordBuilder::writeMemberType(RecordType &Record) {
+ assert(Kind.hasValue());
+
+ uint32_t OriginalOffset = SegmentWriter.getOffset();
+ CVMemberRecord CVMR;
+ CVMR.Kind = static_cast<TypeLeafKind>(Record.getKind());
+
+ // Member Records aren't length-prefixed, they only have a 2-byte TypeLeafKind
+ // at the beginning.
+ cantFail(SegmentWriter.writeEnum(CVMR.Kind));
+
+ // Let the Mapping handle the rest.
+ cantFail(Mapping.visitMemberBegin(CVMR));
+ cantFail(Mapping.visitKnownMember(CVMR, Record));
+ cantFail(Mapping.visitMemberEnd(CVMR));
+
+ // Make sure it's padded to 4 bytes.
+ addPadding(SegmentWriter);
+ assert(getCurrentSegmentLength() % 4 == 0);
+
+ // The maximum length of a single segment is 64KB minus the size to insert a
+ // continuation. So if we are over that, inject a continuation between the
+ // previous member and the member that was just written, then end the previous
+ // segment after the continuation and begin a new one with the just-written
+ // member.
+ if (getCurrentSegmentLength() > MaxSegmentLength) {
+ // We need to inject some bytes before the member we just wrote but after
+ // the previous member. Save off the length of the member we just wrote so
+ // that we can do some sanity checking on it.
+ uint32_t MemberLength = SegmentWriter.getOffset() - OriginalOffset;
+ (void) MemberLength;
+ insertSegmentEnd(OriginalOffset);
+ // Since this member now becomes a new top-level record, it should have
+ // gotten a RecordPrefix injected, and that RecordPrefix + the member we
+ // just wrote should now constitute the entirety of the current "new"
+ // segment.
+ assert(getCurrentSegmentLength() == MemberLength + sizeof(RecordPrefix));
+ }
+
+ assert(getCurrentSegmentLength() % 4 == 0);
+ assert(getCurrentSegmentLength() <= MaxSegmentLength);
+}
+
+uint32_t ContinuationRecordBuilder::getCurrentSegmentLength() const {
+ return SegmentWriter.getOffset() - SegmentOffsets.back();
+}
+
+void ContinuationRecordBuilder::insertSegmentEnd(uint32_t Offset) {
+ uint32_t SegmentBegin = SegmentOffsets.back();
+ (void)SegmentBegin;
+ assert(Offset > SegmentBegin);
+ assert(Offset - SegmentBegin <= MaxSegmentLength);
+
+ // We need to make space for the continuation record. For now we can't fill
+ // out the length or the TypeIndex of the back-reference, but we need the
+ // space to at least be there.
+ Buffer.insert(Offset, InjectedSegmentBytes);
+
+ uint32_t NewSegmentBegin = Offset + ContinuationLength;
+ uint32_t SegmentLength = NewSegmentBegin - SegmentOffsets.back();
+ (void) SegmentLength;
+
+ assert(SegmentLength % 4 == 0);
+ assert(SegmentLength <= MaxRecordLength);
+ SegmentOffsets.push_back(NewSegmentBegin);
+
+ // Seek to the end so that we can keep writing against the new segment.
+ SegmentWriter.setOffset(SegmentWriter.getLength());
+ assert(SegmentWriter.bytesRemaining() == 0);
+}
+
+CVType ContinuationRecordBuilder::createSegmentRecord(
+ uint32_t OffBegin, uint32_t OffEnd, Optional<TypeIndex> RefersTo) {
+ assert(OffEnd - OffBegin <= USHRT_MAX);
+
+ MutableArrayRef<uint8_t> Data = Buffer.data();
+ Data = Data.slice(OffBegin, OffEnd - OffBegin);
+
+ // Write the length to the RecordPrefix, making sure it does not include
+ // sizeof(RecordPrefix.Length)
+ RecordPrefix *Prefix = reinterpret_cast<RecordPrefix *>(Data.data());
+ Prefix->RecordLen = Data.size() - sizeof(RecordPrefix::RecordLen);
+
+ if (RefersTo.hasValue()) {
+ auto Continuation = Data.take_back(ContinuationLength);
+ ContinuationRecord *CR =
+ reinterpret_cast<ContinuationRecord *>(Continuation.data());
+ assert(CR->Kind == TypeLeafKind::LF_INDEX);
+ assert(CR->IndexRef == 0xB0C0B0C0);
+ CR->IndexRef = RefersTo->getIndex();
+ }
+
+ return CVType(Data);
+}
+
+std::vector<CVType> ContinuationRecordBuilder::end(TypeIndex Index) {
+ RecordPrefix Prefix(getTypeLeafKind(*Kind));
+ CVType Type(&Prefix, sizeof(Prefix));
+ cantFail(Mapping.visitTypeEnd(Type));
+
+ // We're now done, and we have a series of segments each beginning at an
+ // offset specified in the SegmentOffsets array. We now need to iterate
+ // over each segment and post-process them in the following two ways:
+ // 1) Each top-level record has a RecordPrefix whose type is either
+ // LF_FIELDLIST or LF_METHODLIST, but the Length field is still 0.
+ // Those should all be set to the correct length now.
+ // 2) Each continuation record has an IndexRef field which we set to the
+ // magic value 0xB0C0B0C0. Now that the caller has told us the TypeIndex
+ // they want this sequence to start from, we can go through and update
+ // each one.
+ //
+ // Logically, the sequence of records we've built up looks like this:
+ //
+ // SegmentOffsets[0]: <Length> (Initially: uninitialized)
+ // SegmentOffsets[0]+2: LF_FIELDLIST
+ // SegmentOffsets[0]+4: Member[0]
+ // SegmentOffsets[0]+?: ...
+ // SegmentOffsets[0]+?: Member[4]
+ // SegmentOffsets[1]-8: LF_INDEX
+ // SegmentOffsets[1]-6: 0
+ // SegmentOffsets[1]-4: <Type Index of Next Record> (Initially: 0xB0C0B0C0)
+ //
+ // SegmentOffsets[1]: <Length> (Initially: uninitialized)
+ // SegmentOffsets[1]+2: LF_FIELDLIST
+ // SegmentOffsets[1]+4: Member[0]
+ // SegmentOffsets[1]+?: ...
+ // SegmentOffsets[1]+?: Member[s]
+ // SegmentOffsets[2]-8: LF_INDEX
+ // SegmentOffsets[2]-6: 0
+ // SegmentOffsets[2]-4: <Type Index of Next Record> (Initially: 0xB0C0B0C0)
+ //
+ // ...
+ //
+ // SegmentOffsets[N]: <Length> (Initially: uninitialized)
+ // SegmentOffsets[N]+2: LF_FIELDLIST
+ // SegmentOffsets[N]+4: Member[0]
+ // SegmentOffsets[N]+?: ...
+ // SegmentOffsets[N]+?: Member[t]
+ //
+ // And this is the way we have laid them out in the serialization buffer. But
+ // we cannot actually commit them to the underlying stream this way, due to
+ // the topological sorting requirement of a type stream (specifically,
+ // TypeIndex references can only point backwards, not forwards). So the
+ // sequence that we return to the caller contains the records in reverse
+ // order, which is the proper order for committing the serialized records.
+
+ std::vector<CVType> Types;
+ Types.reserve(SegmentOffsets.size());
+
+ auto SO = makeArrayRef(SegmentOffsets);
+
+ uint32_t End = SegmentWriter.getOffset();
+
+ Optional<TypeIndex> RefersTo;
+ for (uint32_t Offset : reverse(SO)) {
+ Types.push_back(createSegmentRecord(Offset, End, RefersTo));
+
+ End = Offset;
+ RefersTo = Index++;
+ }
+
+ Kind.reset();
+ return Types;
+}
+
+// Explicitly instantiate the member function for each known type so that we can
+// implement this in the cpp file.
+#define TYPE_RECORD(EnumName, EnumVal, Name)
+#define TYPE_RECORD_ALIAS(EnumName, EnumVal, Name, AliasName)
+#define MEMBER_RECORD(EnumName, EnumVal, Name) \
+ template void llvm::codeview::ContinuationRecordBuilder::writeMemberType( \
+ Name##Record &Record);
+#define MEMBER_RECORD_ALIAS(EnumName, EnumVal, Name, AliasName)
+#include "llvm/DebugInfo/CodeView/CodeViewTypes.def"
diff --git a/contrib/libs/llvm12/lib/DebugInfo/CodeView/DebugChecksumsSubsection.cpp b/contrib/libs/llvm12/lib/DebugInfo/CodeView/DebugChecksumsSubsection.cpp
index 856bc26dfaf..3d28bac00c4 100644
--- a/contrib/libs/llvm12/lib/DebugInfo/CodeView/DebugChecksumsSubsection.cpp
+++ b/contrib/libs/llvm12/lib/DebugInfo/CodeView/DebugChecksumsSubsection.cpp
@@ -1,115 +1,115 @@
-//===- DebugChecksumsSubsection.cpp ---------------------------------------===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-
-#include "llvm/DebugInfo/CodeView/DebugChecksumsSubsection.h"
-#include "llvm/ADT/ArrayRef.h"
-#include "llvm/DebugInfo/CodeView/CodeView.h"
-#include "llvm/DebugInfo/CodeView/DebugStringTableSubsection.h"
-#include "llvm/Support/BinaryStreamReader.h"
-#include "llvm/Support/BinaryStreamWriter.h"
-#include "llvm/Support/Endian.h"
-#include "llvm/Support/Error.h"
-#include "llvm/Support/MathExtras.h"
-#include <cassert>
-#include <cstdint>
-#include <cstring>
-
-using namespace llvm;
-using namespace llvm::codeview;
-
-struct FileChecksumEntryHeader {
- using ulittle32_t = support::ulittle32_t;
-
- ulittle32_t FileNameOffset; // Byte offset of filename in global string table.
- uint8_t ChecksumSize; // Number of bytes of checksum.
- uint8_t ChecksumKind; // FileChecksumKind
- // Checksum bytes follow.
-};
-
-Error VarStreamArrayExtractor<FileChecksumEntry>::
-operator()(BinaryStreamRef Stream, uint32_t &Len, FileChecksumEntry &Item) {
- BinaryStreamReader Reader(Stream);
-
- const FileChecksumEntryHeader *Header;
- if (auto EC = Reader.readObject(Header))
- return EC;
-
- Item.FileNameOffset = Header->FileNameOffset;
- Item.Kind = static_cast<FileChecksumKind>(Header->ChecksumKind);
- if (auto EC = Reader.readBytes(Item.Checksum, Header->ChecksumSize))
- return EC;
-
- Len = alignTo(Header->ChecksumSize + sizeof(FileChecksumEntryHeader), 4);
- return Error::success();
-}
-
-Error DebugChecksumsSubsectionRef::initialize(BinaryStreamReader Reader) {
- if (auto EC = Reader.readArray(Checksums, Reader.bytesRemaining()))
- return EC;
-
- return Error::success();
-}
-
-Error DebugChecksumsSubsectionRef::initialize(BinaryStreamRef Section) {
- BinaryStreamReader Reader(Section);
- return initialize(Reader);
-}
-
-DebugChecksumsSubsection::DebugChecksumsSubsection(
- DebugStringTableSubsection &Strings)
- : DebugSubsection(DebugSubsectionKind::FileChecksums), Strings(Strings) {}
-
-void DebugChecksumsSubsection::addChecksum(StringRef FileName,
- FileChecksumKind Kind,
- ArrayRef<uint8_t> Bytes) {
- FileChecksumEntry Entry;
- if (!Bytes.empty()) {
- uint8_t *Copy = Storage.Allocate<uint8_t>(Bytes.size());
- ::memcpy(Copy, Bytes.data(), Bytes.size());
- Entry.Checksum = makeArrayRef(Copy, Bytes.size());
- }
-
- Entry.FileNameOffset = Strings.insert(FileName);
- Entry.Kind = Kind;
- Checksums.push_back(Entry);
-
- // This maps the offset of this string in the string table to the offset
- // of this checksum entry in the checksum buffer.
- OffsetMap[Entry.FileNameOffset] = SerializedSize;
- assert(SerializedSize % 4 == 0);
-
- uint32_t Len = alignTo(sizeof(FileChecksumEntryHeader) + Bytes.size(), 4);
- SerializedSize += Len;
-}
-
-uint32_t DebugChecksumsSubsection::calculateSerializedSize() const {
- return SerializedSize;
-}
-
-Error DebugChecksumsSubsection::commit(BinaryStreamWriter &Writer) const {
- for (const auto &FC : Checksums) {
- FileChecksumEntryHeader Header;
- Header.ChecksumKind = uint8_t(FC.Kind);
- Header.ChecksumSize = FC.Checksum.size();
- Header.FileNameOffset = FC.FileNameOffset;
- if (auto EC = Writer.writeObject(Header))
- return EC;
- if (auto EC = Writer.writeArray(makeArrayRef(FC.Checksum)))
- return EC;
- if (auto EC = Writer.padToAlignment(4))
- return EC;
- }
- return Error::success();
-}
-
-uint32_t DebugChecksumsSubsection::mapChecksumOffset(StringRef FileName) const {
- uint32_t Offset = Strings.getIdForString(FileName);
- auto Iter = OffsetMap.find(Offset);
- assert(Iter != OffsetMap.end());
- return Iter->second;
-}
+//===- DebugChecksumsSubsection.cpp ---------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "llvm/DebugInfo/CodeView/DebugChecksumsSubsection.h"
+#include "llvm/ADT/ArrayRef.h"
+#include "llvm/DebugInfo/CodeView/CodeView.h"
+#include "llvm/DebugInfo/CodeView/DebugStringTableSubsection.h"
+#include "llvm/Support/BinaryStreamReader.h"
+#include "llvm/Support/BinaryStreamWriter.h"
+#include "llvm/Support/Endian.h"
+#include "llvm/Support/Error.h"
+#include "llvm/Support/MathExtras.h"
+#include <cassert>
+#include <cstdint>
+#include <cstring>
+
+using namespace llvm;
+using namespace llvm::codeview;
+
+struct FileChecksumEntryHeader {
+ using ulittle32_t = support::ulittle32_t;
+
+ ulittle32_t FileNameOffset; // Byte offset of filename in global string table.
+ uint8_t ChecksumSize; // Number of bytes of checksum.
+ uint8_t ChecksumKind; // FileChecksumKind
+ // Checksum bytes follow.
+};
+
+Error VarStreamArrayExtractor<FileChecksumEntry>::
+operator()(BinaryStreamRef Stream, uint32_t &Len, FileChecksumEntry &Item) {
+ BinaryStreamReader Reader(Stream);
+
+ const FileChecksumEntryHeader *Header;
+ if (auto EC = Reader.readObject(Header))
+ return EC;
+
+ Item.FileNameOffset = Header->FileNameOffset;
+ Item.Kind = static_cast<FileChecksumKind>(Header->ChecksumKind);
+ if (auto EC = Reader.readBytes(Item.Checksum, Header->ChecksumSize))
+ return EC;
+
+ Len = alignTo(Header->ChecksumSize + sizeof(FileChecksumEntryHeader), 4);
+ return Error::success();
+}
+
+Error DebugChecksumsSubsectionRef::initialize(BinaryStreamReader Reader) {
+ if (auto EC = Reader.readArray(Checksums, Reader.bytesRemaining()))
+ return EC;
+
+ return Error::success();
+}
+
+Error DebugChecksumsSubsectionRef::initialize(BinaryStreamRef Section) {
+ BinaryStreamReader Reader(Section);
+ return initialize(Reader);
+}
+
+DebugChecksumsSubsection::DebugChecksumsSubsection(
+ DebugStringTableSubsection &Strings)
+ : DebugSubsection(DebugSubsectionKind::FileChecksums), Strings(Strings) {}
+
+void DebugChecksumsSubsection::addChecksum(StringRef FileName,
+ FileChecksumKind Kind,
+ ArrayRef<uint8_t> Bytes) {
+ FileChecksumEntry Entry;
+ if (!Bytes.empty()) {
+ uint8_t *Copy = Storage.Allocate<uint8_t>(Bytes.size());
+ ::memcpy(Copy, Bytes.data(), Bytes.size());
+ Entry.Checksum = makeArrayRef(Copy, Bytes.size());
+ }
+
+ Entry.FileNameOffset = Strings.insert(FileName);
+ Entry.Kind = Kind;
+ Checksums.push_back(Entry);
+
+ // This maps the offset of this string in the string table to the offset
+ // of this checksum entry in the checksum buffer.
+ OffsetMap[Entry.FileNameOffset] = SerializedSize;
+ assert(SerializedSize % 4 == 0);
+
+ uint32_t Len = alignTo(sizeof(FileChecksumEntryHeader) + Bytes.size(), 4);
+ SerializedSize += Len;
+}
+
+uint32_t DebugChecksumsSubsection::calculateSerializedSize() const {
+ return SerializedSize;
+}
+
+Error DebugChecksumsSubsection::commit(BinaryStreamWriter &Writer) const {
+ for (const auto &FC : Checksums) {
+ FileChecksumEntryHeader Header;
+ Header.ChecksumKind = uint8_t(FC.Kind);
+ Header.ChecksumSize = FC.Checksum.size();
+ Header.FileNameOffset = FC.FileNameOffset;
+ if (auto EC = Writer.writeObject(Header))
+ return EC;
+ if (auto EC = Writer.writeArray(makeArrayRef(FC.Checksum)))
+ return EC;
+ if (auto EC = Writer.padToAlignment(4))
+ return EC;
+ }
+ return Error::success();
+}
+
+uint32_t DebugChecksumsSubsection::mapChecksumOffset(StringRef FileName) const {
+ uint32_t Offset = Strings.getIdForString(FileName);
+ auto Iter = OffsetMap.find(Offset);
+ assert(Iter != OffsetMap.end());
+ return Iter->second;
+}
diff --git a/contrib/libs/llvm12/lib/DebugInfo/CodeView/DebugCrossExSubsection.cpp b/contrib/libs/llvm12/lib/DebugInfo/CodeView/DebugCrossExSubsection.cpp
index 2334e9f5f6c..b23410409f8 100644
--- a/contrib/libs/llvm12/lib/DebugInfo/CodeView/DebugCrossExSubsection.cpp
+++ b/contrib/libs/llvm12/lib/DebugInfo/CodeView/DebugCrossExSubsection.cpp
@@ -1,52 +1,52 @@
-//===- DebugCrossExSubsection.cpp -----------------------------------------===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-
-#include "llvm/DebugInfo/CodeView/DebugCrossExSubsection.h"
-#include "llvm/DebugInfo/CodeView/CodeViewError.h"
-#include "llvm/Support/BinaryStreamWriter.h"
-#include "llvm/Support/Error.h"
-#include <cstdint>
-
-using namespace llvm;
-using namespace llvm::codeview;
-
-Error DebugCrossModuleExportsSubsectionRef::initialize(
- BinaryStreamReader Reader) {
- if (Reader.bytesRemaining() % sizeof(CrossModuleExport) != 0)
- return make_error<CodeViewError>(
- cv_error_code::corrupt_record,
- "Cross Scope Exports section is an invalid size!");
-
- uint32_t Size = Reader.bytesRemaining() / sizeof(CrossModuleExport);
- return Reader.readArray(References, Size);
-}
-
-Error DebugCrossModuleExportsSubsectionRef::initialize(BinaryStreamRef Stream) {
- BinaryStreamReader Reader(Stream);
- return initialize(Reader);
-}
-
-void DebugCrossModuleExportsSubsection::addMapping(uint32_t Local,
- uint32_t Global) {
- Mappings[Local] = Global;
-}
-
-uint32_t DebugCrossModuleExportsSubsection::calculateSerializedSize() const {
- return Mappings.size() * sizeof(CrossModuleExport);
-}
-
-Error DebugCrossModuleExportsSubsection::commit(
- BinaryStreamWriter &Writer) const {
- for (const auto &M : Mappings) {
- if (auto EC = Writer.writeInteger(M.first))
- return EC;
- if (auto EC = Writer.writeInteger(M.second))
- return EC;
- }
- return Error::success();
-}
+//===- DebugCrossExSubsection.cpp -----------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "llvm/DebugInfo/CodeView/DebugCrossExSubsection.h"
+#include "llvm/DebugInfo/CodeView/CodeViewError.h"
+#include "llvm/Support/BinaryStreamWriter.h"
+#include "llvm/Support/Error.h"
+#include <cstdint>
+
+using namespace llvm;
+using namespace llvm::codeview;
+
+Error DebugCrossModuleExportsSubsectionRef::initialize(
+ BinaryStreamReader Reader) {
+ if (Reader.bytesRemaining() % sizeof(CrossModuleExport) != 0)
+ return make_error<CodeViewError>(
+ cv_error_code::corrupt_record,
+ "Cross Scope Exports section is an invalid size!");
+
+ uint32_t Size = Reader.bytesRemaining() / sizeof(CrossModuleExport);
+ return Reader.readArray(References, Size);
+}
+
+Error DebugCrossModuleExportsSubsectionRef::initialize(BinaryStreamRef Stream) {
+ BinaryStreamReader Reader(Stream);
+ return initialize(Reader);
+}
+
+void DebugCrossModuleExportsSubsection::addMapping(uint32_t Local,
+ uint32_t Global) {
+ Mappings[Local] = Global;
+}
+
+uint32_t DebugCrossModuleExportsSubsection::calculateSerializedSize() const {
+ return Mappings.size() * sizeof(CrossModuleExport);
+}
+
+Error DebugCrossModuleExportsSubsection::commit(
+ BinaryStreamWriter &Writer) const {
+ for (const auto &M : Mappings) {
+ if (auto EC = Writer.writeInteger(M.first))
+ return EC;
+ if (auto EC = Writer.writeInteger(M.second))
+ return EC;
+ }
+ return Error::success();
+}
diff --git a/contrib/libs/llvm12/lib/DebugInfo/CodeView/DebugCrossImpSubsection.cpp b/contrib/libs/llvm12/lib/DebugInfo/CodeView/DebugCrossImpSubsection.cpp
index 58b479ae163..dbadafd3aaf 100644
--- a/contrib/libs/llvm12/lib/DebugInfo/CodeView/DebugCrossImpSubsection.cpp
+++ b/contrib/libs/llvm12/lib/DebugInfo/CodeView/DebugCrossImpSubsection.cpp
@@ -1,96 +1,96 @@
-//===- DebugCrossImpSubsection.cpp ----------------------------------------===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-
-#include "llvm/DebugInfo/CodeView/DebugCrossImpSubsection.h"
-#include "llvm/ADT/ArrayRef.h"
-#include "llvm/DebugInfo/CodeView/CodeViewError.h"
-#include "llvm/DebugInfo/CodeView/DebugStringTableSubsection.h"
-#include "llvm/Support/BinaryStreamReader.h"
-#include "llvm/Support/BinaryStreamWriter.h"
-#include "llvm/Support/Endian.h"
-#include "llvm/Support/Error.h"
-#include <algorithm>
-#include <cstdint>
-#include <utility>
-#include <vector>
-
-using namespace llvm;
-using namespace llvm::codeview;
-
-Error VarStreamArrayExtractor<CrossModuleImportItem>::
-operator()(BinaryStreamRef Stream, uint32_t &Len,
- codeview::CrossModuleImportItem &Item) {
- BinaryStreamReader Reader(Stream);
- if (Reader.bytesRemaining() < sizeof(CrossModuleImport))
- return make_error<CodeViewError>(
- cv_error_code::insufficient_buffer,
- "Not enough bytes for a Cross Module Import Header!");
- if (auto EC = Reader.readObject(Item.Header))
- return EC;
- if (Reader.bytesRemaining() < Item.Header->Count * sizeof(uint32_t))
- return make_error<CodeViewError>(
- cv_error_code::insufficient_buffer,
- "Not enough to read specified number of Cross Module References!");
- if (auto EC = Reader.readArray(Item.Imports, Item.Header->Count))
- return EC;
- return Error::success();
-}
-
-Error DebugCrossModuleImportsSubsectionRef::initialize(
- BinaryStreamReader Reader) {
- return Reader.readArray(References, Reader.bytesRemaining());
-}
-
-Error DebugCrossModuleImportsSubsectionRef::initialize(BinaryStreamRef Stream) {
- BinaryStreamReader Reader(Stream);
- return initialize(Reader);
-}
-
-void DebugCrossModuleImportsSubsection::addImport(StringRef Module,
- uint32_t ImportId) {
- Strings.insert(Module);
- std::vector<support::ulittle32_t> Targets = {support::ulittle32_t(ImportId)};
- auto Result = Mappings.insert(std::make_pair(Module, Targets));
- if (!Result.second)
- Result.first->getValue().push_back(Targets[0]);
-}
-
-uint32_t DebugCrossModuleImportsSubsection::calculateSerializedSize() const {
- uint32_t Size = 0;
- for (const auto &Item : Mappings) {
- Size += sizeof(CrossModuleImport);
- Size += sizeof(support::ulittle32_t) * Item.second.size();
- }
- return Size;
-}
-
-Error DebugCrossModuleImportsSubsection::commit(
- BinaryStreamWriter &Writer) const {
- using T = decltype(&*Mappings.begin());
- std::vector<T> Ids;
- Ids.reserve(Mappings.size());
-
- for (const auto &M : Mappings)
- Ids.push_back(&M);
-
- llvm::sort(Ids, [this](const T &L1, const T &L2) {
- return Strings.getIdForString(L1->getKey()) <
- Strings.getIdForString(L2->getKey());
- });
-
- for (const auto &Item : Ids) {
- CrossModuleImport Imp;
- Imp.ModuleNameOffset = Strings.getIdForString(Item->getKey());
- Imp.Count = Item->getValue().size();
- if (auto EC = Writer.writeObject(Imp))
- return EC;
- if (auto EC = Writer.writeArray(makeArrayRef(Item->getValue())))
- return EC;
- }
- return Error::success();
-}
+//===- DebugCrossImpSubsection.cpp ----------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "llvm/DebugInfo/CodeView/DebugCrossImpSubsection.h"
+#include "llvm/ADT/ArrayRef.h"
+#include "llvm/DebugInfo/CodeView/CodeViewError.h"
+#include "llvm/DebugInfo/CodeView/DebugStringTableSubsection.h"
+#include "llvm/Support/BinaryStreamReader.h"
+#include "llvm/Support/BinaryStreamWriter.h"
+#include "llvm/Support/Endian.h"
+#include "llvm/Support/Error.h"
+#include <algorithm>
+#include <cstdint>
+#include <utility>
+#include <vector>
+
+using namespace llvm;
+using namespace llvm::codeview;
+
+Error VarStreamArrayExtractor<CrossModuleImportItem>::
+operator()(BinaryStreamRef Stream, uint32_t &Len,
+ codeview::CrossModuleImportItem &Item) {
+ BinaryStreamReader Reader(Stream);
+ if (Reader.bytesRemaining() < sizeof(CrossModuleImport))
+ return make_error<CodeViewError>(
+ cv_error_code::insufficient_buffer,
+ "Not enough bytes for a Cross Module Import Header!");
+ if (auto EC = Reader.readObject(Item.Header))
+ return EC;
+ if (Reader.bytesRemaining() < Item.Header->Count * sizeof(uint32_t))
+ return make_error<CodeViewError>(
+ cv_error_code::insufficient_buffer,
+ "Not enough to read specified number of Cross Module References!");
+ if (auto EC = Reader.readArray(Item.Imports, Item.Header->Count))
+ return EC;
+ return Error::success();
+}
+
+Error DebugCrossModuleImportsSubsectionRef::initialize(
+ BinaryStreamReader Reader) {
+ return Reader.readArray(References, Reader.bytesRemaining());
+}
+
+Error DebugCrossModuleImportsSubsectionRef::initialize(BinaryStreamRef Stream) {
+ BinaryStreamReader Reader(Stream);
+ return initialize(Reader);
+}
+
+void DebugCrossModuleImportsSubsection::addImport(StringRef Module,
+ uint32_t ImportId) {
+ Strings.insert(Module);
+ std::vector<support::ulittle32_t> Targets = {support::ulittle32_t(ImportId)};
+ auto Result = Mappings.insert(std::make_pair(Module, Targets));
+ if (!Result.second)
+ Result.first->getValue().push_back(Targets[0]);
+}
+
+uint32_t DebugCrossModuleImportsSubsection::calculateSerializedSize() const {
+ uint32_t Size = 0;
+ for (const auto &Item : Mappings) {
+ Size += sizeof(CrossModuleImport);
+ Size += sizeof(support::ulittle32_t) * Item.second.size();
+ }
+ return Size;
+}
+
+Error DebugCrossModuleImportsSubsection::commit(
+ BinaryStreamWriter &Writer) const {
+ using T = decltype(&*Mappings.begin());
+ std::vector<T> Ids;
+ Ids.reserve(Mappings.size());
+
+ for (const auto &M : Mappings)
+ Ids.push_back(&M);
+
+ llvm::sort(Ids, [this](const T &L1, const T &L2) {
+ return Strings.getIdForString(L1->getKey()) <
+ Strings.getIdForString(L2->getKey());
+ });
+
+ for (const auto &Item : Ids) {
+ CrossModuleImport Imp;
+ Imp.ModuleNameOffset = Strings.getIdForString(Item->getKey());
+ Imp.Count = Item->getValue().size();
+ if (auto EC = Writer.writeObject(Imp))
+ return EC;
+ if (auto EC = Writer.writeArray(makeArrayRef(Item->getValue())))
+ return EC;
+ }
+ return Error::success();
+}
diff --git a/contrib/libs/llvm12/lib/DebugInfo/CodeView/DebugFrameDataSubsection.cpp b/contrib/libs/llvm12/lib/DebugInfo/CodeView/DebugFrameDataSubsection.cpp
index 1da20b8144f..9bc69abea10 100644
--- a/contrib/libs/llvm12/lib/DebugInfo/CodeView/DebugFrameDataSubsection.cpp
+++ b/contrib/libs/llvm12/lib/DebugInfo/CodeView/DebugFrameDataSubsection.cpp
@@ -1,60 +1,60 @@
-//===- DebugFrameDataSubsection.cpp -----------------------------*- C++ -*-===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-
-#include "llvm/DebugInfo/CodeView/DebugFrameDataSubsection.h"
-#include "llvm/DebugInfo/CodeView/CodeViewError.h"
-
-using namespace llvm;
-using namespace llvm::codeview;
-
-Error DebugFrameDataSubsectionRef::initialize(BinaryStreamReader Reader) {
- if (Reader.bytesRemaining() % sizeof(FrameData) != 0) {
- if (auto EC = Reader.readObject(RelocPtr))
- return EC;
- }
-
- if (Reader.bytesRemaining() % sizeof(FrameData) != 0)
- return make_error<CodeViewError>(cv_error_code::corrupt_record,
- "Invalid frame data record format!");
-
- uint32_t Count = Reader.bytesRemaining() / sizeof(FrameData);
- if (auto EC = Reader.readArray(Frames, Count))
- return EC;
- return Error::success();
-}
-
-Error DebugFrameDataSubsectionRef::initialize(BinaryStreamRef Section) {
- BinaryStreamReader Reader(Section);
- return initialize(Reader);
-}
-
-uint32_t DebugFrameDataSubsection::calculateSerializedSize() const {
- uint32_t Size = sizeof(FrameData) * Frames.size();
- if (IncludeRelocPtr)
- Size += sizeof(uint32_t);
- return Size;
-}
-
-Error DebugFrameDataSubsection::commit(BinaryStreamWriter &Writer) const {
- if (IncludeRelocPtr) {
- if (auto EC = Writer.writeInteger<uint32_t>(0))
- return EC;
- }
-
- std::vector<FrameData> SortedFrames(Frames.begin(), Frames.end());
+//===- DebugFrameDataSubsection.cpp -----------------------------*- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "llvm/DebugInfo/CodeView/DebugFrameDataSubsection.h"
+#include "llvm/DebugInfo/CodeView/CodeViewError.h"
+
+using namespace llvm;
+using namespace llvm::codeview;
+
+Error DebugFrameDataSubsectionRef::initialize(BinaryStreamReader Reader) {
+ if (Reader.bytesRemaining() % sizeof(FrameData) != 0) {
+ if (auto EC = Reader.readObject(RelocPtr))
+ return EC;
+ }
+
+ if (Reader.bytesRemaining() % sizeof(FrameData) != 0)
+ return make_error<CodeViewError>(cv_error_code::corrupt_record,
+ "Invalid frame data record format!");
+
+ uint32_t Count = Reader.bytesRemaining() / sizeof(FrameData);
+ if (auto EC = Reader.readArray(Frames, Count))
+ return EC;
+ return Error::success();
+}
+
+Error DebugFrameDataSubsectionRef::initialize(BinaryStreamRef Section) {
+ BinaryStreamReader Reader(Section);
+ return initialize(Reader);
+}
+
+uint32_t DebugFrameDataSubsection::calculateSerializedSize() const {
+ uint32_t Size = sizeof(FrameData) * Frames.size();
+ if (IncludeRelocPtr)
+ Size += sizeof(uint32_t);
+ return Size;
+}
+
+Error DebugFrameDataSubsection::commit(BinaryStreamWriter &Writer) const {
+ if (IncludeRelocPtr) {
+ if (auto EC = Writer.writeInteger<uint32_t>(0))
+ return EC;
+ }
+
+ std::vector<FrameData> SortedFrames(Frames.begin(), Frames.end());
llvm::sort(SortedFrames, [](const FrameData &LHS, const FrameData &RHS) {
return LHS.RvaStart < RHS.RvaStart;
});
- if (auto EC = Writer.writeArray(makeArrayRef(SortedFrames)))
- return EC;
- return Error::success();
-}
-
-void DebugFrameDataSubsection::addFrameData(const FrameData &Frame) {
- Frames.push_back(Frame);
-}
+ if (auto EC = Writer.writeArray(makeArrayRef(SortedFrames)))
+ return EC;
+ return Error::success();
+}
+
+void DebugFrameDataSubsection::addFrameData(const FrameData &Frame) {
+ Frames.push_back(Frame);
+}
diff --git a/contrib/libs/llvm12/lib/DebugInfo/CodeView/DebugInlineeLinesSubsection.cpp b/contrib/libs/llvm12/lib/DebugInfo/CodeView/DebugInlineeLinesSubsection.cpp
index 4893b3fab77..48ec7e4ecdd 100644
--- a/contrib/libs/llvm12/lib/DebugInfo/CodeView/DebugInlineeLinesSubsection.cpp
+++ b/contrib/libs/llvm12/lib/DebugInfo/CodeView/DebugInlineeLinesSubsection.cpp
@@ -1,125 +1,125 @@
-//===- DebugInlineeLinesSubsection.cpp ------------------------------------===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-
-#include "llvm/DebugInfo/CodeView/DebugInlineeLinesSubsection.h"
-#include "llvm/ADT/ArrayRef.h"
-#include "llvm/DebugInfo/CodeView/CodeView.h"
-#include "llvm/DebugInfo/CodeView/DebugChecksumsSubsection.h"
-#include "llvm/Support/BinaryStreamReader.h"
-#include "llvm/Support/BinaryStreamWriter.h"
-#include "llvm/Support/Endian.h"
-#include "llvm/Support/Error.h"
-#include <cassert>
-#include <cstdint>
-
-using namespace llvm;
-using namespace llvm::codeview;
-
-Error VarStreamArrayExtractor<InlineeSourceLine>::
-operator()(BinaryStreamRef Stream, uint32_t &Len, InlineeSourceLine &Item) {
- BinaryStreamReader Reader(Stream);
-
- if (auto EC = Reader.readObject(Item.Header))
- return EC;
-
- if (HasExtraFiles) {
- uint32_t ExtraFileCount;
- if (auto EC = Reader.readInteger(ExtraFileCount))
- return EC;
- if (auto EC = Reader.readArray(Item.ExtraFiles, ExtraFileCount))
- return EC;
- }
-
- Len = Reader.getOffset();
- return Error::success();
-}
-
-DebugInlineeLinesSubsectionRef::DebugInlineeLinesSubsectionRef()
- : DebugSubsectionRef(DebugSubsectionKind::InlineeLines) {}
-
-Error DebugInlineeLinesSubsectionRef::initialize(BinaryStreamReader Reader) {
- if (auto EC = Reader.readEnum(Signature))
- return EC;
-
- Lines.getExtractor().HasExtraFiles = hasExtraFiles();
- if (auto EC = Reader.readArray(Lines, Reader.bytesRemaining()))
- return EC;
-
- assert(Reader.bytesRemaining() == 0);
- return Error::success();
-}
-
-bool DebugInlineeLinesSubsectionRef::hasExtraFiles() const {
- return Signature == InlineeLinesSignature::ExtraFiles;
-}
-
-DebugInlineeLinesSubsection::DebugInlineeLinesSubsection(
- DebugChecksumsSubsection &Checksums, bool HasExtraFiles)
- : DebugSubsection(DebugSubsectionKind::InlineeLines), Checksums(Checksums),
- HasExtraFiles(HasExtraFiles) {}
-
-uint32_t DebugInlineeLinesSubsection::calculateSerializedSize() const {
- // 4 bytes for the signature
- uint32_t Size = sizeof(InlineeLinesSignature);
-
- // one header for each entry.
- Size += Entries.size() * sizeof(InlineeSourceLineHeader);
- if (HasExtraFiles) {
- // If extra files are enabled, one count for each entry.
- Size += Entries.size() * sizeof(uint32_t);
-
- // And one file id for each file.
- Size += ExtraFileCount * sizeof(uint32_t);
- }
- assert(Size % 4 == 0);
- return Size;
-}
-
-Error DebugInlineeLinesSubsection::commit(BinaryStreamWriter &Writer) const {
- InlineeLinesSignature Sig = InlineeLinesSignature::Normal;
- if (HasExtraFiles)
- Sig = InlineeLinesSignature::ExtraFiles;
-
- if (auto EC = Writer.writeEnum(Sig))
- return EC;
-
- for (const auto &E : Entries) {
- if (auto EC = Writer.writeObject(E.Header))
- return EC;
-
- if (!HasExtraFiles)
- continue;
-
- if (auto EC = Writer.writeInteger<uint32_t>(E.ExtraFiles.size()))
- return EC;
- if (auto EC = Writer.writeArray(makeArrayRef(E.ExtraFiles)))
- return EC;
- }
-
- return Error::success();
-}
-
-void DebugInlineeLinesSubsection::addExtraFile(StringRef FileName) {
- uint32_t Offset = Checksums.mapChecksumOffset(FileName);
-
- auto &Entry = Entries.back();
- Entry.ExtraFiles.push_back(ulittle32_t(Offset));
- ++ExtraFileCount;
-}
-
-void DebugInlineeLinesSubsection::addInlineSite(TypeIndex FuncId,
- StringRef FileName,
- uint32_t SourceLine) {
- uint32_t Offset = Checksums.mapChecksumOffset(FileName);
-
- Entries.emplace_back();
- auto &Entry = Entries.back();
- Entry.Header.FileID = Offset;
- Entry.Header.SourceLineNum = SourceLine;
- Entry.Header.Inlinee = FuncId;
-}
+//===- DebugInlineeLinesSubsection.cpp ------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "llvm/DebugInfo/CodeView/DebugInlineeLinesSubsection.h"
+#include "llvm/ADT/ArrayRef.h"
+#include "llvm/DebugInfo/CodeView/CodeView.h"
+#include "llvm/DebugInfo/CodeView/DebugChecksumsSubsection.h"
+#include "llvm/Support/BinaryStreamReader.h"
+#include "llvm/Support/BinaryStreamWriter.h"
+#include "llvm/Support/Endian.h"
+#include "llvm/Support/Error.h"
+#include <cassert>
+#include <cstdint>
+
+using namespace llvm;
+using namespace llvm::codeview;
+
+Error VarStreamArrayExtractor<InlineeSourceLine>::
+operator()(BinaryStreamRef Stream, uint32_t &Len, InlineeSourceLine &Item) {
+ BinaryStreamReader Reader(Stream);
+
+ if (auto EC = Reader.readObject(Item.Header))
+ return EC;
+
+ if (HasExtraFiles) {
+ uint32_t ExtraFileCount;
+ if (auto EC = Reader.readInteger(ExtraFileCount))
+ return EC;
+ if (auto EC = Reader.readArray(Item.ExtraFiles, ExtraFileCount))
+ return EC;
+ }
+
+ Len = Reader.getOffset();
+ return Error::success();
+}
+
+DebugInlineeLinesSubsectionRef::DebugInlineeLinesSubsectionRef()
+ : DebugSubsectionRef(DebugSubsectionKind::InlineeLines) {}
+
+Error DebugInlineeLinesSubsectionRef::initialize(BinaryStreamReader Reader) {
+ if (auto EC = Reader.readEnum(Signature))
+ return EC;
+
+ Lines.getExtractor().HasExtraFiles = hasExtraFiles();
+ if (auto EC = Reader.readArray(Lines, Reader.bytesRemaining()))
+ return EC;
+
+ assert(Reader.bytesRemaining() == 0);
+ return Error::success();
+}
+
+bool DebugInlineeLinesSubsectionRef::hasExtraFiles() const {
+ return Signature == InlineeLinesSignature::ExtraFiles;
+}
+
+DebugInlineeLinesSubsection::DebugInlineeLinesSubsection(
+ DebugChecksumsSubsection &Checksums, bool HasExtraFiles)
+ : DebugSubsection(DebugSubsectionKind::InlineeLines), Checksums(Checksums),
+ HasExtraFiles(HasExtraFiles) {}
+
+uint32_t DebugInlineeLinesSubsection::calculateSerializedSize() const {
+ // 4 bytes for the signature
+ uint32_t Size = sizeof(InlineeLinesSignature);
+
+ // one header for each entry.
+ Size += Entries.size() * sizeof(InlineeSourceLineHeader);
+ if (HasExtraFiles) {
+ // If extra files are enabled, one count for each entry.
+ Size += Entries.size() * sizeof(uint32_t);
+
+ // And one file id for each file.
+ Size += ExtraFileCount * sizeof(uint32_t);
+ }
+ assert(Size % 4 == 0);
+ return Size;
+}
+
+Error DebugInlineeLinesSubsection::commit(BinaryStreamWriter &Writer) const {
+ InlineeLinesSignature Sig = InlineeLinesSignature::Normal;
+ if (HasExtraFiles)
+ Sig = InlineeLinesSignature::ExtraFiles;
+
+ if (auto EC = Writer.writeEnum(Sig))
+ return EC;
+
+ for (const auto &E : Entries) {
+ if (auto EC = Writer.writeObject(E.Header))
+ return EC;
+
+ if (!HasExtraFiles)
+ continue;
+
+ if (auto EC = Writer.writeInteger<uint32_t>(E.ExtraFiles.size()))
+ return EC;
+ if (auto EC = Writer.writeArray(makeArrayRef(E.ExtraFiles)))
+ return EC;
+ }
+
+ return Error::success();
+}
+
+void DebugInlineeLinesSubsection::addExtraFile(StringRef FileName) {
+ uint32_t Offset = Checksums.mapChecksumOffset(FileName);
+
+ auto &Entry = Entries.back();
+ Entry.ExtraFiles.push_back(ulittle32_t(Offset));
+ ++ExtraFileCount;
+}
+
+void DebugInlineeLinesSubsection::addInlineSite(TypeIndex FuncId,
+ StringRef FileName,
+ uint32_t SourceLine) {
+ uint32_t Offset = Checksums.mapChecksumOffset(FileName);
+
+ Entries.emplace_back();
+ auto &Entry = Entries.back();
+ Entry.Header.FileID = Offset;
+ Entry.Header.SourceLineNum = SourceLine;
+ Entry.Header.Inlinee = FuncId;
+}
diff --git a/contrib/libs/llvm12/lib/DebugInfo/CodeView/DebugLinesSubsection.cpp b/contrib/libs/llvm12/lib/DebugInfo/CodeView/DebugLinesSubsection.cpp
index e653d77092b..ea16c0a6c67 100644
--- a/contrib/libs/llvm12/lib/DebugInfo/CodeView/DebugLinesSubsection.cpp
+++ b/contrib/libs/llvm12/lib/DebugInfo/CodeView/DebugLinesSubsection.cpp
@@ -1,160 +1,160 @@
-//===- DebugLinesSubsection.cpp -------------------------------------------===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-
-#include "llvm/DebugInfo/CodeView/DebugLinesSubsection.h"
-#include "llvm/ADT/ArrayRef.h"
-#include "llvm/DebugInfo/CodeView/CodeView.h"
-#include "llvm/DebugInfo/CodeView/CodeViewError.h"
-#include "llvm/DebugInfo/CodeView/DebugChecksumsSubsection.h"
-#include "llvm/Support/BinaryStreamReader.h"
-#include "llvm/Support/BinaryStreamWriter.h"
-#include "llvm/Support/Error.h"
-#include <cassert>
-#include <cstdint>
-
-using namespace llvm;
-using namespace llvm::codeview;
-
-Error LineColumnExtractor::operator()(BinaryStreamRef Stream, uint32_t &Len,
- LineColumnEntry &Item) {
- const LineBlockFragmentHeader *BlockHeader;
- BinaryStreamReader Reader(Stream);
- if (auto EC = Reader.readObject(BlockHeader))
- return EC;
- bool HasColumn = Header->Flags & uint16_t(LF_HaveColumns);
- uint32_t LineInfoSize =
- BlockHeader->NumLines *
- (sizeof(LineNumberEntry) + (HasColumn ? sizeof(ColumnNumberEntry) : 0));
- if (BlockHeader->BlockSize < sizeof(LineBlockFragmentHeader))
- return make_error<CodeViewError>(cv_error_code::corrupt_record,
- "Invalid line block record size");
- uint32_t Size = BlockHeader->BlockSize - sizeof(LineBlockFragmentHeader);
- if (LineInfoSize > Size)
- return make_error<CodeViewError>(cv_error_code::corrupt_record,
- "Invalid line block record size");
- // The value recorded in BlockHeader->BlockSize includes the size of
- // LineBlockFragmentHeader.
- Len = BlockHeader->BlockSize;
- Item.NameIndex = BlockHeader->NameIndex;
- if (auto EC = Reader.readArray(Item.LineNumbers, BlockHeader->NumLines))
- return EC;
- if (HasColumn) {
- if (auto EC = Reader.readArray(Item.Columns, BlockHeader->NumLines))
- return EC;
- }
- return Error::success();
-}
-
-DebugLinesSubsectionRef::DebugLinesSubsectionRef()
- : DebugSubsectionRef(DebugSubsectionKind::Lines) {}
-
-Error DebugLinesSubsectionRef::initialize(BinaryStreamReader Reader) {
- if (auto EC = Reader.readObject(Header))
- return EC;
-
- LinesAndColumns.getExtractor().Header = Header;
- if (auto EC = Reader.readArray(LinesAndColumns, Reader.bytesRemaining()))
- return EC;
-
- return Error::success();
-}
-
-bool DebugLinesSubsectionRef::hasColumnInfo() const {
- return !!(Header->Flags & LF_HaveColumns);
-}
-
-DebugLinesSubsection::DebugLinesSubsection(DebugChecksumsSubsection &Checksums,
- DebugStringTableSubsection &Strings)
- : DebugSubsection(DebugSubsectionKind::Lines), Checksums(Checksums) {}
-
-void DebugLinesSubsection::createBlock(StringRef FileName) {
- uint32_t Offset = Checksums.mapChecksumOffset(FileName);
-
- Blocks.emplace_back(Offset);
-}
-
-void DebugLinesSubsection::addLineInfo(uint32_t Offset, const LineInfo &Line) {
- Block &B = Blocks.back();
- LineNumberEntry LNE;
- LNE.Flags = Line.getRawData();
- LNE.Offset = Offset;
- B.Lines.push_back(LNE);
-}
-
-void DebugLinesSubsection::addLineAndColumnInfo(uint32_t Offset,
- const LineInfo &Line,
- uint32_t ColStart,
- uint32_t ColEnd) {
- Block &B = Blocks.back();
- assert(B.Lines.size() == B.Columns.size());
-
- addLineInfo(Offset, Line);
- ColumnNumberEntry CNE;
- CNE.StartColumn = ColStart;
- CNE.EndColumn = ColEnd;
- B.Columns.push_back(CNE);
-}
-
-Error DebugLinesSubsection::commit(BinaryStreamWriter &Writer) const {
- LineFragmentHeader Header;
- Header.CodeSize = CodeSize;
- Header.Flags = hasColumnInfo() ? LF_HaveColumns : 0;
- Header.RelocOffset = RelocOffset;
- Header.RelocSegment = RelocSegment;
-
- if (auto EC = Writer.writeObject(Header))
- return EC;
-
- for (const auto &B : Blocks) {
- LineBlockFragmentHeader BlockHeader;
- assert(B.Lines.size() == B.Columns.size() || B.Columns.empty());
-
- BlockHeader.NumLines = B.Lines.size();
- BlockHeader.BlockSize = sizeof(LineBlockFragmentHeader);
- BlockHeader.BlockSize += BlockHeader.NumLines * sizeof(LineNumberEntry);
- if (hasColumnInfo())
- BlockHeader.BlockSize += BlockHeader.NumLines * sizeof(ColumnNumberEntry);
- BlockHeader.NameIndex = B.ChecksumBufferOffset;
- if (auto EC = Writer.writeObject(BlockHeader))
- return EC;
-
- if (auto EC = Writer.writeArray(makeArrayRef(B.Lines)))
- return EC;
-
- if (hasColumnInfo()) {
- if (auto EC = Writer.writeArray(makeArrayRef(B.Columns)))
- return EC;
- }
- }
- return Error::success();
-}
-
-uint32_t DebugLinesSubsection::calculateSerializedSize() const {
- uint32_t Size = sizeof(LineFragmentHeader);
- for (const auto &B : Blocks) {
- Size += sizeof(LineBlockFragmentHeader);
- Size += B.Lines.size() * sizeof(LineNumberEntry);
- if (hasColumnInfo())
- Size += B.Columns.size() * sizeof(ColumnNumberEntry);
- }
- return Size;
-}
-
-void DebugLinesSubsection::setRelocationAddress(uint16_t Segment,
- uint32_t Offset) {
- RelocOffset = Offset;
- RelocSegment = Segment;
-}
-
-void DebugLinesSubsection::setCodeSize(uint32_t Size) { CodeSize = Size; }
-
-void DebugLinesSubsection::setFlags(LineFlags Flags) { this->Flags = Flags; }
-
-bool DebugLinesSubsection::hasColumnInfo() const {
- return Flags & LF_HaveColumns;
-}
+//===- DebugLinesSubsection.cpp -------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "llvm/DebugInfo/CodeView/DebugLinesSubsection.h"
+#include "llvm/ADT/ArrayRef.h"
+#include "llvm/DebugInfo/CodeView/CodeView.h"
+#include "llvm/DebugInfo/CodeView/CodeViewError.h"
+#include "llvm/DebugInfo/CodeView/DebugChecksumsSubsection.h"
+#include "llvm/Support/BinaryStreamReader.h"
+#include "llvm/Support/BinaryStreamWriter.h"
+#include "llvm/Support/Error.h"
+#include <cassert>
+#include <cstdint>
+
+using namespace llvm;
+using namespace llvm::codeview;
+
+Error LineColumnExtractor::operator()(BinaryStreamRef Stream, uint32_t &Len,
+ LineColumnEntry &Item) {
+ const LineBlockFragmentHeader *BlockHeader;
+ BinaryStreamReader Reader(Stream);
+ if (auto EC = Reader.readObject(BlockHeader))
+ return EC;
+ bool HasColumn = Header->Flags & uint16_t(LF_HaveColumns);
+ uint32_t LineInfoSize =
+ BlockHeader->NumLines *
+ (sizeof(LineNumberEntry) + (HasColumn ? sizeof(ColumnNumberEntry) : 0));
+ if (BlockHeader->BlockSize < sizeof(LineBlockFragmentHeader))
+ return make_error<CodeViewError>(cv_error_code::corrupt_record,
+ "Invalid line block record size");
+ uint32_t Size = BlockHeader->BlockSize - sizeof(LineBlockFragmentHeader);
+ if (LineInfoSize > Size)
+ return make_error<CodeViewError>(cv_error_code::corrupt_record,
+ "Invalid line block record size");
+ // The value recorded in BlockHeader->BlockSize includes the size of
+ // LineBlockFragmentHeader.
+ Len = BlockHeader->BlockSize;
+ Item.NameIndex = BlockHeader->NameIndex;
+ if (auto EC = Reader.readArray(Item.LineNumbers, BlockHeader->NumLines))
+ return EC;
+ if (HasColumn) {
+ if (auto EC = Reader.readArray(Item.Columns, BlockHeader->NumLines))
+ return EC;
+ }
+ return Error::success();
+}
+
+DebugLinesSubsectionRef::DebugLinesSubsectionRef()
+ : DebugSubsectionRef(DebugSubsectionKind::Lines) {}
+
+Error DebugLinesSubsectionRef::initialize(BinaryStreamReader Reader) {
+ if (auto EC = Reader.readObject(Header))
+ return EC;
+
+ LinesAndColumns.getExtractor().Header = Header;
+ if (auto EC = Reader.readArray(LinesAndColumns, Reader.bytesRemaining()))
+ return EC;
+
+ return Error::success();
+}
+
+bool DebugLinesSubsectionRef::hasColumnInfo() const {
+ return !!(Header->Flags & LF_HaveColumns);
+}
+
+DebugLinesSubsection::DebugLinesSubsection(DebugChecksumsSubsection &Checksums,
+ DebugStringTableSubsection &Strings)
+ : DebugSubsection(DebugSubsectionKind::Lines), Checksums(Checksums) {}
+
+void DebugLinesSubsection::createBlock(StringRef FileName) {
+ uint32_t Offset = Checksums.mapChecksumOffset(FileName);
+
+ Blocks.emplace_back(Offset);
+}
+
+void DebugLinesSubsection::addLineInfo(uint32_t Offset, const LineInfo &Line) {
+ Block &B = Blocks.back();
+ LineNumberEntry LNE;
+ LNE.Flags = Line.getRawData();
+ LNE.Offset = Offset;
+ B.Lines.push_back(LNE);
+}
+
+void DebugLinesSubsection::addLineAndColumnInfo(uint32_t Offset,
+ const LineInfo &Line,
+ uint32_t ColStart,
+ uint32_t ColEnd) {
+ Block &B = Blocks.back();
+ assert(B.Lines.size() == B.Columns.size());
+
+ addLineInfo(Offset, Line);
+ ColumnNumberEntry CNE;
+ CNE.StartColumn = ColStart;
+ CNE.EndColumn = ColEnd;
+ B.Columns.push_back(CNE);
+}
+
+Error DebugLinesSubsection::commit(BinaryStreamWriter &Writer) const {
+ LineFragmentHeader Header;
+ Header.CodeSize = CodeSize;
+ Header.Flags = hasColumnInfo() ? LF_HaveColumns : 0;
+ Header.RelocOffset = RelocOffset;
+ Header.RelocSegment = RelocSegment;
+
+ if (auto EC = Writer.writeObject(Header))
+ return EC;
+
+ for (const auto &B : Blocks) {
+ LineBlockFragmentHeader BlockHeader;
+ assert(B.Lines.size() == B.Columns.size() || B.Columns.empty());
+
+ BlockHeader.NumLines = B.Lines.size();
+ BlockHeader.BlockSize = sizeof(LineBlockFragmentHeader);
+ BlockHeader.BlockSize += BlockHeader.NumLines * sizeof(LineNumberEntry);
+ if (hasColumnInfo())
+ BlockHeader.BlockSize += BlockHeader.NumLines * sizeof(ColumnNumberEntry);
+ BlockHeader.NameIndex = B.ChecksumBufferOffset;
+ if (auto EC = Writer.writeObject(BlockHeader))
+ return EC;
+
+ if (auto EC = Writer.writeArray(makeArrayRef(B.Lines)))
+ return EC;
+
+ if (hasColumnInfo()) {
+ if (auto EC = Writer.writeArray(makeArrayRef(B.Columns)))
+ return EC;
+ }
+ }
+ return Error::success();
+}
+
+uint32_t DebugLinesSubsection::calculateSerializedSize() const {
+ uint32_t Size = sizeof(LineFragmentHeader);
+ for (const auto &B : Blocks) {
+ Size += sizeof(LineBlockFragmentHeader);
+ Size += B.Lines.size() * sizeof(LineNumberEntry);
+ if (hasColumnInfo())
+ Size += B.Columns.size() * sizeof(ColumnNumberEntry);
+ }
+ return Size;
+}
+
+void DebugLinesSubsection::setRelocationAddress(uint16_t Segment,
+ uint32_t Offset) {
+ RelocOffset = Offset;
+ RelocSegment = Segment;
+}
+
+void DebugLinesSubsection::setCodeSize(uint32_t Size) { CodeSize = Size; }
+
+void DebugLinesSubsection::setFlags(LineFlags Flags) { this->Flags = Flags; }
+
+bool DebugLinesSubsection::hasColumnInfo() const {
+ return Flags & LF_HaveColumns;
+}
diff --git a/contrib/libs/llvm12/lib/DebugInfo/CodeView/DebugStringTableSubsection.cpp b/contrib/libs/llvm12/lib/DebugInfo/CodeView/DebugStringTableSubsection.cpp
index 205678c5009..63342749918 100644
--- a/contrib/libs/llvm12/lib/DebugInfo/CodeView/DebugStringTableSubsection.cpp
+++ b/contrib/libs/llvm12/lib/DebugInfo/CodeView/DebugStringTableSubsection.cpp
@@ -1,107 +1,107 @@
-//===- DebugStringTableSubsection.cpp - CodeView String Table -------------===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-
-#include "llvm/DebugInfo/CodeView/DebugStringTableSubsection.h"
-#include "llvm/ADT/StringRef.h"
-#include "llvm/DebugInfo/CodeView/CodeView.h"
-#include "llvm/Support/BinaryStreamReader.h"
-#include "llvm/Support/BinaryStreamWriter.h"
-#include "llvm/Support/Error.h"
-#include <algorithm>
-#include <cassert>
-#include <cstdint>
-
-using namespace llvm;
-using namespace llvm::codeview;
-
-DebugStringTableSubsectionRef::DebugStringTableSubsectionRef()
- : DebugSubsectionRef(DebugSubsectionKind::StringTable) {}
-
-Error DebugStringTableSubsectionRef::initialize(BinaryStreamRef Contents) {
- Stream = Contents;
- return Error::success();
-}
-
-Error DebugStringTableSubsectionRef::initialize(BinaryStreamReader &Reader) {
- return Reader.readStreamRef(Stream);
-}
-
-Expected<StringRef>
-DebugStringTableSubsectionRef::getString(uint32_t Offset) const {
- BinaryStreamReader Reader(Stream);
- Reader.setOffset(Offset);
- StringRef Result;
- if (auto EC = Reader.readCString(Result))
- return std::move(EC);
- return Result;
-}
-
-DebugStringTableSubsection::DebugStringTableSubsection()
- : DebugSubsection(DebugSubsectionKind::StringTable) {}
-
-uint32_t DebugStringTableSubsection::insert(StringRef S) {
- auto P = StringToId.insert({S, StringSize});
-
- // If a given string didn't exist in the string table, we want to increment
- // the string table size and insert it into the reverse lookup.
- if (P.second) {
- IdToString.insert({P.first->getValue(), P.first->getKey()});
- StringSize += S.size() + 1; // +1 for '\0'
- }
-
- return P.first->second;
-}
-
-uint32_t DebugStringTableSubsection::calculateSerializedSize() const {
- return StringSize;
-}
-
-Error DebugStringTableSubsection::commit(BinaryStreamWriter &Writer) const {
- uint32_t Begin = Writer.getOffset();
- uint32_t End = Begin + StringSize;
-
- // Write a null string at the beginning.
- if (auto EC = Writer.writeCString(StringRef()))
- return EC;
-
- for (auto &Pair : StringToId) {
- StringRef S = Pair.getKey();
- uint32_t Offset = Begin + Pair.getValue();
- Writer.setOffset(Offset);
- if (auto EC = Writer.writeCString(S))
- return EC;
- assert(Writer.getOffset() <= End);
- }
-
- Writer.setOffset(End);
- assert((End - Begin) == StringSize);
- return Error::success();
-}
-
-uint32_t DebugStringTableSubsection::size() const { return StringToId.size(); }
-
-std::vector<uint32_t> DebugStringTableSubsection::sortedIds() const {
- std::vector<uint32_t> Result;
- Result.reserve(IdToString.size());
- for (const auto &Entry : IdToString)
- Result.push_back(Entry.first);
- llvm::sort(Result);
- return Result;
-}
-
-uint32_t DebugStringTableSubsection::getIdForString(StringRef S) const {
- auto Iter = StringToId.find(S);
- assert(Iter != StringToId.end());
- return Iter->second;
-}
-
-StringRef DebugStringTableSubsection::getStringForId(uint32_t Id) const {
- auto Iter = IdToString.find(Id);
- assert(Iter != IdToString.end());
- return Iter->second;
-}
+//===- DebugStringTableSubsection.cpp - CodeView String Table -------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "llvm/DebugInfo/CodeView/DebugStringTableSubsection.h"
+#include "llvm/ADT/StringRef.h"
+#include "llvm/DebugInfo/CodeView/CodeView.h"
+#include "llvm/Support/BinaryStreamReader.h"
+#include "llvm/Support/BinaryStreamWriter.h"
+#include "llvm/Support/Error.h"
+#include <algorithm>
+#include <cassert>
+#include <cstdint>
+
+using namespace llvm;
+using namespace llvm::codeview;
+
+DebugStringTableSubsectionRef::DebugStringTableSubsectionRef()
+ : DebugSubsectionRef(DebugSubsectionKind::StringTable) {}
+
+Error DebugStringTableSubsectionRef::initialize(BinaryStreamRef Contents) {
+ Stream = Contents;
+ return Error::success();
+}
+
+Error DebugStringTableSubsectionRef::initialize(BinaryStreamReader &Reader) {
+ return Reader.readStreamRef(Stream);
+}
+
+Expected<StringRef>
+DebugStringTableSubsectionRef::getString(uint32_t Offset) const {
+ BinaryStreamReader Reader(Stream);
+ Reader.setOffset(Offset);
+ StringRef Result;
+ if (auto EC = Reader.readCString(Result))
+ return std::move(EC);
+ return Result;
+}
+
+DebugStringTableSubsection::DebugStringTableSubsection()
+ : DebugSubsection(DebugSubsectionKind::StringTable) {}
+
+uint32_t DebugStringTableSubsection::insert(StringRef S) {
+ auto P = StringToId.insert({S, StringSize});
+
+ // If a given string didn't exist in the string table, we want to increment
+ // the string table size and insert it into the reverse lookup.
+ if (P.second) {
+ IdToString.insert({P.first->getValue(), P.first->getKey()});
+ StringSize += S.size() + 1; // +1 for '\0'
+ }
+
+ return P.first->second;
+}
+
+uint32_t DebugStringTableSubsection::calculateSerializedSize() const {
+ return StringSize;
+}
+
+Error DebugStringTableSubsection::commit(BinaryStreamWriter &Writer) const {
+ uint32_t Begin = Writer.getOffset();
+ uint32_t End = Begin + StringSize;
+
+ // Write a null string at the beginning.
+ if (auto EC = Writer.writeCString(StringRef()))
+ return EC;
+
+ for (auto &Pair : StringToId) {
+ StringRef S = Pair.getKey();
+ uint32_t Offset = Begin + Pair.getValue();
+ Writer.setOffset(Offset);
+ if (auto EC = Writer.writeCString(S))
+ return EC;
+ assert(Writer.getOffset() <= End);
+ }
+
+ Writer.setOffset(End);
+ assert((End - Begin) == StringSize);
+ return Error::success();
+}
+
+uint32_t DebugStringTableSubsection::size() const { return StringToId.size(); }
+
+std::vector<uint32_t> DebugStringTableSubsection::sortedIds() const {
+ std::vector<uint32_t> Result;
+ Result.reserve(IdToString.size());
+ for (const auto &Entry : IdToString)
+ Result.push_back(Entry.first);
+ llvm::sort(Result);
+ return Result;
+}
+
+uint32_t DebugStringTableSubsection::getIdForString(StringRef S) const {
+ auto Iter = StringToId.find(S);
+ assert(Iter != StringToId.end());
+ return Iter->second;
+}
+
+StringRef DebugStringTableSubsection::getStringForId(uint32_t Id) const {
+ auto Iter = IdToString.find(Id);
+ assert(Iter != IdToString.end());
+ return Iter->second;
+}
diff --git a/contrib/libs/llvm12/lib/DebugInfo/CodeView/DebugSubsection.cpp b/contrib/libs/llvm12/lib/DebugInfo/CodeView/DebugSubsection.cpp
index 484afa6653d..3f93463fe6d 100644
--- a/contrib/libs/llvm12/lib/DebugInfo/CodeView/DebugSubsection.cpp
+++ b/contrib/libs/llvm12/lib/DebugInfo/CodeView/DebugSubsection.cpp
@@ -1,15 +1,15 @@
-//===- DebugSubsection.cpp -----------------------------------*- C++-*-===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-
-#include "llvm/DebugInfo/CodeView/DebugSubsection.h"
-
-using namespace llvm::codeview;
-
-DebugSubsectionRef::~DebugSubsectionRef() {}
-
-DebugSubsection::~DebugSubsection() {}
+//===- DebugSubsection.cpp -----------------------------------*- C++-*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "llvm/DebugInfo/CodeView/DebugSubsection.h"
+
+using namespace llvm::codeview;
+
+DebugSubsectionRef::~DebugSubsectionRef() {}
+
+DebugSubsection::~DebugSubsection() {}
diff --git a/contrib/libs/llvm12/lib/DebugInfo/CodeView/DebugSubsectionRecord.cpp b/contrib/libs/llvm12/lib/DebugInfo/CodeView/DebugSubsectionRecord.cpp
index 9070125d820..3c8a3010145 100644
--- a/contrib/libs/llvm12/lib/DebugInfo/CodeView/DebugSubsectionRecord.cpp
+++ b/contrib/libs/llvm12/lib/DebugInfo/CodeView/DebugSubsectionRecord.cpp
@@ -1,94 +1,94 @@
-//===- DebugSubsectionRecord.cpp ------------------------------------------===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-
-#include "llvm/DebugInfo/CodeView/DebugSubsectionRecord.h"
-#include "llvm/DebugInfo/CodeView/CodeView.h"
-#include "llvm/DebugInfo/CodeView/DebugSubsection.h"
-#include "llvm/Support/BinaryStreamReader.h"
-#include "llvm/Support/BinaryStreamWriter.h"
-#include "llvm/Support/Error.h"
-#include "llvm/Support/MathExtras.h"
-#include <algorithm>
-#include <cassert>
-#include <cstdint>
-
-using namespace llvm;
-using namespace llvm::codeview;
-
-DebugSubsectionRecord::DebugSubsectionRecord() = default;
-
-DebugSubsectionRecord::DebugSubsectionRecord(DebugSubsectionKind Kind,
- BinaryStreamRef Data)
- : Kind(Kind), Data(Data) {}
-
-Error DebugSubsectionRecord::initialize(BinaryStreamRef Stream,
- DebugSubsectionRecord &Info) {
- const DebugSubsectionHeader *Header;
- BinaryStreamReader Reader(Stream);
- if (auto EC = Reader.readObject(Header))
- return EC;
-
- DebugSubsectionKind Kind =
- static_cast<DebugSubsectionKind>(uint32_t(Header->Kind));
- if (auto EC = Reader.readStreamRef(Info.Data, Header->Length))
- return EC;
- Info.Kind = Kind;
- return Error::success();
-}
-
-uint32_t DebugSubsectionRecord::getRecordLength() const {
- return sizeof(DebugSubsectionHeader) + Data.getLength();
-}
-
-DebugSubsectionKind DebugSubsectionRecord::kind() const { return Kind; }
-
-BinaryStreamRef DebugSubsectionRecord::getRecordData() const { return Data; }
-
-DebugSubsectionRecordBuilder::DebugSubsectionRecordBuilder(
- std::shared_ptr<DebugSubsection> Subsection)
- : Subsection(std::move(Subsection)) {}
-
-DebugSubsectionRecordBuilder::DebugSubsectionRecordBuilder(
- const DebugSubsectionRecord &Contents)
- : Contents(Contents) {}
-
-uint32_t DebugSubsectionRecordBuilder::calculateSerializedLength() const {
- uint32_t DataSize = Subsection ? Subsection->calculateSerializedSize()
- : Contents.getRecordData().getLength();
- // The length of the entire subsection is always padded to 4 bytes,
- // regardless of the container kind.
- return sizeof(DebugSubsectionHeader) + alignTo(DataSize, 4);
-}
-
-Error DebugSubsectionRecordBuilder::commit(BinaryStreamWriter &Writer,
- CodeViewContainer Container) const {
- assert(Writer.getOffset() % alignOf(Container) == 0 &&
- "Debug Subsection not properly aligned");
-
- DebugSubsectionHeader Header;
- Header.Kind = uint32_t(Subsection ? Subsection->kind() : Contents.kind());
- // The value written into the Header's Length field is only padded to the
- // container's alignment
- uint32_t DataSize = Subsection ? Subsection->calculateSerializedSize()
- : Contents.getRecordData().getLength();
- Header.Length = alignTo(DataSize, alignOf(Container));
-
- if (auto EC = Writer.writeObject(Header))
- return EC;
- if (Subsection) {
- if (auto EC = Subsection->commit(Writer))
- return EC;
- } else {
- if (auto EC = Writer.writeStreamRef(Contents.getRecordData()))
- return EC;
- }
- if (auto EC = Writer.padToAlignment(4))
- return EC;
-
- return Error::success();
-}
+//===- DebugSubsectionRecord.cpp ------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "llvm/DebugInfo/CodeView/DebugSubsectionRecord.h"
+#include "llvm/DebugInfo/CodeView/CodeView.h"
+#include "llvm/DebugInfo/CodeView/DebugSubsection.h"
+#include "llvm/Support/BinaryStreamReader.h"
+#include "llvm/Support/BinaryStreamWriter.h"
+#include "llvm/Support/Error.h"
+#include "llvm/Support/MathExtras.h"
+#include <algorithm>
+#include <cassert>
+#include <cstdint>
+
+using namespace llvm;
+using namespace llvm::codeview;
+
+DebugSubsectionRecord::DebugSubsectionRecord() = default;
+
+DebugSubsectionRecord::DebugSubsectionRecord(DebugSubsectionKind Kind,
+ BinaryStreamRef Data)
+ : Kind(Kind), Data(Data) {}
+
+Error DebugSubsectionRecord::initialize(BinaryStreamRef Stream,
+ DebugSubsectionRecord &Info) {
+ const DebugSubsectionHeader *Header;
+ BinaryStreamReader Reader(Stream);
+ if (auto EC = Reader.readObject(Header))
+ return EC;
+
+ DebugSubsectionKind Kind =
+ static_cast<DebugSubsectionKind>(uint32_t(Header->Kind));
+ if (auto EC = Reader.readStreamRef(Info.Data, Header->Length))
+ return EC;
+ Info.Kind = Kind;
+ return Error::success();
+}
+
+uint32_t DebugSubsectionRecord::getRecordLength() const {
+ return sizeof(DebugSubsectionHeader) + Data.getLength();
+}
+
+DebugSubsectionKind DebugSubsectionRecord::kind() const { return Kind; }
+
+BinaryStreamRef DebugSubsectionRecord::getRecordData() const { return Data; }
+
+DebugSubsectionRecordBuilder::DebugSubsectionRecordBuilder(
+ std::shared_ptr<DebugSubsection> Subsection)
+ : Subsection(std::move(Subsection)) {}
+
+DebugSubsectionRecordBuilder::DebugSubsectionRecordBuilder(
+ const DebugSubsectionRecord &Contents)
+ : Contents(Contents) {}
+
+uint32_t DebugSubsectionRecordBuilder::calculateSerializedLength() const {
+ uint32_t DataSize = Subsection ? Subsection->calculateSerializedSize()
+ : Contents.getRecordData().getLength();
+ // The length of the entire subsection is always padded to 4 bytes,
+ // regardless of the container kind.
+ return sizeof(DebugSubsectionHeader) + alignTo(DataSize, 4);
+}
+
+Error DebugSubsectionRecordBuilder::commit(BinaryStreamWriter &Writer,
+ CodeViewContainer Container) const {
+ assert(Writer.getOffset() % alignOf(Container) == 0 &&
+ "Debug Subsection not properly aligned");
+
+ DebugSubsectionHeader Header;
+ Header.Kind = uint32_t(Subsection ? Subsection->kind() : Contents.kind());
+ // The value written into the Header's Length field is only padded to the
+ // container's alignment
+ uint32_t DataSize = Subsection ? Subsection->calculateSerializedSize()
+ : Contents.getRecordData().getLength();
+ Header.Length = alignTo(DataSize, alignOf(Container));
+
+ if (auto EC = Writer.writeObject(Header))
+ return EC;
+ if (Subsection) {
+ if (auto EC = Subsection->commit(Writer))
+ return EC;
+ } else {
+ if (auto EC = Writer.writeStreamRef(Contents.getRecordData()))
+ return EC;
+ }
+ if (auto EC = Writer.padToAlignment(4))
+ return EC;
+
+ return Error::success();
+}
diff --git a/contrib/libs/llvm12/lib/DebugInfo/CodeView/DebugSubsectionVisitor.cpp b/contrib/libs/llvm12/lib/DebugInfo/CodeView/DebugSubsectionVisitor.cpp
index b6c46fe4ccb..7968b6a2d75 100644
--- a/contrib/libs/llvm12/lib/DebugInfo/CodeView/DebugSubsectionVisitor.cpp
+++ b/contrib/libs/llvm12/lib/DebugInfo/CodeView/DebugSubsectionVisitor.cpp
@@ -1,94 +1,94 @@
-//===- DebugSubsectionVisitor.cpp -------------------------------*- C++ -*-===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-
-#include "llvm/DebugInfo/CodeView/DebugSubsectionVisitor.h"
-
-#include "llvm/DebugInfo/CodeView/DebugChecksumsSubsection.h"
-#include "llvm/DebugInfo/CodeView/DebugCrossExSubsection.h"
-#include "llvm/DebugInfo/CodeView/DebugCrossImpSubsection.h"
-#include "llvm/DebugInfo/CodeView/DebugFrameDataSubsection.h"
-#include "llvm/DebugInfo/CodeView/DebugInlineeLinesSubsection.h"
-#include "llvm/DebugInfo/CodeView/DebugLinesSubsection.h"
-#include "llvm/DebugInfo/CodeView/DebugStringTableSubsection.h"
-#include "llvm/DebugInfo/CodeView/DebugSubsectionRecord.h"
-#include "llvm/DebugInfo/CodeView/DebugSymbolRVASubsection.h"
-#include "llvm/DebugInfo/CodeView/DebugSymbolsSubsection.h"
-#include "llvm/DebugInfo/CodeView/DebugUnknownSubsection.h"
-#include "llvm/Support/BinaryStreamReader.h"
-#include "llvm/Support/BinaryStreamRef.h"
-
-using namespace llvm;
-using namespace llvm::codeview;
-
-Error llvm::codeview::visitDebugSubsection(
- const DebugSubsectionRecord &R, DebugSubsectionVisitor &V,
- const StringsAndChecksumsRef &State) {
- BinaryStreamReader Reader(R.getRecordData());
- switch (R.kind()) {
- case DebugSubsectionKind::Lines: {
- DebugLinesSubsectionRef Fragment;
- if (auto EC = Fragment.initialize(Reader))
- return EC;
-
- return V.visitLines(Fragment, State);
- }
- case DebugSubsectionKind::FileChecksums: {
- DebugChecksumsSubsectionRef Fragment;
- if (auto EC = Fragment.initialize(Reader))
- return EC;
-
- return V.visitFileChecksums(Fragment, State);
- }
- case DebugSubsectionKind::InlineeLines: {
- DebugInlineeLinesSubsectionRef Fragment;
- if (auto EC = Fragment.initialize(Reader))
- return EC;
- return V.visitInlineeLines(Fragment, State);
- }
- case DebugSubsectionKind::CrossScopeExports: {
- DebugCrossModuleExportsSubsectionRef Section;
- if (auto EC = Section.initialize(Reader))
- return EC;
- return V.visitCrossModuleExports(Section, State);
- }
- case DebugSubsectionKind::CrossScopeImports: {
- DebugCrossModuleImportsSubsectionRef Section;
- if (auto EC = Section.initialize(Reader))
- return EC;
- return V.visitCrossModuleImports(Section, State);
- }
- case DebugSubsectionKind::Symbols: {
- DebugSymbolsSubsectionRef Section;
- if (auto EC = Section.initialize(Reader))
- return EC;
- return V.visitSymbols(Section, State);
- }
- case DebugSubsectionKind::StringTable: {
- DebugStringTableSubsectionRef Section;
- if (auto EC = Section.initialize(Reader))
- return EC;
- return V.visitStringTable(Section, State);
- }
- case DebugSubsectionKind::FrameData: {
- DebugFrameDataSubsectionRef Section;
- if (auto EC = Section.initialize(Reader))
- return EC;
- return V.visitFrameData(Section, State);
- }
- case DebugSubsectionKind::CoffSymbolRVA: {
- DebugSymbolRVASubsectionRef Section;
- if (auto EC = Section.initialize(Reader))
- return EC;
- return V.visitCOFFSymbolRVAs(Section, State);
- }
- default: {
- DebugUnknownSubsectionRef Fragment(R.kind(), R.getRecordData());
- return V.visitUnknown(Fragment);
- }
- }
-}
+//===- DebugSubsectionVisitor.cpp -------------------------------*- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "llvm/DebugInfo/CodeView/DebugSubsectionVisitor.h"
+
+#include "llvm/DebugInfo/CodeView/DebugChecksumsSubsection.h"
+#include "llvm/DebugInfo/CodeView/DebugCrossExSubsection.h"
+#include "llvm/DebugInfo/CodeView/DebugCrossImpSubsection.h"
+#include "llvm/DebugInfo/CodeView/DebugFrameDataSubsection.h"
+#include "llvm/DebugInfo/CodeView/DebugInlineeLinesSubsection.h"
+#include "llvm/DebugInfo/CodeView/DebugLinesSubsection.h"
+#include "llvm/DebugInfo/CodeView/DebugStringTableSubsection.h"
+#include "llvm/DebugInfo/CodeView/DebugSubsectionRecord.h"
+#include "llvm/DebugInfo/CodeView/DebugSymbolRVASubsection.h"
+#include "llvm/DebugInfo/CodeView/DebugSymbolsSubsection.h"
+#include "llvm/DebugInfo/CodeView/DebugUnknownSubsection.h"
+#include "llvm/Support/BinaryStreamReader.h"
+#include "llvm/Support/BinaryStreamRef.h"
+
+using namespace llvm;
+using namespace llvm::codeview;
+
+Error llvm::codeview::visitDebugSubsection(
+ const DebugSubsectionRecord &R, DebugSubsectionVisitor &V,
+ const StringsAndChecksumsRef &State) {
+ BinaryStreamReader Reader(R.getRecordData());
+ switch (R.kind()) {
+ case DebugSubsectionKind::Lines: {
+ DebugLinesSubsectionRef Fragment;
+ if (auto EC = Fragment.initialize(Reader))
+ return EC;
+
+ return V.visitLines(Fragment, State);
+ }
+ case DebugSubsectionKind::FileChecksums: {
+ DebugChecksumsSubsectionRef Fragment;
+ if (auto EC = Fragment.initialize(Reader))
+ return EC;
+
+ return V.visitFileChecksums(Fragment, State);
+ }
+ case DebugSubsectionKind::InlineeLines: {
+ DebugInlineeLinesSubsectionRef Fragment;
+ if (auto EC = Fragment.initialize(Reader))
+ return EC;
+ return V.visitInlineeLines(Fragment, State);
+ }
+ case DebugSubsectionKind::CrossScopeExports: {
+ DebugCrossModuleExportsSubsectionRef Section;
+ if (auto EC = Section.initialize(Reader))
+ return EC;
+ return V.visitCrossModuleExports(Section, State);
+ }
+ case DebugSubsectionKind::CrossScopeImports: {
+ DebugCrossModuleImportsSubsectionRef Section;
+ if (auto EC = Section.initialize(Reader))
+ return EC;
+ return V.visitCrossModuleImports(Section, State);
+ }
+ case DebugSubsectionKind::Symbols: {
+ DebugSymbolsSubsectionRef Section;
+ if (auto EC = Section.initialize(Reader))
+ return EC;
+ return V.visitSymbols(Section, State);
+ }
+ case DebugSubsectionKind::StringTable: {
+ DebugStringTableSubsectionRef Section;
+ if (auto EC = Section.initialize(Reader))
+ return EC;
+ return V.visitStringTable(Section, State);
+ }
+ case DebugSubsectionKind::FrameData: {
+ DebugFrameDataSubsectionRef Section;
+ if (auto EC = Section.initialize(Reader))
+ return EC;
+ return V.visitFrameData(Section, State);
+ }
+ case DebugSubsectionKind::CoffSymbolRVA: {
+ DebugSymbolRVASubsectionRef Section;
+ if (auto EC = Section.initialize(Reader))
+ return EC;
+ return V.visitCOFFSymbolRVAs(Section, State);
+ }
+ default: {
+ DebugUnknownSubsectionRef Fragment(R.kind(), R.getRecordData());
+ return V.visitUnknown(Fragment);
+ }
+ }
+}
diff --git a/contrib/libs/llvm12/lib/DebugInfo/CodeView/DebugSymbolRVASubsection.cpp b/contrib/libs/llvm12/lib/DebugInfo/CodeView/DebugSymbolRVASubsection.cpp
index eb5c4129fea..52328967357 100644
--- a/contrib/libs/llvm12/lib/DebugInfo/CodeView/DebugSymbolRVASubsection.cpp
+++ b/contrib/libs/llvm12/lib/DebugInfo/CodeView/DebugSymbolRVASubsection.cpp
@@ -1,35 +1,35 @@
-//===- DebugSymbolRVASubsection.cpp ---------------------------------------===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-
-#include "llvm/DebugInfo/CodeView/DebugSymbolRVASubsection.h"
-#include "llvm/ADT/ArrayRef.h"
-#include "llvm/DebugInfo/CodeView/CodeView.h"
-#include "llvm/Support/BinaryStreamReader.h"
-#include "llvm/Support/BinaryStreamWriter.h"
-#include <cstdint>
-
-using namespace llvm;
-using namespace llvm::codeview;
-
-DebugSymbolRVASubsectionRef::DebugSymbolRVASubsectionRef()
- : DebugSubsectionRef(DebugSubsectionKind::CoffSymbolRVA) {}
-
-Error DebugSymbolRVASubsectionRef::initialize(BinaryStreamReader &Reader) {
- return Reader.readArray(RVAs, Reader.bytesRemaining() / sizeof(uint32_t));
-}
-
-DebugSymbolRVASubsection::DebugSymbolRVASubsection()
- : DebugSubsection(DebugSubsectionKind::CoffSymbolRVA) {}
-
-Error DebugSymbolRVASubsection::commit(BinaryStreamWriter &Writer) const {
- return Writer.writeArray(makeArrayRef(RVAs));
-}
-
-uint32_t DebugSymbolRVASubsection::calculateSerializedSize() const {
- return RVAs.size() * sizeof(uint32_t);
-}
+//===- DebugSymbolRVASubsection.cpp ---------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "llvm/DebugInfo/CodeView/DebugSymbolRVASubsection.h"
+#include "llvm/ADT/ArrayRef.h"
+#include "llvm/DebugInfo/CodeView/CodeView.h"
+#include "llvm/Support/BinaryStreamReader.h"
+#include "llvm/Support/BinaryStreamWriter.h"
+#include <cstdint>
+
+using namespace llvm;
+using namespace llvm::codeview;
+
+DebugSymbolRVASubsectionRef::DebugSymbolRVASubsectionRef()
+ : DebugSubsectionRef(DebugSubsectionKind::CoffSymbolRVA) {}
+
+Error DebugSymbolRVASubsectionRef::initialize(BinaryStreamReader &Reader) {
+ return Reader.readArray(RVAs, Reader.bytesRemaining() / sizeof(uint32_t));
+}
+
+DebugSymbolRVASubsection::DebugSymbolRVASubsection()
+ : DebugSubsection(DebugSubsectionKind::CoffSymbolRVA) {}
+
+Error DebugSymbolRVASubsection::commit(BinaryStreamWriter &Writer) const {
+ return Writer.writeArray(makeArrayRef(RVAs));
+}
+
+uint32_t DebugSymbolRVASubsection::calculateSerializedSize() const {
+ return RVAs.size() * sizeof(uint32_t);
+}
diff --git a/contrib/libs/llvm12/lib/DebugInfo/CodeView/DebugSymbolsSubsection.cpp b/contrib/libs/llvm12/lib/DebugInfo/CodeView/DebugSymbolsSubsection.cpp
index 0719ebff7e0..c833103663e 100644
--- a/contrib/libs/llvm12/lib/DebugInfo/CodeView/DebugSymbolsSubsection.cpp
+++ b/contrib/libs/llvm12/lib/DebugInfo/CodeView/DebugSymbolsSubsection.cpp
@@ -1,33 +1,33 @@
-//===- DebugSymbolsSubsection.cpp -------------------------------*- C++ -*-===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-
-#include "llvm/DebugInfo/CodeView/DebugSymbolsSubsection.h"
-
-using namespace llvm;
-using namespace llvm::codeview;
-
-Error DebugSymbolsSubsectionRef::initialize(BinaryStreamReader Reader) {
- return Reader.readArray(Records, Reader.getLength());
-}
-
-uint32_t DebugSymbolsSubsection::calculateSerializedSize() const {
- return Length;
-}
-
-Error DebugSymbolsSubsection::commit(BinaryStreamWriter &Writer) const {
- for (const auto &Record : Records) {
- if (auto EC = Writer.writeBytes(Record.RecordData))
- return EC;
- }
- return Error::success();
-}
-
-void DebugSymbolsSubsection::addSymbol(CVSymbol Symbol) {
- Records.push_back(Symbol);
- Length += Symbol.length();
-}
+//===- DebugSymbolsSubsection.cpp -------------------------------*- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "llvm/DebugInfo/CodeView/DebugSymbolsSubsection.h"
+
+using namespace llvm;
+using namespace llvm::codeview;
+
+Error DebugSymbolsSubsectionRef::initialize(BinaryStreamReader Reader) {
+ return Reader.readArray(Records, Reader.getLength());
+}
+
+uint32_t DebugSymbolsSubsection::calculateSerializedSize() const {
+ return Length;
+}
+
+Error DebugSymbolsSubsection::commit(BinaryStreamWriter &Writer) const {
+ for (const auto &Record : Records) {
+ if (auto EC = Writer.writeBytes(Record.RecordData))
+ return EC;
+ }
+ return Error::success();
+}
+
+void DebugSymbolsSubsection::addSymbol(CVSymbol Symbol) {
+ Records.push_back(Symbol);
+ Length += Symbol.length();
+}
diff --git a/contrib/libs/llvm12/lib/DebugInfo/CodeView/EnumTables.cpp b/contrib/libs/llvm12/lib/DebugInfo/CodeView/EnumTables.cpp
index 62e84f97691..949707bf547 100644
--- a/contrib/libs/llvm12/lib/DebugInfo/CodeView/EnumTables.cpp
+++ b/contrib/libs/llvm12/lib/DebugInfo/CodeView/EnumTables.cpp
@@ -1,44 +1,44 @@
-//===- EnumTables.cpp - Enum to string conversion tables ------------------===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-
-#include "llvm/DebugInfo/CodeView/EnumTables.h"
-#include "llvm/Support/ScopedPrinter.h"
-#include <type_traits>
-
-using namespace llvm;
-using namespace codeview;
-
-#define CV_ENUM_CLASS_ENT(enum_class, enum) \
- { #enum, std::underlying_type < enum_class > ::type(enum_class::enum) }
-
-#define CV_ENUM_ENT(ns, enum) \
- { #enum, ns::enum }
-
-static const EnumEntry<SymbolKind> SymbolTypeNames[] = {
-#define CV_SYMBOL(enum, val) {#enum, enum},
-#include "llvm/DebugInfo/CodeView/CodeViewSymbols.def"
-#undef CV_SYMBOL
-};
-
-static const EnumEntry<TypeLeafKind> TypeLeafNames[] = {
-#define CV_TYPE(name, val) {#name, name},
-#include "llvm/DebugInfo/CodeView/CodeViewTypes.def"
-#undef CV_TYPE
-};
-
-static const EnumEntry<uint16_t> RegisterNames_X86[] = {
-#define CV_REGISTERS_X86
-#define CV_REGISTER(name, val) CV_ENUM_CLASS_ENT(RegisterId, name),
-#include "llvm/DebugInfo/CodeView/CodeViewRegisters.def"
-#undef CV_REGISTER
-#undef CV_REGISTERS_X86
-};
-
+//===- EnumTables.cpp - Enum to string conversion tables ------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "llvm/DebugInfo/CodeView/EnumTables.h"
+#include "llvm/Support/ScopedPrinter.h"
+#include <type_traits>
+
+using namespace llvm;
+using namespace codeview;
+
+#define CV_ENUM_CLASS_ENT(enum_class, enum) \
+ { #enum, std::underlying_type < enum_class > ::type(enum_class::enum) }
+
+#define CV_ENUM_ENT(ns, enum) \
+ { #enum, ns::enum }
+
+static const EnumEntry<SymbolKind> SymbolTypeNames[] = {
+#define CV_SYMBOL(enum, val) {#enum, enum},
+#include "llvm/DebugInfo/CodeView/CodeViewSymbols.def"
+#undef CV_SYMBOL
+};
+
+static const EnumEntry<TypeLeafKind> TypeLeafNames[] = {
+#define CV_TYPE(name, val) {#name, name},
+#include "llvm/DebugInfo/CodeView/CodeViewTypes.def"
+#undef CV_TYPE
+};
+
+static const EnumEntry<uint16_t> RegisterNames_X86[] = {
+#define CV_REGISTERS_X86
+#define CV_REGISTER(name, val) CV_ENUM_CLASS_ENT(RegisterId, name),
+#include "llvm/DebugInfo/CodeView/CodeViewRegisters.def"
+#undef CV_REGISTER
+#undef CV_REGISTERS_X86
+};
+
static const EnumEntry<uint16_t> RegisterNames_ARM[] = {
#define CV_REGISTERS_ARM
#define CV_REGISTER(name, val) CV_ENUM_CLASS_ENT(RegisterId, name),
@@ -47,513 +47,513 @@ static const EnumEntry<uint16_t> RegisterNames_ARM[] = {
#undef CV_REGISTERS_ARM
};
-static const EnumEntry<uint16_t> RegisterNames_ARM64[] = {
-#define CV_REGISTERS_ARM64
-#define CV_REGISTER(name, val) CV_ENUM_CLASS_ENT(RegisterId, name),
-#include "llvm/DebugInfo/CodeView/CodeViewRegisters.def"
-#undef CV_REGISTER
-#undef CV_REGISTERS_ARM64
-};
-
-static const EnumEntry<uint32_t> PublicSymFlagNames[] = {
- CV_ENUM_CLASS_ENT(PublicSymFlags, Code),
- CV_ENUM_CLASS_ENT(PublicSymFlags, Function),
- CV_ENUM_CLASS_ENT(PublicSymFlags, Managed),
- CV_ENUM_CLASS_ENT(PublicSymFlags, MSIL),
-};
-
-static const EnumEntry<uint8_t> ProcSymFlagNames[] = {
- CV_ENUM_CLASS_ENT(ProcSymFlags, HasFP),
- CV_ENUM_CLASS_ENT(ProcSymFlags, HasIRET),
- CV_ENUM_CLASS_ENT(ProcSymFlags, HasFRET),
- CV_ENUM_CLASS_ENT(ProcSymFlags, IsNoReturn),
- CV_ENUM_CLASS_ENT(ProcSymFlags, IsUnreachable),
- CV_ENUM_CLASS_ENT(ProcSymFlags, HasCustomCallingConv),
- CV_ENUM_CLASS_ENT(ProcSymFlags, IsNoInline),
- CV_ENUM_CLASS_ENT(ProcSymFlags, HasOptimizedDebugInfo),
-};
-
-static const EnumEntry<uint16_t> LocalFlags[] = {
- CV_ENUM_CLASS_ENT(LocalSymFlags, IsParameter),
- CV_ENUM_CLASS_ENT(LocalSymFlags, IsAddressTaken),
- CV_ENUM_CLASS_ENT(LocalSymFlags, IsCompilerGenerated),
- CV_ENUM_CLASS_ENT(LocalSymFlags, IsAggregate),
- CV_ENUM_CLASS_ENT(LocalSymFlags, IsAggregated),
- CV_ENUM_CLASS_ENT(LocalSymFlags, IsAliased),
- CV_ENUM_CLASS_ENT(LocalSymFlags, IsAlias),
- CV_ENUM_CLASS_ENT(LocalSymFlags, IsReturnValue),
- CV_ENUM_CLASS_ENT(LocalSymFlags, IsOptimizedOut),
- CV_ENUM_CLASS_ENT(LocalSymFlags, IsEnregisteredGlobal),
- CV_ENUM_CLASS_ENT(LocalSymFlags, IsEnregisteredStatic),
-};
-
-static const EnumEntry<uint8_t> FrameCookieKinds[] = {
- CV_ENUM_CLASS_ENT(FrameCookieKind, Copy),
- CV_ENUM_CLASS_ENT(FrameCookieKind, XorStackPointer),
- CV_ENUM_CLASS_ENT(FrameCookieKind, XorFramePointer),
- CV_ENUM_CLASS_ENT(FrameCookieKind, XorR13),
-};
-
-static const EnumEntry<codeview::SourceLanguage> SourceLanguages[] = {
- CV_ENUM_ENT(SourceLanguage, C), CV_ENUM_ENT(SourceLanguage, Cpp),
- CV_ENUM_ENT(SourceLanguage, Fortran), CV_ENUM_ENT(SourceLanguage, Masm),
- CV_ENUM_ENT(SourceLanguage, Pascal), CV_ENUM_ENT(SourceLanguage, Basic),
- CV_ENUM_ENT(SourceLanguage, Cobol), CV_ENUM_ENT(SourceLanguage, Link),
- CV_ENUM_ENT(SourceLanguage, Cvtres), CV_ENUM_ENT(SourceLanguage, Cvtpgd),
- CV_ENUM_ENT(SourceLanguage, CSharp), CV_ENUM_ENT(SourceLanguage, VB),
- CV_ENUM_ENT(SourceLanguage, ILAsm), CV_ENUM_ENT(SourceLanguage, Java),
- CV_ENUM_ENT(SourceLanguage, JScript), CV_ENUM_ENT(SourceLanguage, MSIL),
- CV_ENUM_ENT(SourceLanguage, HLSL), CV_ENUM_ENT(SourceLanguage, D),
- CV_ENUM_ENT(SourceLanguage, Swift),
-};
-
-static const EnumEntry<uint32_t> CompileSym2FlagNames[] = {
- CV_ENUM_CLASS_ENT(CompileSym2Flags, EC),
- CV_ENUM_CLASS_ENT(CompileSym2Flags, NoDbgInfo),
- CV_ENUM_CLASS_ENT(CompileSym2Flags, LTCG),
- CV_ENUM_CLASS_ENT(CompileSym2Flags, NoDataAlign),
- CV_ENUM_CLASS_ENT(CompileSym2Flags, ManagedPresent),
- CV_ENUM_CLASS_ENT(CompileSym2Flags, SecurityChecks),
- CV_ENUM_CLASS_ENT(CompileSym2Flags, HotPatch),
- CV_ENUM_CLASS_ENT(CompileSym2Flags, CVTCIL),
- CV_ENUM_CLASS_ENT(CompileSym2Flags, MSILModule),
-};
-
-static const EnumEntry<uint32_t> CompileSym3FlagNames[] = {
- CV_ENUM_CLASS_ENT(CompileSym3Flags, EC),
- CV_ENUM_CLASS_ENT(CompileSym3Flags, NoDbgInfo),
- CV_ENUM_CLASS_ENT(CompileSym3Flags, LTCG),
- CV_ENUM_CLASS_ENT(CompileSym3Flags, NoDataAlign),
- CV_ENUM_CLASS_ENT(CompileSym3Flags, ManagedPresent),
- CV_ENUM_CLASS_ENT(CompileSym3Flags, SecurityChecks),
- CV_ENUM_CLASS_ENT(CompileSym3Flags, HotPatch),
- CV_ENUM_CLASS_ENT(CompileSym3Flags, CVTCIL),
- CV_ENUM_CLASS_ENT(CompileSym3Flags, MSILModule),
- CV_ENUM_CLASS_ENT(CompileSym3Flags, Sdl),
- CV_ENUM_CLASS_ENT(CompileSym3Flags, PGO),
- CV_ENUM_CLASS_ENT(CompileSym3Flags, Exp),
-};
-
-static const EnumEntry<uint32_t> FileChecksumNames[] = {
- CV_ENUM_CLASS_ENT(FileChecksumKind, None),
- CV_ENUM_CLASS_ENT(FileChecksumKind, MD5),
- CV_ENUM_CLASS_ENT(FileChecksumKind, SHA1),
- CV_ENUM_CLASS_ENT(FileChecksumKind, SHA256),
-};
-
-static const EnumEntry<unsigned> CPUTypeNames[] = {
- CV_ENUM_CLASS_ENT(CPUType, Intel8080),
- CV_ENUM_CLASS_ENT(CPUType, Intel8086),
- CV_ENUM_CLASS_ENT(CPUType, Intel80286),
- CV_ENUM_CLASS_ENT(CPUType, Intel80386),
- CV_ENUM_CLASS_ENT(CPUType, Intel80486),
- CV_ENUM_CLASS_ENT(CPUType, Pentium),
- CV_ENUM_CLASS_ENT(CPUType, PentiumPro),
- CV_ENUM_CLASS_ENT(CPUType, Pentium3),
- CV_ENUM_CLASS_ENT(CPUType, MIPS),
- CV_ENUM_CLASS_ENT(CPUType, MIPS16),
- CV_ENUM_CLASS_ENT(CPUType, MIPS32),
- CV_ENUM_CLASS_ENT(CPUType, MIPS64),
- CV_ENUM_CLASS_ENT(CPUType, MIPSI),
- CV_ENUM_CLASS_ENT(CPUType, MIPSII),
- CV_ENUM_CLASS_ENT(CPUType, MIPSIII),
- CV_ENUM_CLASS_ENT(CPUType, MIPSIV),
- CV_ENUM_CLASS_ENT(CPUType, MIPSV),
- CV_ENUM_CLASS_ENT(CPUType, M68000),
- CV_ENUM_CLASS_ENT(CPUType, M68010),
- CV_ENUM_CLASS_ENT(CPUType, M68020),
- CV_ENUM_CLASS_ENT(CPUType, M68030),
- CV_ENUM_CLASS_ENT(CPUType, M68040),
- CV_ENUM_CLASS_ENT(CPUType, Alpha),
- CV_ENUM_CLASS_ENT(CPUType, Alpha21164),
- CV_ENUM_CLASS_ENT(CPUType, Alpha21164A),
- CV_ENUM_CLASS_ENT(CPUType, Alpha21264),
- CV_ENUM_CLASS_ENT(CPUType, Alpha21364),
- CV_ENUM_CLASS_ENT(CPUType, PPC601),
- CV_ENUM_CLASS_ENT(CPUType, PPC603),
- CV_ENUM_CLASS_ENT(CPUType, PPC604),
- CV_ENUM_CLASS_ENT(CPUType, PPC620),
- CV_ENUM_CLASS_ENT(CPUType, PPCFP),
- CV_ENUM_CLASS_ENT(CPUType, PPCBE),
- CV_ENUM_CLASS_ENT(CPUType, SH3),
- CV_ENUM_CLASS_ENT(CPUType, SH3E),
- CV_ENUM_CLASS_ENT(CPUType, SH3DSP),
- CV_ENUM_CLASS_ENT(CPUType, SH4),
- CV_ENUM_CLASS_ENT(CPUType, SHMedia),
- CV_ENUM_CLASS_ENT(CPUType, ARM3),
- CV_ENUM_CLASS_ENT(CPUType, ARM4),
- CV_ENUM_CLASS_ENT(CPUType, ARM4T),
- CV_ENUM_CLASS_ENT(CPUType, ARM5),
- CV_ENUM_CLASS_ENT(CPUType, ARM5T),
- CV_ENUM_CLASS_ENT(CPUType, ARM6),
- CV_ENUM_CLASS_ENT(CPUType, ARM_XMAC),
- CV_ENUM_CLASS_ENT(CPUType, ARM_WMMX),
- CV_ENUM_CLASS_ENT(CPUType, ARM7),
- CV_ENUM_CLASS_ENT(CPUType, ARM64),
- CV_ENUM_CLASS_ENT(CPUType, Omni),
- CV_ENUM_CLASS_ENT(CPUType, Ia64),
- CV_ENUM_CLASS_ENT(CPUType, Ia64_2),
- CV_ENUM_CLASS_ENT(CPUType, CEE),
- CV_ENUM_CLASS_ENT(CPUType, AM33),
- CV_ENUM_CLASS_ENT(CPUType, M32R),
- CV_ENUM_CLASS_ENT(CPUType, TriCore),
- CV_ENUM_CLASS_ENT(CPUType, X64),
- CV_ENUM_CLASS_ENT(CPUType, EBC),
- CV_ENUM_CLASS_ENT(CPUType, Thumb),
- CV_ENUM_CLASS_ENT(CPUType, ARMNT),
- CV_ENUM_CLASS_ENT(CPUType, D3D11_Shader),
-};
-
-static const EnumEntry<uint32_t> FrameProcSymFlagNames[] = {
- CV_ENUM_CLASS_ENT(FrameProcedureOptions, HasAlloca),
- CV_ENUM_CLASS_ENT(FrameProcedureOptions, HasSetJmp),
- CV_ENUM_CLASS_ENT(FrameProcedureOptions, HasLongJmp),
- CV_ENUM_CLASS_ENT(FrameProcedureOptions, HasInlineAssembly),
- CV_ENUM_CLASS_ENT(FrameProcedureOptions, HasExceptionHandling),
- CV_ENUM_CLASS_ENT(FrameProcedureOptions, MarkedInline),
- CV_ENUM_CLASS_ENT(FrameProcedureOptions, HasStructuredExceptionHandling),
- CV_ENUM_CLASS_ENT(FrameProcedureOptions, Naked),
- CV_ENUM_CLASS_ENT(FrameProcedureOptions, SecurityChecks),
- CV_ENUM_CLASS_ENT(FrameProcedureOptions, AsynchronousExceptionHandling),
- CV_ENUM_CLASS_ENT(FrameProcedureOptions, NoStackOrderingForSecurityChecks),
- CV_ENUM_CLASS_ENT(FrameProcedureOptions, Inlined),
- CV_ENUM_CLASS_ENT(FrameProcedureOptions, StrictSecurityChecks),
- CV_ENUM_CLASS_ENT(FrameProcedureOptions, SafeBuffers),
- CV_ENUM_CLASS_ENT(FrameProcedureOptions, EncodedLocalBasePointerMask),
- CV_ENUM_CLASS_ENT(FrameProcedureOptions, EncodedParamBasePointerMask),
- CV_ENUM_CLASS_ENT(FrameProcedureOptions, ProfileGuidedOptimization),
- CV_ENUM_CLASS_ENT(FrameProcedureOptions, ValidProfileCounts),
- CV_ENUM_CLASS_ENT(FrameProcedureOptions, OptimizedForSpeed),
- CV_ENUM_CLASS_ENT(FrameProcedureOptions, GuardCfg),
- CV_ENUM_CLASS_ENT(FrameProcedureOptions, GuardCfw),
-};
-
-static const EnumEntry<uint32_t> ModuleSubstreamKindNames[] = {
- CV_ENUM_CLASS_ENT(DebugSubsectionKind, None),
- CV_ENUM_CLASS_ENT(DebugSubsectionKind, Symbols),
- CV_ENUM_CLASS_ENT(DebugSubsectionKind, Lines),
- CV_ENUM_CLASS_ENT(DebugSubsectionKind, StringTable),
- CV_ENUM_CLASS_ENT(DebugSubsectionKind, FileChecksums),
- CV_ENUM_CLASS_ENT(DebugSubsectionKind, FrameData),
- CV_ENUM_CLASS_ENT(DebugSubsectionKind, InlineeLines),
- CV_ENUM_CLASS_ENT(DebugSubsectionKind, CrossScopeImports),
- CV_ENUM_CLASS_ENT(DebugSubsectionKind, CrossScopeExports),
- CV_ENUM_CLASS_ENT(DebugSubsectionKind, ILLines),
- CV_ENUM_CLASS_ENT(DebugSubsectionKind, FuncMDTokenMap),
- CV_ENUM_CLASS_ENT(DebugSubsectionKind, TypeMDTokenMap),
- CV_ENUM_CLASS_ENT(DebugSubsectionKind, MergedAssemblyInput),
- CV_ENUM_CLASS_ENT(DebugSubsectionKind, CoffSymbolRVA),
-};
-
-static const EnumEntry<uint16_t> ExportSymFlagNames[] = {
- CV_ENUM_CLASS_ENT(ExportFlags, IsConstant),
- CV_ENUM_CLASS_ENT(ExportFlags, IsData),
- CV_ENUM_CLASS_ENT(ExportFlags, IsPrivate),
- CV_ENUM_CLASS_ENT(ExportFlags, HasNoName),
- CV_ENUM_CLASS_ENT(ExportFlags, HasExplicitOrdinal),
- CV_ENUM_CLASS_ENT(ExportFlags, IsForwarder),
-};
-
-static const EnumEntry<uint8_t> ThunkOrdinalNames[] = {
- CV_ENUM_CLASS_ENT(ThunkOrdinal, Standard),
- CV_ENUM_CLASS_ENT(ThunkOrdinal, ThisAdjustor),
- CV_ENUM_CLASS_ENT(ThunkOrdinal, Vcall),
- CV_ENUM_CLASS_ENT(ThunkOrdinal, Pcode),
- CV_ENUM_CLASS_ENT(ThunkOrdinal, UnknownLoad),
- CV_ENUM_CLASS_ENT(ThunkOrdinal, TrampIncremental),
- CV_ENUM_CLASS_ENT(ThunkOrdinal, BranchIsland),
-};
-
-static const EnumEntry<uint16_t> TrampolineNames[] = {
- CV_ENUM_CLASS_ENT(TrampolineType, TrampIncremental),
- CV_ENUM_CLASS_ENT(TrampolineType, BranchIsland),
-};
-
-static const EnumEntry<COFF::SectionCharacteristics>
- ImageSectionCharacteristicNames[] = {
- CV_ENUM_ENT(COFF, IMAGE_SCN_TYPE_NOLOAD),
- CV_ENUM_ENT(COFF, IMAGE_SCN_TYPE_NO_PAD),
- CV_ENUM_ENT(COFF, IMAGE_SCN_CNT_CODE),
- CV_ENUM_ENT(COFF, IMAGE_SCN_CNT_INITIALIZED_DATA),
- CV_ENUM_ENT(COFF, IMAGE_SCN_CNT_UNINITIALIZED_DATA),
- CV_ENUM_ENT(COFF, IMAGE_SCN_LNK_OTHER),
- CV_ENUM_ENT(COFF, IMAGE_SCN_LNK_INFO),
- CV_ENUM_ENT(COFF, IMAGE_SCN_LNK_REMOVE),
- CV_ENUM_ENT(COFF, IMAGE_SCN_LNK_COMDAT),
- CV_ENUM_ENT(COFF, IMAGE_SCN_GPREL),
- CV_ENUM_ENT(COFF, IMAGE_SCN_MEM_PURGEABLE),
- CV_ENUM_ENT(COFF, IMAGE_SCN_MEM_16BIT),
- CV_ENUM_ENT(COFF, IMAGE_SCN_MEM_LOCKED),
- CV_ENUM_ENT(COFF, IMAGE_SCN_MEM_PRELOAD),
- CV_ENUM_ENT(COFF, IMAGE_SCN_ALIGN_1BYTES),
- CV_ENUM_ENT(COFF, IMAGE_SCN_ALIGN_2BYTES),
- CV_ENUM_ENT(COFF, IMAGE_SCN_ALIGN_4BYTES),
- CV_ENUM_ENT(COFF, IMAGE_SCN_ALIGN_8BYTES),
- CV_ENUM_ENT(COFF, IMAGE_SCN_ALIGN_16BYTES),
- CV_ENUM_ENT(COFF, IMAGE_SCN_ALIGN_32BYTES),
- CV_ENUM_ENT(COFF, IMAGE_SCN_ALIGN_64BYTES),
- CV_ENUM_ENT(COFF, IMAGE_SCN_ALIGN_128BYTES),
- CV_ENUM_ENT(COFF, IMAGE_SCN_ALIGN_256BYTES),
- CV_ENUM_ENT(COFF, IMAGE_SCN_ALIGN_512BYTES),
- CV_ENUM_ENT(COFF, IMAGE_SCN_ALIGN_1024BYTES),
- CV_ENUM_ENT(COFF, IMAGE_SCN_ALIGN_2048BYTES),
- CV_ENUM_ENT(COFF, IMAGE_SCN_ALIGN_4096BYTES),
- CV_ENUM_ENT(COFF, IMAGE_SCN_ALIGN_8192BYTES),
- CV_ENUM_ENT(COFF, IMAGE_SCN_LNK_NRELOC_OVFL),
- CV_ENUM_ENT(COFF, IMAGE_SCN_MEM_DISCARDABLE),
- CV_ENUM_ENT(COFF, IMAGE_SCN_MEM_NOT_CACHED),
- CV_ENUM_ENT(COFF, IMAGE_SCN_MEM_NOT_PAGED),
- CV_ENUM_ENT(COFF, IMAGE_SCN_MEM_SHARED),
- CV_ENUM_ENT(COFF, IMAGE_SCN_MEM_EXECUTE),
- CV_ENUM_ENT(COFF, IMAGE_SCN_MEM_READ),
- CV_ENUM_ENT(COFF, IMAGE_SCN_MEM_WRITE)};
-
-static const EnumEntry<uint16_t> ClassOptionNames[] = {
- CV_ENUM_CLASS_ENT(ClassOptions, Packed),
- CV_ENUM_CLASS_ENT(ClassOptions, HasConstructorOrDestructor),
- CV_ENUM_CLASS_ENT(ClassOptions, HasOverloadedOperator),
- CV_ENUM_CLASS_ENT(ClassOptions, Nested),
- CV_ENUM_CLASS_ENT(ClassOptions, ContainsNestedClass),
- CV_ENUM_CLASS_ENT(ClassOptions, HasOverloadedAssignmentOperator),
- CV_ENUM_CLASS_ENT(ClassOptions, HasConversionOperator),
- CV_ENUM_CLASS_ENT(ClassOptions, ForwardReference),
- CV_ENUM_CLASS_ENT(ClassOptions, Scoped),
- CV_ENUM_CLASS_ENT(ClassOptions, HasUniqueName),
- CV_ENUM_CLASS_ENT(ClassOptions, Sealed),
- CV_ENUM_CLASS_ENT(ClassOptions, Intrinsic),
-};
-
-static const EnumEntry<uint8_t> MemberAccessNames[] = {
- CV_ENUM_CLASS_ENT(MemberAccess, None),
- CV_ENUM_CLASS_ENT(MemberAccess, Private),
- CV_ENUM_CLASS_ENT(MemberAccess, Protected),
- CV_ENUM_CLASS_ENT(MemberAccess, Public),
-};
-
-static const EnumEntry<uint16_t> MethodOptionNames[] = {
- CV_ENUM_CLASS_ENT(MethodOptions, Pseudo),
- CV_ENUM_CLASS_ENT(MethodOptions, NoInherit),
- CV_ENUM_CLASS_ENT(MethodOptions, NoConstruct),
- CV_ENUM_CLASS_ENT(MethodOptions, CompilerGenerated),
- CV_ENUM_CLASS_ENT(MethodOptions, Sealed),
-};
-
-static const EnumEntry<uint16_t> MemberKindNames[] = {
- CV_ENUM_CLASS_ENT(MethodKind, Vanilla),
- CV_ENUM_CLASS_ENT(MethodKind, Virtual),
- CV_ENUM_CLASS_ENT(MethodKind, Static),
- CV_ENUM_CLASS_ENT(MethodKind, Friend),
- CV_ENUM_CLASS_ENT(MethodKind, IntroducingVirtual),
- CV_ENUM_CLASS_ENT(MethodKind, PureVirtual),
- CV_ENUM_CLASS_ENT(MethodKind, PureIntroducingVirtual),
-};
-
-static const EnumEntry<uint8_t> PtrKindNames[] = {
- CV_ENUM_CLASS_ENT(PointerKind, Near16),
- CV_ENUM_CLASS_ENT(PointerKind, Far16),
- CV_ENUM_CLASS_ENT(PointerKind, Huge16),
- CV_ENUM_CLASS_ENT(PointerKind, BasedOnSegment),
- CV_ENUM_CLASS_ENT(PointerKind, BasedOnValue),
- CV_ENUM_CLASS_ENT(PointerKind, BasedOnSegmentValue),
- CV_ENUM_CLASS_ENT(PointerKind, BasedOnAddress),
- CV_ENUM_CLASS_ENT(PointerKind, BasedOnSegmentAddress),
- CV_ENUM_CLASS_ENT(PointerKind, BasedOnType),
- CV_ENUM_CLASS_ENT(PointerKind, BasedOnSelf),
- CV_ENUM_CLASS_ENT(PointerKind, Near32),
- CV_ENUM_CLASS_ENT(PointerKind, Far32),
- CV_ENUM_CLASS_ENT(PointerKind, Near64),
-};
-
-static const EnumEntry<uint8_t> PtrModeNames[] = {
- CV_ENUM_CLASS_ENT(PointerMode, Pointer),
- CV_ENUM_CLASS_ENT(PointerMode, LValueReference),
- CV_ENUM_CLASS_ENT(PointerMode, PointerToDataMember),
- CV_ENUM_CLASS_ENT(PointerMode, PointerToMemberFunction),
- CV_ENUM_CLASS_ENT(PointerMode, RValueReference),
-};
-
-static const EnumEntry<uint16_t> PtrMemberRepNames[] = {
- CV_ENUM_CLASS_ENT(PointerToMemberRepresentation, Unknown),
- CV_ENUM_CLASS_ENT(PointerToMemberRepresentation, SingleInheritanceData),
- CV_ENUM_CLASS_ENT(PointerToMemberRepresentation, MultipleInheritanceData),
- CV_ENUM_CLASS_ENT(PointerToMemberRepresentation, VirtualInheritanceData),
- CV_ENUM_CLASS_ENT(PointerToMemberRepresentation, GeneralData),
- CV_ENUM_CLASS_ENT(PointerToMemberRepresentation, SingleInheritanceFunction),
- CV_ENUM_CLASS_ENT(PointerToMemberRepresentation,
- MultipleInheritanceFunction),
- CV_ENUM_CLASS_ENT(PointerToMemberRepresentation,
- VirtualInheritanceFunction),
- CV_ENUM_CLASS_ENT(PointerToMemberRepresentation, GeneralFunction),
-};
-
-static const EnumEntry<uint16_t> TypeModifierNames[] = {
- CV_ENUM_CLASS_ENT(ModifierOptions, Const),
- CV_ENUM_CLASS_ENT(ModifierOptions, Volatile),
- CV_ENUM_CLASS_ENT(ModifierOptions, Unaligned),
-};
-
-static const EnumEntry<uint8_t> CallingConventions[] = {
- CV_ENUM_CLASS_ENT(CallingConvention, NearC),
- CV_ENUM_CLASS_ENT(CallingConvention, FarC),
- CV_ENUM_CLASS_ENT(CallingConvention, NearPascal),
- CV_ENUM_CLASS_ENT(CallingConvention, FarPascal),
- CV_ENUM_CLASS_ENT(CallingConvention, NearFast),
- CV_ENUM_CLASS_ENT(CallingConvention, FarFast),
- CV_ENUM_CLASS_ENT(CallingConvention, NearStdCall),
- CV_ENUM_CLASS_ENT(CallingConvention, FarStdCall),
- CV_ENUM_CLASS_ENT(CallingConvention, NearSysCall),
- CV_ENUM_CLASS_ENT(CallingConvention, FarSysCall),
- CV_ENUM_CLASS_ENT(CallingConvention, ThisCall),
- CV_ENUM_CLASS_ENT(CallingConvention, MipsCall),
- CV_ENUM_CLASS_ENT(CallingConvention, Generic),
- CV_ENUM_CLASS_ENT(CallingConvention, AlphaCall),
- CV_ENUM_CLASS_ENT(CallingConvention, PpcCall),
- CV_ENUM_CLASS_ENT(CallingConvention, SHCall),
- CV_ENUM_CLASS_ENT(CallingConvention, ArmCall),
- CV_ENUM_CLASS_ENT(CallingConvention, AM33Call),
- CV_ENUM_CLASS_ENT(CallingConvention, TriCall),
- CV_ENUM_CLASS_ENT(CallingConvention, SH5Call),
- CV_ENUM_CLASS_ENT(CallingConvention, M32RCall),
- CV_ENUM_CLASS_ENT(CallingConvention, ClrCall),
- CV_ENUM_CLASS_ENT(CallingConvention, Inline),
- CV_ENUM_CLASS_ENT(CallingConvention, NearVector),
-};
-
-static const EnumEntry<uint8_t> FunctionOptionEnum[] = {
- CV_ENUM_CLASS_ENT(FunctionOptions, CxxReturnUdt),
- CV_ENUM_CLASS_ENT(FunctionOptions, Constructor),
- CV_ENUM_CLASS_ENT(FunctionOptions, ConstructorWithVirtualBases),
-};
-
-static const EnumEntry<uint16_t> LabelTypeEnum[] = {
- CV_ENUM_CLASS_ENT(LabelType, Near),
- CV_ENUM_CLASS_ENT(LabelType, Far),
-};
-
-namespace llvm {
-namespace codeview {
-
-ArrayRef<EnumEntry<SymbolKind>> getSymbolTypeNames() {
- return makeArrayRef(SymbolTypeNames);
-}
-
-ArrayRef<EnumEntry<TypeLeafKind>> getTypeLeafNames() {
- return makeArrayRef(TypeLeafNames);
-}
-
-ArrayRef<EnumEntry<uint16_t>> getRegisterNames(CPUType Cpu) {
+static const EnumEntry<uint16_t> RegisterNames_ARM64[] = {
+#define CV_REGISTERS_ARM64
+#define CV_REGISTER(name, val) CV_ENUM_CLASS_ENT(RegisterId, name),
+#include "llvm/DebugInfo/CodeView/CodeViewRegisters.def"
+#undef CV_REGISTER
+#undef CV_REGISTERS_ARM64
+};
+
+static const EnumEntry<uint32_t> PublicSymFlagNames[] = {
+ CV_ENUM_CLASS_ENT(PublicSymFlags, Code),
+ CV_ENUM_CLASS_ENT(PublicSymFlags, Function),
+ CV_ENUM_CLASS_ENT(PublicSymFlags, Managed),
+ CV_ENUM_CLASS_ENT(PublicSymFlags, MSIL),
+};
+
+static const EnumEntry<uint8_t> ProcSymFlagNames[] = {
+ CV_ENUM_CLASS_ENT(ProcSymFlags, HasFP),
+ CV_ENUM_CLASS_ENT(ProcSymFlags, HasIRET),
+ CV_ENUM_CLASS_ENT(ProcSymFlags, HasFRET),
+ CV_ENUM_CLASS_ENT(ProcSymFlags, IsNoReturn),
+ CV_ENUM_CLASS_ENT(ProcSymFlags, IsUnreachable),
+ CV_ENUM_CLASS_ENT(ProcSymFlags, HasCustomCallingConv),
+ CV_ENUM_CLASS_ENT(ProcSymFlags, IsNoInline),
+ CV_ENUM_CLASS_ENT(ProcSymFlags, HasOptimizedDebugInfo),
+};
+
+static const EnumEntry<uint16_t> LocalFlags[] = {
+ CV_ENUM_CLASS_ENT(LocalSymFlags, IsParameter),
+ CV_ENUM_CLASS_ENT(LocalSymFlags, IsAddressTaken),
+ CV_ENUM_CLASS_ENT(LocalSymFlags, IsCompilerGenerated),
+ CV_ENUM_CLASS_ENT(LocalSymFlags, IsAggregate),
+ CV_ENUM_CLASS_ENT(LocalSymFlags, IsAggregated),
+ CV_ENUM_CLASS_ENT(LocalSymFlags, IsAliased),
+ CV_ENUM_CLASS_ENT(LocalSymFlags, IsAlias),
+ CV_ENUM_CLASS_ENT(LocalSymFlags, IsReturnValue),
+ CV_ENUM_CLASS_ENT(LocalSymFlags, IsOptimizedOut),
+ CV_ENUM_CLASS_ENT(LocalSymFlags, IsEnregisteredGlobal),
+ CV_ENUM_CLASS_ENT(LocalSymFlags, IsEnregisteredStatic),
+};
+
+static const EnumEntry<uint8_t> FrameCookieKinds[] = {
+ CV_ENUM_CLASS_ENT(FrameCookieKind, Copy),
+ CV_ENUM_CLASS_ENT(FrameCookieKind, XorStackPointer),
+ CV_ENUM_CLASS_ENT(FrameCookieKind, XorFramePointer),
+ CV_ENUM_CLASS_ENT(FrameCookieKind, XorR13),
+};
+
+static const EnumEntry<codeview::SourceLanguage> SourceLanguages[] = {
+ CV_ENUM_ENT(SourceLanguage, C), CV_ENUM_ENT(SourceLanguage, Cpp),
+ CV_ENUM_ENT(SourceLanguage, Fortran), CV_ENUM_ENT(SourceLanguage, Masm),
+ CV_ENUM_ENT(SourceLanguage, Pascal), CV_ENUM_ENT(SourceLanguage, Basic),
+ CV_ENUM_ENT(SourceLanguage, Cobol), CV_ENUM_ENT(SourceLanguage, Link),
+ CV_ENUM_ENT(SourceLanguage, Cvtres), CV_ENUM_ENT(SourceLanguage, Cvtpgd),
+ CV_ENUM_ENT(SourceLanguage, CSharp), CV_ENUM_ENT(SourceLanguage, VB),
+ CV_ENUM_ENT(SourceLanguage, ILAsm), CV_ENUM_ENT(SourceLanguage, Java),
+ CV_ENUM_ENT(SourceLanguage, JScript), CV_ENUM_ENT(SourceLanguage, MSIL),
+ CV_ENUM_ENT(SourceLanguage, HLSL), CV_ENUM_ENT(SourceLanguage, D),
+ CV_ENUM_ENT(SourceLanguage, Swift),
+};
+
+static const EnumEntry<uint32_t> CompileSym2FlagNames[] = {
+ CV_ENUM_CLASS_ENT(CompileSym2Flags, EC),
+ CV_ENUM_CLASS_ENT(CompileSym2Flags, NoDbgInfo),
+ CV_ENUM_CLASS_ENT(CompileSym2Flags, LTCG),
+ CV_ENUM_CLASS_ENT(CompileSym2Flags, NoDataAlign),
+ CV_ENUM_CLASS_ENT(CompileSym2Flags, ManagedPresent),
+ CV_ENUM_CLASS_ENT(CompileSym2Flags, SecurityChecks),
+ CV_ENUM_CLASS_ENT(CompileSym2Flags, HotPatch),
+ CV_ENUM_CLASS_ENT(CompileSym2Flags, CVTCIL),
+ CV_ENUM_CLASS_ENT(CompileSym2Flags, MSILModule),
+};
+
+static const EnumEntry<uint32_t> CompileSym3FlagNames[] = {
+ CV_ENUM_CLASS_ENT(CompileSym3Flags, EC),
+ CV_ENUM_CLASS_ENT(CompileSym3Flags, NoDbgInfo),
+ CV_ENUM_CLASS_ENT(CompileSym3Flags, LTCG),
+ CV_ENUM_CLASS_ENT(CompileSym3Flags, NoDataAlign),
+ CV_ENUM_CLASS_ENT(CompileSym3Flags, ManagedPresent),
+ CV_ENUM_CLASS_ENT(CompileSym3Flags, SecurityChecks),
+ CV_ENUM_CLASS_ENT(CompileSym3Flags, HotPatch),
+ CV_ENUM_CLASS_ENT(CompileSym3Flags, CVTCIL),
+ CV_ENUM_CLASS_ENT(CompileSym3Flags, MSILModule),
+ CV_ENUM_CLASS_ENT(CompileSym3Flags, Sdl),
+ CV_ENUM_CLASS_ENT(CompileSym3Flags, PGO),
+ CV_ENUM_CLASS_ENT(CompileSym3Flags, Exp),
+};
+
+static const EnumEntry<uint32_t> FileChecksumNames[] = {
+ CV_ENUM_CLASS_ENT(FileChecksumKind, None),
+ CV_ENUM_CLASS_ENT(FileChecksumKind, MD5),
+ CV_ENUM_CLASS_ENT(FileChecksumKind, SHA1),
+ CV_ENUM_CLASS_ENT(FileChecksumKind, SHA256),
+};
+
+static const EnumEntry<unsigned> CPUTypeNames[] = {
+ CV_ENUM_CLASS_ENT(CPUType, Intel8080),
+ CV_ENUM_CLASS_ENT(CPUType, Intel8086),
+ CV_ENUM_CLASS_ENT(CPUType, Intel80286),
+ CV_ENUM_CLASS_ENT(CPUType, Intel80386),
+ CV_ENUM_CLASS_ENT(CPUType, Intel80486),
+ CV_ENUM_CLASS_ENT(CPUType, Pentium),
+ CV_ENUM_CLASS_ENT(CPUType, PentiumPro),
+ CV_ENUM_CLASS_ENT(CPUType, Pentium3),
+ CV_ENUM_CLASS_ENT(CPUType, MIPS),
+ CV_ENUM_CLASS_ENT(CPUType, MIPS16),
+ CV_ENUM_CLASS_ENT(CPUType, MIPS32),
+ CV_ENUM_CLASS_ENT(CPUType, MIPS64),
+ CV_ENUM_CLASS_ENT(CPUType, MIPSI),
+ CV_ENUM_CLASS_ENT(CPUType, MIPSII),
+ CV_ENUM_CLASS_ENT(CPUType, MIPSIII),
+ CV_ENUM_CLASS_ENT(CPUType, MIPSIV),
+ CV_ENUM_CLASS_ENT(CPUType, MIPSV),
+ CV_ENUM_CLASS_ENT(CPUType, M68000),
+ CV_ENUM_CLASS_ENT(CPUType, M68010),
+ CV_ENUM_CLASS_ENT(CPUType, M68020),
+ CV_ENUM_CLASS_ENT(CPUType, M68030),
+ CV_ENUM_CLASS_ENT(CPUType, M68040),
+ CV_ENUM_CLASS_ENT(CPUType, Alpha),
+ CV_ENUM_CLASS_ENT(CPUType, Alpha21164),
+ CV_ENUM_CLASS_ENT(CPUType, Alpha21164A),
+ CV_ENUM_CLASS_ENT(CPUType, Alpha21264),
+ CV_ENUM_CLASS_ENT(CPUType, Alpha21364),
+ CV_ENUM_CLASS_ENT(CPUType, PPC601),
+ CV_ENUM_CLASS_ENT(CPUType, PPC603),
+ CV_ENUM_CLASS_ENT(CPUType, PPC604),
+ CV_ENUM_CLASS_ENT(CPUType, PPC620),
+ CV_ENUM_CLASS_ENT(CPUType, PPCFP),
+ CV_ENUM_CLASS_ENT(CPUType, PPCBE),
+ CV_ENUM_CLASS_ENT(CPUType, SH3),
+ CV_ENUM_CLASS_ENT(CPUType, SH3E),
+ CV_ENUM_CLASS_ENT(CPUType, SH3DSP),
+ CV_ENUM_CLASS_ENT(CPUType, SH4),
+ CV_ENUM_CLASS_ENT(CPUType, SHMedia),
+ CV_ENUM_CLASS_ENT(CPUType, ARM3),
+ CV_ENUM_CLASS_ENT(CPUType, ARM4),
+ CV_ENUM_CLASS_ENT(CPUType, ARM4T),
+ CV_ENUM_CLASS_ENT(CPUType, ARM5),
+ CV_ENUM_CLASS_ENT(CPUType, ARM5T),
+ CV_ENUM_CLASS_ENT(CPUType, ARM6),
+ CV_ENUM_CLASS_ENT(CPUType, ARM_XMAC),
+ CV_ENUM_CLASS_ENT(CPUType, ARM_WMMX),
+ CV_ENUM_CLASS_ENT(CPUType, ARM7),
+ CV_ENUM_CLASS_ENT(CPUType, ARM64),
+ CV_ENUM_CLASS_ENT(CPUType, Omni),
+ CV_ENUM_CLASS_ENT(CPUType, Ia64),
+ CV_ENUM_CLASS_ENT(CPUType, Ia64_2),
+ CV_ENUM_CLASS_ENT(CPUType, CEE),
+ CV_ENUM_CLASS_ENT(CPUType, AM33),
+ CV_ENUM_CLASS_ENT(CPUType, M32R),
+ CV_ENUM_CLASS_ENT(CPUType, TriCore),
+ CV_ENUM_CLASS_ENT(CPUType, X64),
+ CV_ENUM_CLASS_ENT(CPUType, EBC),
+ CV_ENUM_CLASS_ENT(CPUType, Thumb),
+ CV_ENUM_CLASS_ENT(CPUType, ARMNT),
+ CV_ENUM_CLASS_ENT(CPUType, D3D11_Shader),
+};
+
+static const EnumEntry<uint32_t> FrameProcSymFlagNames[] = {
+ CV_ENUM_CLASS_ENT(FrameProcedureOptions, HasAlloca),
+ CV_ENUM_CLASS_ENT(FrameProcedureOptions, HasSetJmp),
+ CV_ENUM_CLASS_ENT(FrameProcedureOptions, HasLongJmp),
+ CV_ENUM_CLASS_ENT(FrameProcedureOptions, HasInlineAssembly),
+ CV_ENUM_CLASS_ENT(FrameProcedureOptions, HasExceptionHandling),
+ CV_ENUM_CLASS_ENT(FrameProcedureOptions, MarkedInline),
+ CV_ENUM_CLASS_ENT(FrameProcedureOptions, HasStructuredExceptionHandling),
+ CV_ENUM_CLASS_ENT(FrameProcedureOptions, Naked),
+ CV_ENUM_CLASS_ENT(FrameProcedureOptions, SecurityChecks),
+ CV_ENUM_CLASS_ENT(FrameProcedureOptions, AsynchronousExceptionHandling),
+ CV_ENUM_CLASS_ENT(FrameProcedureOptions, NoStackOrderingForSecurityChecks),
+ CV_ENUM_CLASS_ENT(FrameProcedureOptions, Inlined),
+ CV_ENUM_CLASS_ENT(FrameProcedureOptions, StrictSecurityChecks),
+ CV_ENUM_CLASS_ENT(FrameProcedureOptions, SafeBuffers),
+ CV_ENUM_CLASS_ENT(FrameProcedureOptions, EncodedLocalBasePointerMask),
+ CV_ENUM_CLASS_ENT(FrameProcedureOptions, EncodedParamBasePointerMask),
+ CV_ENUM_CLASS_ENT(FrameProcedureOptions, ProfileGuidedOptimization),
+ CV_ENUM_CLASS_ENT(FrameProcedureOptions, ValidProfileCounts),
+ CV_ENUM_CLASS_ENT(FrameProcedureOptions, OptimizedForSpeed),
+ CV_ENUM_CLASS_ENT(FrameProcedureOptions, GuardCfg),
+ CV_ENUM_CLASS_ENT(FrameProcedureOptions, GuardCfw),
+};
+
+static const EnumEntry<uint32_t> ModuleSubstreamKindNames[] = {
+ CV_ENUM_CLASS_ENT(DebugSubsectionKind, None),
+ CV_ENUM_CLASS_ENT(DebugSubsectionKind, Symbols),
+ CV_ENUM_CLASS_ENT(DebugSubsectionKind, Lines),
+ CV_ENUM_CLASS_ENT(DebugSubsectionKind, StringTable),
+ CV_ENUM_CLASS_ENT(DebugSubsectionKind, FileChecksums),
+ CV_ENUM_CLASS_ENT(DebugSubsectionKind, FrameData),
+ CV_ENUM_CLASS_ENT(DebugSubsectionKind, InlineeLines),
+ CV_ENUM_CLASS_ENT(DebugSubsectionKind, CrossScopeImports),
+ CV_ENUM_CLASS_ENT(DebugSubsectionKind, CrossScopeExports),
+ CV_ENUM_CLASS_ENT(DebugSubsectionKind, ILLines),
+ CV_ENUM_CLASS_ENT(DebugSubsectionKind, FuncMDTokenMap),
+ CV_ENUM_CLASS_ENT(DebugSubsectionKind, TypeMDTokenMap),
+ CV_ENUM_CLASS_ENT(DebugSubsectionKind, MergedAssemblyInput),
+ CV_ENUM_CLASS_ENT(DebugSubsectionKind, CoffSymbolRVA),
+};
+
+static const EnumEntry<uint16_t> ExportSymFlagNames[] = {
+ CV_ENUM_CLASS_ENT(ExportFlags, IsConstant),
+ CV_ENUM_CLASS_ENT(ExportFlags, IsData),
+ CV_ENUM_CLASS_ENT(ExportFlags, IsPrivate),
+ CV_ENUM_CLASS_ENT(ExportFlags, HasNoName),
+ CV_ENUM_CLASS_ENT(ExportFlags, HasExplicitOrdinal),
+ CV_ENUM_CLASS_ENT(ExportFlags, IsForwarder),
+};
+
+static const EnumEntry<uint8_t> ThunkOrdinalNames[] = {
+ CV_ENUM_CLASS_ENT(ThunkOrdinal, Standard),
+ CV_ENUM_CLASS_ENT(ThunkOrdinal, ThisAdjustor),
+ CV_ENUM_CLASS_ENT(ThunkOrdinal, Vcall),
+ CV_ENUM_CLASS_ENT(ThunkOrdinal, Pcode),
+ CV_ENUM_CLASS_ENT(ThunkOrdinal, UnknownLoad),
+ CV_ENUM_CLASS_ENT(ThunkOrdinal, TrampIncremental),
+ CV_ENUM_CLASS_ENT(ThunkOrdinal, BranchIsland),
+};
+
+static const EnumEntry<uint16_t> TrampolineNames[] = {
+ CV_ENUM_CLASS_ENT(TrampolineType, TrampIncremental),
+ CV_ENUM_CLASS_ENT(TrampolineType, BranchIsland),
+};
+
+static const EnumEntry<COFF::SectionCharacteristics>
+ ImageSectionCharacteristicNames[] = {
+ CV_ENUM_ENT(COFF, IMAGE_SCN_TYPE_NOLOAD),
+ CV_ENUM_ENT(COFF, IMAGE_SCN_TYPE_NO_PAD),
+ CV_ENUM_ENT(COFF, IMAGE_SCN_CNT_CODE),
+ CV_ENUM_ENT(COFF, IMAGE_SCN_CNT_INITIALIZED_DATA),
+ CV_ENUM_ENT(COFF, IMAGE_SCN_CNT_UNINITIALIZED_DATA),
+ CV_ENUM_ENT(COFF, IMAGE_SCN_LNK_OTHER),
+ CV_ENUM_ENT(COFF, IMAGE_SCN_LNK_INFO),
+ CV_ENUM_ENT(COFF, IMAGE_SCN_LNK_REMOVE),
+ CV_ENUM_ENT(COFF, IMAGE_SCN_LNK_COMDAT),
+ CV_ENUM_ENT(COFF, IMAGE_SCN_GPREL),
+ CV_ENUM_ENT(COFF, IMAGE_SCN_MEM_PURGEABLE),
+ CV_ENUM_ENT(COFF, IMAGE_SCN_MEM_16BIT),
+ CV_ENUM_ENT(COFF, IMAGE_SCN_MEM_LOCKED),
+ CV_ENUM_ENT(COFF, IMAGE_SCN_MEM_PRELOAD),
+ CV_ENUM_ENT(COFF, IMAGE_SCN_ALIGN_1BYTES),
+ CV_ENUM_ENT(COFF, IMAGE_SCN_ALIGN_2BYTES),
+ CV_ENUM_ENT(COFF, IMAGE_SCN_ALIGN_4BYTES),
+ CV_ENUM_ENT(COFF, IMAGE_SCN_ALIGN_8BYTES),
+ CV_ENUM_ENT(COFF, IMAGE_SCN_ALIGN_16BYTES),
+ CV_ENUM_ENT(COFF, IMAGE_SCN_ALIGN_32BYTES),
+ CV_ENUM_ENT(COFF, IMAGE_SCN_ALIGN_64BYTES),
+ CV_ENUM_ENT(COFF, IMAGE_SCN_ALIGN_128BYTES),
+ CV_ENUM_ENT(COFF, IMAGE_SCN_ALIGN_256BYTES),
+ CV_ENUM_ENT(COFF, IMAGE_SCN_ALIGN_512BYTES),
+ CV_ENUM_ENT(COFF, IMAGE_SCN_ALIGN_1024BYTES),
+ CV_ENUM_ENT(COFF, IMAGE_SCN_ALIGN_2048BYTES),
+ CV_ENUM_ENT(COFF, IMAGE_SCN_ALIGN_4096BYTES),
+ CV_ENUM_ENT(COFF, IMAGE_SCN_ALIGN_8192BYTES),
+ CV_ENUM_ENT(COFF, IMAGE_SCN_LNK_NRELOC_OVFL),
+ CV_ENUM_ENT(COFF, IMAGE_SCN_MEM_DISCARDABLE),
+ CV_ENUM_ENT(COFF, IMAGE_SCN_MEM_NOT_CACHED),
+ CV_ENUM_ENT(COFF, IMAGE_SCN_MEM_NOT_PAGED),
+ CV_ENUM_ENT(COFF, IMAGE_SCN_MEM_SHARED),
+ CV_ENUM_ENT(COFF, IMAGE_SCN_MEM_EXECUTE),
+ CV_ENUM_ENT(COFF, IMAGE_SCN_MEM_READ),
+ CV_ENUM_ENT(COFF, IMAGE_SCN_MEM_WRITE)};
+
+static const EnumEntry<uint16_t> ClassOptionNames[] = {
+ CV_ENUM_CLASS_ENT(ClassOptions, Packed),
+ CV_ENUM_CLASS_ENT(ClassOptions, HasConstructorOrDestructor),
+ CV_ENUM_CLASS_ENT(ClassOptions, HasOverloadedOperator),
+ CV_ENUM_CLASS_ENT(ClassOptions, Nested),
+ CV_ENUM_CLASS_ENT(ClassOptions, ContainsNestedClass),
+ CV_ENUM_CLASS_ENT(ClassOptions, HasOverloadedAssignmentOperator),
+ CV_ENUM_CLASS_ENT(ClassOptions, HasConversionOperator),
+ CV_ENUM_CLASS_ENT(ClassOptions, ForwardReference),
+ CV_ENUM_CLASS_ENT(ClassOptions, Scoped),
+ CV_ENUM_CLASS_ENT(ClassOptions, HasUniqueName),
+ CV_ENUM_CLASS_ENT(ClassOptions, Sealed),
+ CV_ENUM_CLASS_ENT(ClassOptions, Intrinsic),
+};
+
+static const EnumEntry<uint8_t> MemberAccessNames[] = {
+ CV_ENUM_CLASS_ENT(MemberAccess, None),
+ CV_ENUM_CLASS_ENT(MemberAccess, Private),
+ CV_ENUM_CLASS_ENT(MemberAccess, Protected),
+ CV_ENUM_CLASS_ENT(MemberAccess, Public),
+};
+
+static const EnumEntry<uint16_t> MethodOptionNames[] = {
+ CV_ENUM_CLASS_ENT(MethodOptions, Pseudo),
+ CV_ENUM_CLASS_ENT(MethodOptions, NoInherit),
+ CV_ENUM_CLASS_ENT(MethodOptions, NoConstruct),
+ CV_ENUM_CLASS_ENT(MethodOptions, CompilerGenerated),
+ CV_ENUM_CLASS_ENT(MethodOptions, Sealed),
+};
+
+static const EnumEntry<uint16_t> MemberKindNames[] = {
+ CV_ENUM_CLASS_ENT(MethodKind, Vanilla),
+ CV_ENUM_CLASS_ENT(MethodKind, Virtual),
+ CV_ENUM_CLASS_ENT(MethodKind, Static),
+ CV_ENUM_CLASS_ENT(MethodKind, Friend),
+ CV_ENUM_CLASS_ENT(MethodKind, IntroducingVirtual),
+ CV_ENUM_CLASS_ENT(MethodKind, PureVirtual),
+ CV_ENUM_CLASS_ENT(MethodKind, PureIntroducingVirtual),
+};
+
+static const EnumEntry<uint8_t> PtrKindNames[] = {
+ CV_ENUM_CLASS_ENT(PointerKind, Near16),
+ CV_ENUM_CLASS_ENT(PointerKind, Far16),
+ CV_ENUM_CLASS_ENT(PointerKind, Huge16),
+ CV_ENUM_CLASS_ENT(PointerKind, BasedOnSegment),
+ CV_ENUM_CLASS_ENT(PointerKind, BasedOnValue),
+ CV_ENUM_CLASS_ENT(PointerKind, BasedOnSegmentValue),
+ CV_ENUM_CLASS_ENT(PointerKind, BasedOnAddress),
+ CV_ENUM_CLASS_ENT(PointerKind, BasedOnSegmentAddress),
+ CV_ENUM_CLASS_ENT(PointerKind, BasedOnType),
+ CV_ENUM_CLASS_ENT(PointerKind, BasedOnSelf),
+ CV_ENUM_CLASS_ENT(PointerKind, Near32),
+ CV_ENUM_CLASS_ENT(PointerKind, Far32),
+ CV_ENUM_CLASS_ENT(PointerKind, Near64),
+};
+
+static const EnumEntry<uint8_t> PtrModeNames[] = {
+ CV_ENUM_CLASS_ENT(PointerMode, Pointer),
+ CV_ENUM_CLASS_ENT(PointerMode, LValueReference),
+ CV_ENUM_CLASS_ENT(PointerMode, PointerToDataMember),
+ CV_ENUM_CLASS_ENT(PointerMode, PointerToMemberFunction),
+ CV_ENUM_CLASS_ENT(PointerMode, RValueReference),
+};
+
+static const EnumEntry<uint16_t> PtrMemberRepNames[] = {
+ CV_ENUM_CLASS_ENT(PointerToMemberRepresentation, Unknown),
+ CV_ENUM_CLASS_ENT(PointerToMemberRepresentation, SingleInheritanceData),
+ CV_ENUM_CLASS_ENT(PointerToMemberRepresentation, MultipleInheritanceData),
+ CV_ENUM_CLASS_ENT(PointerToMemberRepresentation, VirtualInheritanceData),
+ CV_ENUM_CLASS_ENT(PointerToMemberRepresentation, GeneralData),
+ CV_ENUM_CLASS_ENT(PointerToMemberRepresentation, SingleInheritanceFunction),
+ CV_ENUM_CLASS_ENT(PointerToMemberRepresentation,
+ MultipleInheritanceFunction),
+ CV_ENUM_CLASS_ENT(PointerToMemberRepresentation,
+ VirtualInheritanceFunction),
+ CV_ENUM_CLASS_ENT(PointerToMemberRepresentation, GeneralFunction),
+};
+
+static const EnumEntry<uint16_t> TypeModifierNames[] = {
+ CV_ENUM_CLASS_ENT(ModifierOptions, Const),
+ CV_ENUM_CLASS_ENT(ModifierOptions, Volatile),
+ CV_ENUM_CLASS_ENT(ModifierOptions, Unaligned),
+};
+
+static const EnumEntry<uint8_t> CallingConventions[] = {
+ CV_ENUM_CLASS_ENT(CallingConvention, NearC),
+ CV_ENUM_CLASS_ENT(CallingConvention, FarC),
+ CV_ENUM_CLASS_ENT(CallingConvention, NearPascal),
+ CV_ENUM_CLASS_ENT(CallingConvention, FarPascal),
+ CV_ENUM_CLASS_ENT(CallingConvention, NearFast),
+ CV_ENUM_CLASS_ENT(CallingConvention, FarFast),
+ CV_ENUM_CLASS_ENT(CallingConvention, NearStdCall),
+ CV_ENUM_CLASS_ENT(CallingConvention, FarStdCall),
+ CV_ENUM_CLASS_ENT(CallingConvention, NearSysCall),
+ CV_ENUM_CLASS_ENT(CallingConvention, FarSysCall),
+ CV_ENUM_CLASS_ENT(CallingConvention, ThisCall),
+ CV_ENUM_CLASS_ENT(CallingConvention, MipsCall),
+ CV_ENUM_CLASS_ENT(CallingConvention, Generic),
+ CV_ENUM_CLASS_ENT(CallingConvention, AlphaCall),
+ CV_ENUM_CLASS_ENT(CallingConvention, PpcCall),
+ CV_ENUM_CLASS_ENT(CallingConvention, SHCall),
+ CV_ENUM_CLASS_ENT(CallingConvention, ArmCall),
+ CV_ENUM_CLASS_ENT(CallingConvention, AM33Call),
+ CV_ENUM_CLASS_ENT(CallingConvention, TriCall),
+ CV_ENUM_CLASS_ENT(CallingConvention, SH5Call),
+ CV_ENUM_CLASS_ENT(CallingConvention, M32RCall),
+ CV_ENUM_CLASS_ENT(CallingConvention, ClrCall),
+ CV_ENUM_CLASS_ENT(CallingConvention, Inline),
+ CV_ENUM_CLASS_ENT(CallingConvention, NearVector),
+};
+
+static const EnumEntry<uint8_t> FunctionOptionEnum[] = {
+ CV_ENUM_CLASS_ENT(FunctionOptions, CxxReturnUdt),
+ CV_ENUM_CLASS_ENT(FunctionOptions, Constructor),
+ CV_ENUM_CLASS_ENT(FunctionOptions, ConstructorWithVirtualBases),
+};
+
+static const EnumEntry<uint16_t> LabelTypeEnum[] = {
+ CV_ENUM_CLASS_ENT(LabelType, Near),
+ CV_ENUM_CLASS_ENT(LabelType, Far),
+};
+
+namespace llvm {
+namespace codeview {
+
+ArrayRef<EnumEntry<SymbolKind>> getSymbolTypeNames() {
+ return makeArrayRef(SymbolTypeNames);
+}
+
+ArrayRef<EnumEntry<TypeLeafKind>> getTypeLeafNames() {
+ return makeArrayRef(TypeLeafNames);
+}
+
+ArrayRef<EnumEntry<uint16_t>> getRegisterNames(CPUType Cpu) {
if (Cpu == CPUType::ARMNT) {
return makeArrayRef(RegisterNames_ARM);
} else if (Cpu == CPUType::ARM64) {
- return makeArrayRef(RegisterNames_ARM64);
- }
- return makeArrayRef(RegisterNames_X86);
-}
-
-ArrayRef<EnumEntry<uint32_t>> getPublicSymFlagNames() {
- return makeArrayRef(PublicSymFlagNames);
-}
-
-ArrayRef<EnumEntry<uint8_t>> getProcSymFlagNames() {
- return makeArrayRef(ProcSymFlagNames);
-}
-
-ArrayRef<EnumEntry<uint16_t>> getLocalFlagNames() {
- return makeArrayRef(LocalFlags);
-}
-
-ArrayRef<EnumEntry<uint8_t>> getFrameCookieKindNames() {
- return makeArrayRef(FrameCookieKinds);
-}
-
-ArrayRef<EnumEntry<SourceLanguage>> getSourceLanguageNames() {
- return makeArrayRef(SourceLanguages);
-}
-
-ArrayRef<EnumEntry<uint32_t>> getCompileSym2FlagNames() {
- return makeArrayRef(CompileSym2FlagNames);
-}
-
-ArrayRef<EnumEntry<uint32_t>> getCompileSym3FlagNames() {
- return makeArrayRef(CompileSym3FlagNames);
-}
-
-ArrayRef<EnumEntry<uint32_t>> getFileChecksumNames() {
- return makeArrayRef(FileChecksumNames);
-}
-
-ArrayRef<EnumEntry<unsigned>> getCPUTypeNames() {
- return makeArrayRef(CPUTypeNames);
-}
-
-ArrayRef<EnumEntry<uint32_t>> getFrameProcSymFlagNames() {
- return makeArrayRef(FrameProcSymFlagNames);
-}
-
-ArrayRef<EnumEntry<uint16_t>> getExportSymFlagNames() {
- return makeArrayRef(ExportSymFlagNames);
-}
-
-ArrayRef<EnumEntry<uint32_t>> getModuleSubstreamKindNames() {
- return makeArrayRef(ModuleSubstreamKindNames);
-}
-
-ArrayRef<EnumEntry<uint8_t>> getThunkOrdinalNames() {
- return makeArrayRef(ThunkOrdinalNames);
-}
-
-ArrayRef<EnumEntry<uint16_t>> getTrampolineNames() {
- return makeArrayRef(TrampolineNames);
-}
-
-ArrayRef<EnumEntry<COFF::SectionCharacteristics>>
-getImageSectionCharacteristicNames() {
- return makeArrayRef(ImageSectionCharacteristicNames);
-}
-
-ArrayRef<EnumEntry<uint16_t>> getClassOptionNames() {
- return makeArrayRef(ClassOptionNames);
-}
-
-ArrayRef<EnumEntry<uint8_t>> getMemberAccessNames() {
- return makeArrayRef(MemberAccessNames);
-}
-
-ArrayRef<EnumEntry<uint16_t>> getMethodOptionNames() {
- return makeArrayRef(MethodOptionNames);
-}
-
-ArrayRef<EnumEntry<uint16_t>> getMemberKindNames() {
- return makeArrayRef(MemberKindNames);
-}
-
-ArrayRef<EnumEntry<uint8_t>> getPtrKindNames() {
- return makeArrayRef(PtrKindNames);
-}
-
-ArrayRef<EnumEntry<uint8_t>> getPtrModeNames() {
- return makeArrayRef(PtrModeNames);
-}
-
-ArrayRef<EnumEntry<uint16_t>> getPtrMemberRepNames() {
- return makeArrayRef(PtrMemberRepNames);
-}
-
-ArrayRef<EnumEntry<uint16_t>> getTypeModifierNames() {
- return makeArrayRef(TypeModifierNames);
-}
-
-ArrayRef<EnumEntry<uint8_t>> getCallingConventions() {
- return makeArrayRef(CallingConventions);
-}
-
-ArrayRef<EnumEntry<uint8_t>> getFunctionOptionEnum() {
- return makeArrayRef(FunctionOptionEnum);
-}
-
-ArrayRef<EnumEntry<uint16_t>> getLabelTypeEnum() {
- return makeArrayRef(LabelTypeEnum);
-}
-
-} // end namespace codeview
-} // end namespace llvm
+ return makeArrayRef(RegisterNames_ARM64);
+ }
+ return makeArrayRef(RegisterNames_X86);
+}
+
+ArrayRef<EnumEntry<uint32_t>> getPublicSymFlagNames() {
+ return makeArrayRef(PublicSymFlagNames);
+}
+
+ArrayRef<EnumEntry<uint8_t>> getProcSymFlagNames() {
+ return makeArrayRef(ProcSymFlagNames);
+}
+
+ArrayRef<EnumEntry<uint16_t>> getLocalFlagNames() {
+ return makeArrayRef(LocalFlags);
+}
+
+ArrayRef<EnumEntry<uint8_t>> getFrameCookieKindNames() {
+ return makeArrayRef(FrameCookieKinds);
+}
+
+ArrayRef<EnumEntry<SourceLanguage>> getSourceLanguageNames() {
+ return makeArrayRef(SourceLanguages);
+}
+
+ArrayRef<EnumEntry<uint32_t>> getCompileSym2FlagNames() {
+ return makeArrayRef(CompileSym2FlagNames);
+}
+
+ArrayRef<EnumEntry<uint32_t>> getCompileSym3FlagNames() {
+ return makeArrayRef(CompileSym3FlagNames);
+}
+
+ArrayRef<EnumEntry<uint32_t>> getFileChecksumNames() {
+ return makeArrayRef(FileChecksumNames);
+}
+
+ArrayRef<EnumEntry<unsigned>> getCPUTypeNames() {
+ return makeArrayRef(CPUTypeNames);
+}
+
+ArrayRef<EnumEntry<uint32_t>> getFrameProcSymFlagNames() {
+ return makeArrayRef(FrameProcSymFlagNames);
+}
+
+ArrayRef<EnumEntry<uint16_t>> getExportSymFlagNames() {
+ return makeArrayRef(ExportSymFlagNames);
+}
+
+ArrayRef<EnumEntry<uint32_t>> getModuleSubstreamKindNames() {
+ return makeArrayRef(ModuleSubstreamKindNames);
+}
+
+ArrayRef<EnumEntry<uint8_t>> getThunkOrdinalNames() {
+ return makeArrayRef(ThunkOrdinalNames);
+}
+
+ArrayRef<EnumEntry<uint16_t>> getTrampolineNames() {
+ return makeArrayRef(TrampolineNames);
+}
+
+ArrayRef<EnumEntry<COFF::SectionCharacteristics>>
+getImageSectionCharacteristicNames() {
+ return makeArrayRef(ImageSectionCharacteristicNames);
+}
+
+ArrayRef<EnumEntry<uint16_t>> getClassOptionNames() {
+ return makeArrayRef(ClassOptionNames);
+}
+
+ArrayRef<EnumEntry<uint8_t>> getMemberAccessNames() {
+ return makeArrayRef(MemberAccessNames);
+}
+
+ArrayRef<EnumEntry<uint16_t>> getMethodOptionNames() {
+ return makeArrayRef(MethodOptionNames);
+}
+
+ArrayRef<EnumEntry<uint16_t>> getMemberKindNames() {
+ return makeArrayRef(MemberKindNames);
+}
+
+ArrayRef<EnumEntry<uint8_t>> getPtrKindNames() {
+ return makeArrayRef(PtrKindNames);
+}
+
+ArrayRef<EnumEntry<uint8_t>> getPtrModeNames() {
+ return makeArrayRef(PtrModeNames);
+}
+
+ArrayRef<EnumEntry<uint16_t>> getPtrMemberRepNames() {
+ return makeArrayRef(PtrMemberRepNames);
+}
+
+ArrayRef<EnumEntry<uint16_t>> getTypeModifierNames() {
+ return makeArrayRef(TypeModifierNames);
+}
+
+ArrayRef<EnumEntry<uint8_t>> getCallingConventions() {
+ return makeArrayRef(CallingConventions);
+}
+
+ArrayRef<EnumEntry<uint8_t>> getFunctionOptionEnum() {
+ return makeArrayRef(FunctionOptionEnum);
+}
+
+ArrayRef<EnumEntry<uint16_t>> getLabelTypeEnum() {
+ return makeArrayRef(LabelTypeEnum);
+}
+
+} // end namespace codeview
+} // end namespace llvm
diff --git a/contrib/libs/llvm12/lib/DebugInfo/CodeView/Formatters.cpp b/contrib/libs/llvm12/lib/DebugInfo/CodeView/Formatters.cpp
index fc8482ed815..a7a8c7ff82b 100644
--- a/contrib/libs/llvm12/lib/DebugInfo/CodeView/Formatters.cpp
+++ b/contrib/libs/llvm12/lib/DebugInfo/CodeView/Formatters.cpp
@@ -1,47 +1,47 @@
-//===- Formatters.cpp -----------------------------------------------------===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-
-#include "llvm/DebugInfo/CodeView/Formatters.h"
-#include "llvm/ADT/ArrayRef.h"
-#include "llvm/DebugInfo/CodeView/GUID.h"
-#include "llvm/Support/raw_ostream.h"
-#include <algorithm>
-#include <cassert>
-
-using namespace llvm;
-using namespace llvm::codeview;
-using namespace llvm::codeview::detail;
-
-GuidAdapter::GuidAdapter(StringRef Guid)
- : FormatAdapter(makeArrayRef(Guid.bytes_begin(), Guid.bytes_end())) {}
-
-GuidAdapter::GuidAdapter(ArrayRef<uint8_t> Guid)
- : FormatAdapter(std::move(Guid)) {}
-
-void GuidAdapter::format(raw_ostream &Stream, StringRef Style) {
- static const char *Lookup = "0123456789ABCDEF";
-
- assert(Item.size() == 16 && "Expected 16-byte GUID");
- Stream << "{";
- for (int i = 0; i < 16;) {
- uint8_t Byte = Item[i];
- uint8_t HighNibble = (Byte >> 4) & 0xF;
- uint8_t LowNibble = Byte & 0xF;
- Stream << Lookup[HighNibble] << Lookup[LowNibble];
- ++i;
- if (i >= 4 && i <= 10 && i % 2 == 0)
- Stream << "-";
- }
- Stream << "}";
-}
-
-raw_ostream &llvm::codeview::operator<<(raw_ostream &OS, const GUID &Guid) {
- codeview::detail::GuidAdapter A(Guid.Guid);
- A.format(OS, "");
- return OS;
-}
+//===- Formatters.cpp -----------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "llvm/DebugInfo/CodeView/Formatters.h"
+#include "llvm/ADT/ArrayRef.h"
+#include "llvm/DebugInfo/CodeView/GUID.h"
+#include "llvm/Support/raw_ostream.h"
+#include <algorithm>
+#include <cassert>
+
+using namespace llvm;
+using namespace llvm::codeview;
+using namespace llvm::codeview::detail;
+
+GuidAdapter::GuidAdapter(StringRef Guid)
+ : FormatAdapter(makeArrayRef(Guid.bytes_begin(), Guid.bytes_end())) {}
+
+GuidAdapter::GuidAdapter(ArrayRef<uint8_t> Guid)
+ : FormatAdapter(std::move(Guid)) {}
+
+void GuidAdapter::format(raw_ostream &Stream, StringRef Style) {
+ static const char *Lookup = "0123456789ABCDEF";
+
+ assert(Item.size() == 16 && "Expected 16-byte GUID");
+ Stream << "{";
+ for (int i = 0; i < 16;) {
+ uint8_t Byte = Item[i];
+ uint8_t HighNibble = (Byte >> 4) & 0xF;
+ uint8_t LowNibble = Byte & 0xF;
+ Stream << Lookup[HighNibble] << Lookup[LowNibble];
+ ++i;
+ if (i >= 4 && i <= 10 && i % 2 == 0)
+ Stream << "-";
+ }
+ Stream << "}";
+}
+
+raw_ostream &llvm::codeview::operator<<(raw_ostream &OS, const GUID &Guid) {
+ codeview::detail::GuidAdapter A(Guid.Guid);
+ A.format(OS, "");
+ return OS;
+}
diff --git a/contrib/libs/llvm12/lib/DebugInfo/CodeView/GlobalTypeTableBuilder.cpp b/contrib/libs/llvm12/lib/DebugInfo/CodeView/GlobalTypeTableBuilder.cpp
index 0923eb1729d..7cd9ca7498f 100644
--- a/contrib/libs/llvm12/lib/DebugInfo/CodeView/GlobalTypeTableBuilder.cpp
+++ b/contrib/libs/llvm12/lib/DebugInfo/CodeView/GlobalTypeTableBuilder.cpp
@@ -1,140 +1,140 @@
-//===- GlobalTypeTableBuilder.cpp -----------------------------------------===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-
-#include "llvm/DebugInfo/CodeView/GlobalTypeTableBuilder.h"
-#include "llvm/ADT/ArrayRef.h"
-#include "llvm/ADT/DenseSet.h"
-#include "llvm/ADT/STLExtras.h"
-#include "llvm/DebugInfo/CodeView/CodeView.h"
-#include "llvm/DebugInfo/CodeView/ContinuationRecordBuilder.h"
-#include "llvm/DebugInfo/CodeView/RecordSerialization.h"
-#include "llvm/DebugInfo/CodeView/TypeIndex.h"
-#include "llvm/Support/Allocator.h"
-#include "llvm/Support/BinaryByteStream.h"
-#include "llvm/Support/BinaryStreamWriter.h"
-#include "llvm/Support/Endian.h"
-#include "llvm/Support/Error.h"
-#include <algorithm>
-#include <cassert>
-#include <cstdint>
-#include <cstring>
-
-using namespace llvm;
-using namespace llvm::codeview;
-
-TypeIndex GlobalTypeTableBuilder::nextTypeIndex() const {
- return TypeIndex::fromArrayIndex(SeenRecords.size());
-}
-
-GlobalTypeTableBuilder::GlobalTypeTableBuilder(BumpPtrAllocator &Storage)
- : RecordStorage(Storage) {
- SeenRecords.reserve(4096);
-}
-
-GlobalTypeTableBuilder::~GlobalTypeTableBuilder() = default;
-
-Optional<TypeIndex> GlobalTypeTableBuilder::getFirst() {
- if (empty())
- return None;
-
- return TypeIndex(TypeIndex::FirstNonSimpleIndex);
-}
-
-Optional<TypeIndex> GlobalTypeTableBuilder::getNext(TypeIndex Prev) {
- if (++Prev == nextTypeIndex())
- return None;
- return Prev;
-}
-
-CVType GlobalTypeTableBuilder::getType(TypeIndex Index) {
- CVType Type(SeenRecords[Index.toArrayIndex()]);
- return Type;
-}
-
-StringRef GlobalTypeTableBuilder::getTypeName(TypeIndex Index) {
- llvm_unreachable("Method not implemented");
-}
-
-bool GlobalTypeTableBuilder::contains(TypeIndex Index) {
- if (Index.isSimple() || Index.isNoneType())
- return false;
-
- return Index.toArrayIndex() < SeenRecords.size();
-}
-
-uint32_t GlobalTypeTableBuilder::size() { return SeenRecords.size(); }
-
-uint32_t GlobalTypeTableBuilder::capacity() { return SeenRecords.size(); }
-
-ArrayRef<ArrayRef<uint8_t>> GlobalTypeTableBuilder::records() const {
- return SeenRecords;
-}
-
-ArrayRef<GloballyHashedType> GlobalTypeTableBuilder::hashes() const {
- return SeenHashes;
-}
-
-void GlobalTypeTableBuilder::reset() {
- HashedRecords.clear();
- SeenRecords.clear();
-}
-
-static inline ArrayRef<uint8_t> stabilize(BumpPtrAllocator &Alloc,
- ArrayRef<uint8_t> Data) {
- uint8_t *Stable = Alloc.Allocate<uint8_t>(Data.size());
- memcpy(Stable, Data.data(), Data.size());
- return makeArrayRef(Stable, Data.size());
-}
-
-TypeIndex GlobalTypeTableBuilder::insertRecordBytes(ArrayRef<uint8_t> Record) {
- GloballyHashedType GHT =
- GloballyHashedType::hashType(Record, SeenHashes, SeenHashes);
- return insertRecordAs(GHT, Record.size(),
- [Record](MutableArrayRef<uint8_t> Data) {
- assert(Data.size() == Record.size());
- ::memcpy(Data.data(), Record.data(), Record.size());
- return Data;
- });
-}
-
-TypeIndex
-GlobalTypeTableBuilder::insertRecord(ContinuationRecordBuilder &Builder) {
- TypeIndex TI;
- auto Fragments = Builder.end(nextTypeIndex());
- assert(!Fragments.empty());
- for (auto C : Fragments)
- TI = insertRecordBytes(C.RecordData);
- return TI;
-}
-
-bool GlobalTypeTableBuilder::replaceType(TypeIndex &Index, CVType Data,
- bool Stabilize) {
- assert(Index.toArrayIndex() < SeenRecords.size() &&
- "This function cannot be used to insert records!");
-
- ArrayRef<uint8_t> Record = Data.data();
- assert(Record.size() < UINT32_MAX && "Record too big");
- assert(Record.size() % 4 == 0 &&
- "The type record size is not a multiple of 4 bytes which will cause "
- "misalignment in the output TPI stream!");
-
- GloballyHashedType Hash =
- GloballyHashedType::hashType(Record, SeenHashes, SeenHashes);
- auto Result = HashedRecords.try_emplace(Hash, Index.toArrayIndex());
- if (!Result.second) {
- Index = Result.first->second;
- return false; // The record is already there, at a different location
- }
-
- if (Stabilize)
- Record = stabilize(RecordStorage, Record);
-
- SeenRecords[Index.toArrayIndex()] = Record;
- SeenHashes[Index.toArrayIndex()] = Hash;
- return true;
-}
+//===- GlobalTypeTableBuilder.cpp -----------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "llvm/DebugInfo/CodeView/GlobalTypeTableBuilder.h"
+#include "llvm/ADT/ArrayRef.h"
+#include "llvm/ADT/DenseSet.h"
+#include "llvm/ADT/STLExtras.h"
+#include "llvm/DebugInfo/CodeView/CodeView.h"
+#include "llvm/DebugInfo/CodeView/ContinuationRecordBuilder.h"
+#include "llvm/DebugInfo/CodeView/RecordSerialization.h"
+#include "llvm/DebugInfo/CodeView/TypeIndex.h"
+#include "llvm/Support/Allocator.h"
+#include "llvm/Support/BinaryByteStream.h"
+#include "llvm/Support/BinaryStreamWriter.h"
+#include "llvm/Support/Endian.h"
+#include "llvm/Support/Error.h"
+#include <algorithm>
+#include <cassert>
+#include <cstdint>
+#include <cstring>
+
+using namespace llvm;
+using namespace llvm::codeview;
+
+TypeIndex GlobalTypeTableBuilder::nextTypeIndex() const {
+ return TypeIndex::fromArrayIndex(SeenRecords.size());
+}
+
+GlobalTypeTableBuilder::GlobalTypeTableBuilder(BumpPtrAllocator &Storage)
+ : RecordStorage(Storage) {
+ SeenRecords.reserve(4096);
+}
+
+GlobalTypeTableBuilder::~GlobalTypeTableBuilder() = default;
+
+Optional<TypeIndex> GlobalTypeTableBuilder::getFirst() {
+ if (empty())
+ return None;
+
+ return TypeIndex(TypeIndex::FirstNonSimpleIndex);
+}
+
+Optional<TypeIndex> GlobalTypeTableBuilder::getNext(TypeIndex Prev) {
+ if (++Prev == nextTypeIndex())
+ return None;
+ return Prev;
+}
+
+CVType GlobalTypeTableBuilder::getType(TypeIndex Index) {
+ CVType Type(SeenRecords[Index.toArrayIndex()]);
+ return Type;
+}
+
+StringRef GlobalTypeTableBuilder::getTypeName(TypeIndex Index) {
+ llvm_unreachable("Method not implemented");
+}
+
+bool GlobalTypeTableBuilder::contains(TypeIndex Index) {
+ if (Index.isSimple() || Index.isNoneType())
+ return false;
+
+ return Index.toArrayIndex() < SeenRecords.size();
+}
+
+uint32_t GlobalTypeTableBuilder::size() { return SeenRecords.size(); }
+
+uint32_t GlobalTypeTableBuilder::capacity() { return SeenRecords.size(); }
+
+ArrayRef<ArrayRef<uint8_t>> GlobalTypeTableBuilder::records() const {
+ return SeenRecords;
+}
+
+ArrayRef<GloballyHashedType> GlobalTypeTableBuilder::hashes() const {
+ return SeenHashes;
+}
+
+void GlobalTypeTableBuilder::reset() {
+ HashedRecords.clear();
+ SeenRecords.clear();
+}
+
+static inline ArrayRef<uint8_t> stabilize(BumpPtrAllocator &Alloc,
+ ArrayRef<uint8_t> Data) {
+ uint8_t *Stable = Alloc.Allocate<uint8_t>(Data.size());
+ memcpy(Stable, Data.data(), Data.size());
+ return makeArrayRef(Stable, Data.size());
+}
+
+TypeIndex GlobalTypeTableBuilder::insertRecordBytes(ArrayRef<uint8_t> Record) {
+ GloballyHashedType GHT =
+ GloballyHashedType::hashType(Record, SeenHashes, SeenHashes);
+ return insertRecordAs(GHT, Record.size(),
+ [Record](MutableArrayRef<uint8_t> Data) {
+ assert(Data.size() == Record.size());
+ ::memcpy(Data.data(), Record.data(), Record.size());
+ return Data;
+ });
+}
+
+TypeIndex
+GlobalTypeTableBuilder::insertRecord(ContinuationRecordBuilder &Builder) {
+ TypeIndex TI;
+ auto Fragments = Builder.end(nextTypeIndex());
+ assert(!Fragments.empty());
+ for (auto C : Fragments)
+ TI = insertRecordBytes(C.RecordData);
+ return TI;
+}
+
+bool GlobalTypeTableBuilder::replaceType(TypeIndex &Index, CVType Data,
+ bool Stabilize) {
+ assert(Index.toArrayIndex() < SeenRecords.size() &&
+ "This function cannot be used to insert records!");
+
+ ArrayRef<uint8_t> Record = Data.data();
+ assert(Record.size() < UINT32_MAX && "Record too big");
+ assert(Record.size() % 4 == 0 &&
+ "The type record size is not a multiple of 4 bytes which will cause "
+ "misalignment in the output TPI stream!");
+
+ GloballyHashedType Hash =
+ GloballyHashedType::hashType(Record, SeenHashes, SeenHashes);
+ auto Result = HashedRecords.try_emplace(Hash, Index.toArrayIndex());
+ if (!Result.second) {
+ Index = Result.first->second;
+ return false; // The record is already there, at a different location
+ }
+
+ if (Stabilize)
+ Record = stabilize(RecordStorage, Record);
+
+ SeenRecords[Index.toArrayIndex()] = Record;
+ SeenHashes[Index.toArrayIndex()] = Hash;
+ return true;
+}
diff --git a/contrib/libs/llvm12/lib/DebugInfo/CodeView/LazyRandomTypeCollection.cpp b/contrib/libs/llvm12/lib/DebugInfo/CodeView/LazyRandomTypeCollection.cpp
index dae7fbe2ac4..c0fc3e0ef65 100644
--- a/contrib/libs/llvm12/lib/DebugInfo/CodeView/LazyRandomTypeCollection.cpp
+++ b/contrib/libs/llvm12/lib/DebugInfo/CodeView/LazyRandomTypeCollection.cpp
@@ -1,284 +1,284 @@
-//===- LazyRandomTypeCollection.cpp ---------------------------------------===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-
-#include "llvm/DebugInfo/CodeView/LazyRandomTypeCollection.h"
-#include "llvm/ADT/ArrayRef.h"
-#include "llvm/ADT/None.h"
-#include "llvm/ADT/StringExtras.h"
-#include "llvm/ADT/StringRef.h"
-#include "llvm/DebugInfo/CodeView/CodeViewError.h"
-#include "llvm/DebugInfo/CodeView/RecordName.h"
-#include "llvm/DebugInfo/CodeView/TypeRecord.h"
-#include "llvm/Support/BinaryStreamReader.h"
-#include "llvm/Support/Endian.h"
-#include "llvm/Support/Error.h"
-#include <algorithm>
-#include <cassert>
-#include <cstdint>
-#include <iterator>
-
-using namespace llvm;
-using namespace llvm::codeview;
-
-static void error(Error &&EC) {
- assert(!static_cast<bool>(EC));
- if (EC)
- consumeError(std::move(EC));
-}
-
-LazyRandomTypeCollection::LazyRandomTypeCollection(uint32_t RecordCountHint)
- : LazyRandomTypeCollection(CVTypeArray(), RecordCountHint,
- PartialOffsetArray()) {}
-
-LazyRandomTypeCollection::LazyRandomTypeCollection(
- const CVTypeArray &Types, uint32_t RecordCountHint,
- PartialOffsetArray PartialOffsets)
- : NameStorage(Allocator), Types(Types), PartialOffsets(PartialOffsets) {
- Records.resize(RecordCountHint);
-}
-
-LazyRandomTypeCollection::LazyRandomTypeCollection(ArrayRef<uint8_t> Data,
- uint32_t RecordCountHint)
- : LazyRandomTypeCollection(RecordCountHint) {
-}
-
-LazyRandomTypeCollection::LazyRandomTypeCollection(StringRef Data,
- uint32_t RecordCountHint)
- : LazyRandomTypeCollection(
- makeArrayRef(Data.bytes_begin(), Data.bytes_end()), RecordCountHint) {
-}
-
-LazyRandomTypeCollection::LazyRandomTypeCollection(const CVTypeArray &Types,
- uint32_t NumRecords)
- : LazyRandomTypeCollection(Types, NumRecords, PartialOffsetArray()) {}
-
-void LazyRandomTypeCollection::reset(BinaryStreamReader &Reader,
- uint32_t RecordCountHint) {
- Count = 0;
- PartialOffsets = PartialOffsetArray();
-
- error(Reader.readArray(Types, Reader.bytesRemaining()));
-
- // Clear and then resize, to make sure existing data gets destroyed.
- Records.clear();
- Records.resize(RecordCountHint);
-}
-
-void LazyRandomTypeCollection::reset(StringRef Data, uint32_t RecordCountHint) {
- BinaryStreamReader Reader(Data, support::little);
- reset(Reader, RecordCountHint);
-}
-
-void LazyRandomTypeCollection::reset(ArrayRef<uint8_t> Data,
- uint32_t RecordCountHint) {
- BinaryStreamReader Reader(Data, support::little);
- reset(Reader, RecordCountHint);
-}
-
-uint32_t LazyRandomTypeCollection::getOffsetOfType(TypeIndex Index) {
- error(ensureTypeExists(Index));
- assert(contains(Index));
-
- return Records[Index.toArrayIndex()].Offset;
-}
-
-CVType LazyRandomTypeCollection::getType(TypeIndex Index) {
- assert(!Index.isSimple());
-
- auto EC = ensureTypeExists(Index);
- error(std::move(EC));
- assert(contains(Index));
-
- return Records[Index.toArrayIndex()].Type;
-}
-
-Optional<CVType> LazyRandomTypeCollection::tryGetType(TypeIndex Index) {
- if (Index.isSimple())
- return None;
-
- if (auto EC = ensureTypeExists(Index)) {
- consumeError(std::move(EC));
- return None;
- }
-
- assert(contains(Index));
- return Records[Index.toArrayIndex()].Type;
-}
-
-StringRef LazyRandomTypeCollection::getTypeName(TypeIndex Index) {
- if (Index.isNoneType() || Index.isSimple())
- return TypeIndex::simpleTypeName(Index);
-
- // Try to make sure the type exists. Even if it doesn't though, it may be
- // because we're dumping a symbol stream with no corresponding type stream
- // present, in which case we still want to be able to print <unknown UDT>
- // for the type names.
- if (auto EC = ensureTypeExists(Index)) {
- consumeError(std::move(EC));
- return "<unknown UDT>";
- }
-
- uint32_t I = Index.toArrayIndex();
- ensureCapacityFor(Index);
- if (Records[I].Name.data() == nullptr) {
- StringRef Result = NameStorage.save(computeTypeName(*this, Index));
- Records[I].Name = Result;
- }
- return Records[I].Name;
-}
-
-bool LazyRandomTypeCollection::contains(TypeIndex Index) {
- if (Index.isSimple() || Index.isNoneType())
- return false;
-
- if (Records.size() <= Index.toArrayIndex())
- return false;
- if (!Records[Index.toArrayIndex()].Type.valid())
- return false;
- return true;
-}
-
-uint32_t LazyRandomTypeCollection::size() { return Count; }
-
-uint32_t LazyRandomTypeCollection::capacity() { return Records.size(); }
-
-Error LazyRandomTypeCollection::ensureTypeExists(TypeIndex TI) {
- if (contains(TI))
- return Error::success();
-
- return visitRangeForType(TI);
-}
-
-void LazyRandomTypeCollection::ensureCapacityFor(TypeIndex Index) {
- assert(!Index.isSimple());
- uint32_t MinSize = Index.toArrayIndex() + 1;
-
- if (MinSize <= capacity())
- return;
-
- uint32_t NewCapacity = MinSize * 3 / 2;
-
- assert(NewCapacity > capacity());
- Records.resize(NewCapacity);
-}
-
-Error LazyRandomTypeCollection::visitRangeForType(TypeIndex TI) {
- assert(!TI.isSimple());
- if (PartialOffsets.empty())
- return fullScanForType(TI);
-
+//===- LazyRandomTypeCollection.cpp ---------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "llvm/DebugInfo/CodeView/LazyRandomTypeCollection.h"
+#include "llvm/ADT/ArrayRef.h"
+#include "llvm/ADT/None.h"
+#include "llvm/ADT/StringExtras.h"
+#include "llvm/ADT/StringRef.h"
+#include "llvm/DebugInfo/CodeView/CodeViewError.h"
+#include "llvm/DebugInfo/CodeView/RecordName.h"
+#include "llvm/DebugInfo/CodeView/TypeRecord.h"
+#include "llvm/Support/BinaryStreamReader.h"
+#include "llvm/Support/Endian.h"
+#include "llvm/Support/Error.h"
+#include <algorithm>
+#include <cassert>
+#include <cstdint>
+#include <iterator>
+
+using namespace llvm;
+using namespace llvm::codeview;
+
+static void error(Error &&EC) {
+ assert(!static_cast<bool>(EC));
+ if (EC)
+ consumeError(std::move(EC));
+}
+
+LazyRandomTypeCollection::LazyRandomTypeCollection(uint32_t RecordCountHint)
+ : LazyRandomTypeCollection(CVTypeArray(), RecordCountHint,
+ PartialOffsetArray()) {}
+
+LazyRandomTypeCollection::LazyRandomTypeCollection(
+ const CVTypeArray &Types, uint32_t RecordCountHint,
+ PartialOffsetArray PartialOffsets)
+ : NameStorage(Allocator), Types(Types), PartialOffsets(PartialOffsets) {
+ Records.resize(RecordCountHint);
+}
+
+LazyRandomTypeCollection::LazyRandomTypeCollection(ArrayRef<uint8_t> Data,
+ uint32_t RecordCountHint)
+ : LazyRandomTypeCollection(RecordCountHint) {
+}
+
+LazyRandomTypeCollection::LazyRandomTypeCollection(StringRef Data,
+ uint32_t RecordCountHint)
+ : LazyRandomTypeCollection(
+ makeArrayRef(Data.bytes_begin(), Data.bytes_end()), RecordCountHint) {
+}
+
+LazyRandomTypeCollection::LazyRandomTypeCollection(const CVTypeArray &Types,
+ uint32_t NumRecords)
+ : LazyRandomTypeCollection(Types, NumRecords, PartialOffsetArray()) {}
+
+void LazyRandomTypeCollection::reset(BinaryStreamReader &Reader,
+ uint32_t RecordCountHint) {
+ Count = 0;
+ PartialOffsets = PartialOffsetArray();
+
+ error(Reader.readArray(Types, Reader.bytesRemaining()));
+
+ // Clear and then resize, to make sure existing data gets destroyed.
+ Records.clear();
+ Records.resize(RecordCountHint);
+}
+
+void LazyRandomTypeCollection::reset(StringRef Data, uint32_t RecordCountHint) {
+ BinaryStreamReader Reader(Data, support::little);
+ reset(Reader, RecordCountHint);
+}
+
+void LazyRandomTypeCollection::reset(ArrayRef<uint8_t> Data,
+ uint32_t RecordCountHint) {
+ BinaryStreamReader Reader(Data, support::little);
+ reset(Reader, RecordCountHint);
+}
+
+uint32_t LazyRandomTypeCollection::getOffsetOfType(TypeIndex Index) {
+ error(ensureTypeExists(Index));
+ assert(contains(Index));
+
+ return Records[Index.toArrayIndex()].Offset;
+}
+
+CVType LazyRandomTypeCollection::getType(TypeIndex Index) {
+ assert(!Index.isSimple());
+
+ auto EC = ensureTypeExists(Index);
+ error(std::move(EC));
+ assert(contains(Index));
+
+ return Records[Index.toArrayIndex()].Type;
+}
+
+Optional<CVType> LazyRandomTypeCollection::tryGetType(TypeIndex Index) {
+ if (Index.isSimple())
+ return None;
+
+ if (auto EC = ensureTypeExists(Index)) {
+ consumeError(std::move(EC));
+ return None;
+ }
+
+ assert(contains(Index));
+ return Records[Index.toArrayIndex()].Type;
+}
+
+StringRef LazyRandomTypeCollection::getTypeName(TypeIndex Index) {
+ if (Index.isNoneType() || Index.isSimple())
+ return TypeIndex::simpleTypeName(Index);
+
+ // Try to make sure the type exists. Even if it doesn't though, it may be
+ // because we're dumping a symbol stream with no corresponding type stream
+ // present, in which case we still want to be able to print <unknown UDT>
+ // for the type names.
+ if (auto EC = ensureTypeExists(Index)) {
+ consumeError(std::move(EC));
+ return "<unknown UDT>";
+ }
+
+ uint32_t I = Index.toArrayIndex();
+ ensureCapacityFor(Index);
+ if (Records[I].Name.data() == nullptr) {
+ StringRef Result = NameStorage.save(computeTypeName(*this, Index));
+ Records[I].Name = Result;
+ }
+ return Records[I].Name;
+}
+
+bool LazyRandomTypeCollection::contains(TypeIndex Index) {
+ if (Index.isSimple() || Index.isNoneType())
+ return false;
+
+ if (Records.size() <= Index.toArrayIndex())
+ return false;
+ if (!Records[Index.toArrayIndex()].Type.valid())
+ return false;
+ return true;
+}
+
+uint32_t LazyRandomTypeCollection::size() { return Count; }
+
+uint32_t LazyRandomTypeCollection::capacity() { return Records.size(); }
+
+Error LazyRandomTypeCollection::ensureTypeExists(TypeIndex TI) {
+ if (contains(TI))
+ return Error::success();
+
+ return visitRangeForType(TI);
+}
+
+void LazyRandomTypeCollection::ensureCapacityFor(TypeIndex Index) {
+ assert(!Index.isSimple());
+ uint32_t MinSize = Index.toArrayIndex() + 1;
+
+ if (MinSize <= capacity())
+ return;
+
+ uint32_t NewCapacity = MinSize * 3 / 2;
+
+ assert(NewCapacity > capacity());
+ Records.resize(NewCapacity);
+}
+
+Error LazyRandomTypeCollection::visitRangeForType(TypeIndex TI) {
+ assert(!TI.isSimple());
+ if (PartialOffsets.empty())
+ return fullScanForType(TI);
+
auto Next = llvm::upper_bound(PartialOffsets, TI,
[](TypeIndex Value, const TypeIndexOffset &IO) {
return Value < IO.Type;
});
-
- assert(Next != PartialOffsets.begin());
- auto Prev = std::prev(Next);
-
- TypeIndex TIB = Prev->Type;
- if (contains(TIB)) {
- // They've asked us to fetch a type index, but the entry we found in the
- // partial offsets array has already been visited. Since we visit an entire
- // block every time, that means this record should have been previously
+
+ assert(Next != PartialOffsets.begin());
+ auto Prev = std::prev(Next);
+
+ TypeIndex TIB = Prev->Type;
+ if (contains(TIB)) {
+ // They've asked us to fetch a type index, but the entry we found in the
+ // partial offsets array has already been visited. Since we visit an entire
+ // block every time, that means this record should have been previously
// discovered. Ultimately, this means this is a request for a non-existent
- // type index.
- return make_error<CodeViewError>("Invalid type index");
- }
-
- TypeIndex TIE;
- if (Next == PartialOffsets.end()) {
- TIE = TypeIndex::fromArrayIndex(capacity());
- } else {
- TIE = Next->Type;
- }
-
- visitRange(TIB, Prev->Offset, TIE);
- return Error::success();
-}
-
-Optional<TypeIndex> LazyRandomTypeCollection::getFirst() {
- TypeIndex TI = TypeIndex::fromArrayIndex(0);
- if (auto EC = ensureTypeExists(TI)) {
- consumeError(std::move(EC));
- return None;
- }
- return TI;
-}
-
-Optional<TypeIndex> LazyRandomTypeCollection::getNext(TypeIndex Prev) {
- // We can't be sure how long this type stream is, given that the initial count
- // given to the constructor is just a hint. So just try to make sure the next
- // record exists, and if anything goes wrong, we must be at the end.
- if (auto EC = ensureTypeExists(Prev + 1)) {
- consumeError(std::move(EC));
- return None;
- }
-
- return Prev + 1;
-}
-
-Error LazyRandomTypeCollection::fullScanForType(TypeIndex TI) {
- assert(!TI.isSimple());
- assert(PartialOffsets.empty());
-
- TypeIndex CurrentTI = TypeIndex::fromArrayIndex(0);
- auto Begin = Types.begin();
-
- if (Count > 0) {
- // In the case of type streams which we don't know the number of records of,
- // it's possible to search for a type index triggering a full scan, but then
- // later additional records are added since we didn't know how many there
- // would be until we did a full visitation, then you try to access the new
- // type triggering another full scan. To avoid this, we assume that if the
- // database has some records, this must be what's going on. We can also
- // assume that this index must be larger than the largest type index we've
- // visited, so we start from there and scan forward.
- uint32_t Offset = Records[LargestTypeIndex.toArrayIndex()].Offset;
- CurrentTI = LargestTypeIndex + 1;
- Begin = Types.at(Offset);
- ++Begin;
- }
-
- auto End = Types.end();
- while (Begin != End) {
- ensureCapacityFor(CurrentTI);
- LargestTypeIndex = std::max(LargestTypeIndex, CurrentTI);
- auto Idx = CurrentTI.toArrayIndex();
- Records[Idx].Type = *Begin;
- Records[Idx].Offset = Begin.offset();
- ++Count;
- ++Begin;
- ++CurrentTI;
- }
- if (CurrentTI <= TI) {
- return make_error<CodeViewError>("Type Index does not exist!");
- }
- return Error::success();
-}
-
-void LazyRandomTypeCollection::visitRange(TypeIndex Begin, uint32_t BeginOffset,
- TypeIndex End) {
- auto RI = Types.at(BeginOffset);
- assert(RI != Types.end());
-
- ensureCapacityFor(End);
- while (Begin != End) {
- LargestTypeIndex = std::max(LargestTypeIndex, Begin);
- auto Idx = Begin.toArrayIndex();
- Records[Idx].Type = *RI;
- Records[Idx].Offset = RI.offset();
- ++Count;
- ++Begin;
- ++RI;
- }
-}
-
-bool LazyRandomTypeCollection::replaceType(TypeIndex &Index, CVType Data,
- bool Stabilize) {
- llvm_unreachable("Method cannot be called");
-}
+ // type index.
+ return make_error<CodeViewError>("Invalid type index");
+ }
+
+ TypeIndex TIE;
+ if (Next == PartialOffsets.end()) {
+ TIE = TypeIndex::fromArrayIndex(capacity());
+ } else {
+ TIE = Next->Type;
+ }
+
+ visitRange(TIB, Prev->Offset, TIE);
+ return Error::success();
+}
+
+Optional<TypeIndex> LazyRandomTypeCollection::getFirst() {
+ TypeIndex TI = TypeIndex::fromArrayIndex(0);
+ if (auto EC = ensureTypeExists(TI)) {
+ consumeError(std::move(EC));
+ return None;
+ }
+ return TI;
+}
+
+Optional<TypeIndex> LazyRandomTypeCollection::getNext(TypeIndex Prev) {
+ // We can't be sure how long this type stream is, given that the initial count
+ // given to the constructor is just a hint. So just try to make sure the next
+ // record exists, and if anything goes wrong, we must be at the end.
+ if (auto EC = ensureTypeExists(Prev + 1)) {
+ consumeError(std::move(EC));
+ return None;
+ }
+
+ return Prev + 1;
+}
+
+Error LazyRandomTypeCollection::fullScanForType(TypeIndex TI) {
+ assert(!TI.isSimple());
+ assert(PartialOffsets.empty());
+
+ TypeIndex CurrentTI = TypeIndex::fromArrayIndex(0);
+ auto Begin = Types.begin();
+
+ if (Count > 0) {
+ // In the case of type streams which we don't know the number of records of,
+ // it's possible to search for a type index triggering a full scan, but then
+ // later additional records are added since we didn't know how many there
+ // would be until we did a full visitation, then you try to access the new
+ // type triggering another full scan. To avoid this, we assume that if the
+ // database has some records, this must be what's going on. We can also
+ // assume that this index must be larger than the largest type index we've
+ // visited, so we start from there and scan forward.
+ uint32_t Offset = Records[LargestTypeIndex.toArrayIndex()].Offset;
+ CurrentTI = LargestTypeIndex + 1;
+ Begin = Types.at(Offset);
+ ++Begin;
+ }
+
+ auto End = Types.end();
+ while (Begin != End) {
+ ensureCapacityFor(CurrentTI);
+ LargestTypeIndex = std::max(LargestTypeIndex, CurrentTI);
+ auto Idx = CurrentTI.toArrayIndex();
+ Records[Idx].Type = *Begin;
+ Records[Idx].Offset = Begin.offset();
+ ++Count;
+ ++Begin;
+ ++CurrentTI;
+ }
+ if (CurrentTI <= TI) {
+ return make_error<CodeViewError>("Type Index does not exist!");
+ }
+ return Error::success();
+}
+
+void LazyRandomTypeCollection::visitRange(TypeIndex Begin, uint32_t BeginOffset,
+ TypeIndex End) {
+ auto RI = Types.at(BeginOffset);
+ assert(RI != Types.end());
+
+ ensureCapacityFor(End);
+ while (Begin != End) {
+ LargestTypeIndex = std::max(LargestTypeIndex, Begin);
+ auto Idx = Begin.toArrayIndex();
+ Records[Idx].Type = *RI;
+ Records[Idx].Offset = RI.offset();
+ ++Count;
+ ++Begin;
+ ++RI;
+ }
+}
+
+bool LazyRandomTypeCollection::replaceType(TypeIndex &Index, CVType Data,
+ bool Stabilize) {
+ llvm_unreachable("Method cannot be called");
+}
diff --git a/contrib/libs/llvm12/lib/DebugInfo/CodeView/Line.cpp b/contrib/libs/llvm12/lib/DebugInfo/CodeView/Line.cpp
index 247cd8d9bfe..53adc8cac51 100644
--- a/contrib/libs/llvm12/lib/DebugInfo/CodeView/Line.cpp
+++ b/contrib/libs/llvm12/lib/DebugInfo/CodeView/Line.cpp
@@ -1,21 +1,21 @@
-//===-- Line.cpp ----------------------------------------------------------===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-
-#include "llvm/DebugInfo/CodeView/Line.h"
-
-using namespace llvm;
-using namespace codeview;
-
-LineInfo::LineInfo(uint32_t StartLine, uint32_t EndLine, bool IsStatement) {
- LineData = StartLine & StartLineMask;
- uint32_t LineDelta = EndLine - StartLine;
- LineData |= (LineDelta << EndLineDeltaShift) & EndLineDeltaMask;
- if (IsStatement) {
- LineData |= StatementFlag;
- }
-}
+//===-- Line.cpp ----------------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "llvm/DebugInfo/CodeView/Line.h"
+
+using namespace llvm;
+using namespace codeview;
+
+LineInfo::LineInfo(uint32_t StartLine, uint32_t EndLine, bool IsStatement) {
+ LineData = StartLine & StartLineMask;
+ uint32_t LineDelta = EndLine - StartLine;
+ LineData |= (LineDelta << EndLineDeltaShift) & EndLineDeltaMask;
+ if (IsStatement) {
+ LineData |= StatementFlag;
+ }
+}
diff --git a/contrib/libs/llvm12/lib/DebugInfo/CodeView/MergingTypeTableBuilder.cpp b/contrib/libs/llvm12/lib/DebugInfo/CodeView/MergingTypeTableBuilder.cpp
index 67200a86aaf..13ce3ae82c2 100644
--- a/contrib/libs/llvm12/lib/DebugInfo/CodeView/MergingTypeTableBuilder.cpp
+++ b/contrib/libs/llvm12/lib/DebugInfo/CodeView/MergingTypeTableBuilder.cpp
@@ -1,152 +1,152 @@
-//===- MergingTypeTableBuilder.cpp ----------------------------------------===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-
-#include "llvm/DebugInfo/CodeView/MergingTypeTableBuilder.h"
-#include "llvm/ADT/ArrayRef.h"
-#include "llvm/ADT/DenseSet.h"
-#include "llvm/ADT/STLExtras.h"
-#include "llvm/DebugInfo/CodeView/CodeView.h"
-#include "llvm/DebugInfo/CodeView/ContinuationRecordBuilder.h"
-#include "llvm/DebugInfo/CodeView/RecordSerialization.h"
-#include "llvm/DebugInfo/CodeView/TypeIndex.h"
-#include "llvm/Support/Allocator.h"
-#include "llvm/Support/BinaryByteStream.h"
-#include "llvm/Support/BinaryStreamWriter.h"
-#include "llvm/Support/Endian.h"
-#include "llvm/Support/Error.h"
-#include <algorithm>
-#include <cassert>
-#include <cstdint>
-#include <cstring>
-
-using namespace llvm;
-using namespace llvm::codeview;
-
-TypeIndex MergingTypeTableBuilder::nextTypeIndex() const {
- return TypeIndex::fromArrayIndex(SeenRecords.size());
-}
-
-MergingTypeTableBuilder::MergingTypeTableBuilder(BumpPtrAllocator &Storage)
- : RecordStorage(Storage) {
- SeenRecords.reserve(4096);
-}
-
-MergingTypeTableBuilder::~MergingTypeTableBuilder() = default;
-
-Optional<TypeIndex> MergingTypeTableBuilder::getFirst() {
- if (empty())
- return None;
-
- return TypeIndex(TypeIndex::FirstNonSimpleIndex);
-}
-
-Optional<TypeIndex> MergingTypeTableBuilder::getNext(TypeIndex Prev) {
- if (++Prev == nextTypeIndex())
- return None;
- return Prev;
-}
-
-CVType MergingTypeTableBuilder::getType(TypeIndex Index) {
- CVType Type(SeenRecords[Index.toArrayIndex()]);
- return Type;
-}
-
-StringRef MergingTypeTableBuilder::getTypeName(TypeIndex Index) {
- llvm_unreachable("Method not implemented");
-}
-
-bool MergingTypeTableBuilder::contains(TypeIndex Index) {
- if (Index.isSimple() || Index.isNoneType())
- return false;
-
- return Index.toArrayIndex() < SeenRecords.size();
-}
-
-uint32_t MergingTypeTableBuilder::size() { return SeenRecords.size(); }
-
-uint32_t MergingTypeTableBuilder::capacity() { return SeenRecords.size(); }
-
-ArrayRef<ArrayRef<uint8_t>> MergingTypeTableBuilder::records() const {
- return SeenRecords;
-}
-
-void MergingTypeTableBuilder::reset() {
- HashedRecords.clear();
- SeenRecords.clear();
-}
-
-static inline ArrayRef<uint8_t> stabilize(BumpPtrAllocator &Alloc,
- ArrayRef<uint8_t> Data) {
- uint8_t *Stable = Alloc.Allocate<uint8_t>(Data.size());
- memcpy(Stable, Data.data(), Data.size());
- return makeArrayRef(Stable, Data.size());
-}
-
-TypeIndex MergingTypeTableBuilder::insertRecordAs(hash_code Hash,
- ArrayRef<uint8_t> &Record) {
- assert(Record.size() < UINT32_MAX && "Record too big");
- assert(Record.size() % 4 == 0 &&
- "The type record size is not a multiple of 4 bytes which will cause "
- "misalignment in the output TPI stream!");
-
- LocallyHashedType WeakHash{Hash, Record};
- auto Result = HashedRecords.try_emplace(WeakHash, nextTypeIndex());
-
- if (Result.second) {
- ArrayRef<uint8_t> RecordData = stabilize(RecordStorage, Record);
- Result.first->first.RecordData = RecordData;
- SeenRecords.push_back(RecordData);
- }
-
- // Update the caller's copy of Record to point a stable copy.
- TypeIndex ActualTI = Result.first->second;
- Record = SeenRecords[ActualTI.toArrayIndex()];
- return ActualTI;
-}
-
-TypeIndex
-MergingTypeTableBuilder::insertRecordBytes(ArrayRef<uint8_t> &Record) {
- return insertRecordAs(hash_value(Record), Record);
-}
-
-TypeIndex
-MergingTypeTableBuilder::insertRecord(ContinuationRecordBuilder &Builder) {
- TypeIndex TI;
- auto Fragments = Builder.end(nextTypeIndex());
- assert(!Fragments.empty());
- for (auto C : Fragments)
- TI = insertRecordBytes(C.RecordData);
- return TI;
-}
-
-bool MergingTypeTableBuilder::replaceType(TypeIndex &Index, CVType Data,
- bool Stabilize) {
- assert(Index.toArrayIndex() < SeenRecords.size() &&
- "This function cannot be used to insert records!");
-
- ArrayRef<uint8_t> Record = Data.data();
- assert(Record.size() < UINT32_MAX && "Record too big");
- assert(Record.size() % 4 == 0 &&
- "The type record size is not a multiple of 4 bytes which will cause "
- "misalignment in the output TPI stream!");
-
- LocallyHashedType WeakHash{hash_value(Record), Record};
- auto Result = HashedRecords.try_emplace(WeakHash, Index.toArrayIndex());
- if (!Result.second) {
- Index = Result.first->second;
- return false; // The record is already there, at a different location
- }
-
- if (Stabilize) {
- Record = stabilize(RecordStorage, Record);
- Result.first->first.RecordData = Record;
- }
-
- SeenRecords[Index.toArrayIndex()] = Record;
- return true;
-}
+//===- MergingTypeTableBuilder.cpp ----------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "llvm/DebugInfo/CodeView/MergingTypeTableBuilder.h"
+#include "llvm/ADT/ArrayRef.h"
+#include "llvm/ADT/DenseSet.h"
+#include "llvm/ADT/STLExtras.h"
+#include "llvm/DebugInfo/CodeView/CodeView.h"
+#include "llvm/DebugInfo/CodeView/ContinuationRecordBuilder.h"
+#include "llvm/DebugInfo/CodeView/RecordSerialization.h"
+#include "llvm/DebugInfo/CodeView/TypeIndex.h"
+#include "llvm/Support/Allocator.h"
+#include "llvm/Support/BinaryByteStream.h"
+#include "llvm/Support/BinaryStreamWriter.h"
+#include "llvm/Support/Endian.h"
+#include "llvm/Support/Error.h"
+#include <algorithm>
+#include <cassert>
+#include <cstdint>
+#include <cstring>
+
+using namespace llvm;
+using namespace llvm::codeview;
+
+TypeIndex MergingTypeTableBuilder::nextTypeIndex() const {
+ return TypeIndex::fromArrayIndex(SeenRecords.size());
+}
+
+MergingTypeTableBuilder::MergingTypeTableBuilder(BumpPtrAllocator &Storage)
+ : RecordStorage(Storage) {
+ SeenRecords.reserve(4096);
+}
+
+MergingTypeTableBuilder::~MergingTypeTableBuilder() = default;
+
+Optional<TypeIndex> MergingTypeTableBuilder::getFirst() {
+ if (empty())
+ return None;
+
+ return TypeIndex(TypeIndex::FirstNonSimpleIndex);
+}
+
+Optional<TypeIndex> MergingTypeTableBuilder::getNext(TypeIndex Prev) {
+ if (++Prev == nextTypeIndex())
+ return None;
+ return Prev;
+}
+
+CVType MergingTypeTableBuilder::getType(TypeIndex Index) {
+ CVType Type(SeenRecords[Index.toArrayIndex()]);
+ return Type;
+}
+
+StringRef MergingTypeTableBuilder::getTypeName(TypeIndex Index) {
+ llvm_unreachable("Method not implemented");
+}
+
+bool MergingTypeTableBuilder::contains(TypeIndex Index) {
+ if (Index.isSimple() || Index.isNoneType())
+ return false;
+
+ return Index.toArrayIndex() < SeenRecords.size();
+}
+
+uint32_t MergingTypeTableBuilder::size() { return SeenRecords.size(); }
+
+uint32_t MergingTypeTableBuilder::capacity() { return SeenRecords.size(); }
+
+ArrayRef<ArrayRef<uint8_t>> MergingTypeTableBuilder::records() const {
+ return SeenRecords;
+}
+
+void MergingTypeTableBuilder::reset() {
+ HashedRecords.clear();
+ SeenRecords.clear();
+}
+
+static inline ArrayRef<uint8_t> stabilize(BumpPtrAllocator &Alloc,
+ ArrayRef<uint8_t> Data) {
+ uint8_t *Stable = Alloc.Allocate<uint8_t>(Data.size());
+ memcpy(Stable, Data.data(), Data.size());
+ return makeArrayRef(Stable, Data.size());
+}
+
+TypeIndex MergingTypeTableBuilder::insertRecordAs(hash_code Hash,
+ ArrayRef<uint8_t> &Record) {
+ assert(Record.size() < UINT32_MAX && "Record too big");
+ assert(Record.size() % 4 == 0 &&
+ "The type record size is not a multiple of 4 bytes which will cause "
+ "misalignment in the output TPI stream!");
+
+ LocallyHashedType WeakHash{Hash, Record};
+ auto Result = HashedRecords.try_emplace(WeakHash, nextTypeIndex());
+
+ if (Result.second) {
+ ArrayRef<uint8_t> RecordData = stabilize(RecordStorage, Record);
+ Result.first->first.RecordData = RecordData;
+ SeenRecords.push_back(RecordData);
+ }
+
+ // Update the caller's copy of Record to point a stable copy.
+ TypeIndex ActualTI = Result.first->second;
+ Record = SeenRecords[ActualTI.toArrayIndex()];
+ return ActualTI;
+}
+
+TypeIndex
+MergingTypeTableBuilder::insertRecordBytes(ArrayRef<uint8_t> &Record) {
+ return insertRecordAs(hash_value(Record), Record);
+}
+
+TypeIndex
+MergingTypeTableBuilder::insertRecord(ContinuationRecordBuilder &Builder) {
+ TypeIndex TI;
+ auto Fragments = Builder.end(nextTypeIndex());
+ assert(!Fragments.empty());
+ for (auto C : Fragments)
+ TI = insertRecordBytes(C.RecordData);
+ return TI;
+}
+
+bool MergingTypeTableBuilder::replaceType(TypeIndex &Index, CVType Data,
+ bool Stabilize) {
+ assert(Index.toArrayIndex() < SeenRecords.size() &&
+ "This function cannot be used to insert records!");
+
+ ArrayRef<uint8_t> Record = Data.data();
+ assert(Record.size() < UINT32_MAX && "Record too big");
+ assert(Record.size() % 4 == 0 &&
+ "The type record size is not a multiple of 4 bytes which will cause "
+ "misalignment in the output TPI stream!");
+
+ LocallyHashedType WeakHash{hash_value(Record), Record};
+ auto Result = HashedRecords.try_emplace(WeakHash, Index.toArrayIndex());
+ if (!Result.second) {
+ Index = Result.first->second;
+ return false; // The record is already there, at a different location
+ }
+
+ if (Stabilize) {
+ Record = stabilize(RecordStorage, Record);
+ Result.first->first.RecordData = Record;
+ }
+
+ SeenRecords[Index.toArrayIndex()] = Record;
+ return true;
+}
diff --git a/contrib/libs/llvm12/lib/DebugInfo/CodeView/RecordName.cpp b/contrib/libs/llvm12/lib/DebugInfo/CodeView/RecordName.cpp
index 9bec737a4ba..1ca899789be 100644
--- a/contrib/libs/llvm12/lib/DebugInfo/CodeView/RecordName.cpp
+++ b/contrib/libs/llvm12/lib/DebugInfo/CodeView/RecordName.cpp
@@ -1,339 +1,339 @@
-//===- RecordName.cpp ----------------------------------------- *- C++ --*-===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-
-#include "llvm/DebugInfo/CodeView/RecordName.h"
-
-#include "llvm/ADT/SmallString.h"
+//===- RecordName.cpp ----------------------------------------- *- C++ --*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "llvm/DebugInfo/CodeView/RecordName.h"
+
+#include "llvm/ADT/SmallString.h"
#include "llvm/ADT/StringExtras.h"
-#include "llvm/DebugInfo/CodeView/CVSymbolVisitor.h"
-#include "llvm/DebugInfo/CodeView/CVTypeVisitor.h"
-#include "llvm/DebugInfo/CodeView/SymbolRecordMapping.h"
-#include "llvm/DebugInfo/CodeView/TypeVisitorCallbacks.h"
-#include "llvm/Support/FormatVariadic.h"
-
-using namespace llvm;
-using namespace llvm::codeview;
-
-namespace {
-class TypeNameComputer : public TypeVisitorCallbacks {
- /// The type collection. Used to calculate names of nested types.
- TypeCollection &Types;
- TypeIndex CurrentTypeIndex = TypeIndex::None();
-
- /// Name of the current type. Only valid before visitTypeEnd.
- SmallString<256> Name;
-
-public:
- explicit TypeNameComputer(TypeCollection &Types) : Types(Types) {}
-
- StringRef name() const { return Name; }
-
- /// Paired begin/end actions for all types. Receives all record data,
- /// including the fixed-length record prefix.
- Error visitTypeBegin(CVType &Record) override;
- Error visitTypeBegin(CVType &Record, TypeIndex Index) override;
- Error visitTypeEnd(CVType &Record) override;
-
-#define TYPE_RECORD(EnumName, EnumVal, Name) \
- Error visitKnownRecord(CVType &CVR, Name##Record &Record) override;
-#define TYPE_RECORD_ALIAS(EnumName, EnumVal, Name, AliasName)
-#define MEMBER_RECORD(EnumName, EnumVal, Name)
-#include "llvm/DebugInfo/CodeView/CodeViewTypes.def"
-};
-} // namespace
-
-Error TypeNameComputer::visitTypeBegin(CVType &Record) {
- llvm_unreachable("Must call visitTypeBegin with a TypeIndex!");
- return Error::success();
-}
-
-Error TypeNameComputer::visitTypeBegin(CVType &Record, TypeIndex Index) {
- // Reset Name to the empty string. If the visitor sets it, we know it.
- Name = "";
- CurrentTypeIndex = Index;
- return Error::success();
-}
-
-Error TypeNameComputer::visitTypeEnd(CVType &CVR) { return Error::success(); }
-
-Error TypeNameComputer::visitKnownRecord(CVType &CVR,
- FieldListRecord &FieldList) {
- Name = "<field list>";
- return Error::success();
-}
-
-Error TypeNameComputer::visitKnownRecord(CVRecord<TypeLeafKind> &CVR,
- StringIdRecord &String) {
- Name = String.getString();
- return Error::success();
-}
-
-Error TypeNameComputer::visitKnownRecord(CVType &CVR, ArgListRecord &Args) {
- auto Indices = Args.getIndices();
- uint32_t Size = Indices.size();
- Name = "(";
- for (uint32_t I = 0; I < Size; ++I) {
+#include "llvm/DebugInfo/CodeView/CVSymbolVisitor.h"
+#include "llvm/DebugInfo/CodeView/CVTypeVisitor.h"
+#include "llvm/DebugInfo/CodeView/SymbolRecordMapping.h"
+#include "llvm/DebugInfo/CodeView/TypeVisitorCallbacks.h"
+#include "llvm/Support/FormatVariadic.h"
+
+using namespace llvm;
+using namespace llvm::codeview;
+
+namespace {
+class TypeNameComputer : public TypeVisitorCallbacks {
+ /// The type collection. Used to calculate names of nested types.
+ TypeCollection &Types;
+ TypeIndex CurrentTypeIndex = TypeIndex::None();
+
+ /// Name of the current type. Only valid before visitTypeEnd.
+ SmallString<256> Name;
+
+public:
+ explicit TypeNameComputer(TypeCollection &Types) : Types(Types) {}
+
+ StringRef name() const { return Name; }
+
+ /// Paired begin/end actions for all types. Receives all record data,
+ /// including the fixed-length record prefix.
+ Error visitTypeBegin(CVType &Record) override;
+ Error visitTypeBegin(CVType &Record, TypeIndex Index) override;
+ Error visitTypeEnd(CVType &Record) override;
+
+#define TYPE_RECORD(EnumName, EnumVal, Name) \
+ Error visitKnownRecord(CVType &CVR, Name##Record &Record) override;
+#define TYPE_RECORD_ALIAS(EnumName, EnumVal, Name, AliasName)
+#define MEMBER_RECORD(EnumName, EnumVal, Name)
+#include "llvm/DebugInfo/CodeView/CodeViewTypes.def"
+};
+} // namespace
+
+Error TypeNameComputer::visitTypeBegin(CVType &Record) {
+ llvm_unreachable("Must call visitTypeBegin with a TypeIndex!");
+ return Error::success();
+}
+
+Error TypeNameComputer::visitTypeBegin(CVType &Record, TypeIndex Index) {
+ // Reset Name to the empty string. If the visitor sets it, we know it.
+ Name = "";
+ CurrentTypeIndex = Index;
+ return Error::success();
+}
+
+Error TypeNameComputer::visitTypeEnd(CVType &CVR) { return Error::success(); }
+
+Error TypeNameComputer::visitKnownRecord(CVType &CVR,
+ FieldListRecord &FieldList) {
+ Name = "<field list>";
+ return Error::success();
+}
+
+Error TypeNameComputer::visitKnownRecord(CVRecord<TypeLeafKind> &CVR,
+ StringIdRecord &String) {
+ Name = String.getString();
+ return Error::success();
+}
+
+Error TypeNameComputer::visitKnownRecord(CVType &CVR, ArgListRecord &Args) {
+ auto Indices = Args.getIndices();
+ uint32_t Size = Indices.size();
+ Name = "(";
+ for (uint32_t I = 0; I < Size; ++I) {
if (Indices[I] < CurrentTypeIndex)
Name.append(Types.getTypeName(Indices[I]));
else
Name.append("<unknown 0x" + utohexstr(Indices[I].getIndex()) + ">");
- if (I + 1 != Size)
- Name.append(", ");
- }
- Name.push_back(')');
- return Error::success();
-}
-
-Error TypeNameComputer::visitKnownRecord(CVType &CVR,
- StringListRecord &Strings) {
- auto Indices = Strings.getIndices();
- uint32_t Size = Indices.size();
- Name = "\"";
- for (uint32_t I = 0; I < Size; ++I) {
- Name.append(Types.getTypeName(Indices[I]));
- if (I + 1 != Size)
- Name.append("\" \"");
- }
- Name.push_back('\"');
- return Error::success();
-}
-
-Error TypeNameComputer::visitKnownRecord(CVType &CVR, ClassRecord &Class) {
- Name = Class.getName();
- return Error::success();
-}
-
-Error TypeNameComputer::visitKnownRecord(CVType &CVR, UnionRecord &Union) {
- Name = Union.getName();
- return Error::success();
-}
-
-Error TypeNameComputer::visitKnownRecord(CVType &CVR, EnumRecord &Enum) {
- Name = Enum.getName();
- return Error::success();
-}
-
-Error TypeNameComputer::visitKnownRecord(CVType &CVR, ArrayRecord &AT) {
- Name = AT.getName();
- return Error::success();
-}
-
-Error TypeNameComputer::visitKnownRecord(CVType &CVR, VFTableRecord &VFT) {
- Name = VFT.getName();
- return Error::success();
-}
-
-Error TypeNameComputer::visitKnownRecord(CVType &CVR, MemberFuncIdRecord &Id) {
- Name = Id.getName();
- return Error::success();
-}
-
-Error TypeNameComputer::visitKnownRecord(CVType &CVR, ProcedureRecord &Proc) {
- StringRef Ret = Types.getTypeName(Proc.getReturnType());
- StringRef Params = Types.getTypeName(Proc.getArgumentList());
- Name = formatv("{0} {1}", Ret, Params).sstr<256>();
- return Error::success();
-}
-
-Error TypeNameComputer::visitKnownRecord(CVType &CVR,
- MemberFunctionRecord &MF) {
- StringRef Ret = Types.getTypeName(MF.getReturnType());
- StringRef Class = Types.getTypeName(MF.getClassType());
- StringRef Params = Types.getTypeName(MF.getArgumentList());
- Name = formatv("{0} {1}::{2}", Ret, Class, Params).sstr<256>();
- return Error::success();
-}
-
-Error TypeNameComputer::visitKnownRecord(CVType &CVR, FuncIdRecord &Func) {
- Name = Func.getName();
- return Error::success();
-}
-
-Error TypeNameComputer::visitKnownRecord(CVType &CVR, TypeServer2Record &TS) {
- Name = TS.getName();
- return Error::success();
-}
-
-Error TypeNameComputer::visitKnownRecord(CVType &CVR, PointerRecord &Ptr) {
-
- if (Ptr.isPointerToMember()) {
- const MemberPointerInfo &MI = Ptr.getMemberInfo();
-
- StringRef Pointee = Types.getTypeName(Ptr.getReferentType());
- StringRef Class = Types.getTypeName(MI.getContainingType());
- Name = formatv("{0} {1}::*", Pointee, Class);
- } else {
- Name.append(Types.getTypeName(Ptr.getReferentType()));
-
- if (Ptr.getMode() == PointerMode::LValueReference)
- Name.append("&");
- else if (Ptr.getMode() == PointerMode::RValueReference)
- Name.append("&&");
- else if (Ptr.getMode() == PointerMode::Pointer)
- Name.append("*");
-
- // Qualifiers in pointer records apply to the pointer, not the pointee, so
- // they go on the right.
- if (Ptr.isConst())
- Name.append(" const");
- if (Ptr.isVolatile())
- Name.append(" volatile");
- if (Ptr.isUnaligned())
- Name.append(" __unaligned");
- if (Ptr.isRestrict())
- Name.append(" __restrict");
- }
- return Error::success();
-}
-
-Error TypeNameComputer::visitKnownRecord(CVType &CVR, ModifierRecord &Mod) {
- uint16_t Mods = static_cast<uint16_t>(Mod.getModifiers());
-
- if (Mods & uint16_t(ModifierOptions::Const))
- Name.append("const ");
- if (Mods & uint16_t(ModifierOptions::Volatile))
- Name.append("volatile ");
- if (Mods & uint16_t(ModifierOptions::Unaligned))
- Name.append("__unaligned ");
- Name.append(Types.getTypeName(Mod.getModifiedType()));
- return Error::success();
-}
-
-Error TypeNameComputer::visitKnownRecord(CVType &CVR,
- VFTableShapeRecord &Shape) {
- Name = formatv("<vftable {0} methods>", Shape.getEntryCount());
- return Error::success();
-}
-
-Error TypeNameComputer::visitKnownRecord(
- CVType &CVR, UdtModSourceLineRecord &ModSourceLine) {
- return Error::success();
-}
-
-Error TypeNameComputer::visitKnownRecord(CVType &CVR,
- UdtSourceLineRecord &SourceLine) {
- return Error::success();
-}
-
-Error TypeNameComputer::visitKnownRecord(CVType &CVR, BitFieldRecord &BF) {
- return Error::success();
-}
-
-Error TypeNameComputer::visitKnownRecord(CVType &CVR,
- MethodOverloadListRecord &Overloads) {
- return Error::success();
-}
-
-Error TypeNameComputer::visitKnownRecord(CVType &CVR, BuildInfoRecord &BI) {
- return Error::success();
-}
-
-Error TypeNameComputer::visitKnownRecord(CVType &CVR, LabelRecord &R) {
- return Error::success();
-}
-
-Error TypeNameComputer::visitKnownRecord(CVType &CVR,
- PrecompRecord &Precomp) {
- return Error::success();
-}
-
-Error TypeNameComputer::visitKnownRecord(CVType &CVR,
- EndPrecompRecord &EndPrecomp) {
- return Error::success();
-}
-
-std::string llvm::codeview::computeTypeName(TypeCollection &Types,
- TypeIndex Index) {
- TypeNameComputer Computer(Types);
- CVType Record = Types.getType(Index);
- if (auto EC = visitTypeRecord(Record, Index, Computer)) {
- consumeError(std::move(EC));
- return "<unknown UDT>";
- }
- return std::string(Computer.name());
-}
-
-static int getSymbolNameOffset(CVSymbol Sym) {
- switch (Sym.kind()) {
- // See ProcSym
- case SymbolKind::S_GPROC32:
- case SymbolKind::S_LPROC32:
- case SymbolKind::S_GPROC32_ID:
- case SymbolKind::S_LPROC32_ID:
- case SymbolKind::S_LPROC32_DPC:
- case SymbolKind::S_LPROC32_DPC_ID:
- return 35;
- // See Thunk32Sym
- case SymbolKind::S_THUNK32:
- return 21;
- // See SectionSym
- case SymbolKind::S_SECTION:
- return 16;
- // See CoffGroupSym
- case SymbolKind::S_COFFGROUP:
- return 14;
- // See PublicSym32, FileStaticSym, RegRelativeSym, DataSym, ThreadLocalDataSym
- case SymbolKind::S_PUB32:
- case SymbolKind::S_FILESTATIC:
- case SymbolKind::S_REGREL32:
- case SymbolKind::S_GDATA32:
- case SymbolKind::S_LDATA32:
- case SymbolKind::S_LMANDATA:
- case SymbolKind::S_GMANDATA:
- case SymbolKind::S_LTHREAD32:
- case SymbolKind::S_GTHREAD32:
- case SymbolKind::S_PROCREF:
- case SymbolKind::S_LPROCREF:
- return 10;
- // See RegisterSym and LocalSym
- case SymbolKind::S_REGISTER:
- case SymbolKind::S_LOCAL:
- return 6;
- // See BlockSym
- case SymbolKind::S_BLOCK32:
- return 18;
- // See LabelSym
- case SymbolKind::S_LABEL32:
- return 7;
- // See ObjNameSym, ExportSym, and UDTSym
- case SymbolKind::S_OBJNAME:
- case SymbolKind::S_EXPORT:
- case SymbolKind::S_UDT:
- return 4;
- // See BPRelativeSym
- case SymbolKind::S_BPREL32:
- return 8;
- // See UsingNamespaceSym
- case SymbolKind::S_UNAMESPACE:
- return 0;
- default:
- return -1;
- }
-}
-
-StringRef llvm::codeview::getSymbolName(CVSymbol Sym) {
- if (Sym.kind() == SymbolKind::S_CONSTANT) {
- // S_CONSTANT is preceded by an APSInt, which has a variable length. So we
- // have to do a full deserialization.
- BinaryStreamReader Reader(Sym.content(), llvm::support::little);
- // The container doesn't matter for single records.
- SymbolRecordMapping Mapping(Reader, CodeViewContainer::ObjectFile);
- ConstantSym Const(SymbolKind::S_CONSTANT);
- cantFail(Mapping.visitSymbolBegin(Sym));
- cantFail(Mapping.visitKnownRecord(Sym, Const));
- cantFail(Mapping.visitSymbolEnd(Sym));
- return Const.Name;
- }
-
- int Offset = getSymbolNameOffset(Sym);
- if (Offset == -1)
- return StringRef();
-
- StringRef StringData = toStringRef(Sym.content()).drop_front(Offset);
- return StringData.split('\0').first;
-}
+ if (I + 1 != Size)
+ Name.append(", ");
+ }
+ Name.push_back(')');
+ return Error::success();
+}
+
+Error TypeNameComputer::visitKnownRecord(CVType &CVR,
+ StringListRecord &Strings) {
+ auto Indices = Strings.getIndices();
+ uint32_t Size = Indices.size();
+ Name = "\"";
+ for (uint32_t I = 0; I < Size; ++I) {
+ Name.append(Types.getTypeName(Indices[I]));
+ if (I + 1 != Size)
+ Name.append("\" \"");
+ }
+ Name.push_back('\"');
+ return Error::success();
+}
+
+Error TypeNameComputer::visitKnownRecord(CVType &CVR, ClassRecord &Class) {
+ Name = Class.getName();
+ return Error::success();
+}
+
+Error TypeNameComputer::visitKnownRecord(CVType &CVR, UnionRecord &Union) {
+ Name = Union.getName();
+ return Error::success();
+}
+
+Error TypeNameComputer::visitKnownRecord(CVType &CVR, EnumRecord &Enum) {
+ Name = Enum.getName();
+ return Error::success();
+}
+
+Error TypeNameComputer::visitKnownRecord(CVType &CVR, ArrayRecord &AT) {
+ Name = AT.getName();
+ return Error::success();
+}
+
+Error TypeNameComputer::visitKnownRecord(CVType &CVR, VFTableRecord &VFT) {
+ Name = VFT.getName();
+ return Error::success();
+}
+
+Error TypeNameComputer::visitKnownRecord(CVType &CVR, MemberFuncIdRecord &Id) {
+ Name = Id.getName();
+ return Error::success();
+}
+
+Error TypeNameComputer::visitKnownRecord(CVType &CVR, ProcedureRecord &Proc) {
+ StringRef Ret = Types.getTypeName(Proc.getReturnType());
+ StringRef Params = Types.getTypeName(Proc.getArgumentList());
+ Name = formatv("{0} {1}", Ret, Params).sstr<256>();
+ return Error::success();
+}
+
+Error TypeNameComputer::visitKnownRecord(CVType &CVR,
+ MemberFunctionRecord &MF) {
+ StringRef Ret = Types.getTypeName(MF.getReturnType());
+ StringRef Class = Types.getTypeName(MF.getClassType());
+ StringRef Params = Types.getTypeName(MF.getArgumentList());
+ Name = formatv("{0} {1}::{2}", Ret, Class, Params).sstr<256>();
+ return Error::success();
+}
+
+Error TypeNameComputer::visitKnownRecord(CVType &CVR, FuncIdRecord &Func) {
+ Name = Func.getName();
+ return Error::success();
+}
+
+Error TypeNameComputer::visitKnownRecord(CVType &CVR, TypeServer2Record &TS) {
+ Name = TS.getName();
+ return Error::success();
+}
+
+Error TypeNameComputer::visitKnownRecord(CVType &CVR, PointerRecord &Ptr) {
+
+ if (Ptr.isPointerToMember()) {
+ const MemberPointerInfo &MI = Ptr.getMemberInfo();
+
+ StringRef Pointee = Types.getTypeName(Ptr.getReferentType());
+ StringRef Class = Types.getTypeName(MI.getContainingType());
+ Name = formatv("{0} {1}::*", Pointee, Class);
+ } else {
+ Name.append(Types.getTypeName(Ptr.getReferentType()));
+
+ if (Ptr.getMode() == PointerMode::LValueReference)
+ Name.append("&");
+ else if (Ptr.getMode() == PointerMode::RValueReference)
+ Name.append("&&");
+ else if (Ptr.getMode() == PointerMode::Pointer)
+ Name.append("*");
+
+ // Qualifiers in pointer records apply to the pointer, not the pointee, so
+ // they go on the right.
+ if (Ptr.isConst())
+ Name.append(" const");
+ if (Ptr.isVolatile())
+ Name.append(" volatile");
+ if (Ptr.isUnaligned())
+ Name.append(" __unaligned");
+ if (Ptr.isRestrict())
+ Name.append(" __restrict");
+ }
+ return Error::success();
+}
+
+Error TypeNameComputer::visitKnownRecord(CVType &CVR, ModifierRecord &Mod) {
+ uint16_t Mods = static_cast<uint16_t>(Mod.getModifiers());
+
+ if (Mods & uint16_t(ModifierOptions::Const))
+ Name.append("const ");
+ if (Mods & uint16_t(ModifierOptions::Volatile))
+ Name.append("volatile ");
+ if (Mods & uint16_t(ModifierOptions::Unaligned))
+ Name.append("__unaligned ");
+ Name.append(Types.getTypeName(Mod.getModifiedType()));
+ return Error::success();
+}
+
+Error TypeNameComputer::visitKnownRecord(CVType &CVR,
+ VFTableShapeRecord &Shape) {
+ Name = formatv("<vftable {0} methods>", Shape.getEntryCount());
+ return Error::success();
+}
+
+Error TypeNameComputer::visitKnownRecord(
+ CVType &CVR, UdtModSourceLineRecord &ModSourceLine) {
+ return Error::success();
+}
+
+Error TypeNameComputer::visitKnownRecord(CVType &CVR,
+ UdtSourceLineRecord &SourceLine) {
+ return Error::success();
+}
+
+Error TypeNameComputer::visitKnownRecord(CVType &CVR, BitFieldRecord &BF) {
+ return Error::success();
+}
+
+Error TypeNameComputer::visitKnownRecord(CVType &CVR,
+ MethodOverloadListRecord &Overloads) {
+ return Error::success();
+}
+
+Error TypeNameComputer::visitKnownRecord(CVType &CVR, BuildInfoRecord &BI) {
+ return Error::success();
+}
+
+Error TypeNameComputer::visitKnownRecord(CVType &CVR, LabelRecord &R) {
+ return Error::success();
+}
+
+Error TypeNameComputer::visitKnownRecord(CVType &CVR,
+ PrecompRecord &Precomp) {
+ return Error::success();
+}
+
+Error TypeNameComputer::visitKnownRecord(CVType &CVR,
+ EndPrecompRecord &EndPrecomp) {
+ return Error::success();
+}
+
+std::string llvm::codeview::computeTypeName(TypeCollection &Types,
+ TypeIndex Index) {
+ TypeNameComputer Computer(Types);
+ CVType Record = Types.getType(Index);
+ if (auto EC = visitTypeRecord(Record, Index, Computer)) {
+ consumeError(std::move(EC));
+ return "<unknown UDT>";
+ }
+ return std::string(Computer.name());
+}
+
+static int getSymbolNameOffset(CVSymbol Sym) {
+ switch (Sym.kind()) {
+ // See ProcSym
+ case SymbolKind::S_GPROC32:
+ case SymbolKind::S_LPROC32:
+ case SymbolKind::S_GPROC32_ID:
+ case SymbolKind::S_LPROC32_ID:
+ case SymbolKind::S_LPROC32_DPC:
+ case SymbolKind::S_LPROC32_DPC_ID:
+ return 35;
+ // See Thunk32Sym
+ case SymbolKind::S_THUNK32:
+ return 21;
+ // See SectionSym
+ case SymbolKind::S_SECTION:
+ return 16;
+ // See CoffGroupSym
+ case SymbolKind::S_COFFGROUP:
+ return 14;
+ // See PublicSym32, FileStaticSym, RegRelativeSym, DataSym, ThreadLocalDataSym
+ case SymbolKind::S_PUB32:
+ case SymbolKind::S_FILESTATIC:
+ case SymbolKind::S_REGREL32:
+ case SymbolKind::S_GDATA32:
+ case SymbolKind::S_LDATA32:
+ case SymbolKind::S_LMANDATA:
+ case SymbolKind::S_GMANDATA:
+ case SymbolKind::S_LTHREAD32:
+ case SymbolKind::S_GTHREAD32:
+ case SymbolKind::S_PROCREF:
+ case SymbolKind::S_LPROCREF:
+ return 10;
+ // See RegisterSym and LocalSym
+ case SymbolKind::S_REGISTER:
+ case SymbolKind::S_LOCAL:
+ return 6;
+ // See BlockSym
+ case SymbolKind::S_BLOCK32:
+ return 18;
+ // See LabelSym
+ case SymbolKind::S_LABEL32:
+ return 7;
+ // See ObjNameSym, ExportSym, and UDTSym
+ case SymbolKind::S_OBJNAME:
+ case SymbolKind::S_EXPORT:
+ case SymbolKind::S_UDT:
+ return 4;
+ // See BPRelativeSym
+ case SymbolKind::S_BPREL32:
+ return 8;
+ // See UsingNamespaceSym
+ case SymbolKind::S_UNAMESPACE:
+ return 0;
+ default:
+ return -1;
+ }
+}
+
+StringRef llvm::codeview::getSymbolName(CVSymbol Sym) {
+ if (Sym.kind() == SymbolKind::S_CONSTANT) {
+ // S_CONSTANT is preceded by an APSInt, which has a variable length. So we
+ // have to do a full deserialization.
+ BinaryStreamReader Reader(Sym.content(), llvm::support::little);
+ // The container doesn't matter for single records.
+ SymbolRecordMapping Mapping(Reader, CodeViewContainer::ObjectFile);
+ ConstantSym Const(SymbolKind::S_CONSTANT);
+ cantFail(Mapping.visitSymbolBegin(Sym));
+ cantFail(Mapping.visitKnownRecord(Sym, Const));
+ cantFail(Mapping.visitSymbolEnd(Sym));
+ return Const.Name;
+ }
+
+ int Offset = getSymbolNameOffset(Sym);
+ if (Offset == -1)
+ return StringRef();
+
+ StringRef StringData = toStringRef(Sym.content()).drop_front(Offset);
+ return StringData.split('\0').first;
+}
diff --git a/contrib/libs/llvm12/lib/DebugInfo/CodeView/RecordSerialization.cpp b/contrib/libs/llvm12/lib/DebugInfo/CodeView/RecordSerialization.cpp
index ff364069ee3..63ce302a4e0 100644
--- a/contrib/libs/llvm12/lib/DebugInfo/CodeView/RecordSerialization.cpp
+++ b/contrib/libs/llvm12/lib/DebugInfo/CodeView/RecordSerialization.cpp
@@ -1,154 +1,154 @@
-//===-- RecordSerialization.cpp -------------------------------------------===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-//
-// Utilities for serializing and deserializing CodeView records.
-//
-//===----------------------------------------------------------------------===//
-
-#include "llvm/DebugInfo/CodeView/RecordSerialization.h"
-#include "llvm/ADT/APInt.h"
-#include "llvm/ADT/APSInt.h"
-#include "llvm/DebugInfo/CodeView/CodeViewError.h"
-#include "llvm/DebugInfo/CodeView/SymbolRecord.h"
-#include "llvm/DebugInfo/CodeView/TypeRecord.h"
-#include "llvm/Support/BinaryByteStream.h"
-
-using namespace llvm;
-using namespace llvm::codeview;
-using namespace llvm::support;
-
-/// Reinterpret a byte array as an array of characters. Does not interpret as
-/// a C string, as StringRef has several helpers (split) that make that easy.
-StringRef llvm::codeview::getBytesAsCharacters(ArrayRef<uint8_t> LeafData) {
- return StringRef(reinterpret_cast<const char *>(LeafData.data()),
- LeafData.size());
-}
-
-StringRef llvm::codeview::getBytesAsCString(ArrayRef<uint8_t> LeafData) {
- return getBytesAsCharacters(LeafData).split('\0').first;
-}
-
-Error llvm::codeview::consume(BinaryStreamReader &Reader, APSInt &Num) {
+//===-- RecordSerialization.cpp -------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+//
+// Utilities for serializing and deserializing CodeView records.
+//
+//===----------------------------------------------------------------------===//
+
+#include "llvm/DebugInfo/CodeView/RecordSerialization.h"
+#include "llvm/ADT/APInt.h"
+#include "llvm/ADT/APSInt.h"
+#include "llvm/DebugInfo/CodeView/CodeViewError.h"
+#include "llvm/DebugInfo/CodeView/SymbolRecord.h"
+#include "llvm/DebugInfo/CodeView/TypeRecord.h"
+#include "llvm/Support/BinaryByteStream.h"
+
+using namespace llvm;
+using namespace llvm::codeview;
+using namespace llvm::support;
+
+/// Reinterpret a byte array as an array of characters. Does not interpret as
+/// a C string, as StringRef has several helpers (split) that make that easy.
+StringRef llvm::codeview::getBytesAsCharacters(ArrayRef<uint8_t> LeafData) {
+ return StringRef(reinterpret_cast<const char *>(LeafData.data()),
+ LeafData.size());
+}
+
+StringRef llvm::codeview::getBytesAsCString(ArrayRef<uint8_t> LeafData) {
+ return getBytesAsCharacters(LeafData).split('\0').first;
+}
+
+Error llvm::codeview::consume(BinaryStreamReader &Reader, APSInt &Num) {
// Used to avoid overload ambiguity on APInt constructor.
- bool FalseVal = false;
- uint16_t Short;
- if (auto EC = Reader.readInteger(Short))
- return EC;
-
- if (Short < LF_NUMERIC) {
- Num = APSInt(APInt(/*numBits=*/16, Short, /*isSigned=*/false),
- /*isUnsigned=*/true);
- return Error::success();
- }
-
- switch (Short) {
- case LF_CHAR: {
- int8_t N;
- if (auto EC = Reader.readInteger(N))
- return EC;
- Num = APSInt(APInt(8, N, true), false);
- return Error::success();
- }
- case LF_SHORT: {
- int16_t N;
- if (auto EC = Reader.readInteger(N))
- return EC;
- Num = APSInt(APInt(16, N, true), false);
- return Error::success();
- }
- case LF_USHORT: {
- uint16_t N;
- if (auto EC = Reader.readInteger(N))
- return EC;
- Num = APSInt(APInt(16, N, false), true);
- return Error::success();
- }
- case LF_LONG: {
- int32_t N;
- if (auto EC = Reader.readInteger(N))
- return EC;
- Num = APSInt(APInt(32, N, true), false);
- return Error::success();
- }
- case LF_ULONG: {
- uint32_t N;
- if (auto EC = Reader.readInteger(N))
- return EC;
- Num = APSInt(APInt(32, N, FalseVal), true);
- return Error::success();
- }
- case LF_QUADWORD: {
- int64_t N;
- if (auto EC = Reader.readInteger(N))
- return EC;
- Num = APSInt(APInt(64, N, true), false);
- return Error::success();
- }
- case LF_UQUADWORD: {
- uint64_t N;
- if (auto EC = Reader.readInteger(N))
- return EC;
- Num = APSInt(APInt(64, N, false), true);
- return Error::success();
- }
- }
- return make_error<CodeViewError>(cv_error_code::corrupt_record,
- "Buffer contains invalid APSInt type");
-}
-
-Error llvm::codeview::consume(StringRef &Data, APSInt &Num) {
- ArrayRef<uint8_t> Bytes(Data.bytes_begin(), Data.bytes_end());
- BinaryByteStream S(Bytes, llvm::support::little);
- BinaryStreamReader SR(S);
- auto EC = consume(SR, Num);
- Data = Data.take_back(SR.bytesRemaining());
- return EC;
-}
-
-/// Decode a numeric leaf value that is known to be a uint64_t.
-Error llvm::codeview::consume_numeric(BinaryStreamReader &Reader,
- uint64_t &Num) {
- APSInt N;
- if (auto EC = consume(Reader, N))
- return EC;
- if (N.isSigned() || !N.isIntN(64))
- return make_error<CodeViewError>(cv_error_code::corrupt_record,
- "Data is not a numeric value!");
- Num = N.getLimitedValue();
- return Error::success();
-}
-
-Error llvm::codeview::consume(BinaryStreamReader &Reader, uint32_t &Item) {
- return Reader.readInteger(Item);
-}
-
-Error llvm::codeview::consume(StringRef &Data, uint32_t &Item) {
- ArrayRef<uint8_t> Bytes(Data.bytes_begin(), Data.bytes_end());
- BinaryByteStream S(Bytes, llvm::support::little);
- BinaryStreamReader SR(S);
- auto EC = consume(SR, Item);
- Data = Data.take_back(SR.bytesRemaining());
- return EC;
-}
-
-Error llvm::codeview::consume(BinaryStreamReader &Reader, int32_t &Item) {
- return Reader.readInteger(Item);
-}
-
-Error llvm::codeview::consume(BinaryStreamReader &Reader, StringRef &Item) {
- if (Reader.empty())
- return make_error<CodeViewError>(cv_error_code::corrupt_record,
- "Null terminated string buffer is empty!");
-
- return Reader.readCString(Item);
-}
-
-Expected<CVSymbol> llvm::codeview::readSymbolFromStream(BinaryStreamRef Stream,
- uint32_t Offset) {
- return readCVRecordFromStream<SymbolKind>(Stream, Offset);
-}
+ bool FalseVal = false;
+ uint16_t Short;
+ if (auto EC = Reader.readInteger(Short))
+ return EC;
+
+ if (Short < LF_NUMERIC) {
+ Num = APSInt(APInt(/*numBits=*/16, Short, /*isSigned=*/false),
+ /*isUnsigned=*/true);
+ return Error::success();
+ }
+
+ switch (Short) {
+ case LF_CHAR: {
+ int8_t N;
+ if (auto EC = Reader.readInteger(N))
+ return EC;
+ Num = APSInt(APInt(8, N, true), false);
+ return Error::success();
+ }
+ case LF_SHORT: {
+ int16_t N;
+ if (auto EC = Reader.readInteger(N))
+ return EC;
+ Num = APSInt(APInt(16, N, true), false);
+ return Error::success();
+ }
+ case LF_USHORT: {
+ uint16_t N;
+ if (auto EC = Reader.readInteger(N))
+ return EC;
+ Num = APSInt(APInt(16, N, false), true);
+ return Error::success();
+ }
+ case LF_LONG: {
+ int32_t N;
+ if (auto EC = Reader.readInteger(N))
+ return EC;
+ Num = APSInt(APInt(32, N, true), false);
+ return Error::success();
+ }
+ case LF_ULONG: {
+ uint32_t N;
+ if (auto EC = Reader.readInteger(N))
+ return EC;
+ Num = APSInt(APInt(32, N, FalseVal), true);
+ return Error::success();
+ }
+ case LF_QUADWORD: {
+ int64_t N;
+ if (auto EC = Reader.readInteger(N))
+ return EC;
+ Num = APSInt(APInt(64, N, true), false);
+ return Error::success();
+ }
+ case LF_UQUADWORD: {
+ uint64_t N;
+ if (auto EC = Reader.readInteger(N))
+ return EC;
+ Num = APSInt(APInt(64, N, false), true);
+ return Error::success();
+ }
+ }
+ return make_error<CodeViewError>(cv_error_code::corrupt_record,
+ "Buffer contains invalid APSInt type");
+}
+
+Error llvm::codeview::consume(StringRef &Data, APSInt &Num) {
+ ArrayRef<uint8_t> Bytes(Data.bytes_begin(), Data.bytes_end());
+ BinaryByteStream S(Bytes, llvm::support::little);
+ BinaryStreamReader SR(S);
+ auto EC = consume(SR, Num);
+ Data = Data.take_back(SR.bytesRemaining());
+ return EC;
+}
+
+/// Decode a numeric leaf value that is known to be a uint64_t.
+Error llvm::codeview::consume_numeric(BinaryStreamReader &Reader,
+ uint64_t &Num) {
+ APSInt N;
+ if (auto EC = consume(Reader, N))
+ return EC;
+ if (N.isSigned() || !N.isIntN(64))
+ return make_error<CodeViewError>(cv_error_code::corrupt_record,
+ "Data is not a numeric value!");
+ Num = N.getLimitedValue();
+ return Error::success();
+}
+
+Error llvm::codeview::consume(BinaryStreamReader &Reader, uint32_t &Item) {
+ return Reader.readInteger(Item);
+}
+
+Error llvm::codeview::consume(StringRef &Data, uint32_t &Item) {
+ ArrayRef<uint8_t> Bytes(Data.bytes_begin(), Data.bytes_end());
+ BinaryByteStream S(Bytes, llvm::support::little);
+ BinaryStreamReader SR(S);
+ auto EC = consume(SR, Item);
+ Data = Data.take_back(SR.bytesRemaining());
+ return EC;
+}
+
+Error llvm::codeview::consume(BinaryStreamReader &Reader, int32_t &Item) {
+ return Reader.readInteger(Item);
+}
+
+Error llvm::codeview::consume(BinaryStreamReader &Reader, StringRef &Item) {
+ if (Reader.empty())
+ return make_error<CodeViewError>(cv_error_code::corrupt_record,
+ "Null terminated string buffer is empty!");
+
+ return Reader.readCString(Item);
+}
+
+Expected<CVSymbol> llvm::codeview::readSymbolFromStream(BinaryStreamRef Stream,
+ uint32_t Offset) {
+ return readCVRecordFromStream<SymbolKind>(Stream, Offset);
+}
diff --git a/contrib/libs/llvm12/lib/DebugInfo/CodeView/SimpleTypeSerializer.cpp b/contrib/libs/llvm12/lib/DebugInfo/CodeView/SimpleTypeSerializer.cpp
index dd542a142da..ac3b3017595 100644
--- a/contrib/libs/llvm12/lib/DebugInfo/CodeView/SimpleTypeSerializer.cpp
+++ b/contrib/libs/llvm12/lib/DebugInfo/CodeView/SimpleTypeSerializer.cpp
@@ -1,67 +1,67 @@
-//===- SimpleTypeSerializer.cpp -----------------------------------------===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-
-#include "llvm/DebugInfo/CodeView/SimpleTypeSerializer.h"
-#include "llvm/DebugInfo/CodeView/TypeRecord.h"
-#include "llvm/DebugInfo/CodeView/TypeRecordMapping.h"
-#include "llvm/Support/BinaryStreamWriter.h"
-
-using namespace llvm;
-using namespace llvm::codeview;
-
-static void addPadding(BinaryStreamWriter &Writer) {
- uint32_t Align = Writer.getOffset() % 4;
- if (Align == 0)
- return;
-
- int PaddingBytes = 4 - Align;
- while (PaddingBytes > 0) {
- uint8_t Pad = static_cast<uint8_t>(LF_PAD0 + PaddingBytes);
- cantFail(Writer.writeInteger(Pad));
- --PaddingBytes;
- }
-}
-
-SimpleTypeSerializer::SimpleTypeSerializer() : ScratchBuffer(MaxRecordLength) {}
-
-SimpleTypeSerializer::~SimpleTypeSerializer() {}
-
-template <typename T>
-ArrayRef<uint8_t> SimpleTypeSerializer::serialize(T &Record) {
- BinaryStreamWriter Writer(ScratchBuffer, support::little);
- TypeRecordMapping Mapping(Writer);
-
- // Write the record prefix first with a dummy length but real kind.
- RecordPrefix DummyPrefix(uint16_t(Record.getKind()));
- cantFail(Writer.writeObject(DummyPrefix));
-
- RecordPrefix *Prefix = reinterpret_cast<RecordPrefix *>(ScratchBuffer.data());
- CVType CVT(Prefix, sizeof(RecordPrefix));
-
- cantFail(Mapping.visitTypeBegin(CVT));
- cantFail(Mapping.visitKnownRecord(CVT, Record));
- cantFail(Mapping.visitTypeEnd(CVT));
-
- addPadding(Writer);
-
- // Update the size and kind after serialization.
- Prefix->RecordKind = CVT.kind();
- Prefix->RecordLen = Writer.getOffset() - sizeof(uint16_t);
-
- return {ScratchBuffer.data(), Writer.getOffset()};
-}
-
-// Explicitly instantiate the member function for each known type so that we can
-// implement this in the cpp file.
-#define TYPE_RECORD(EnumName, EnumVal, Name) \
- template ArrayRef<uint8_t> llvm::codeview::SimpleTypeSerializer::serialize( \
- Name##Record &Record);
-#define TYPE_RECORD_ALIAS(EnumName, EnumVal, Name, AliasName)
-#define MEMBER_RECORD(EnumName, EnumVal, Name)
-#define MEMBER_RECORD_ALIAS(EnumName, EnumVal, Name, AliasName)
-#include "llvm/DebugInfo/CodeView/CodeViewTypes.def"
+//===- SimpleTypeSerializer.cpp -----------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "llvm/DebugInfo/CodeView/SimpleTypeSerializer.h"
+#include "llvm/DebugInfo/CodeView/TypeRecord.h"
+#include "llvm/DebugInfo/CodeView/TypeRecordMapping.h"
+#include "llvm/Support/BinaryStreamWriter.h"
+
+using namespace llvm;
+using namespace llvm::codeview;
+
+static void addPadding(BinaryStreamWriter &Writer) {
+ uint32_t Align = Writer.getOffset() % 4;
+ if (Align == 0)
+ return;
+
+ int PaddingBytes = 4 - Align;
+ while (PaddingBytes > 0) {
+ uint8_t Pad = static_cast<uint8_t>(LF_PAD0 + PaddingBytes);
+ cantFail(Writer.writeInteger(Pad));
+ --PaddingBytes;
+ }
+}
+
+SimpleTypeSerializer::SimpleTypeSerializer() : ScratchBuffer(MaxRecordLength) {}
+
+SimpleTypeSerializer::~SimpleTypeSerializer() {}
+
+template <typename T>
+ArrayRef<uint8_t> SimpleTypeSerializer::serialize(T &Record) {
+ BinaryStreamWriter Writer(ScratchBuffer, support::little);
+ TypeRecordMapping Mapping(Writer);
+
+ // Write the record prefix first with a dummy length but real kind.
+ RecordPrefix DummyPrefix(uint16_t(Record.getKind()));
+ cantFail(Writer.writeObject(DummyPrefix));
+
+ RecordPrefix *Prefix = reinterpret_cast<RecordPrefix *>(ScratchBuffer.data());
+ CVType CVT(Prefix, sizeof(RecordPrefix));
+
+ cantFail(Mapping.visitTypeBegin(CVT));
+ cantFail(Mapping.visitKnownRecord(CVT, Record));
+ cantFail(Mapping.visitTypeEnd(CVT));
+
+ addPadding(Writer);
+
+ // Update the size and kind after serialization.
+ Prefix->RecordKind = CVT.kind();
+ Prefix->RecordLen = Writer.getOffset() - sizeof(uint16_t);
+
+ return {ScratchBuffer.data(), Writer.getOffset()};
+}
+
+// Explicitly instantiate the member function for each known type so that we can
+// implement this in the cpp file.
+#define TYPE_RECORD(EnumName, EnumVal, Name) \
+ template ArrayRef<uint8_t> llvm::codeview::SimpleTypeSerializer::serialize( \
+ Name##Record &Record);
+#define TYPE_RECORD_ALIAS(EnumName, EnumVal, Name, AliasName)
+#define MEMBER_RECORD(EnumName, EnumVal, Name)
+#define MEMBER_RECORD_ALIAS(EnumName, EnumVal, Name, AliasName)
+#include "llvm/DebugInfo/CodeView/CodeViewTypes.def"
diff --git a/contrib/libs/llvm12/lib/DebugInfo/CodeView/StringsAndChecksums.cpp b/contrib/libs/llvm12/lib/DebugInfo/CodeView/StringsAndChecksums.cpp
index 3f11d2775ba..9e204eec860 100644
--- a/contrib/libs/llvm12/lib/DebugInfo/CodeView/StringsAndChecksums.cpp
+++ b/contrib/libs/llvm12/lib/DebugInfo/CodeView/StringsAndChecksums.cpp
@@ -1,80 +1,80 @@
-//===- StringsAndChecksums.cpp --------------------------------------------===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-
-#include "llvm/DebugInfo/CodeView/StringsAndChecksums.h"
-#include "llvm/ADT/STLExtras.h"
-#include "llvm/DebugInfo/CodeView/CodeView.h"
-#include "llvm/DebugInfo/CodeView/DebugChecksumsSubsection.h"
-#include "llvm/DebugInfo/CodeView/DebugStringTableSubsection.h"
-#include "llvm/DebugInfo/CodeView/DebugSubsectionRecord.h"
-#include "llvm/Support/Error.h"
-#include <cassert>
-
-using namespace llvm;
-using namespace llvm::codeview;
-
-StringsAndChecksumsRef::StringsAndChecksumsRef() = default;
-
-StringsAndChecksumsRef::StringsAndChecksumsRef(
- const DebugStringTableSubsectionRef &Strings)
- : Strings(&Strings) {}
-
-StringsAndChecksumsRef::StringsAndChecksumsRef(
- const DebugStringTableSubsectionRef &Strings,
- const DebugChecksumsSubsectionRef &Checksums)
- : Strings(&Strings), Checksums(&Checksums) {}
-
-void StringsAndChecksumsRef::initializeStrings(
- const DebugSubsectionRecord &SR) {
- assert(SR.kind() == DebugSubsectionKind::StringTable);
- assert(!Strings && "Found a string table even though we already have one!");
-
- OwnedStrings = std::make_shared<DebugStringTableSubsectionRef>();
- consumeError(OwnedStrings->initialize(SR.getRecordData()));
- Strings = OwnedStrings.get();
-}
-
-void StringsAndChecksumsRef::reset() {
- resetStrings();
- resetChecksums();
-}
-
-void StringsAndChecksumsRef::resetStrings() {
- OwnedStrings.reset();
- Strings = nullptr;
-}
-
-void StringsAndChecksumsRef::resetChecksums() {
- OwnedChecksums.reset();
- Checksums = nullptr;
-}
-
-void StringsAndChecksumsRef::setStrings(
- const DebugStringTableSubsectionRef &StringsRef) {
- OwnedStrings = std::make_shared<DebugStringTableSubsectionRef>();
- *OwnedStrings = StringsRef;
- Strings = OwnedStrings.get();
-}
-
-void StringsAndChecksumsRef::setChecksums(
- const DebugChecksumsSubsectionRef &CS) {
- OwnedChecksums = std::make_shared<DebugChecksumsSubsectionRef>();
- *OwnedChecksums = CS;
- Checksums = OwnedChecksums.get();
-}
-
-void StringsAndChecksumsRef::initializeChecksums(
- const DebugSubsectionRecord &FCR) {
- assert(FCR.kind() == DebugSubsectionKind::FileChecksums);
- if (Checksums)
- return;
-
- OwnedChecksums = std::make_shared<DebugChecksumsSubsectionRef>();
- consumeError(OwnedChecksums->initialize(FCR.getRecordData()));
- Checksums = OwnedChecksums.get();
-}
+//===- StringsAndChecksums.cpp --------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "llvm/DebugInfo/CodeView/StringsAndChecksums.h"
+#include "llvm/ADT/STLExtras.h"
+#include "llvm/DebugInfo/CodeView/CodeView.h"
+#include "llvm/DebugInfo/CodeView/DebugChecksumsSubsection.h"
+#include "llvm/DebugInfo/CodeView/DebugStringTableSubsection.h"
+#include "llvm/DebugInfo/CodeView/DebugSubsectionRecord.h"
+#include "llvm/Support/Error.h"
+#include <cassert>
+
+using namespace llvm;
+using namespace llvm::codeview;
+
+StringsAndChecksumsRef::StringsAndChecksumsRef() = default;
+
+StringsAndChecksumsRef::StringsAndChecksumsRef(
+ const DebugStringTableSubsectionRef &Strings)
+ : Strings(&Strings) {}
+
+StringsAndChecksumsRef::StringsAndChecksumsRef(
+ const DebugStringTableSubsectionRef &Strings,
+ const DebugChecksumsSubsectionRef &Checksums)
+ : Strings(&Strings), Checksums(&Checksums) {}
+
+void StringsAndChecksumsRef::initializeStrings(
+ const DebugSubsectionRecord &SR) {
+ assert(SR.kind() == DebugSubsectionKind::StringTable);
+ assert(!Strings && "Found a string table even though we already have one!");
+
+ OwnedStrings = std::make_shared<DebugStringTableSubsectionRef>();
+ consumeError(OwnedStrings->initialize(SR.getRecordData()));
+ Strings = OwnedStrings.get();
+}
+
+void StringsAndChecksumsRef::reset() {
+ resetStrings();
+ resetChecksums();
+}
+
+void StringsAndChecksumsRef::resetStrings() {
+ OwnedStrings.reset();
+ Strings = nullptr;
+}
+
+void StringsAndChecksumsRef::resetChecksums() {
+ OwnedChecksums.reset();
+ Checksums = nullptr;
+}
+
+void StringsAndChecksumsRef::setStrings(
+ const DebugStringTableSubsectionRef &StringsRef) {
+ OwnedStrings = std::make_shared<DebugStringTableSubsectionRef>();
+ *OwnedStrings = StringsRef;
+ Strings = OwnedStrings.get();
+}
+
+void StringsAndChecksumsRef::setChecksums(
+ const DebugChecksumsSubsectionRef &CS) {
+ OwnedChecksums = std::make_shared<DebugChecksumsSubsectionRef>();
+ *OwnedChecksums = CS;
+ Checksums = OwnedChecksums.get();
+}
+
+void StringsAndChecksumsRef::initializeChecksums(
+ const DebugSubsectionRecord &FCR) {
+ assert(FCR.kind() == DebugSubsectionKind::FileChecksums);
+ if (Checksums)
+ return;
+
+ OwnedChecksums = std::make_shared<DebugChecksumsSubsectionRef>();
+ consumeError(OwnedChecksums->initialize(FCR.getRecordData()));
+ Checksums = OwnedChecksums.get();
+}
diff --git a/contrib/libs/llvm12/lib/DebugInfo/CodeView/SymbolDumper.cpp b/contrib/libs/llvm12/lib/DebugInfo/CodeView/SymbolDumper.cpp
index e130f8b3d22..45b63983beb 100644
--- a/contrib/libs/llvm12/lib/DebugInfo/CodeView/SymbolDumper.cpp
+++ b/contrib/libs/llvm12/lib/DebugInfo/CodeView/SymbolDumper.cpp
@@ -1,679 +1,679 @@
-//===-- SymbolDumper.cpp - CodeView symbol info dumper ----------*- C++ -*-===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-
-#include "llvm/DebugInfo/CodeView/SymbolDumper.h"
-#include "llvm/ADT/SmallString.h"
-#include "llvm/DebugInfo/CodeView/CVSymbolVisitor.h"
-#include "llvm/DebugInfo/CodeView/DebugStringTableSubsection.h"
-#include "llvm/DebugInfo/CodeView/EnumTables.h"
-#include "llvm/DebugInfo/CodeView/SymbolDeserializer.h"
-#include "llvm/DebugInfo/CodeView/SymbolDumpDelegate.h"
-#include "llvm/DebugInfo/CodeView/SymbolRecord.h"
-#include "llvm/DebugInfo/CodeView/SymbolVisitorCallbackPipeline.h"
-#include "llvm/DebugInfo/CodeView/SymbolVisitorCallbacks.h"
-#include "llvm/DebugInfo/CodeView/TypeIndex.h"
-#include "llvm/Support/Error.h"
-#include "llvm/Support/ScopedPrinter.h"
-
-#include <system_error>
-
-using namespace llvm;
-using namespace llvm::codeview;
-
-namespace {
-/// Use this private dumper implementation to keep implementation details about
-/// the visitor out of SymbolDumper.h.
-class CVSymbolDumperImpl : public SymbolVisitorCallbacks {
-public:
- CVSymbolDumperImpl(TypeCollection &Types, SymbolDumpDelegate *ObjDelegate,
- ScopedPrinter &W, CPUType CPU, bool PrintRecordBytes)
- : Types(Types), ObjDelegate(ObjDelegate), W(W), CompilationCPUType(CPU),
- PrintRecordBytes(PrintRecordBytes), InFunctionScope(false) {}
-
-/// CVSymbolVisitor overrides.
-#define SYMBOL_RECORD(EnumName, EnumVal, Name) \
- Error visitKnownRecord(CVSymbol &CVR, Name &Record) override;
-#define SYMBOL_RECORD_ALIAS(EnumName, EnumVal, Name, AliasName)
-#include "llvm/DebugInfo/CodeView/CodeViewSymbols.def"
-
- Error visitSymbolBegin(CVSymbol &Record) override;
- Error visitSymbolEnd(CVSymbol &Record) override;
- Error visitUnknownSymbol(CVSymbol &Record) override;
-
- CPUType getCompilationCPUType() const { return CompilationCPUType; }
-
-private:
- void printLocalVariableAddrRange(const LocalVariableAddrRange &Range,
- uint32_t RelocationOffset);
- void printLocalVariableAddrGap(ArrayRef<LocalVariableAddrGap> Gaps);
- void printTypeIndex(StringRef FieldName, TypeIndex TI);
-
- TypeCollection &Types;
- SymbolDumpDelegate *ObjDelegate;
- ScopedPrinter &W;
-
- /// Save the machine or CPU type when dumping a compile symbols.
- CPUType CompilationCPUType = CPUType::X64;
-
- bool PrintRecordBytes;
- bool InFunctionScope;
-};
-}
-
-static StringRef getSymbolKindName(SymbolKind Kind) {
- switch (Kind) {
-#define SYMBOL_RECORD(EnumName, EnumVal, Name) \
- case EnumName: \
- return #Name;
-#include "llvm/DebugInfo/CodeView/CodeViewSymbols.def"
- default:
- break;
- }
- return "UnknownSym";
-}
-
-void CVSymbolDumperImpl::printLocalVariableAddrRange(
- const LocalVariableAddrRange &Range, uint32_t RelocationOffset) {
- DictScope S(W, "LocalVariableAddrRange");
- if (ObjDelegate)
- ObjDelegate->printRelocatedField("OffsetStart", RelocationOffset,
- Range.OffsetStart);
- W.printHex("ISectStart", Range.ISectStart);
- W.printHex("Range", Range.Range);
-}
-
-void CVSymbolDumperImpl::printLocalVariableAddrGap(
- ArrayRef<LocalVariableAddrGap> Gaps) {
- for (auto &Gap : Gaps) {
- ListScope S(W, "LocalVariableAddrGap");
- W.printHex("GapStartOffset", Gap.GapStartOffset);
- W.printHex("Range", Gap.Range);
- }
-}
-
-void CVSymbolDumperImpl::printTypeIndex(StringRef FieldName, TypeIndex TI) {
- codeview::printTypeIndex(W, FieldName, TI, Types);
-}
-
-Error CVSymbolDumperImpl::visitSymbolBegin(CVSymbol &CVR) {
- W.startLine() << getSymbolKindName(CVR.kind());
- W.getOStream() << " {\n";
- W.indent();
- W.printEnum("Kind", unsigned(CVR.kind()), getSymbolTypeNames());
- return Error::success();
-}
-
-Error CVSymbolDumperImpl::visitSymbolEnd(CVSymbol &CVR) {
- if (PrintRecordBytes && ObjDelegate)
- ObjDelegate->printBinaryBlockWithRelocs("SymData", CVR.content());
-
- W.unindent();
- W.startLine() << "}\n";
- return Error::success();
-}
-
-Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR, BlockSym &Block) {
- StringRef LinkageName;
- W.printHex("PtrParent", Block.Parent);
- W.printHex("PtrEnd", Block.End);
- W.printHex("CodeSize", Block.CodeSize);
- if (ObjDelegate) {
- ObjDelegate->printRelocatedField("CodeOffset", Block.getRelocationOffset(),
- Block.CodeOffset, &LinkageName);
- }
- W.printHex("Segment", Block.Segment);
- W.printString("BlockName", Block.Name);
- W.printString("LinkageName", LinkageName);
- return Error::success();
-}
-
-Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR, Thunk32Sym &Thunk) {
- W.printString("Name", Thunk.Name);
- W.printNumber("Parent", Thunk.Parent);
- W.printNumber("End", Thunk.End);
- W.printNumber("Next", Thunk.Next);
- W.printNumber("Off", Thunk.Offset);
- W.printNumber("Seg", Thunk.Segment);
- W.printNumber("Len", Thunk.Length);
- W.printEnum("Ordinal", uint8_t(Thunk.Thunk), getThunkOrdinalNames());
- return Error::success();
-}
-
-Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR,
- TrampolineSym &Tramp) {
- W.printEnum("Type", uint16_t(Tramp.Type), getTrampolineNames());
- W.printNumber("Size", Tramp.Size);
- W.printNumber("ThunkOff", Tramp.ThunkOffset);
- W.printNumber("TargetOff", Tramp.TargetOffset);
- W.printNumber("ThunkSection", Tramp.ThunkSection);
- W.printNumber("TargetSection", Tramp.TargetSection);
- return Error::success();
-}
-
-Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR, SectionSym &Section) {
- W.printNumber("SectionNumber", Section.SectionNumber);
- W.printNumber("Alignment", Section.Alignment);
- W.printNumber("Rva", Section.Rva);
- W.printNumber("Length", Section.Length);
- W.printFlags("Characteristics", Section.Characteristics,
- getImageSectionCharacteristicNames(),
- COFF::SectionCharacteristics(0x00F00000));
-
- W.printString("Name", Section.Name);
- return Error::success();
-}
-
-Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR,
- CoffGroupSym &CoffGroup) {
- W.printNumber("Size", CoffGroup.Size);
- W.printFlags("Characteristics", CoffGroup.Characteristics,
- getImageSectionCharacteristicNames(),
- COFF::SectionCharacteristics(0x00F00000));
- W.printNumber("Offset", CoffGroup.Offset);
- W.printNumber("Segment", CoffGroup.Segment);
- W.printString("Name", CoffGroup.Name);
- return Error::success();
-}
-
-Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR,
- BPRelativeSym &BPRel) {
- W.printNumber("Offset", BPRel.Offset);
- printTypeIndex("Type", BPRel.Type);
- W.printString("VarName", BPRel.Name);
- return Error::success();
-}
-
-Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR,
- BuildInfoSym &BuildInfo) {
- printTypeIndex("BuildId", BuildInfo.BuildId);
- return Error::success();
-}
-
-Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR,
- CallSiteInfoSym &CallSiteInfo) {
- StringRef LinkageName;
- if (ObjDelegate) {
- ObjDelegate->printRelocatedField("CodeOffset",
- CallSiteInfo.getRelocationOffset(),
- CallSiteInfo.CodeOffset, &LinkageName);
- }
- W.printHex("Segment", CallSiteInfo.Segment);
- printTypeIndex("Type", CallSiteInfo.Type);
- if (!LinkageName.empty())
- W.printString("LinkageName", LinkageName);
- return Error::success();
-}
-
-Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR,
- EnvBlockSym &EnvBlock) {
- ListScope L(W, "Entries");
- for (auto Entry : EnvBlock.Fields) {
- W.printString(Entry);
- }
- return Error::success();
-}
-
-Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR,
- FileStaticSym &FileStatic) {
- printTypeIndex("Index", FileStatic.Index);
- W.printNumber("ModFilenameOffset", FileStatic.ModFilenameOffset);
- W.printFlags("Flags", uint16_t(FileStatic.Flags), getLocalFlagNames());
- W.printString("Name", FileStatic.Name);
- return Error::success();
-}
-
-Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR, ExportSym &Export) {
- W.printNumber("Ordinal", Export.Ordinal);
- W.printFlags("Flags", uint16_t(Export.Flags), getExportSymFlagNames());
- W.printString("Name", Export.Name);
- return Error::success();
-}
-
-Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR,
- Compile2Sym &Compile2) {
- W.printEnum("Language", Compile2.getLanguage(), getSourceLanguageNames());
- W.printFlags("Flags", Compile2.getFlags(), getCompileSym2FlagNames());
- W.printEnum("Machine", unsigned(Compile2.Machine), getCPUTypeNames());
- CompilationCPUType = Compile2.Machine;
- std::string FrontendVersion;
- {
- raw_string_ostream Out(FrontendVersion);
- Out << Compile2.VersionFrontendMajor << '.' << Compile2.VersionFrontendMinor
- << '.' << Compile2.VersionFrontendBuild;
- }
- std::string BackendVersion;
- {
- raw_string_ostream Out(BackendVersion);
- Out << Compile2.VersionBackendMajor << '.' << Compile2.VersionBackendMinor
- << '.' << Compile2.VersionBackendBuild;
- }
- W.printString("FrontendVersion", FrontendVersion);
- W.printString("BackendVersion", BackendVersion);
- W.printString("VersionName", Compile2.Version);
- return Error::success();
-}
-
-Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR,
- Compile3Sym &Compile3) {
- W.printEnum("Language", uint8_t(Compile3.getLanguage()), getSourceLanguageNames());
- W.printFlags("Flags", uint32_t(Compile3.getFlags()),
- getCompileSym3FlagNames());
- W.printEnum("Machine", unsigned(Compile3.Machine), getCPUTypeNames());
- CompilationCPUType = Compile3.Machine;
- std::string FrontendVersion;
- {
- raw_string_ostream Out(FrontendVersion);
- Out << Compile3.VersionFrontendMajor << '.' << Compile3.VersionFrontendMinor
- << '.' << Compile3.VersionFrontendBuild << '.'
- << Compile3.VersionFrontendQFE;
- }
- std::string BackendVersion;
- {
- raw_string_ostream Out(BackendVersion);
- Out << Compile3.VersionBackendMajor << '.' << Compile3.VersionBackendMinor
- << '.' << Compile3.VersionBackendBuild << '.'
- << Compile3.VersionBackendQFE;
- }
- W.printString("FrontendVersion", FrontendVersion);
- W.printString("BackendVersion", BackendVersion);
- W.printString("VersionName", Compile3.Version);
- return Error::success();
-}
-
-Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR,
- ConstantSym &Constant) {
- printTypeIndex("Type", Constant.Type);
- W.printNumber("Value", Constant.Value);
- W.printString("Name", Constant.Name);
- return Error::success();
-}
-
-Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR, DataSym &Data) {
- StringRef LinkageName;
- if (ObjDelegate) {
- ObjDelegate->printRelocatedField("DataOffset", Data.getRelocationOffset(),
- Data.DataOffset, &LinkageName);
- }
- printTypeIndex("Type", Data.Type);
- W.printString("DisplayName", Data.Name);
- if (!LinkageName.empty())
- W.printString("LinkageName", LinkageName);
- return Error::success();
-}
-
-Error CVSymbolDumperImpl::visitKnownRecord(
- CVSymbol &CVR,
- DefRangeFramePointerRelFullScopeSym &DefRangeFramePointerRelFullScope) {
- W.printNumber("Offset", DefRangeFramePointerRelFullScope.Offset);
- return Error::success();
-}
-
-Error CVSymbolDumperImpl::visitKnownRecord(
- CVSymbol &CVR, DefRangeFramePointerRelSym &DefRangeFramePointerRel) {
- W.printNumber("Offset", DefRangeFramePointerRel.Hdr.Offset);
- printLocalVariableAddrRange(DefRangeFramePointerRel.Range,
- DefRangeFramePointerRel.getRelocationOffset());
- printLocalVariableAddrGap(DefRangeFramePointerRel.Gaps);
- return Error::success();
-}
-
-Error CVSymbolDumperImpl::visitKnownRecord(
- CVSymbol &CVR, DefRangeRegisterRelSym &DefRangeRegisterRel) {
- W.printEnum("BaseRegister", uint16_t(DefRangeRegisterRel.Hdr.Register),
- getRegisterNames(CompilationCPUType));
- W.printBoolean("HasSpilledUDTMember",
- DefRangeRegisterRel.hasSpilledUDTMember());
- W.printNumber("OffsetInParent", DefRangeRegisterRel.offsetInParent());
- W.printNumber("BasePointerOffset", DefRangeRegisterRel.Hdr.BasePointerOffset);
- printLocalVariableAddrRange(DefRangeRegisterRel.Range,
- DefRangeRegisterRel.getRelocationOffset());
- printLocalVariableAddrGap(DefRangeRegisterRel.Gaps);
- return Error::success();
-}
-
-Error CVSymbolDumperImpl::visitKnownRecord(
- CVSymbol &CVR, DefRangeRegisterSym &DefRangeRegister) {
- W.printEnum("Register", uint16_t(DefRangeRegister.Hdr.Register),
- getRegisterNames(CompilationCPUType));
- W.printNumber("MayHaveNoName", DefRangeRegister.Hdr.MayHaveNoName);
- printLocalVariableAddrRange(DefRangeRegister.Range,
- DefRangeRegister.getRelocationOffset());
- printLocalVariableAddrGap(DefRangeRegister.Gaps);
- return Error::success();
-}
-
-Error CVSymbolDumperImpl::visitKnownRecord(
- CVSymbol &CVR, DefRangeSubfieldRegisterSym &DefRangeSubfieldRegister) {
- W.printEnum("Register", uint16_t(DefRangeSubfieldRegister.Hdr.Register),
- getRegisterNames(CompilationCPUType));
- W.printNumber("MayHaveNoName", DefRangeSubfieldRegister.Hdr.MayHaveNoName);
- W.printNumber("OffsetInParent", DefRangeSubfieldRegister.Hdr.OffsetInParent);
- printLocalVariableAddrRange(DefRangeSubfieldRegister.Range,
- DefRangeSubfieldRegister.getRelocationOffset());
- printLocalVariableAddrGap(DefRangeSubfieldRegister.Gaps);
- return Error::success();
-}
-
-Error CVSymbolDumperImpl::visitKnownRecord(
- CVSymbol &CVR, DefRangeSubfieldSym &DefRangeSubfield) {
- if (ObjDelegate) {
- DebugStringTableSubsectionRef Strings = ObjDelegate->getStringTable();
- auto ExpectedProgram = Strings.getString(DefRangeSubfield.Program);
- if (!ExpectedProgram) {
- consumeError(ExpectedProgram.takeError());
- return llvm::make_error<CodeViewError>(
- "String table offset outside of bounds of String Table!");
- }
- W.printString("Program", *ExpectedProgram);
- }
- W.printNumber("OffsetInParent", DefRangeSubfield.OffsetInParent);
- printLocalVariableAddrRange(DefRangeSubfield.Range,
- DefRangeSubfield.getRelocationOffset());
- printLocalVariableAddrGap(DefRangeSubfield.Gaps);
- return Error::success();
-}
-
-Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR,
- DefRangeSym &DefRange) {
- if (ObjDelegate) {
- DebugStringTableSubsectionRef Strings = ObjDelegate->getStringTable();
- auto ExpectedProgram = Strings.getString(DefRange.Program);
- if (!ExpectedProgram) {
- consumeError(ExpectedProgram.takeError());
- return llvm::make_error<CodeViewError>(
- "String table offset outside of bounds of String Table!");
- }
- W.printString("Program", *ExpectedProgram);
- }
- printLocalVariableAddrRange(DefRange.Range, DefRange.getRelocationOffset());
- printLocalVariableAddrGap(DefRange.Gaps);
- return Error::success();
-}
-
-Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR,
- FrameCookieSym &FrameCookie) {
- StringRef LinkageName;
- if (ObjDelegate) {
- ObjDelegate->printRelocatedField("CodeOffset",
- FrameCookie.getRelocationOffset(),
- FrameCookie.CodeOffset, &LinkageName);
- }
- W.printEnum("Register", uint16_t(FrameCookie.Register),
- getRegisterNames(CompilationCPUType));
- W.printEnum("CookieKind", uint16_t(FrameCookie.CookieKind),
- getFrameCookieKindNames());
- W.printHex("Flags", FrameCookie.Flags);
- return Error::success();
-}
-
-Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR,
- FrameProcSym &FrameProc) {
- W.printHex("TotalFrameBytes", FrameProc.TotalFrameBytes);
- W.printHex("PaddingFrameBytes", FrameProc.PaddingFrameBytes);
- W.printHex("OffsetToPadding", FrameProc.OffsetToPadding);
- W.printHex("BytesOfCalleeSavedRegisters",
- FrameProc.BytesOfCalleeSavedRegisters);
- W.printHex("OffsetOfExceptionHandler", FrameProc.OffsetOfExceptionHandler);
- W.printHex("SectionIdOfExceptionHandler",
- FrameProc.SectionIdOfExceptionHandler);
- W.printFlags("Flags", static_cast<uint32_t>(FrameProc.Flags),
- getFrameProcSymFlagNames());
- W.printEnum("LocalFramePtrReg",
- uint16_t(FrameProc.getLocalFramePtrReg(CompilationCPUType)),
- getRegisterNames(CompilationCPUType));
- W.printEnum("ParamFramePtrReg",
- uint16_t(FrameProc.getParamFramePtrReg(CompilationCPUType)),
- getRegisterNames(CompilationCPUType));
- return Error::success();
-}
-
-Error CVSymbolDumperImpl::visitKnownRecord(
- CVSymbol &CVR, HeapAllocationSiteSym &HeapAllocSite) {
- StringRef LinkageName;
- if (ObjDelegate) {
- ObjDelegate->printRelocatedField("CodeOffset",
- HeapAllocSite.getRelocationOffset(),
- HeapAllocSite.CodeOffset, &LinkageName);
- }
- W.printHex("Segment", HeapAllocSite.Segment);
- W.printHex("CallInstructionSize", HeapAllocSite.CallInstructionSize);
- printTypeIndex("Type", HeapAllocSite.Type);
- if (!LinkageName.empty())
- W.printString("LinkageName", LinkageName);
- return Error::success();
-}
-
-Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR,
- InlineSiteSym &InlineSite) {
- W.printHex("PtrParent", InlineSite.Parent);
- W.printHex("PtrEnd", InlineSite.End);
- printTypeIndex("Inlinee", InlineSite.Inlinee);
-
- ListScope BinaryAnnotations(W, "BinaryAnnotations");
- for (auto &Annotation : InlineSite.annotations()) {
- switch (Annotation.OpCode) {
- case BinaryAnnotationsOpCode::Invalid:
- W.printString("(Annotation Padding)");
- break;
- case BinaryAnnotationsOpCode::CodeOffset:
- case BinaryAnnotationsOpCode::ChangeCodeOffset:
- case BinaryAnnotationsOpCode::ChangeCodeLength:
- W.printHex(Annotation.Name, Annotation.U1);
- break;
- case BinaryAnnotationsOpCode::ChangeCodeOffsetBase:
- case BinaryAnnotationsOpCode::ChangeLineEndDelta:
- case BinaryAnnotationsOpCode::ChangeRangeKind:
- case BinaryAnnotationsOpCode::ChangeColumnStart:
- case BinaryAnnotationsOpCode::ChangeColumnEnd:
- W.printNumber(Annotation.Name, Annotation.U1);
- break;
- case BinaryAnnotationsOpCode::ChangeLineOffset:
- case BinaryAnnotationsOpCode::ChangeColumnEndDelta:
- W.printNumber(Annotation.Name, Annotation.S1);
- break;
- case BinaryAnnotationsOpCode::ChangeFile:
- if (ObjDelegate) {
- W.printHex("ChangeFile",
- ObjDelegate->getFileNameForFileOffset(Annotation.U1),
- Annotation.U1);
- } else {
- W.printHex("ChangeFile", Annotation.U1);
- }
-
- break;
- case BinaryAnnotationsOpCode::ChangeCodeOffsetAndLineOffset: {
- W.startLine() << "ChangeCodeOffsetAndLineOffset: {CodeOffset: "
- << W.hex(Annotation.U1) << ", LineOffset: " << Annotation.S1
- << "}\n";
- break;
- }
- case BinaryAnnotationsOpCode::ChangeCodeLengthAndCodeOffset: {
- W.startLine() << "ChangeCodeLengthAndCodeOffset: {CodeOffset: "
- << W.hex(Annotation.U2)
- << ", Length: " << W.hex(Annotation.U1) << "}\n";
- break;
- }
- }
- }
- return Error::success();
-}
-
-Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR,
- RegisterSym &Register) {
- printTypeIndex("Type", Register.Index);
- W.printEnum("Seg", uint16_t(Register.Register),
- getRegisterNames(CompilationCPUType));
- W.printString("Name", Register.Name);
- return Error::success();
-}
-
-Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR, PublicSym32 &Public) {
- W.printFlags("Flags", uint32_t(Public.Flags), getPublicSymFlagNames());
- W.printNumber("Seg", Public.Segment);
- W.printNumber("Off", Public.Offset);
- W.printString("Name", Public.Name);
- return Error::success();
-}
-
-Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR, ProcRefSym &ProcRef) {
- W.printNumber("SumName", ProcRef.SumName);
- W.printNumber("SymOffset", ProcRef.SymOffset);
- W.printNumber("Mod", ProcRef.Module);
- W.printString("Name", ProcRef.Name);
- return Error::success();
-}
-
-Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR, LabelSym &Label) {
- StringRef LinkageName;
- if (ObjDelegate) {
- ObjDelegate->printRelocatedField("CodeOffset", Label.getRelocationOffset(),
- Label.CodeOffset, &LinkageName);
- }
- W.printHex("Segment", Label.Segment);
- W.printHex("Flags", uint8_t(Label.Flags));
- W.printFlags("Flags", uint8_t(Label.Flags), getProcSymFlagNames());
- W.printString("DisplayName", Label.Name);
- if (!LinkageName.empty())
- W.printString("LinkageName", LinkageName);
- return Error::success();
-}
-
-Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR, LocalSym &Local) {
- printTypeIndex("Type", Local.Type);
- W.printFlags("Flags", uint16_t(Local.Flags), getLocalFlagNames());
- W.printString("VarName", Local.Name);
- return Error::success();
-}
-
-Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR, ObjNameSym &ObjName) {
- W.printHex("Signature", ObjName.Signature);
- W.printString("ObjectName", ObjName.Name);
- return Error::success();
-}
-
-Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR, ProcSym &Proc) {
- if (InFunctionScope)
- return llvm::make_error<CodeViewError>(
- "Visiting a ProcSym while inside function scope!");
-
- InFunctionScope = true;
-
- StringRef LinkageName;
- W.printHex("PtrParent", Proc.Parent);
- W.printHex("PtrEnd", Proc.End);
- W.printHex("PtrNext", Proc.Next);
- W.printHex("CodeSize", Proc.CodeSize);
- W.printHex("DbgStart", Proc.DbgStart);
- W.printHex("DbgEnd", Proc.DbgEnd);
- printTypeIndex("FunctionType", Proc.FunctionType);
- if (ObjDelegate) {
- ObjDelegate->printRelocatedField("CodeOffset", Proc.getRelocationOffset(),
- Proc.CodeOffset, &LinkageName);
- }
- W.printHex("Segment", Proc.Segment);
- W.printFlags("Flags", static_cast<uint8_t>(Proc.Flags),
- getProcSymFlagNames());
- W.printString("DisplayName", Proc.Name);
- if (!LinkageName.empty())
- W.printString("LinkageName", LinkageName);
- return Error::success();
-}
-
-Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR,
- ScopeEndSym &ScopeEnd) {
- InFunctionScope = false;
- return Error::success();
-}
-
-Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR, CallerSym &Caller) {
- ListScope S(W, CVR.kind() == S_CALLEES ? "Callees" : "Callers");
- for (auto FuncID : Caller.Indices)
- printTypeIndex("FuncID", FuncID);
- return Error::success();
-}
-
-Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR,
- RegRelativeSym &RegRel) {
- W.printHex("Offset", RegRel.Offset);
- printTypeIndex("Type", RegRel.Type);
- W.printEnum("Register", uint16_t(RegRel.Register),
- getRegisterNames(CompilationCPUType));
- W.printString("VarName", RegRel.Name);
- return Error::success();
-}
-
-Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR,
- ThreadLocalDataSym &Data) {
- StringRef LinkageName;
- if (ObjDelegate) {
- ObjDelegate->printRelocatedField("DataOffset", Data.getRelocationOffset(),
- Data.DataOffset, &LinkageName);
- }
- printTypeIndex("Type", Data.Type);
- W.printString("DisplayName", Data.Name);
- if (!LinkageName.empty())
- W.printString("LinkageName", LinkageName);
- return Error::success();
-}
-
-Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR, UDTSym &UDT) {
- printTypeIndex("Type", UDT.Type);
- W.printString("UDTName", UDT.Name);
- return Error::success();
-}
-
-Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR,
- UsingNamespaceSym &UN) {
- W.printString("Namespace", UN.Name);
- return Error::success();
-}
-
-Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR,
- AnnotationSym &Annot) {
- W.printHex("Offset", Annot.CodeOffset);
- W.printHex("Segment", Annot.Segment);
-
- ListScope S(W, "Strings");
- for (StringRef Str : Annot.Strings)
- W.printString(Str);
-
- return Error::success();
-}
-
-Error CVSymbolDumperImpl::visitUnknownSymbol(CVSymbol &CVR) {
- W.printNumber("Length", CVR.length());
- return Error::success();
-}
-
-Error CVSymbolDumper::dump(CVRecord<SymbolKind> &Record) {
- SymbolVisitorCallbackPipeline Pipeline;
- SymbolDeserializer Deserializer(ObjDelegate.get(), Container);
- CVSymbolDumperImpl Dumper(Types, ObjDelegate.get(), W, CompilationCPUType,
- PrintRecordBytes);
-
- Pipeline.addCallbackToPipeline(Deserializer);
- Pipeline.addCallbackToPipeline(Dumper);
- CVSymbolVisitor Visitor(Pipeline);
- auto Err = Visitor.visitSymbolRecord(Record);
- CompilationCPUType = Dumper.getCompilationCPUType();
- return Err;
-}
-
-Error CVSymbolDumper::dump(const CVSymbolArray &Symbols) {
- SymbolVisitorCallbackPipeline Pipeline;
- SymbolDeserializer Deserializer(ObjDelegate.get(), Container);
- CVSymbolDumperImpl Dumper(Types, ObjDelegate.get(), W, CompilationCPUType,
- PrintRecordBytes);
-
- Pipeline.addCallbackToPipeline(Deserializer);
- Pipeline.addCallbackToPipeline(Dumper);
- CVSymbolVisitor Visitor(Pipeline);
- auto Err = Visitor.visitSymbolStream(Symbols);
- CompilationCPUType = Dumper.getCompilationCPUType();
- return Err;
-}
+//===-- SymbolDumper.cpp - CodeView symbol info dumper ----------*- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "llvm/DebugInfo/CodeView/SymbolDumper.h"
+#include "llvm/ADT/SmallString.h"
+#include "llvm/DebugInfo/CodeView/CVSymbolVisitor.h"
+#include "llvm/DebugInfo/CodeView/DebugStringTableSubsection.h"
+#include "llvm/DebugInfo/CodeView/EnumTables.h"
+#include "llvm/DebugInfo/CodeView/SymbolDeserializer.h"
+#include "llvm/DebugInfo/CodeView/SymbolDumpDelegate.h"
+#include "llvm/DebugInfo/CodeView/SymbolRecord.h"
+#include "llvm/DebugInfo/CodeView/SymbolVisitorCallbackPipeline.h"
+#include "llvm/DebugInfo/CodeView/SymbolVisitorCallbacks.h"
+#include "llvm/DebugInfo/CodeView/TypeIndex.h"
+#include "llvm/Support/Error.h"
+#include "llvm/Support/ScopedPrinter.h"
+
+#include <system_error>
+
+using namespace llvm;
+using namespace llvm::codeview;
+
+namespace {
+/// Use this private dumper implementation to keep implementation details about
+/// the visitor out of SymbolDumper.h.
+class CVSymbolDumperImpl : public SymbolVisitorCallbacks {
+public:
+ CVSymbolDumperImpl(TypeCollection &Types, SymbolDumpDelegate *ObjDelegate,
+ ScopedPrinter &W, CPUType CPU, bool PrintRecordBytes)
+ : Types(Types), ObjDelegate(ObjDelegate), W(W), CompilationCPUType(CPU),
+ PrintRecordBytes(PrintRecordBytes), InFunctionScope(false) {}
+
+/// CVSymbolVisitor overrides.
+#define SYMBOL_RECORD(EnumName, EnumVal, Name) \
+ Error visitKnownRecord(CVSymbol &CVR, Name &Record) override;
+#define SYMBOL_RECORD_ALIAS(EnumName, EnumVal, Name, AliasName)
+#include "llvm/DebugInfo/CodeView/CodeViewSymbols.def"
+
+ Error visitSymbolBegin(CVSymbol &Record) override;
+ Error visitSymbolEnd(CVSymbol &Record) override;
+ Error visitUnknownSymbol(CVSymbol &Record) override;
+
+ CPUType getCompilationCPUType() const { return CompilationCPUType; }
+
+private:
+ void printLocalVariableAddrRange(const LocalVariableAddrRange &Range,
+ uint32_t RelocationOffset);
+ void printLocalVariableAddrGap(ArrayRef<LocalVariableAddrGap> Gaps);
+ void printTypeIndex(StringRef FieldName, TypeIndex TI);
+
+ TypeCollection &Types;
+ SymbolDumpDelegate *ObjDelegate;
+ ScopedPrinter &W;
+
+ /// Save the machine or CPU type when dumping a compile symbols.
+ CPUType CompilationCPUType = CPUType::X64;
+
+ bool PrintRecordBytes;
+ bool InFunctionScope;
+};
+}
+
+static StringRef getSymbolKindName(SymbolKind Kind) {
+ switch (Kind) {
+#define SYMBOL_RECORD(EnumName, EnumVal, Name) \
+ case EnumName: \
+ return #Name;
+#include "llvm/DebugInfo/CodeView/CodeViewSymbols.def"
+ default:
+ break;
+ }
+ return "UnknownSym";
+}
+
+void CVSymbolDumperImpl::printLocalVariableAddrRange(
+ const LocalVariableAddrRange &Range, uint32_t RelocationOffset) {
+ DictScope S(W, "LocalVariableAddrRange");
+ if (ObjDelegate)
+ ObjDelegate->printRelocatedField("OffsetStart", RelocationOffset,
+ Range.OffsetStart);
+ W.printHex("ISectStart", Range.ISectStart);
+ W.printHex("Range", Range.Range);
+}
+
+void CVSymbolDumperImpl::printLocalVariableAddrGap(
+ ArrayRef<LocalVariableAddrGap> Gaps) {
+ for (auto &Gap : Gaps) {
+ ListScope S(W, "LocalVariableAddrGap");
+ W.printHex("GapStartOffset", Gap.GapStartOffset);
+ W.printHex("Range", Gap.Range);
+ }
+}
+
+void CVSymbolDumperImpl::printTypeIndex(StringRef FieldName, TypeIndex TI) {
+ codeview::printTypeIndex(W, FieldName, TI, Types);
+}
+
+Error CVSymbolDumperImpl::visitSymbolBegin(CVSymbol &CVR) {
+ W.startLine() << getSymbolKindName(CVR.kind());
+ W.getOStream() << " {\n";
+ W.indent();
+ W.printEnum("Kind", unsigned(CVR.kind()), getSymbolTypeNames());
+ return Error::success();
+}
+
+Error CVSymbolDumperImpl::visitSymbolEnd(CVSymbol &CVR) {
+ if (PrintRecordBytes && ObjDelegate)
+ ObjDelegate->printBinaryBlockWithRelocs("SymData", CVR.content());
+
+ W.unindent();
+ W.startLine() << "}\n";
+ return Error::success();
+}
+
+Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR, BlockSym &Block) {
+ StringRef LinkageName;
+ W.printHex("PtrParent", Block.Parent);
+ W.printHex("PtrEnd", Block.End);
+ W.printHex("CodeSize", Block.CodeSize);
+ if (ObjDelegate) {
+ ObjDelegate->printRelocatedField("CodeOffset", Block.getRelocationOffset(),
+ Block.CodeOffset, &LinkageName);
+ }
+ W.printHex("Segment", Block.Segment);
+ W.printString("BlockName", Block.Name);
+ W.printString("LinkageName", LinkageName);
+ return Error::success();
+}
+
+Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR, Thunk32Sym &Thunk) {
+ W.printString("Name", Thunk.Name);
+ W.printNumber("Parent", Thunk.Parent);
+ W.printNumber("End", Thunk.End);
+ W.printNumber("Next", Thunk.Next);
+ W.printNumber("Off", Thunk.Offset);
+ W.printNumber("Seg", Thunk.Segment);
+ W.printNumber("Len", Thunk.Length);
+ W.printEnum("Ordinal", uint8_t(Thunk.Thunk), getThunkOrdinalNames());
+ return Error::success();
+}
+
+Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR,
+ TrampolineSym &Tramp) {
+ W.printEnum("Type", uint16_t(Tramp.Type), getTrampolineNames());
+ W.printNumber("Size", Tramp.Size);
+ W.printNumber("ThunkOff", Tramp.ThunkOffset);
+ W.printNumber("TargetOff", Tramp.TargetOffset);
+ W.printNumber("ThunkSection", Tramp.ThunkSection);
+ W.printNumber("TargetSection", Tramp.TargetSection);
+ return Error::success();
+}
+
+Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR, SectionSym &Section) {
+ W.printNumber("SectionNumber", Section.SectionNumber);
+ W.printNumber("Alignment", Section.Alignment);
+ W.printNumber("Rva", Section.Rva);
+ W.printNumber("Length", Section.Length);
+ W.printFlags("Characteristics", Section.Characteristics,
+ getImageSectionCharacteristicNames(),
+ COFF::SectionCharacteristics(0x00F00000));
+
+ W.printString("Name", Section.Name);
+ return Error::success();
+}
+
+Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR,
+ CoffGroupSym &CoffGroup) {
+ W.printNumber("Size", CoffGroup.Size);
+ W.printFlags("Characteristics", CoffGroup.Characteristics,
+ getImageSectionCharacteristicNames(),
+ COFF::SectionCharacteristics(0x00F00000));
+ W.printNumber("Offset", CoffGroup.Offset);
+ W.printNumber("Segment", CoffGroup.Segment);
+ W.printString("Name", CoffGroup.Name);
+ return Error::success();
+}
+
+Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR,
+ BPRelativeSym &BPRel) {
+ W.printNumber("Offset", BPRel.Offset);
+ printTypeIndex("Type", BPRel.Type);
+ W.printString("VarName", BPRel.Name);
+ return Error::success();
+}
+
+Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR,
+ BuildInfoSym &BuildInfo) {
+ printTypeIndex("BuildId", BuildInfo.BuildId);
+ return Error::success();
+}
+
+Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR,
+ CallSiteInfoSym &CallSiteInfo) {
+ StringRef LinkageName;
+ if (ObjDelegate) {
+ ObjDelegate->printRelocatedField("CodeOffset",
+ CallSiteInfo.getRelocationOffset(),
+ CallSiteInfo.CodeOffset, &LinkageName);
+ }
+ W.printHex("Segment", CallSiteInfo.Segment);
+ printTypeIndex("Type", CallSiteInfo.Type);
+ if (!LinkageName.empty())
+ W.printString("LinkageName", LinkageName);
+ return Error::success();
+}
+
+Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR,
+ EnvBlockSym &EnvBlock) {
+ ListScope L(W, "Entries");
+ for (auto Entry : EnvBlock.Fields) {
+ W.printString(Entry);
+ }
+ return Error::success();
+}
+
+Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR,
+ FileStaticSym &FileStatic) {
+ printTypeIndex("Index", FileStatic.Index);
+ W.printNumber("ModFilenameOffset", FileStatic.ModFilenameOffset);
+ W.printFlags("Flags", uint16_t(FileStatic.Flags), getLocalFlagNames());
+ W.printString("Name", FileStatic.Name);
+ return Error::success();
+}
+
+Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR, ExportSym &Export) {
+ W.printNumber("Ordinal", Export.Ordinal);
+ W.printFlags("Flags", uint16_t(Export.Flags), getExportSymFlagNames());
+ W.printString("Name", Export.Name);
+ return Error::success();
+}
+
+Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR,
+ Compile2Sym &Compile2) {
+ W.printEnum("Language", Compile2.getLanguage(), getSourceLanguageNames());
+ W.printFlags("Flags", Compile2.getFlags(), getCompileSym2FlagNames());
+ W.printEnum("Machine", unsigned(Compile2.Machine), getCPUTypeNames());
+ CompilationCPUType = Compile2.Machine;
+ std::string FrontendVersion;
+ {
+ raw_string_ostream Out(FrontendVersion);
+ Out << Compile2.VersionFrontendMajor << '.' << Compile2.VersionFrontendMinor
+ << '.' << Compile2.VersionFrontendBuild;
+ }
+ std::string BackendVersion;
+ {
+ raw_string_ostream Out(BackendVersion);
+ Out << Compile2.VersionBackendMajor << '.' << Compile2.VersionBackendMinor
+ << '.' << Compile2.VersionBackendBuild;
+ }
+ W.printString("FrontendVersion", FrontendVersion);
+ W.printString("BackendVersion", BackendVersion);
+ W.printString("VersionName", Compile2.Version);
+ return Error::success();
+}
+
+Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR,
+ Compile3Sym &Compile3) {
+ W.printEnum("Language", uint8_t(Compile3.getLanguage()), getSourceLanguageNames());
+ W.printFlags("Flags", uint32_t(Compile3.getFlags()),
+ getCompileSym3FlagNames());
+ W.printEnum("Machine", unsigned(Compile3.Machine), getCPUTypeNames());
+ CompilationCPUType = Compile3.Machine;
+ std::string FrontendVersion;
+ {
+ raw_string_ostream Out(FrontendVersion);
+ Out << Compile3.VersionFrontendMajor << '.' << Compile3.VersionFrontendMinor
+ << '.' << Compile3.VersionFrontendBuild << '.'
+ << Compile3.VersionFrontendQFE;
+ }
+ std::string BackendVersion;
+ {
+ raw_string_ostream Out(BackendVersion);
+ Out << Compile3.VersionBackendMajor << '.' << Compile3.VersionBackendMinor
+ << '.' << Compile3.VersionBackendBuild << '.'
+ << Compile3.VersionBackendQFE;
+ }
+ W.printString("FrontendVersion", FrontendVersion);
+ W.printString("BackendVersion", BackendVersion);
+ W.printString("VersionName", Compile3.Version);
+ return Error::success();
+}
+
+Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR,
+ ConstantSym &Constant) {
+ printTypeIndex("Type", Constant.Type);
+ W.printNumber("Value", Constant.Value);
+ W.printString("Name", Constant.Name);
+ return Error::success();
+}
+
+Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR, DataSym &Data) {
+ StringRef LinkageName;
+ if (ObjDelegate) {
+ ObjDelegate->printRelocatedField("DataOffset", Data.getRelocationOffset(),
+ Data.DataOffset, &LinkageName);
+ }
+ printTypeIndex("Type", Data.Type);
+ W.printString("DisplayName", Data.Name);
+ if (!LinkageName.empty())
+ W.printString("LinkageName", LinkageName);
+ return Error::success();
+}
+
+Error CVSymbolDumperImpl::visitKnownRecord(
+ CVSymbol &CVR,
+ DefRangeFramePointerRelFullScopeSym &DefRangeFramePointerRelFullScope) {
+ W.printNumber("Offset", DefRangeFramePointerRelFullScope.Offset);
+ return Error::success();
+}
+
+Error CVSymbolDumperImpl::visitKnownRecord(
+ CVSymbol &CVR, DefRangeFramePointerRelSym &DefRangeFramePointerRel) {
+ W.printNumber("Offset", DefRangeFramePointerRel.Hdr.Offset);
+ printLocalVariableAddrRange(DefRangeFramePointerRel.Range,
+ DefRangeFramePointerRel.getRelocationOffset());
+ printLocalVariableAddrGap(DefRangeFramePointerRel.Gaps);
+ return Error::success();
+}
+
+Error CVSymbolDumperImpl::visitKnownRecord(
+ CVSymbol &CVR, DefRangeRegisterRelSym &DefRangeRegisterRel) {
+ W.printEnum("BaseRegister", uint16_t(DefRangeRegisterRel.Hdr.Register),
+ getRegisterNames(CompilationCPUType));
+ W.printBoolean("HasSpilledUDTMember",
+ DefRangeRegisterRel.hasSpilledUDTMember());
+ W.printNumber("OffsetInParent", DefRangeRegisterRel.offsetInParent());
+ W.printNumber("BasePointerOffset", DefRangeRegisterRel.Hdr.BasePointerOffset);
+ printLocalVariableAddrRange(DefRangeRegisterRel.Range,
+ DefRangeRegisterRel.getRelocationOffset());
+ printLocalVariableAddrGap(DefRangeRegisterRel.Gaps);
+ return Error::success();
+}
+
+Error CVSymbolDumperImpl::visitKnownRecord(
+ CVSymbol &CVR, DefRangeRegisterSym &DefRangeRegister) {
+ W.printEnum("Register", uint16_t(DefRangeRegister.Hdr.Register),
+ getRegisterNames(CompilationCPUType));
+ W.printNumber("MayHaveNoName", DefRangeRegister.Hdr.MayHaveNoName);
+ printLocalVariableAddrRange(DefRangeRegister.Range,
+ DefRangeRegister.getRelocationOffset());
+ printLocalVariableAddrGap(DefRangeRegister.Gaps);
+ return Error::success();
+}
+
+Error CVSymbolDumperImpl::visitKnownRecord(
+ CVSymbol &CVR, DefRangeSubfieldRegisterSym &DefRangeSubfieldRegister) {
+ W.printEnum("Register", uint16_t(DefRangeSubfieldRegister.Hdr.Register),
+ getRegisterNames(CompilationCPUType));
+ W.printNumber("MayHaveNoName", DefRangeSubfieldRegister.Hdr.MayHaveNoName);
+ W.printNumber("OffsetInParent", DefRangeSubfieldRegister.Hdr.OffsetInParent);
+ printLocalVariableAddrRange(DefRangeSubfieldRegister.Range,
+ DefRangeSubfieldRegister.getRelocationOffset());
+ printLocalVariableAddrGap(DefRangeSubfieldRegister.Gaps);
+ return Error::success();
+}
+
+Error CVSymbolDumperImpl::visitKnownRecord(
+ CVSymbol &CVR, DefRangeSubfieldSym &DefRangeSubfield) {
+ if (ObjDelegate) {
+ DebugStringTableSubsectionRef Strings = ObjDelegate->getStringTable();
+ auto ExpectedProgram = Strings.getString(DefRangeSubfield.Program);
+ if (!ExpectedProgram) {
+ consumeError(ExpectedProgram.takeError());
+ return llvm::make_error<CodeViewError>(
+ "String table offset outside of bounds of String Table!");
+ }
+ W.printString("Program", *ExpectedProgram);
+ }
+ W.printNumber("OffsetInParent", DefRangeSubfield.OffsetInParent);
+ printLocalVariableAddrRange(DefRangeSubfield.Range,
+ DefRangeSubfield.getRelocationOffset());
+ printLocalVariableAddrGap(DefRangeSubfield.Gaps);
+ return Error::success();
+}
+
+Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR,
+ DefRangeSym &DefRange) {
+ if (ObjDelegate) {
+ DebugStringTableSubsectionRef Strings = ObjDelegate->getStringTable();
+ auto ExpectedProgram = Strings.getString(DefRange.Program);
+ if (!ExpectedProgram) {
+ consumeError(ExpectedProgram.takeError());
+ return llvm::make_error<CodeViewError>(
+ "String table offset outside of bounds of String Table!");
+ }
+ W.printString("Program", *ExpectedProgram);
+ }
+ printLocalVariableAddrRange(DefRange.Range, DefRange.getRelocationOffset());
+ printLocalVariableAddrGap(DefRange.Gaps);
+ return Error::success();
+}
+
+Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR,
+ FrameCookieSym &FrameCookie) {
+ StringRef LinkageName;
+ if (ObjDelegate) {
+ ObjDelegate->printRelocatedField("CodeOffset",
+ FrameCookie.getRelocationOffset(),
+ FrameCookie.CodeOffset, &LinkageName);
+ }
+ W.printEnum("Register", uint16_t(FrameCookie.Register),
+ getRegisterNames(CompilationCPUType));
+ W.printEnum("CookieKind", uint16_t(FrameCookie.CookieKind),
+ getFrameCookieKindNames());
+ W.printHex("Flags", FrameCookie.Flags);
+ return Error::success();
+}
+
+Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR,
+ FrameProcSym &FrameProc) {
+ W.printHex("TotalFrameBytes", FrameProc.TotalFrameBytes);
+ W.printHex("PaddingFrameBytes", FrameProc.PaddingFrameBytes);
+ W.printHex("OffsetToPadding", FrameProc.OffsetToPadding);
+ W.printHex("BytesOfCalleeSavedRegisters",
+ FrameProc.BytesOfCalleeSavedRegisters);
+ W.printHex("OffsetOfExceptionHandler", FrameProc.OffsetOfExceptionHandler);
+ W.printHex("SectionIdOfExceptionHandler",
+ FrameProc.SectionIdOfExceptionHandler);
+ W.printFlags("Flags", static_cast<uint32_t>(FrameProc.Flags),
+ getFrameProcSymFlagNames());
+ W.printEnum("LocalFramePtrReg",
+ uint16_t(FrameProc.getLocalFramePtrReg(CompilationCPUType)),
+ getRegisterNames(CompilationCPUType));
+ W.printEnum("ParamFramePtrReg",
+ uint16_t(FrameProc.getParamFramePtrReg(CompilationCPUType)),
+ getRegisterNames(CompilationCPUType));
+ return Error::success();
+}
+
+Error CVSymbolDumperImpl::visitKnownRecord(
+ CVSymbol &CVR, HeapAllocationSiteSym &HeapAllocSite) {
+ StringRef LinkageName;
+ if (ObjDelegate) {
+ ObjDelegate->printRelocatedField("CodeOffset",
+ HeapAllocSite.getRelocationOffset(),
+ HeapAllocSite.CodeOffset, &LinkageName);
+ }
+ W.printHex("Segment", HeapAllocSite.Segment);
+ W.printHex("CallInstructionSize", HeapAllocSite.CallInstructionSize);
+ printTypeIndex("Type", HeapAllocSite.Type);
+ if (!LinkageName.empty())
+ W.printString("LinkageName", LinkageName);
+ return Error::success();
+}
+
+Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR,
+ InlineSiteSym &InlineSite) {
+ W.printHex("PtrParent", InlineSite.Parent);
+ W.printHex("PtrEnd", InlineSite.End);
+ printTypeIndex("Inlinee", InlineSite.Inlinee);
+
+ ListScope BinaryAnnotations(W, "BinaryAnnotations");
+ for (auto &Annotation : InlineSite.annotations()) {
+ switch (Annotation.OpCode) {
+ case BinaryAnnotationsOpCode::Invalid:
+ W.printString("(Annotation Padding)");
+ break;
+ case BinaryAnnotationsOpCode::CodeOffset:
+ case BinaryAnnotationsOpCode::ChangeCodeOffset:
+ case BinaryAnnotationsOpCode::ChangeCodeLength:
+ W.printHex(Annotation.Name, Annotation.U1);
+ break;
+ case BinaryAnnotationsOpCode::ChangeCodeOffsetBase:
+ case BinaryAnnotationsOpCode::ChangeLineEndDelta:
+ case BinaryAnnotationsOpCode::ChangeRangeKind:
+ case BinaryAnnotationsOpCode::ChangeColumnStart:
+ case BinaryAnnotationsOpCode::ChangeColumnEnd:
+ W.printNumber(Annotation.Name, Annotation.U1);
+ break;
+ case BinaryAnnotationsOpCode::ChangeLineOffset:
+ case BinaryAnnotationsOpCode::ChangeColumnEndDelta:
+ W.printNumber(Annotation.Name, Annotation.S1);
+ break;
+ case BinaryAnnotationsOpCode::ChangeFile:
+ if (ObjDelegate) {
+ W.printHex("ChangeFile",
+ ObjDelegate->getFileNameForFileOffset(Annotation.U1),
+ Annotation.U1);
+ } else {
+ W.printHex("ChangeFile", Annotation.U1);
+ }
+
+ break;
+ case BinaryAnnotationsOpCode::ChangeCodeOffsetAndLineOffset: {
+ W.startLine() << "ChangeCodeOffsetAndLineOffset: {CodeOffset: "
+ << W.hex(Annotation.U1) << ", LineOffset: " << Annotation.S1
+ << "}\n";
+ break;
+ }
+ case BinaryAnnotationsOpCode::ChangeCodeLengthAndCodeOffset: {
+ W.startLine() << "ChangeCodeLengthAndCodeOffset: {CodeOffset: "
+ << W.hex(Annotation.U2)
+ << ", Length: " << W.hex(Annotation.U1) << "}\n";
+ break;
+ }
+ }
+ }
+ return Error::success();
+}
+
+Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR,
+ RegisterSym &Register) {
+ printTypeIndex("Type", Register.Index);
+ W.printEnum("Seg", uint16_t(Register.Register),
+ getRegisterNames(CompilationCPUType));
+ W.printString("Name", Register.Name);
+ return Error::success();
+}
+
+Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR, PublicSym32 &Public) {
+ W.printFlags("Flags", uint32_t(Public.Flags), getPublicSymFlagNames());
+ W.printNumber("Seg", Public.Segment);
+ W.printNumber("Off", Public.Offset);
+ W.printString("Name", Public.Name);
+ return Error::success();
+}
+
+Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR, ProcRefSym &ProcRef) {
+ W.printNumber("SumName", ProcRef.SumName);
+ W.printNumber("SymOffset", ProcRef.SymOffset);
+ W.printNumber("Mod", ProcRef.Module);
+ W.printString("Name", ProcRef.Name);
+ return Error::success();
+}
+
+Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR, LabelSym &Label) {
+ StringRef LinkageName;
+ if (ObjDelegate) {
+ ObjDelegate->printRelocatedField("CodeOffset", Label.getRelocationOffset(),
+ Label.CodeOffset, &LinkageName);
+ }
+ W.printHex("Segment", Label.Segment);
+ W.printHex("Flags", uint8_t(Label.Flags));
+ W.printFlags("Flags", uint8_t(Label.Flags), getProcSymFlagNames());
+ W.printString("DisplayName", Label.Name);
+ if (!LinkageName.empty())
+ W.printString("LinkageName", LinkageName);
+ return Error::success();
+}
+
+Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR, LocalSym &Local) {
+ printTypeIndex("Type", Local.Type);
+ W.printFlags("Flags", uint16_t(Local.Flags), getLocalFlagNames());
+ W.printString("VarName", Local.Name);
+ return Error::success();
+}
+
+Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR, ObjNameSym &ObjName) {
+ W.printHex("Signature", ObjName.Signature);
+ W.printString("ObjectName", ObjName.Name);
+ return Error::success();
+}
+
+Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR, ProcSym &Proc) {
+ if (InFunctionScope)
+ return llvm::make_error<CodeViewError>(
+ "Visiting a ProcSym while inside function scope!");
+
+ InFunctionScope = true;
+
+ StringRef LinkageName;
+ W.printHex("PtrParent", Proc.Parent);
+ W.printHex("PtrEnd", Proc.End);
+ W.printHex("PtrNext", Proc.Next);
+ W.printHex("CodeSize", Proc.CodeSize);
+ W.printHex("DbgStart", Proc.DbgStart);
+ W.printHex("DbgEnd", Proc.DbgEnd);
+ printTypeIndex("FunctionType", Proc.FunctionType);
+ if (ObjDelegate) {
+ ObjDelegate->printRelocatedField("CodeOffset", Proc.getRelocationOffset(),
+ Proc.CodeOffset, &LinkageName);
+ }
+ W.printHex("Segment", Proc.Segment);
+ W.printFlags("Flags", static_cast<uint8_t>(Proc.Flags),
+ getProcSymFlagNames());
+ W.printString("DisplayName", Proc.Name);
+ if (!LinkageName.empty())
+ W.printString("LinkageName", LinkageName);
+ return Error::success();
+}
+
+Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR,
+ ScopeEndSym &ScopeEnd) {
+ InFunctionScope = false;
+ return Error::success();
+}
+
+Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR, CallerSym &Caller) {
+ ListScope S(W, CVR.kind() == S_CALLEES ? "Callees" : "Callers");
+ for (auto FuncID : Caller.Indices)
+ printTypeIndex("FuncID", FuncID);
+ return Error::success();
+}
+
+Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR,
+ RegRelativeSym &RegRel) {
+ W.printHex("Offset", RegRel.Offset);
+ printTypeIndex("Type", RegRel.Type);
+ W.printEnum("Register", uint16_t(RegRel.Register),
+ getRegisterNames(CompilationCPUType));
+ W.printString("VarName", RegRel.Name);
+ return Error::success();
+}
+
+Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR,
+ ThreadLocalDataSym &Data) {
+ StringRef LinkageName;
+ if (ObjDelegate) {
+ ObjDelegate->printRelocatedField("DataOffset", Data.getRelocationOffset(),
+ Data.DataOffset, &LinkageName);
+ }
+ printTypeIndex("Type", Data.Type);
+ W.printString("DisplayName", Data.Name);
+ if (!LinkageName.empty())
+ W.printString("LinkageName", LinkageName);
+ return Error::success();
+}
+
+Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR, UDTSym &UDT) {
+ printTypeIndex("Type", UDT.Type);
+ W.printString("UDTName", UDT.Name);
+ return Error::success();
+}
+
+Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR,
+ UsingNamespaceSym &UN) {
+ W.printString("Namespace", UN.Name);
+ return Error::success();
+}
+
+Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR,
+ AnnotationSym &Annot) {
+ W.printHex("Offset", Annot.CodeOffset);
+ W.printHex("Segment", Annot.Segment);
+
+ ListScope S(W, "Strings");
+ for (StringRef Str : Annot.Strings)
+ W.printString(Str);
+
+ return Error::success();
+}
+
+Error CVSymbolDumperImpl::visitUnknownSymbol(CVSymbol &CVR) {
+ W.printNumber("Length", CVR.length());
+ return Error::success();
+}
+
+Error CVSymbolDumper::dump(CVRecord<SymbolKind> &Record) {
+ SymbolVisitorCallbackPipeline Pipeline;
+ SymbolDeserializer Deserializer(ObjDelegate.get(), Container);
+ CVSymbolDumperImpl Dumper(Types, ObjDelegate.get(), W, CompilationCPUType,
+ PrintRecordBytes);
+
+ Pipeline.addCallbackToPipeline(Deserializer);
+ Pipeline.addCallbackToPipeline(Dumper);
+ CVSymbolVisitor Visitor(Pipeline);
+ auto Err = Visitor.visitSymbolRecord(Record);
+ CompilationCPUType = Dumper.getCompilationCPUType();
+ return Err;
+}
+
+Error CVSymbolDumper::dump(const CVSymbolArray &Symbols) {
+ SymbolVisitorCallbackPipeline Pipeline;
+ SymbolDeserializer Deserializer(ObjDelegate.get(), Container);
+ CVSymbolDumperImpl Dumper(Types, ObjDelegate.get(), W, CompilationCPUType,
+ PrintRecordBytes);
+
+ Pipeline.addCallbackToPipeline(Deserializer);
+ Pipeline.addCallbackToPipeline(Dumper);
+ CVSymbolVisitor Visitor(Pipeline);
+ auto Err = Visitor.visitSymbolStream(Symbols);
+ CompilationCPUType = Dumper.getCompilationCPUType();
+ return Err;
+}
diff --git a/contrib/libs/llvm12/lib/DebugInfo/CodeView/SymbolRecordHelpers.cpp b/contrib/libs/llvm12/lib/DebugInfo/CodeView/SymbolRecordHelpers.cpp
index a4d3a4068ea..2562c633bb9 100644
--- a/contrib/libs/llvm12/lib/DebugInfo/CodeView/SymbolRecordHelpers.cpp
+++ b/contrib/libs/llvm12/lib/DebugInfo/CodeView/SymbolRecordHelpers.cpp
@@ -1,93 +1,93 @@
-//===- SymbolRecordHelpers.cpp ----------------------------------*- C++ -*-===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-
-#include "llvm/DebugInfo/CodeView/SymbolRecordHelpers.h"
-
-#include "llvm/ADT/SmallVector.h"
-#include "llvm/DebugInfo/CodeView/SymbolDeserializer.h"
-
-using namespace llvm;
-using namespace llvm::codeview;
-
-template <typename RecordT> static RecordT createRecord(const CVSymbol &sym) {
- RecordT record(static_cast<SymbolRecordKind>(sym.kind()));
- cantFail(SymbolDeserializer::deserializeAs<RecordT>(sym, record));
- return record;
-}
-
-uint32_t llvm::codeview::getScopeEndOffset(const CVSymbol &Sym) {
- assert(symbolOpensScope(Sym.kind()));
- switch (Sym.kind()) {
- case SymbolKind::S_GPROC32:
- case SymbolKind::S_LPROC32:
- case SymbolKind::S_GPROC32_ID:
- case SymbolKind::S_LPROC32_ID:
- case SymbolKind::S_LPROC32_DPC:
- case SymbolKind::S_LPROC32_DPC_ID: {
- ProcSym Proc = createRecord<ProcSym>(Sym);
- return Proc.End;
- }
- case SymbolKind::S_BLOCK32: {
- BlockSym Block = createRecord<BlockSym>(Sym);
- return Block.End;
- }
- case SymbolKind::S_THUNK32: {
- Thunk32Sym Thunk = createRecord<Thunk32Sym>(Sym);
- return Thunk.End;
- }
- case SymbolKind::S_INLINESITE: {
- InlineSiteSym Site = createRecord<InlineSiteSym>(Sym);
- return Site.End;
- }
- default:
- assert(false && "Unknown record type");
- return 0;
- }
-}
-
-uint32_t
-llvm::codeview::getScopeParentOffset(const llvm::codeview::CVSymbol &Sym) {
- assert(symbolOpensScope(Sym.kind()));
- switch (Sym.kind()) {
- case SymbolKind::S_GPROC32:
- case SymbolKind::S_LPROC32:
- case SymbolKind::S_GPROC32_ID:
- case SymbolKind::S_LPROC32_ID:
- case SymbolKind::S_LPROC32_DPC:
- case SymbolKind::S_LPROC32_DPC_ID: {
- ProcSym Proc = createRecord<ProcSym>(Sym);
- return Proc.Parent;
- }
- case SymbolKind::S_BLOCK32: {
- BlockSym Block = createRecord<BlockSym>(Sym);
- return Block.Parent;
- }
- case SymbolKind::S_THUNK32: {
- Thunk32Sym Thunk = createRecord<Thunk32Sym>(Sym);
- return Thunk.Parent;
- }
- case SymbolKind::S_INLINESITE: {
- InlineSiteSym Site = createRecord<InlineSiteSym>(Sym);
- return Site.Parent;
- }
- default:
- assert(false && "Unknown record type");
- return 0;
- }
-}
-
-CVSymbolArray
-llvm::codeview::limitSymbolArrayToScope(const CVSymbolArray &Symbols,
- uint32_t ScopeBegin) {
- CVSymbol Opener = *Symbols.at(ScopeBegin);
- assert(symbolOpensScope(Opener.kind()));
- uint32_t EndOffset = getScopeEndOffset(Opener);
- CVSymbol Closer = *Symbols.at(EndOffset);
- EndOffset += Closer.RecordData.size();
- return Symbols.substream(ScopeBegin, EndOffset);
-}
+//===- SymbolRecordHelpers.cpp ----------------------------------*- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "llvm/DebugInfo/CodeView/SymbolRecordHelpers.h"
+
+#include "llvm/ADT/SmallVector.h"
+#include "llvm/DebugInfo/CodeView/SymbolDeserializer.h"
+
+using namespace llvm;
+using namespace llvm::codeview;
+
+template <typename RecordT> static RecordT createRecord(const CVSymbol &sym) {
+ RecordT record(static_cast<SymbolRecordKind>(sym.kind()));
+ cantFail(SymbolDeserializer::deserializeAs<RecordT>(sym, record));
+ return record;
+}
+
+uint32_t llvm::codeview::getScopeEndOffset(const CVSymbol &Sym) {
+ assert(symbolOpensScope(Sym.kind()));
+ switch (Sym.kind()) {
+ case SymbolKind::S_GPROC32:
+ case SymbolKind::S_LPROC32:
+ case SymbolKind::S_GPROC32_ID:
+ case SymbolKind::S_LPROC32_ID:
+ case SymbolKind::S_LPROC32_DPC:
+ case SymbolKind::S_LPROC32_DPC_ID: {
+ ProcSym Proc = createRecord<ProcSym>(Sym);
+ return Proc.End;
+ }
+ case SymbolKind::S_BLOCK32: {
+ BlockSym Block = createRecord<BlockSym>(Sym);
+ return Block.End;
+ }
+ case SymbolKind::S_THUNK32: {
+ Thunk32Sym Thunk = createRecord<Thunk32Sym>(Sym);
+ return Thunk.End;
+ }
+ case SymbolKind::S_INLINESITE: {
+ InlineSiteSym Site = createRecord<InlineSiteSym>(Sym);
+ return Site.End;
+ }
+ default:
+ assert(false && "Unknown record type");
+ return 0;
+ }
+}
+
+uint32_t
+llvm::codeview::getScopeParentOffset(const llvm::codeview::CVSymbol &Sym) {
+ assert(symbolOpensScope(Sym.kind()));
+ switch (Sym.kind()) {
+ case SymbolKind::S_GPROC32:
+ case SymbolKind::S_LPROC32:
+ case SymbolKind::S_GPROC32_ID:
+ case SymbolKind::S_LPROC32_ID:
+ case SymbolKind::S_LPROC32_DPC:
+ case SymbolKind::S_LPROC32_DPC_ID: {
+ ProcSym Proc = createRecord<ProcSym>(Sym);
+ return Proc.Parent;
+ }
+ case SymbolKind::S_BLOCK32: {
+ BlockSym Block = createRecord<BlockSym>(Sym);
+ return Block.Parent;
+ }
+ case SymbolKind::S_THUNK32: {
+ Thunk32Sym Thunk = createRecord<Thunk32Sym>(Sym);
+ return Thunk.Parent;
+ }
+ case SymbolKind::S_INLINESITE: {
+ InlineSiteSym Site = createRecord<InlineSiteSym>(Sym);
+ return Site.Parent;
+ }
+ default:
+ assert(false && "Unknown record type");
+ return 0;
+ }
+}
+
+CVSymbolArray
+llvm::codeview::limitSymbolArrayToScope(const CVSymbolArray &Symbols,
+ uint32_t ScopeBegin) {
+ CVSymbol Opener = *Symbols.at(ScopeBegin);
+ assert(symbolOpensScope(Opener.kind()));
+ uint32_t EndOffset = getScopeEndOffset(Opener);
+ CVSymbol Closer = *Symbols.at(EndOffset);
+ EndOffset += Closer.RecordData.size();
+ return Symbols.substream(ScopeBegin, EndOffset);
+}
diff --git a/contrib/libs/llvm12/lib/DebugInfo/CodeView/SymbolRecordMapping.cpp b/contrib/libs/llvm12/lib/DebugInfo/CodeView/SymbolRecordMapping.cpp
index a2d37c26d42..3b627930e27 100644
--- a/contrib/libs/llvm12/lib/DebugInfo/CodeView/SymbolRecordMapping.cpp
+++ b/contrib/libs/llvm12/lib/DebugInfo/CodeView/SymbolRecordMapping.cpp
@@ -1,558 +1,558 @@
-//===- SymbolRecordMapping.cpp -----------------------------------*- C++-*-===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-
-#include "llvm/DebugInfo/CodeView/SymbolRecordMapping.h"
-
-using namespace llvm;
-using namespace llvm::codeview;
-
-#define error(X) \
- if (auto EC = X) \
- return EC;
-
-namespace {
-struct MapGap {
- Error operator()(CodeViewRecordIO &IO, LocalVariableAddrGap &Gap) const {
- error(IO.mapInteger(Gap.GapStartOffset));
- error(IO.mapInteger(Gap.Range));
- return Error::success();
- }
-};
-}
-
-static Error mapLocalVariableAddrRange(CodeViewRecordIO &IO,
- LocalVariableAddrRange &Range) {
- error(IO.mapInteger(Range.OffsetStart));
- error(IO.mapInteger(Range.ISectStart));
- error(IO.mapInteger(Range.Range));
- return Error::success();
-}
-
-Error SymbolRecordMapping::visitSymbolBegin(CVSymbol &Record) {
- error(IO.beginRecord(MaxRecordLength - sizeof(RecordPrefix)));
- return Error::success();
-}
-
-Error SymbolRecordMapping::visitSymbolEnd(CVSymbol &Record) {
- error(IO.padToAlignment(alignOf(Container)));
- error(IO.endRecord());
- return Error::success();
-}
-
-Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR, BlockSym &Block) {
-
- error(IO.mapInteger(Block.Parent));
- error(IO.mapInteger(Block.End));
- error(IO.mapInteger(Block.CodeSize));
- error(IO.mapInteger(Block.CodeOffset));
- error(IO.mapInteger(Block.Segment));
- error(IO.mapStringZ(Block.Name));
-
- return Error::success();
-}
-
-Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR, Thunk32Sym &Thunk) {
-
- error(IO.mapInteger(Thunk.Parent));
- error(IO.mapInteger(Thunk.End));
- error(IO.mapInteger(Thunk.Next));
- error(IO.mapInteger(Thunk.Offset));
- error(IO.mapInteger(Thunk.Segment));
- error(IO.mapInteger(Thunk.Length));
- error(IO.mapEnum(Thunk.Thunk));
- error(IO.mapStringZ(Thunk.Name));
- error(IO.mapByteVectorTail(Thunk.VariantData));
-
- return Error::success();
-}
-
-Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
- TrampolineSym &Tramp) {
-
- error(IO.mapEnum(Tramp.Type));
- error(IO.mapInteger(Tramp.Size));
- error(IO.mapInteger(Tramp.ThunkOffset));
- error(IO.mapInteger(Tramp.TargetOffset));
- error(IO.mapInteger(Tramp.ThunkSection));
- error(IO.mapInteger(Tramp.TargetSection));
-
- return Error::success();
-}
-
-Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
- SectionSym &Section) {
- uint8_t Padding = 0;
-
- error(IO.mapInteger(Section.SectionNumber));
- error(IO.mapInteger(Section.Alignment));
- error(IO.mapInteger(Padding));
- error(IO.mapInteger(Section.Rva));
- error(IO.mapInteger(Section.Length));
- error(IO.mapInteger(Section.Characteristics));
- error(IO.mapStringZ(Section.Name));
-
- return Error::success();
-}
-
-Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
- CoffGroupSym &CoffGroup) {
-
- error(IO.mapInteger(CoffGroup.Size));
- error(IO.mapInteger(CoffGroup.Characteristics));
- error(IO.mapInteger(CoffGroup.Offset));
- error(IO.mapInteger(CoffGroup.Segment));
- error(IO.mapStringZ(CoffGroup.Name));
-
- return Error::success();
-}
-
-Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
- BPRelativeSym &BPRel) {
-
- error(IO.mapInteger(BPRel.Offset));
- error(IO.mapInteger(BPRel.Type));
- error(IO.mapStringZ(BPRel.Name));
-
- return Error::success();
-}
-
-Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
- BuildInfoSym &BuildInfo) {
-
- error(IO.mapInteger(BuildInfo.BuildId));
-
- return Error::success();
-}
-
-Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
- CallSiteInfoSym &CallSiteInfo) {
- uint16_t Padding = 0;
-
- error(IO.mapInteger(CallSiteInfo.CodeOffset));
- error(IO.mapInteger(CallSiteInfo.Segment));
- error(IO.mapInteger(Padding));
- error(IO.mapInteger(CallSiteInfo.Type));
-
- return Error::success();
-}
-
-Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
- EnvBlockSym &EnvBlock) {
-
- uint8_t Reserved = 0;
- error(IO.mapInteger(Reserved));
- error(IO.mapStringZVectorZ(EnvBlock.Fields));
-
- return Error::success();
-}
-
-Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
- FileStaticSym &FileStatic) {
-
- error(IO.mapInteger(FileStatic.Index));
- error(IO.mapInteger(FileStatic.ModFilenameOffset));
- error(IO.mapEnum(FileStatic.Flags));
- error(IO.mapStringZ(FileStatic.Name));
-
- return Error::success();
-}
-
-Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR, ExportSym &Export) {
-
- error(IO.mapInteger(Export.Ordinal));
- error(IO.mapEnum(Export.Flags));
- error(IO.mapStringZ(Export.Name));
-
- return Error::success();
-}
-
-Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
- Compile2Sym &Compile2) {
-
- error(IO.mapEnum(Compile2.Flags));
- error(IO.mapEnum(Compile2.Machine));
- error(IO.mapInteger(Compile2.VersionFrontendMajor));
- error(IO.mapInteger(Compile2.VersionFrontendMinor));
- error(IO.mapInteger(Compile2.VersionFrontendBuild));
- error(IO.mapInteger(Compile2.VersionBackendMajor));
- error(IO.mapInteger(Compile2.VersionBackendMinor));
- error(IO.mapInteger(Compile2.VersionBackendBuild));
- error(IO.mapStringZ(Compile2.Version));
- error(IO.mapStringZVectorZ(Compile2.ExtraStrings));
-
- return Error::success();
-}
-
-Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
- Compile3Sym &Compile3) {
-
- error(IO.mapEnum(Compile3.Flags));
- error(IO.mapEnum(Compile3.Machine));
- error(IO.mapInteger(Compile3.VersionFrontendMajor));
- error(IO.mapInteger(Compile3.VersionFrontendMinor));
- error(IO.mapInteger(Compile3.VersionFrontendBuild));
- error(IO.mapInteger(Compile3.VersionFrontendQFE));
- error(IO.mapInteger(Compile3.VersionBackendMajor));
- error(IO.mapInteger(Compile3.VersionBackendMinor));
- error(IO.mapInteger(Compile3.VersionBackendBuild));
- error(IO.mapInteger(Compile3.VersionBackendQFE));
- error(IO.mapStringZ(Compile3.Version));
-
- return Error::success();
-}
-
-Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
- ConstantSym &Constant) {
-
- error(IO.mapInteger(Constant.Type));
- error(IO.mapEncodedInteger(Constant.Value));
- error(IO.mapStringZ(Constant.Name));
-
- return Error::success();
-}
-
-Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR, DataSym &Data) {
-
- error(IO.mapInteger(Data.Type));
- error(IO.mapInteger(Data.DataOffset));
- error(IO.mapInteger(Data.Segment));
- error(IO.mapStringZ(Data.Name));
-
- return Error::success();
-}
-
-Error SymbolRecordMapping::visitKnownRecord(
- CVSymbol &CVR, DefRangeFramePointerRelSym &DefRangeFramePointerRel) {
-
- error(IO.mapObject(DefRangeFramePointerRel.Hdr.Offset));
- error(mapLocalVariableAddrRange(IO, DefRangeFramePointerRel.Range));
- error(IO.mapVectorTail(DefRangeFramePointerRel.Gaps, MapGap()));
-
- return Error::success();
-}
-
-Error SymbolRecordMapping::visitKnownRecord(
- CVSymbol &CVR,
- DefRangeFramePointerRelFullScopeSym &DefRangeFramePointerRelFullScope) {
-
- error(IO.mapInteger(DefRangeFramePointerRelFullScope.Offset));
-
- return Error::success();
-}
-
-Error SymbolRecordMapping::visitKnownRecord(
- CVSymbol &CVR, DefRangeRegisterRelSym &DefRangeRegisterRel) {
-
- error(IO.mapObject(DefRangeRegisterRel.Hdr.Register));
- error(IO.mapObject(DefRangeRegisterRel.Hdr.Flags));
- error(IO.mapObject(DefRangeRegisterRel.Hdr.BasePointerOffset));
- error(mapLocalVariableAddrRange(IO, DefRangeRegisterRel.Range));
- error(IO.mapVectorTail(DefRangeRegisterRel.Gaps, MapGap()));
-
- return Error::success();
-}
-
-Error SymbolRecordMapping::visitKnownRecord(
- CVSymbol &CVR, DefRangeRegisterSym &DefRangeRegister) {
-
- error(IO.mapObject(DefRangeRegister.Hdr.Register));
- error(IO.mapObject(DefRangeRegister.Hdr.MayHaveNoName));
- error(mapLocalVariableAddrRange(IO, DefRangeRegister.Range));
- error(IO.mapVectorTail(DefRangeRegister.Gaps, MapGap()));
-
- return Error::success();
-}
-
-Error SymbolRecordMapping::visitKnownRecord(
- CVSymbol &CVR, DefRangeSubfieldRegisterSym &DefRangeSubfieldRegister) {
-
- error(IO.mapObject(DefRangeSubfieldRegister.Hdr.Register));
- error(IO.mapObject(DefRangeSubfieldRegister.Hdr.MayHaveNoName));
- error(IO.mapObject(DefRangeSubfieldRegister.Hdr.OffsetInParent));
- error(mapLocalVariableAddrRange(IO, DefRangeSubfieldRegister.Range));
- error(IO.mapVectorTail(DefRangeSubfieldRegister.Gaps, MapGap()));
-
- return Error::success();
-}
-
-Error SymbolRecordMapping::visitKnownRecord(
- CVSymbol &CVR, DefRangeSubfieldSym &DefRangeSubfield) {
-
- error(IO.mapInteger(DefRangeSubfield.Program));
- error(IO.mapInteger(DefRangeSubfield.OffsetInParent));
- error(mapLocalVariableAddrRange(IO, DefRangeSubfield.Range));
- error(IO.mapVectorTail(DefRangeSubfield.Gaps, MapGap()));
-
- return Error::success();
-}
-
-Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
- DefRangeSym &DefRange) {
-
- error(IO.mapInteger(DefRange.Program));
- error(mapLocalVariableAddrRange(IO, DefRange.Range));
- error(IO.mapVectorTail(DefRange.Gaps, MapGap()));
-
- return Error::success();
-}
-
-Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
- FrameCookieSym &FrameCookie) {
-
- error(IO.mapInteger(FrameCookie.CodeOffset));
- error(IO.mapInteger(FrameCookie.Register));
- error(IO.mapEnum(FrameCookie.CookieKind));
- error(IO.mapInteger(FrameCookie.Flags));
-
- return Error::success();
-}
-
-Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
- FrameProcSym &FrameProc) {
- error(IO.mapInteger(FrameProc.TotalFrameBytes));
- error(IO.mapInteger(FrameProc.PaddingFrameBytes));
- error(IO.mapInteger(FrameProc.OffsetToPadding));
- error(IO.mapInteger(FrameProc.BytesOfCalleeSavedRegisters));
- error(IO.mapInteger(FrameProc.OffsetOfExceptionHandler));
- error(IO.mapInteger(FrameProc.SectionIdOfExceptionHandler));
- error(IO.mapEnum(FrameProc.Flags));
-
- return Error::success();
-}
-
-Error SymbolRecordMapping::visitKnownRecord(
- CVSymbol &CVR, HeapAllocationSiteSym &HeapAllocSite) {
-
- error(IO.mapInteger(HeapAllocSite.CodeOffset));
- error(IO.mapInteger(HeapAllocSite.Segment));
- error(IO.mapInteger(HeapAllocSite.CallInstructionSize));
- error(IO.mapInteger(HeapAllocSite.Type));
-
- return Error::success();
-}
-
-Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
- InlineSiteSym &InlineSite) {
-
- error(IO.mapInteger(InlineSite.Parent));
- error(IO.mapInteger(InlineSite.End));
- error(IO.mapInteger(InlineSite.Inlinee));
- error(IO.mapByteVectorTail(InlineSite.AnnotationData));
-
- return Error::success();
-}
-
-Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
- RegisterSym &Register) {
-
- error(IO.mapInteger(Register.Index));
- error(IO.mapEnum(Register.Register));
- error(IO.mapStringZ(Register.Name));
-
- return Error::success();
-}
-
-Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
- PublicSym32 &Public) {
-
- error(IO.mapEnum(Public.Flags));
- error(IO.mapInteger(Public.Offset));
- error(IO.mapInteger(Public.Segment));
- error(IO.mapStringZ(Public.Name));
-
- return Error::success();
-}
-
-Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
- ProcRefSym &ProcRef) {
-
- error(IO.mapInteger(ProcRef.SumName));
- error(IO.mapInteger(ProcRef.SymOffset));
- error(IO.mapInteger(ProcRef.Module));
- error(IO.mapStringZ(ProcRef.Name));
-
- return Error::success();
-}
-
-Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR, LabelSym &Label) {
-
- error(IO.mapInteger(Label.CodeOffset));
- error(IO.mapInteger(Label.Segment));
- error(IO.mapEnum(Label.Flags));
- error(IO.mapStringZ(Label.Name));
-
- return Error::success();
-}
-
-Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR, LocalSym &Local) {
- error(IO.mapInteger(Local.Type));
- error(IO.mapEnum(Local.Flags));
- error(IO.mapStringZ(Local.Name));
-
- return Error::success();
-}
-
-Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
- ObjNameSym &ObjName) {
-
- error(IO.mapInteger(ObjName.Signature));
- error(IO.mapStringZ(ObjName.Name));
-
- return Error::success();
-}
-
-Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR, ProcSym &Proc) {
- error(IO.mapInteger(Proc.Parent));
- error(IO.mapInteger(Proc.End));
- error(IO.mapInteger(Proc.Next));
- error(IO.mapInteger(Proc.CodeSize));
- error(IO.mapInteger(Proc.DbgStart));
- error(IO.mapInteger(Proc.DbgEnd));
- error(IO.mapInteger(Proc.FunctionType));
- error(IO.mapInteger(Proc.CodeOffset));
- error(IO.mapInteger(Proc.Segment));
- error(IO.mapEnum(Proc.Flags));
- error(IO.mapStringZ(Proc.Name));
- return Error::success();
-}
-
-Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
- ScopeEndSym &ScopeEnd) {
- return Error::success();
-}
-
-Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR, CallerSym &Caller) {
- error(IO.mapVectorN<uint32_t>(
- Caller.Indices,
- [](CodeViewRecordIO &IO, TypeIndex &N) { return IO.mapInteger(N); }));
- return Error::success();
-}
-
-Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
- RegRelativeSym &RegRel) {
-
- error(IO.mapInteger(RegRel.Offset));
- error(IO.mapInteger(RegRel.Type));
- error(IO.mapEnum(RegRel.Register));
- error(IO.mapStringZ(RegRel.Name));
-
- return Error::success();
-}
-
-Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
- ThreadLocalDataSym &Data) {
-
- error(IO.mapInteger(Data.Type));
- error(IO.mapInteger(Data.DataOffset));
- error(IO.mapInteger(Data.Segment));
- error(IO.mapStringZ(Data.Name));
-
- return Error::success();
-}
-
-Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR, UDTSym &UDT) {
-
- error(IO.mapInteger(UDT.Type));
- error(IO.mapStringZ(UDT.Name));
-
- return Error::success();
-}
-
-Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
- UsingNamespaceSym &UN) {
-
- error(IO.mapStringZ(UN.Name));
-
- return Error::success();
-}
-
-Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
- AnnotationSym &Annot) {
-
- error(IO.mapInteger(Annot.CodeOffset));
- error(IO.mapInteger(Annot.Segment));
- error(IO.mapVectorN<uint16_t>(
- Annot.Strings,
- [](CodeViewRecordIO &IO, StringRef &S) { return IO.mapStringZ(S); }));
-
- return Error::success();
-}
-
-RegisterId codeview::decodeFramePtrReg(EncodedFramePtrReg EncodedReg,
- CPUType CPU) {
- assert(unsigned(EncodedReg) < 4);
- switch (CPU) {
- // FIXME: Add ARM and AArch64 variants here.
- default:
- break;
- case CPUType::Intel8080:
- case CPUType::Intel8086:
- case CPUType::Intel80286:
- case CPUType::Intel80386:
- case CPUType::Intel80486:
- case CPUType::Pentium:
- case CPUType::PentiumPro:
- case CPUType::Pentium3:
- switch (EncodedReg) {
- case EncodedFramePtrReg::None: return RegisterId::NONE;
- case EncodedFramePtrReg::StackPtr: return RegisterId::VFRAME;
- case EncodedFramePtrReg::FramePtr: return RegisterId::EBP;
- case EncodedFramePtrReg::BasePtr: return RegisterId::EBX;
- }
- llvm_unreachable("bad encoding");
- case CPUType::X64:
- switch (EncodedReg) {
- case EncodedFramePtrReg::None: return RegisterId::NONE;
- case EncodedFramePtrReg::StackPtr: return RegisterId::RSP;
- case EncodedFramePtrReg::FramePtr: return RegisterId::RBP;
- case EncodedFramePtrReg::BasePtr: return RegisterId::R13;
- }
- llvm_unreachable("bad encoding");
- }
- return RegisterId::NONE;
-}
-
-EncodedFramePtrReg codeview::encodeFramePtrReg(RegisterId Reg, CPUType CPU) {
- switch (CPU) {
- // FIXME: Add ARM and AArch64 variants here.
- default:
- break;
- case CPUType::Intel8080:
- case CPUType::Intel8086:
- case CPUType::Intel80286:
- case CPUType::Intel80386:
- case CPUType::Intel80486:
- case CPUType::Pentium:
- case CPUType::PentiumPro:
- case CPUType::Pentium3:
- switch (Reg) {
- case RegisterId::VFRAME:
- return EncodedFramePtrReg::StackPtr;
- case RegisterId::EBP:
- return EncodedFramePtrReg::FramePtr;
- case RegisterId::EBX:
- return EncodedFramePtrReg::BasePtr;
- default:
- break;
- }
- break;
- case CPUType::X64:
- switch (Reg) {
- case RegisterId::RSP:
- return EncodedFramePtrReg::StackPtr;
- case RegisterId::RBP:
- return EncodedFramePtrReg::FramePtr;
- case RegisterId::R13:
- return EncodedFramePtrReg::BasePtr;
- default:
- break;
- }
- break;
- }
- return EncodedFramePtrReg::None;
-}
+//===- SymbolRecordMapping.cpp -----------------------------------*- C++-*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "llvm/DebugInfo/CodeView/SymbolRecordMapping.h"
+
+using namespace llvm;
+using namespace llvm::codeview;
+
+#define error(X) \
+ if (auto EC = X) \
+ return EC;
+
+namespace {
+struct MapGap {
+ Error operator()(CodeViewRecordIO &IO, LocalVariableAddrGap &Gap) const {
+ error(IO.mapInteger(Gap.GapStartOffset));
+ error(IO.mapInteger(Gap.Range));
+ return Error::success();
+ }
+};
+}
+
+static Error mapLocalVariableAddrRange(CodeViewRecordIO &IO,
+ LocalVariableAddrRange &Range) {
+ error(IO.mapInteger(Range.OffsetStart));
+ error(IO.mapInteger(Range.ISectStart));
+ error(IO.mapInteger(Range.Range));
+ return Error::success();
+}
+
+Error SymbolRecordMapping::visitSymbolBegin(CVSymbol &Record) {
+ error(IO.beginRecord(MaxRecordLength - sizeof(RecordPrefix)));
+ return Error::success();
+}
+
+Error SymbolRecordMapping::visitSymbolEnd(CVSymbol &Record) {
+ error(IO.padToAlignment(alignOf(Container)));
+ error(IO.endRecord());
+ return Error::success();
+}
+
+Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR, BlockSym &Block) {
+
+ error(IO.mapInteger(Block.Parent));
+ error(IO.mapInteger(Block.End));
+ error(IO.mapInteger(Block.CodeSize));
+ error(IO.mapInteger(Block.CodeOffset));
+ error(IO.mapInteger(Block.Segment));
+ error(IO.mapStringZ(Block.Name));
+
+ return Error::success();
+}
+
+Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR, Thunk32Sym &Thunk) {
+
+ error(IO.mapInteger(Thunk.Parent));
+ error(IO.mapInteger(Thunk.End));
+ error(IO.mapInteger(Thunk.Next));
+ error(IO.mapInteger(Thunk.Offset));
+ error(IO.mapInteger(Thunk.Segment));
+ error(IO.mapInteger(Thunk.Length));
+ error(IO.mapEnum(Thunk.Thunk));
+ error(IO.mapStringZ(Thunk.Name));
+ error(IO.mapByteVectorTail(Thunk.VariantData));
+
+ return Error::success();
+}
+
+Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
+ TrampolineSym &Tramp) {
+
+ error(IO.mapEnum(Tramp.Type));
+ error(IO.mapInteger(Tramp.Size));
+ error(IO.mapInteger(Tramp.ThunkOffset));
+ error(IO.mapInteger(Tramp.TargetOffset));
+ error(IO.mapInteger(Tramp.ThunkSection));
+ error(IO.mapInteger(Tramp.TargetSection));
+
+ return Error::success();
+}
+
+Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
+ SectionSym &Section) {
+ uint8_t Padding = 0;
+
+ error(IO.mapInteger(Section.SectionNumber));
+ error(IO.mapInteger(Section.Alignment));
+ error(IO.mapInteger(Padding));
+ error(IO.mapInteger(Section.Rva));
+ error(IO.mapInteger(Section.Length));
+ error(IO.mapInteger(Section.Characteristics));
+ error(IO.mapStringZ(Section.Name));
+
+ return Error::success();
+}
+
+Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
+ CoffGroupSym &CoffGroup) {
+
+ error(IO.mapInteger(CoffGroup.Size));
+ error(IO.mapInteger(CoffGroup.Characteristics));
+ error(IO.mapInteger(CoffGroup.Offset));
+ error(IO.mapInteger(CoffGroup.Segment));
+ error(IO.mapStringZ(CoffGroup.Name));
+
+ return Error::success();
+}
+
+Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
+ BPRelativeSym &BPRel) {
+
+ error(IO.mapInteger(BPRel.Offset));
+ error(IO.mapInteger(BPRel.Type));
+ error(IO.mapStringZ(BPRel.Name));
+
+ return Error::success();
+}
+
+Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
+ BuildInfoSym &BuildInfo) {
+
+ error(IO.mapInteger(BuildInfo.BuildId));
+
+ return Error::success();
+}
+
+Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
+ CallSiteInfoSym &CallSiteInfo) {
+ uint16_t Padding = 0;
+
+ error(IO.mapInteger(CallSiteInfo.CodeOffset));
+ error(IO.mapInteger(CallSiteInfo.Segment));
+ error(IO.mapInteger(Padding));
+ error(IO.mapInteger(CallSiteInfo.Type));
+
+ return Error::success();
+}
+
+Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
+ EnvBlockSym &EnvBlock) {
+
+ uint8_t Reserved = 0;
+ error(IO.mapInteger(Reserved));
+ error(IO.mapStringZVectorZ(EnvBlock.Fields));
+
+ return Error::success();
+}
+
+Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
+ FileStaticSym &FileStatic) {
+
+ error(IO.mapInteger(FileStatic.Index));
+ error(IO.mapInteger(FileStatic.ModFilenameOffset));
+ error(IO.mapEnum(FileStatic.Flags));
+ error(IO.mapStringZ(FileStatic.Name));
+
+ return Error::success();
+}
+
+Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR, ExportSym &Export) {
+
+ error(IO.mapInteger(Export.Ordinal));
+ error(IO.mapEnum(Export.Flags));
+ error(IO.mapStringZ(Export.Name));
+
+ return Error::success();
+}
+
+Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
+ Compile2Sym &Compile2) {
+
+ error(IO.mapEnum(Compile2.Flags));
+ error(IO.mapEnum(Compile2.Machine));
+ error(IO.mapInteger(Compile2.VersionFrontendMajor));
+ error(IO.mapInteger(Compile2.VersionFrontendMinor));
+ error(IO.mapInteger(Compile2.VersionFrontendBuild));
+ error(IO.mapInteger(Compile2.VersionBackendMajor));
+ error(IO.mapInteger(Compile2.VersionBackendMinor));
+ error(IO.mapInteger(Compile2.VersionBackendBuild));
+ error(IO.mapStringZ(Compile2.Version));
+ error(IO.mapStringZVectorZ(Compile2.ExtraStrings));
+
+ return Error::success();
+}
+
+Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
+ Compile3Sym &Compile3) {
+
+ error(IO.mapEnum(Compile3.Flags));
+ error(IO.mapEnum(Compile3.Machine));
+ error(IO.mapInteger(Compile3.VersionFrontendMajor));
+ error(IO.mapInteger(Compile3.VersionFrontendMinor));
+ error(IO.mapInteger(Compile3.VersionFrontendBuild));
+ error(IO.mapInteger(Compile3.VersionFrontendQFE));
+ error(IO.mapInteger(Compile3.VersionBackendMajor));
+ error(IO.mapInteger(Compile3.VersionBackendMinor));
+ error(IO.mapInteger(Compile3.VersionBackendBuild));
+ error(IO.mapInteger(Compile3.VersionBackendQFE));
+ error(IO.mapStringZ(Compile3.Version));
+
+ return Error::success();
+}
+
+Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
+ ConstantSym &Constant) {
+
+ error(IO.mapInteger(Constant.Type));
+ error(IO.mapEncodedInteger(Constant.Value));
+ error(IO.mapStringZ(Constant.Name));
+
+ return Error::success();
+}
+
+Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR, DataSym &Data) {
+
+ error(IO.mapInteger(Data.Type));
+ error(IO.mapInteger(Data.DataOffset));
+ error(IO.mapInteger(Data.Segment));
+ error(IO.mapStringZ(Data.Name));
+
+ return Error::success();
+}
+
+Error SymbolRecordMapping::visitKnownRecord(
+ CVSymbol &CVR, DefRangeFramePointerRelSym &DefRangeFramePointerRel) {
+
+ error(IO.mapObject(DefRangeFramePointerRel.Hdr.Offset));
+ error(mapLocalVariableAddrRange(IO, DefRangeFramePointerRel.Range));
+ error(IO.mapVectorTail(DefRangeFramePointerRel.Gaps, MapGap()));
+
+ return Error::success();
+}
+
+Error SymbolRecordMapping::visitKnownRecord(
+ CVSymbol &CVR,
+ DefRangeFramePointerRelFullScopeSym &DefRangeFramePointerRelFullScope) {
+
+ error(IO.mapInteger(DefRangeFramePointerRelFullScope.Offset));
+
+ return Error::success();
+}
+
+Error SymbolRecordMapping::visitKnownRecord(
+ CVSymbol &CVR, DefRangeRegisterRelSym &DefRangeRegisterRel) {
+
+ error(IO.mapObject(DefRangeRegisterRel.Hdr.Register));
+ error(IO.mapObject(DefRangeRegisterRel.Hdr.Flags));
+ error(IO.mapObject(DefRangeRegisterRel.Hdr.BasePointerOffset));
+ error(mapLocalVariableAddrRange(IO, DefRangeRegisterRel.Range));
+ error(IO.mapVectorTail(DefRangeRegisterRel.Gaps, MapGap()));
+
+ return Error::success();
+}
+
+Error SymbolRecordMapping::visitKnownRecord(
+ CVSymbol &CVR, DefRangeRegisterSym &DefRangeRegister) {
+
+ error(IO.mapObject(DefRangeRegister.Hdr.Register));
+ error(IO.mapObject(DefRangeRegister.Hdr.MayHaveNoName));
+ error(mapLocalVariableAddrRange(IO, DefRangeRegister.Range));
+ error(IO.mapVectorTail(DefRangeRegister.Gaps, MapGap()));
+
+ return Error::success();
+}
+
+Error SymbolRecordMapping::visitKnownRecord(
+ CVSymbol &CVR, DefRangeSubfieldRegisterSym &DefRangeSubfieldRegister) {
+
+ error(IO.mapObject(DefRangeSubfieldRegister.Hdr.Register));
+ error(IO.mapObject(DefRangeSubfieldRegister.Hdr.MayHaveNoName));
+ error(IO.mapObject(DefRangeSubfieldRegister.Hdr.OffsetInParent));
+ error(mapLocalVariableAddrRange(IO, DefRangeSubfieldRegister.Range));
+ error(IO.mapVectorTail(DefRangeSubfieldRegister.Gaps, MapGap()));
+
+ return Error::success();
+}
+
+Error SymbolRecordMapping::visitKnownRecord(
+ CVSymbol &CVR, DefRangeSubfieldSym &DefRangeSubfield) {
+
+ error(IO.mapInteger(DefRangeSubfield.Program));
+ error(IO.mapInteger(DefRangeSubfield.OffsetInParent));
+ error(mapLocalVariableAddrRange(IO, DefRangeSubfield.Range));
+ error(IO.mapVectorTail(DefRangeSubfield.Gaps, MapGap()));
+
+ return Error::success();
+}
+
+Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
+ DefRangeSym &DefRange) {
+
+ error(IO.mapInteger(DefRange.Program));
+ error(mapLocalVariableAddrRange(IO, DefRange.Range));
+ error(IO.mapVectorTail(DefRange.Gaps, MapGap()));
+
+ return Error::success();
+}
+
+Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
+ FrameCookieSym &FrameCookie) {
+
+ error(IO.mapInteger(FrameCookie.CodeOffset));
+ error(IO.mapInteger(FrameCookie.Register));
+ error(IO.mapEnum(FrameCookie.CookieKind));
+ error(IO.mapInteger(FrameCookie.Flags));
+
+ return Error::success();
+}
+
+Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
+ FrameProcSym &FrameProc) {
+ error(IO.mapInteger(FrameProc.TotalFrameBytes));
+ error(IO.mapInteger(FrameProc.PaddingFrameBytes));
+ error(IO.mapInteger(FrameProc.OffsetToPadding));
+ error(IO.mapInteger(FrameProc.BytesOfCalleeSavedRegisters));
+ error(IO.mapInteger(FrameProc.OffsetOfExceptionHandler));
+ error(IO.mapInteger(FrameProc.SectionIdOfExceptionHandler));
+ error(IO.mapEnum(FrameProc.Flags));
+
+ return Error::success();
+}
+
+Error SymbolRecordMapping::visitKnownRecord(
+ CVSymbol &CVR, HeapAllocationSiteSym &HeapAllocSite) {
+
+ error(IO.mapInteger(HeapAllocSite.CodeOffset));
+ error(IO.mapInteger(HeapAllocSite.Segment));
+ error(IO.mapInteger(HeapAllocSite.CallInstructionSize));
+ error(IO.mapInteger(HeapAllocSite.Type));
+
+ return Error::success();
+}
+
+Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
+ InlineSiteSym &InlineSite) {
+
+ error(IO.mapInteger(InlineSite.Parent));
+ error(IO.mapInteger(InlineSite.End));
+ error(IO.mapInteger(InlineSite.Inlinee));
+ error(IO.mapByteVectorTail(InlineSite.AnnotationData));
+
+ return Error::success();
+}
+
+Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
+ RegisterSym &Register) {
+
+ error(IO.mapInteger(Register.Index));
+ error(IO.mapEnum(Register.Register));
+ error(IO.mapStringZ(Register.Name));
+
+ return Error::success();
+}
+
+Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
+ PublicSym32 &Public) {
+
+ error(IO.mapEnum(Public.Flags));
+ error(IO.mapInteger(Public.Offset));
+ error(IO.mapInteger(Public.Segment));
+ error(IO.mapStringZ(Public.Name));
+
+ return Error::success();
+}
+
+Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
+ ProcRefSym &ProcRef) {
+
+ error(IO.mapInteger(ProcRef.SumName));
+ error(IO.mapInteger(ProcRef.SymOffset));
+ error(IO.mapInteger(ProcRef.Module));
+ error(IO.mapStringZ(ProcRef.Name));
+
+ return Error::success();
+}
+
+Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR, LabelSym &Label) {
+
+ error(IO.mapInteger(Label.CodeOffset));
+ error(IO.mapInteger(Label.Segment));
+ error(IO.mapEnum(Label.Flags));
+ error(IO.mapStringZ(Label.Name));
+
+ return Error::success();
+}
+
+Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR, LocalSym &Local) {
+ error(IO.mapInteger(Local.Type));
+ error(IO.mapEnum(Local.Flags));
+ error(IO.mapStringZ(Local.Name));
+
+ return Error::success();
+}
+
+Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
+ ObjNameSym &ObjName) {
+
+ error(IO.mapInteger(ObjName.Signature));
+ error(IO.mapStringZ(ObjName.Name));
+
+ return Error::success();
+}
+
+Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR, ProcSym &Proc) {
+ error(IO.mapInteger(Proc.Parent));
+ error(IO.mapInteger(Proc.End));
+ error(IO.mapInteger(Proc.Next));
+ error(IO.mapInteger(Proc.CodeSize));
+ error(IO.mapInteger(Proc.DbgStart));
+ error(IO.mapInteger(Proc.DbgEnd));
+ error(IO.mapInteger(Proc.FunctionType));
+ error(IO.mapInteger(Proc.CodeOffset));
+ error(IO.mapInteger(Proc.Segment));
+ error(IO.mapEnum(Proc.Flags));
+ error(IO.mapStringZ(Proc.Name));
+ return Error::success();
+}
+
+Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
+ ScopeEndSym &ScopeEnd) {
+ return Error::success();
+}
+
+Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR, CallerSym &Caller) {
+ error(IO.mapVectorN<uint32_t>(
+ Caller.Indices,
+ [](CodeViewRecordIO &IO, TypeIndex &N) { return IO.mapInteger(N); }));
+ return Error::success();
+}
+
+Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
+ RegRelativeSym &RegRel) {
+
+ error(IO.mapInteger(RegRel.Offset));
+ error(IO.mapInteger(RegRel.Type));
+ error(IO.mapEnum(RegRel.Register));
+ error(IO.mapStringZ(RegRel.Name));
+
+ return Error::success();
+}
+
+Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
+ ThreadLocalDataSym &Data) {
+
+ error(IO.mapInteger(Data.Type));
+ error(IO.mapInteger(Data.DataOffset));
+ error(IO.mapInteger(Data.Segment));
+ error(IO.mapStringZ(Data.Name));
+
+ return Error::success();
+}
+
+Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR, UDTSym &UDT) {
+
+ error(IO.mapInteger(UDT.Type));
+ error(IO.mapStringZ(UDT.Name));
+
+ return Error::success();
+}
+
+Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
+ UsingNamespaceSym &UN) {
+
+ error(IO.mapStringZ(UN.Name));
+
+ return Error::success();
+}
+
+Error SymbolRecordMapping::visitKnownRecord(CVSymbol &CVR,
+ AnnotationSym &Annot) {
+
+ error(IO.mapInteger(Annot.CodeOffset));
+ error(IO.mapInteger(Annot.Segment));
+ error(IO.mapVectorN<uint16_t>(
+ Annot.Strings,
+ [](CodeViewRecordIO &IO, StringRef &S) { return IO.mapStringZ(S); }));
+
+ return Error::success();
+}
+
+RegisterId codeview::decodeFramePtrReg(EncodedFramePtrReg EncodedReg,
+ CPUType CPU) {
+ assert(unsigned(EncodedReg) < 4);
+ switch (CPU) {
+ // FIXME: Add ARM and AArch64 variants here.
+ default:
+ break;
+ case CPUType::Intel8080:
+ case CPUType::Intel8086:
+ case CPUType::Intel80286:
+ case CPUType::Intel80386:
+ case CPUType::Intel80486:
+ case CPUType::Pentium:
+ case CPUType::PentiumPro:
+ case CPUType::Pentium3:
+ switch (EncodedReg) {
+ case EncodedFramePtrReg::None: return RegisterId::NONE;
+ case EncodedFramePtrReg::StackPtr: return RegisterId::VFRAME;
+ case EncodedFramePtrReg::FramePtr: return RegisterId::EBP;
+ case EncodedFramePtrReg::BasePtr: return RegisterId::EBX;
+ }
+ llvm_unreachable("bad encoding");
+ case CPUType::X64:
+ switch (EncodedReg) {
+ case EncodedFramePtrReg::None: return RegisterId::NONE;
+ case EncodedFramePtrReg::StackPtr: return RegisterId::RSP;
+ case EncodedFramePtrReg::FramePtr: return RegisterId::RBP;
+ case EncodedFramePtrReg::BasePtr: return RegisterId::R13;
+ }
+ llvm_unreachable("bad encoding");
+ }
+ return RegisterId::NONE;
+}
+
+EncodedFramePtrReg codeview::encodeFramePtrReg(RegisterId Reg, CPUType CPU) {
+ switch (CPU) {
+ // FIXME: Add ARM and AArch64 variants here.
+ default:
+ break;
+ case CPUType::Intel8080:
+ case CPUType::Intel8086:
+ case CPUType::Intel80286:
+ case CPUType::Intel80386:
+ case CPUType::Intel80486:
+ case CPUType::Pentium:
+ case CPUType::PentiumPro:
+ case CPUType::Pentium3:
+ switch (Reg) {
+ case RegisterId::VFRAME:
+ return EncodedFramePtrReg::StackPtr;
+ case RegisterId::EBP:
+ return EncodedFramePtrReg::FramePtr;
+ case RegisterId::EBX:
+ return EncodedFramePtrReg::BasePtr;
+ default:
+ break;
+ }
+ break;
+ case CPUType::X64:
+ switch (Reg) {
+ case RegisterId::RSP:
+ return EncodedFramePtrReg::StackPtr;
+ case RegisterId::RBP:
+ return EncodedFramePtrReg::FramePtr;
+ case RegisterId::R13:
+ return EncodedFramePtrReg::BasePtr;
+ default:
+ break;
+ }
+ break;
+ }
+ return EncodedFramePtrReg::None;
+}
diff --git a/contrib/libs/llvm12/lib/DebugInfo/CodeView/SymbolSerializer.cpp b/contrib/libs/llvm12/lib/DebugInfo/CodeView/SymbolSerializer.cpp
index 170897257cd..de9bb42b179 100644
--- a/contrib/libs/llvm12/lib/DebugInfo/CodeView/SymbolSerializer.cpp
+++ b/contrib/libs/llvm12/lib/DebugInfo/CodeView/SymbolSerializer.cpp
@@ -1,59 +1,59 @@
-//===- SymbolSerializer.cpp -----------------------------------------------===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-
-#include "llvm/DebugInfo/CodeView/SymbolSerializer.h"
-#include "llvm/ADT/ArrayRef.h"
-#include "llvm/DebugInfo/CodeView/SymbolRecord.h"
-#include "llvm/Support/Endian.h"
-#include "llvm/Support/Error.h"
-#include <cassert>
-#include <cstdint>
-#include <cstring>
-
-using namespace llvm;
-using namespace llvm::codeview;
-
-SymbolSerializer::SymbolSerializer(BumpPtrAllocator &Allocator,
- CodeViewContainer Container)
- : Storage(Allocator), Stream(RecordBuffer, support::little), Writer(Stream),
- Mapping(Writer, Container) {}
-
-Error SymbolSerializer::visitSymbolBegin(CVSymbol &Record) {
- assert(!CurrentSymbol.hasValue() && "Already in a symbol mapping!");
-
- Writer.setOffset(0);
-
- if (auto EC = writeRecordPrefix(Record.kind()))
- return EC;
-
- CurrentSymbol = Record.kind();
- if (auto EC = Mapping.visitSymbolBegin(Record))
- return EC;
-
- return Error::success();
-}
-
-Error SymbolSerializer::visitSymbolEnd(CVSymbol &Record) {
- assert(CurrentSymbol.hasValue() && "Not in a symbol mapping!");
-
- if (auto EC = Mapping.visitSymbolEnd(Record))
- return EC;
-
- uint32_t RecordEnd = Writer.getOffset();
- uint16_t Length = RecordEnd - 2;
- Writer.setOffset(0);
- if (auto EC = Writer.writeInteger(Length))
- return EC;
-
- uint8_t *StableStorage = Storage.Allocate<uint8_t>(RecordEnd);
- ::memcpy(StableStorage, &RecordBuffer[0], RecordEnd);
- Record.RecordData = ArrayRef<uint8_t>(StableStorage, RecordEnd);
- CurrentSymbol.reset();
-
- return Error::success();
-}
+//===- SymbolSerializer.cpp -----------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "llvm/DebugInfo/CodeView/SymbolSerializer.h"
+#include "llvm/ADT/ArrayRef.h"
+#include "llvm/DebugInfo/CodeView/SymbolRecord.h"
+#include "llvm/Support/Endian.h"
+#include "llvm/Support/Error.h"
+#include <cassert>
+#include <cstdint>
+#include <cstring>
+
+using namespace llvm;
+using namespace llvm::codeview;
+
+SymbolSerializer::SymbolSerializer(BumpPtrAllocator &Allocator,
+ CodeViewContainer Container)
+ : Storage(Allocator), Stream(RecordBuffer, support::little), Writer(Stream),
+ Mapping(Writer, Container) {}
+
+Error SymbolSerializer::visitSymbolBegin(CVSymbol &Record) {
+ assert(!CurrentSymbol.hasValue() && "Already in a symbol mapping!");
+
+ Writer.setOffset(0);
+
+ if (auto EC = writeRecordPrefix(Record.kind()))
+ return EC;
+
+ CurrentSymbol = Record.kind();
+ if (auto EC = Mapping.visitSymbolBegin(Record))
+ return EC;
+
+ return Error::success();
+}
+
+Error SymbolSerializer::visitSymbolEnd(CVSymbol &Record) {
+ assert(CurrentSymbol.hasValue() && "Not in a symbol mapping!");
+
+ if (auto EC = Mapping.visitSymbolEnd(Record))
+ return EC;
+
+ uint32_t RecordEnd = Writer.getOffset();
+ uint16_t Length = RecordEnd - 2;
+ Writer.setOffset(0);
+ if (auto EC = Writer.writeInteger(Length))
+ return EC;
+
+ uint8_t *StableStorage = Storage.Allocate<uint8_t>(RecordEnd);
+ ::memcpy(StableStorage, &RecordBuffer[0], RecordEnd);
+ Record.RecordData = ArrayRef<uint8_t>(StableStorage, RecordEnd);
+ CurrentSymbol.reset();
+
+ return Error::success();
+}
diff --git a/contrib/libs/llvm12/lib/DebugInfo/CodeView/TypeDumpVisitor.cpp b/contrib/libs/llvm12/lib/DebugInfo/CodeView/TypeDumpVisitor.cpp
index 5886d33a4a7..d5fea5ee5e2 100644
--- a/contrib/libs/llvm12/lib/DebugInfo/CodeView/TypeDumpVisitor.cpp
+++ b/contrib/libs/llvm12/lib/DebugInfo/CodeView/TypeDumpVisitor.cpp
@@ -1,570 +1,570 @@
-//===-- TypeDumpVisitor.cpp - CodeView type info dumper ----------*- C++-*-===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-
-#include "llvm/DebugInfo/CodeView/TypeDumpVisitor.h"
-
-#include "llvm/ADT/SmallString.h"
-#include "llvm/DebugInfo/CodeView/CVTypeVisitor.h"
-#include "llvm/DebugInfo/CodeView/Formatters.h"
-#include "llvm/DebugInfo/CodeView/TypeCollection.h"
-#include "llvm/DebugInfo/CodeView/TypeIndex.h"
-#include "llvm/DebugInfo/CodeView/TypeRecord.h"
-#include "llvm/Support/FormatVariadic.h"
-#include "llvm/Support/ScopedPrinter.h"
-
-using namespace llvm;
-using namespace llvm::codeview;
-
-static const EnumEntry<TypeLeafKind> LeafTypeNames[] = {
-#define CV_TYPE(enum, val) {#enum, enum},
-#include "llvm/DebugInfo/CodeView/CodeViewTypes.def"
-};
-
-#define ENUM_ENTRY(enum_class, enum) \
- { #enum, std::underlying_type < enum_class > ::type(enum_class::enum) }
-
-static const EnumEntry<uint16_t> ClassOptionNames[] = {
- ENUM_ENTRY(ClassOptions, Packed),
- ENUM_ENTRY(ClassOptions, HasConstructorOrDestructor),
- ENUM_ENTRY(ClassOptions, HasOverloadedOperator),
- ENUM_ENTRY(ClassOptions, Nested),
- ENUM_ENTRY(ClassOptions, ContainsNestedClass),
- ENUM_ENTRY(ClassOptions, HasOverloadedAssignmentOperator),
- ENUM_ENTRY(ClassOptions, HasConversionOperator),
- ENUM_ENTRY(ClassOptions, ForwardReference),
- ENUM_ENTRY(ClassOptions, Scoped),
- ENUM_ENTRY(ClassOptions, HasUniqueName),
- ENUM_ENTRY(ClassOptions, Sealed),
- ENUM_ENTRY(ClassOptions, Intrinsic),
-};
-
-static const EnumEntry<uint8_t> MemberAccessNames[] = {
- ENUM_ENTRY(MemberAccess, None), ENUM_ENTRY(MemberAccess, Private),
- ENUM_ENTRY(MemberAccess, Protected), ENUM_ENTRY(MemberAccess, Public),
-};
-
-static const EnumEntry<uint16_t> MethodOptionNames[] = {
- ENUM_ENTRY(MethodOptions, Pseudo),
- ENUM_ENTRY(MethodOptions, NoInherit),
- ENUM_ENTRY(MethodOptions, NoConstruct),
- ENUM_ENTRY(MethodOptions, CompilerGenerated),
- ENUM_ENTRY(MethodOptions, Sealed),
-};
-
-static const EnumEntry<uint16_t> MemberKindNames[] = {
- ENUM_ENTRY(MethodKind, Vanilla),
- ENUM_ENTRY(MethodKind, Virtual),
- ENUM_ENTRY(MethodKind, Static),
- ENUM_ENTRY(MethodKind, Friend),
- ENUM_ENTRY(MethodKind, IntroducingVirtual),
- ENUM_ENTRY(MethodKind, PureVirtual),
- ENUM_ENTRY(MethodKind, PureIntroducingVirtual),
-};
-
-static const EnumEntry<uint8_t> PtrKindNames[] = {
- ENUM_ENTRY(PointerKind, Near16),
- ENUM_ENTRY(PointerKind, Far16),
- ENUM_ENTRY(PointerKind, Huge16),
- ENUM_ENTRY(PointerKind, BasedOnSegment),
- ENUM_ENTRY(PointerKind, BasedOnValue),
- ENUM_ENTRY(PointerKind, BasedOnSegmentValue),
- ENUM_ENTRY(PointerKind, BasedOnAddress),
- ENUM_ENTRY(PointerKind, BasedOnSegmentAddress),
- ENUM_ENTRY(PointerKind, BasedOnType),
- ENUM_ENTRY(PointerKind, BasedOnSelf),
- ENUM_ENTRY(PointerKind, Near32),
- ENUM_ENTRY(PointerKind, Far32),
- ENUM_ENTRY(PointerKind, Near64),
-};
-
-static const EnumEntry<uint8_t> PtrModeNames[] = {
- ENUM_ENTRY(PointerMode, Pointer),
- ENUM_ENTRY(PointerMode, LValueReference),
- ENUM_ENTRY(PointerMode, PointerToDataMember),
- ENUM_ENTRY(PointerMode, PointerToMemberFunction),
- ENUM_ENTRY(PointerMode, RValueReference),
-};
-
-static const EnumEntry<uint16_t> PtrMemberRepNames[] = {
- ENUM_ENTRY(PointerToMemberRepresentation, Unknown),
- ENUM_ENTRY(PointerToMemberRepresentation, SingleInheritanceData),
- ENUM_ENTRY(PointerToMemberRepresentation, MultipleInheritanceData),
- ENUM_ENTRY(PointerToMemberRepresentation, VirtualInheritanceData),
- ENUM_ENTRY(PointerToMemberRepresentation, GeneralData),
- ENUM_ENTRY(PointerToMemberRepresentation, SingleInheritanceFunction),
- ENUM_ENTRY(PointerToMemberRepresentation, MultipleInheritanceFunction),
- ENUM_ENTRY(PointerToMemberRepresentation, VirtualInheritanceFunction),
- ENUM_ENTRY(PointerToMemberRepresentation, GeneralFunction),
-};
-
-static const EnumEntry<uint16_t> TypeModifierNames[] = {
- ENUM_ENTRY(ModifierOptions, Const), ENUM_ENTRY(ModifierOptions, Volatile),
- ENUM_ENTRY(ModifierOptions, Unaligned),
-};
-
-static const EnumEntry<uint8_t> CallingConventions[] = {
- ENUM_ENTRY(CallingConvention, NearC),
- ENUM_ENTRY(CallingConvention, FarC),
- ENUM_ENTRY(CallingConvention, NearPascal),
- ENUM_ENTRY(CallingConvention, FarPascal),
- ENUM_ENTRY(CallingConvention, NearFast),
- ENUM_ENTRY(CallingConvention, FarFast),
- ENUM_ENTRY(CallingConvention, NearStdCall),
- ENUM_ENTRY(CallingConvention, FarStdCall),
- ENUM_ENTRY(CallingConvention, NearSysCall),
- ENUM_ENTRY(CallingConvention, FarSysCall),
- ENUM_ENTRY(CallingConvention, ThisCall),
- ENUM_ENTRY(CallingConvention, MipsCall),
- ENUM_ENTRY(CallingConvention, Generic),
- ENUM_ENTRY(CallingConvention, AlphaCall),
- ENUM_ENTRY(CallingConvention, PpcCall),
- ENUM_ENTRY(CallingConvention, SHCall),
- ENUM_ENTRY(CallingConvention, ArmCall),
- ENUM_ENTRY(CallingConvention, AM33Call),
- ENUM_ENTRY(CallingConvention, TriCall),
- ENUM_ENTRY(CallingConvention, SH5Call),
- ENUM_ENTRY(CallingConvention, M32RCall),
- ENUM_ENTRY(CallingConvention, ClrCall),
- ENUM_ENTRY(CallingConvention, Inline),
- ENUM_ENTRY(CallingConvention, NearVector),
-};
-
-static const EnumEntry<uint8_t> FunctionOptionEnum[] = {
- ENUM_ENTRY(FunctionOptions, CxxReturnUdt),
- ENUM_ENTRY(FunctionOptions, Constructor),
- ENUM_ENTRY(FunctionOptions, ConstructorWithVirtualBases),
-};
-
-static const EnumEntry<uint16_t> LabelTypeEnum[] = {
- ENUM_ENTRY(LabelType, Near), ENUM_ENTRY(LabelType, Far),
-};
-
-#undef ENUM_ENTRY
-
-static StringRef getLeafTypeName(TypeLeafKind LT) {
- switch (LT) {
-#define TYPE_RECORD(ename, value, name) \
- case ename: \
- return #name;
-#include "llvm/DebugInfo/CodeView/CodeViewTypes.def"
- default:
- break;
- }
- return "UnknownLeaf";
-}
-
-void TypeDumpVisitor::printTypeIndex(StringRef FieldName, TypeIndex TI) const {
- codeview::printTypeIndex(*W, FieldName, TI, TpiTypes);
-}
-
-void TypeDumpVisitor::printItemIndex(StringRef FieldName, TypeIndex TI) const {
- codeview::printTypeIndex(*W, FieldName, TI, getSourceTypes());
-}
-
-Error TypeDumpVisitor::visitTypeBegin(CVType &Record) {
- return visitTypeBegin(Record, TypeIndex::fromArrayIndex(TpiTypes.size()));
-}
-
-Error TypeDumpVisitor::visitTypeBegin(CVType &Record, TypeIndex Index) {
- W->startLine() << getLeafTypeName(Record.kind());
- W->getOStream() << " (" << HexNumber(Index.getIndex()) << ")";
- W->getOStream() << " {\n";
- W->indent();
- W->printEnum("TypeLeafKind", unsigned(Record.kind()),
- makeArrayRef(LeafTypeNames));
- return Error::success();
-}
-
-Error TypeDumpVisitor::visitTypeEnd(CVType &Record) {
- if (PrintRecordBytes)
- W->printBinaryBlock("LeafData", getBytesAsCharacters(Record.content()));
-
- W->unindent();
- W->startLine() << "}\n";
- return Error::success();
-}
-
-Error TypeDumpVisitor::visitMemberBegin(CVMemberRecord &Record) {
- W->startLine() << getLeafTypeName(Record.Kind);
- W->getOStream() << " {\n";
- W->indent();
- W->printEnum("TypeLeafKind", unsigned(Record.Kind),
- makeArrayRef(LeafTypeNames));
- return Error::success();
-}
-
-Error TypeDumpVisitor::visitMemberEnd(CVMemberRecord &Record) {
- if (PrintRecordBytes)
- W->printBinaryBlock("LeafData", getBytesAsCharacters(Record.Data));
-
- W->unindent();
- W->startLine() << "}\n";
- return Error::success();
-}
-
-Error TypeDumpVisitor::visitKnownRecord(CVType &CVR,
- FieldListRecord &FieldList) {
- if (auto EC = codeview::visitMemberRecordStream(FieldList.Data, *this))
- return EC;
-
- return Error::success();
-}
-
-Error TypeDumpVisitor::visitKnownRecord(CVType &CVR, StringIdRecord &String) {
- printItemIndex("Id", String.getId());
- W->printString("StringData", String.getString());
- return Error::success();
-}
-
-Error TypeDumpVisitor::visitKnownRecord(CVType &CVR, ArgListRecord &Args) {
- auto Indices = Args.getIndices();
- uint32_t Size = Indices.size();
- W->printNumber("NumArgs", Size);
- ListScope Arguments(*W, "Arguments");
- for (uint32_t I = 0; I < Size; ++I) {
- printTypeIndex("ArgType", Indices[I]);
- }
- return Error::success();
-}
-
-Error TypeDumpVisitor::visitKnownRecord(CVType &CVR, StringListRecord &Strs) {
- auto Indices = Strs.getIndices();
- uint32_t Size = Indices.size();
- W->printNumber("NumStrings", Size);
- ListScope Arguments(*W, "Strings");
- for (uint32_t I = 0; I < Size; ++I) {
- printItemIndex("String", Indices[I]);
- }
- return Error::success();
-}
-
-Error TypeDumpVisitor::visitKnownRecord(CVType &CVR, ClassRecord &Class) {
- uint16_t Props = static_cast<uint16_t>(Class.getOptions());
- W->printNumber("MemberCount", Class.getMemberCount());
- W->printFlags("Properties", Props, makeArrayRef(ClassOptionNames));
- printTypeIndex("FieldList", Class.getFieldList());
- printTypeIndex("DerivedFrom", Class.getDerivationList());
- printTypeIndex("VShape", Class.getVTableShape());
- W->printNumber("SizeOf", Class.getSize());
- W->printString("Name", Class.getName());
- if (Props & uint16_t(ClassOptions::HasUniqueName))
- W->printString("LinkageName", Class.getUniqueName());
- return Error::success();
-}
-
-Error TypeDumpVisitor::visitKnownRecord(CVType &CVR, UnionRecord &Union) {
- uint16_t Props = static_cast<uint16_t>(Union.getOptions());
- W->printNumber("MemberCount", Union.getMemberCount());
- W->printFlags("Properties", Props, makeArrayRef(ClassOptionNames));
- printTypeIndex("FieldList", Union.getFieldList());
- W->printNumber("SizeOf", Union.getSize());
- W->printString("Name", Union.getName());
- if (Props & uint16_t(ClassOptions::HasUniqueName))
- W->printString("LinkageName", Union.getUniqueName());
- return Error::success();
-}
-
-Error TypeDumpVisitor::visitKnownRecord(CVType &CVR, EnumRecord &Enum) {
- uint16_t Props = static_cast<uint16_t>(Enum.getOptions());
- W->printNumber("NumEnumerators", Enum.getMemberCount());
- W->printFlags("Properties", uint16_t(Enum.getOptions()),
- makeArrayRef(ClassOptionNames));
- printTypeIndex("UnderlyingType", Enum.getUnderlyingType());
- printTypeIndex("FieldListType", Enum.getFieldList());
- W->printString("Name", Enum.getName());
- if (Props & uint16_t(ClassOptions::HasUniqueName))
- W->printString("LinkageName", Enum.getUniqueName());
- return Error::success();
-}
-
-Error TypeDumpVisitor::visitKnownRecord(CVType &CVR, ArrayRecord &AT) {
- printTypeIndex("ElementType", AT.getElementType());
- printTypeIndex("IndexType", AT.getIndexType());
- W->printNumber("SizeOf", AT.getSize());
- W->printString("Name", AT.getName());
- return Error::success();
-}
-
-Error TypeDumpVisitor::visitKnownRecord(CVType &CVR, VFTableRecord &VFT) {
- printTypeIndex("CompleteClass", VFT.getCompleteClass());
- printTypeIndex("OverriddenVFTable", VFT.getOverriddenVTable());
- W->printHex("VFPtrOffset", VFT.getVFPtrOffset());
- W->printString("VFTableName", VFT.getName());
- for (auto N : VFT.getMethodNames())
- W->printString("MethodName", N);
- return Error::success();
-}
-
-Error TypeDumpVisitor::visitKnownRecord(CVType &CVR, MemberFuncIdRecord &Id) {
- printTypeIndex("ClassType", Id.getClassType());
- printTypeIndex("FunctionType", Id.getFunctionType());
- W->printString("Name", Id.getName());
- return Error::success();
-}
-
-Error TypeDumpVisitor::visitKnownRecord(CVType &CVR, ProcedureRecord &Proc) {
- printTypeIndex("ReturnType", Proc.getReturnType());
- W->printEnum("CallingConvention", uint8_t(Proc.getCallConv()),
- makeArrayRef(CallingConventions));
- W->printFlags("FunctionOptions", uint8_t(Proc.getOptions()),
- makeArrayRef(FunctionOptionEnum));
- W->printNumber("NumParameters", Proc.getParameterCount());
- printTypeIndex("ArgListType", Proc.getArgumentList());
- return Error::success();
-}
-
-Error TypeDumpVisitor::visitKnownRecord(CVType &CVR, MemberFunctionRecord &MF) {
- printTypeIndex("ReturnType", MF.getReturnType());
- printTypeIndex("ClassType", MF.getClassType());
- printTypeIndex("ThisType", MF.getThisType());
- W->printEnum("CallingConvention", uint8_t(MF.getCallConv()),
- makeArrayRef(CallingConventions));
- W->printFlags("FunctionOptions", uint8_t(MF.getOptions()),
- makeArrayRef(FunctionOptionEnum));
- W->printNumber("NumParameters", MF.getParameterCount());
- printTypeIndex("ArgListType", MF.getArgumentList());
- W->printNumber("ThisAdjustment", MF.getThisPointerAdjustment());
- return Error::success();
-}
-
-Error TypeDumpVisitor::visitKnownRecord(CVType &CVR,
- MethodOverloadListRecord &MethodList) {
- for (auto &M : MethodList.getMethods()) {
- ListScope S(*W, "Method");
- printMemberAttributes(M.getAccess(), M.getMethodKind(), M.getOptions());
- printTypeIndex("Type", M.getType());
- if (M.isIntroducingVirtual())
- W->printHex("VFTableOffset", M.getVFTableOffset());
- }
- return Error::success();
-}
-
-Error TypeDumpVisitor::visitKnownRecord(CVType &CVR, FuncIdRecord &Func) {
- printItemIndex("ParentScope", Func.getParentScope());
- printTypeIndex("FunctionType", Func.getFunctionType());
- W->printString("Name", Func.getName());
- return Error::success();
-}
-
-Error TypeDumpVisitor::visitKnownRecord(CVType &CVR, TypeServer2Record &TS) {
- W->printString("Guid", formatv("{0}", TS.getGuid()).str());
- W->printNumber("Age", TS.getAge());
- W->printString("Name", TS.getName());
- return Error::success();
-}
-
-Error TypeDumpVisitor::visitKnownRecord(CVType &CVR, PointerRecord &Ptr) {
- printTypeIndex("PointeeType", Ptr.getReferentType());
- W->printEnum("PtrType", unsigned(Ptr.getPointerKind()),
- makeArrayRef(PtrKindNames));
- W->printEnum("PtrMode", unsigned(Ptr.getMode()), makeArrayRef(PtrModeNames));
-
- W->printNumber("IsFlat", Ptr.isFlat());
- W->printNumber("IsConst", Ptr.isConst());
- W->printNumber("IsVolatile", Ptr.isVolatile());
- W->printNumber("IsUnaligned", Ptr.isUnaligned());
- W->printNumber("IsRestrict", Ptr.isRestrict());
- W->printNumber("IsThisPtr&", Ptr.isLValueReferenceThisPtr());
- W->printNumber("IsThisPtr&&", Ptr.isRValueReferenceThisPtr());
- W->printNumber("SizeOf", Ptr.getSize());
-
- if (Ptr.isPointerToMember()) {
- const MemberPointerInfo &MI = Ptr.getMemberInfo();
-
- printTypeIndex("ClassType", MI.getContainingType());
- W->printEnum("Representation", uint16_t(MI.getRepresentation()),
- makeArrayRef(PtrMemberRepNames));
- }
-
- return Error::success();
-}
-
-Error TypeDumpVisitor::visitKnownRecord(CVType &CVR, ModifierRecord &Mod) {
- uint16_t Mods = static_cast<uint16_t>(Mod.getModifiers());
- printTypeIndex("ModifiedType", Mod.getModifiedType());
- W->printFlags("Modifiers", Mods, makeArrayRef(TypeModifierNames));
-
- return Error::success();
-}
-
-Error TypeDumpVisitor::visitKnownRecord(CVType &CVR, BitFieldRecord &BitField) {
- printTypeIndex("Type", BitField.getType());
- W->printNumber("BitSize", BitField.getBitSize());
- W->printNumber("BitOffset", BitField.getBitOffset());
- return Error::success();
-}
-
-Error TypeDumpVisitor::visitKnownRecord(CVType &CVR,
- VFTableShapeRecord &Shape) {
- W->printNumber("VFEntryCount", Shape.getEntryCount());
- return Error::success();
-}
-
-Error TypeDumpVisitor::visitKnownRecord(CVType &CVR,
- UdtSourceLineRecord &Line) {
- printTypeIndex("UDT", Line.getUDT());
- printItemIndex("SourceFile", Line.getSourceFile());
- W->printNumber("LineNumber", Line.getLineNumber());
- return Error::success();
-}
-
-Error TypeDumpVisitor::visitKnownRecord(CVType &CVR,
- UdtModSourceLineRecord &Line) {
- printTypeIndex("UDT", Line.getUDT());
- printItemIndex("SourceFile", Line.getSourceFile());
- W->printNumber("LineNumber", Line.getLineNumber());
- W->printNumber("Module", Line.getModule());
- return Error::success();
-}
-
-Error TypeDumpVisitor::visitKnownRecord(CVType &CVR, BuildInfoRecord &Args) {
- W->printNumber("NumArgs", static_cast<uint32_t>(Args.getArgs().size()));
-
- ListScope Arguments(*W, "Arguments");
- for (auto Arg : Args.getArgs()) {
- printItemIndex("ArgType", Arg);
- }
- return Error::success();
-}
-
-void TypeDumpVisitor::printMemberAttributes(MemberAttributes Attrs) {
- return printMemberAttributes(Attrs.getAccess(), Attrs.getMethodKind(),
- Attrs.getFlags());
-}
-
-void TypeDumpVisitor::printMemberAttributes(MemberAccess Access,
- MethodKind Kind,
- MethodOptions Options) {
- W->printEnum("AccessSpecifier", uint8_t(Access),
- makeArrayRef(MemberAccessNames));
- // Data members will be vanilla. Don't try to print a method kind for them.
- if (Kind != MethodKind::Vanilla)
- W->printEnum("MethodKind", unsigned(Kind), makeArrayRef(MemberKindNames));
- if (Options != MethodOptions::None) {
- W->printFlags("MethodOptions", unsigned(Options),
- makeArrayRef(MethodOptionNames));
- }
-}
-
-Error TypeDumpVisitor::visitUnknownMember(CVMemberRecord &Record) {
- W->printHex("UnknownMember", unsigned(Record.Kind));
- return Error::success();
-}
-
-Error TypeDumpVisitor::visitUnknownType(CVType &Record) {
- W->printEnum("Kind", uint16_t(Record.kind()), makeArrayRef(LeafTypeNames));
- W->printNumber("Length", uint32_t(Record.content().size()));
- return Error::success();
-}
-
-Error TypeDumpVisitor::visitKnownMember(CVMemberRecord &CVR,
- NestedTypeRecord &Nested) {
- printTypeIndex("Type", Nested.getNestedType());
- W->printString("Name", Nested.getName());
- return Error::success();
-}
-
-Error TypeDumpVisitor::visitKnownMember(CVMemberRecord &CVR,
- OneMethodRecord &Method) {
- MethodKind K = Method.getMethodKind();
- printMemberAttributes(Method.getAccess(), K, Method.getOptions());
- printTypeIndex("Type", Method.getType());
- // If virtual, then read the vftable offset.
- if (Method.isIntroducingVirtual())
- W->printHex("VFTableOffset", Method.getVFTableOffset());
- W->printString("Name", Method.getName());
- return Error::success();
-}
-
-Error TypeDumpVisitor::visitKnownMember(CVMemberRecord &CVR,
- OverloadedMethodRecord &Method) {
- W->printHex("MethodCount", Method.getNumOverloads());
- printTypeIndex("MethodListIndex", Method.getMethodList());
- W->printString("Name", Method.getName());
- return Error::success();
-}
-
-Error TypeDumpVisitor::visitKnownMember(CVMemberRecord &CVR,
- DataMemberRecord &Field) {
- printMemberAttributes(Field.getAccess(), MethodKind::Vanilla,
- MethodOptions::None);
- printTypeIndex("Type", Field.getType());
- W->printHex("FieldOffset", Field.getFieldOffset());
- W->printString("Name", Field.getName());
- return Error::success();
-}
-
-Error TypeDumpVisitor::visitKnownMember(CVMemberRecord &CVR,
- StaticDataMemberRecord &Field) {
- printMemberAttributes(Field.getAccess(), MethodKind::Vanilla,
- MethodOptions::None);
- printTypeIndex("Type", Field.getType());
- W->printString("Name", Field.getName());
- return Error::success();
-}
-
-Error TypeDumpVisitor::visitKnownMember(CVMemberRecord &CVR,
- VFPtrRecord &VFTable) {
- printTypeIndex("Type", VFTable.getType());
- return Error::success();
-}
-
-Error TypeDumpVisitor::visitKnownMember(CVMemberRecord &CVR,
- EnumeratorRecord &Enum) {
- printMemberAttributes(Enum.getAccess(), MethodKind::Vanilla,
- MethodOptions::None);
- W->printNumber("EnumValue", Enum.getValue());
- W->printString("Name", Enum.getName());
- return Error::success();
-}
-
-Error TypeDumpVisitor::visitKnownMember(CVMemberRecord &CVR,
- BaseClassRecord &Base) {
- printMemberAttributes(Base.getAccess(), MethodKind::Vanilla,
- MethodOptions::None);
- printTypeIndex("BaseType", Base.getBaseType());
- W->printHex("BaseOffset", Base.getBaseOffset());
- return Error::success();
-}
-
-Error TypeDumpVisitor::visitKnownMember(CVMemberRecord &CVR,
- VirtualBaseClassRecord &Base) {
- printMemberAttributes(Base.getAccess(), MethodKind::Vanilla,
- MethodOptions::None);
- printTypeIndex("BaseType", Base.getBaseType());
- printTypeIndex("VBPtrType", Base.getVBPtrType());
- W->printHex("VBPtrOffset", Base.getVBPtrOffset());
- W->printHex("VBTableIndex", Base.getVTableIndex());
- return Error::success();
-}
-
-Error TypeDumpVisitor::visitKnownMember(CVMemberRecord &CVR,
- ListContinuationRecord &Cont) {
- printTypeIndex("ContinuationIndex", Cont.getContinuationIndex());
- return Error::success();
-}
-
-Error TypeDumpVisitor::visitKnownRecord(CVType &CVR, LabelRecord &LR) {
- W->printEnum("Mode", uint16_t(LR.Mode), makeArrayRef(LabelTypeEnum));
- return Error::success();
-}
-
-Error TypeDumpVisitor::visitKnownRecord(CVType &CVR,
- PrecompRecord &Precomp) {
- W->printHex("StartIndex", Precomp.getStartTypeIndex());
- W->printHex("Count", Precomp.getTypesCount());
- W->printHex("Signature", Precomp.getSignature());
- W->printString("PrecompFile", Precomp.getPrecompFilePath());
- return Error::success();
-}
-
-Error TypeDumpVisitor::visitKnownRecord(CVType &CVR,
- EndPrecompRecord &EndPrecomp) {
- W->printHex("Signature", EndPrecomp.getSignature());
- return Error::success();
-}
+//===-- TypeDumpVisitor.cpp - CodeView type info dumper ----------*- C++-*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "llvm/DebugInfo/CodeView/TypeDumpVisitor.h"
+
+#include "llvm/ADT/SmallString.h"
+#include "llvm/DebugInfo/CodeView/CVTypeVisitor.h"
+#include "llvm/DebugInfo/CodeView/Formatters.h"
+#include "llvm/DebugInfo/CodeView/TypeCollection.h"
+#include "llvm/DebugInfo/CodeView/TypeIndex.h"
+#include "llvm/DebugInfo/CodeView/TypeRecord.h"
+#include "llvm/Support/FormatVariadic.h"
+#include "llvm/Support/ScopedPrinter.h"
+
+using namespace llvm;
+using namespace llvm::codeview;
+
+static const EnumEntry<TypeLeafKind> LeafTypeNames[] = {
+#define CV_TYPE(enum, val) {#enum, enum},
+#include "llvm/DebugInfo/CodeView/CodeViewTypes.def"
+};
+
+#define ENUM_ENTRY(enum_class, enum) \
+ { #enum, std::underlying_type < enum_class > ::type(enum_class::enum) }
+
+static const EnumEntry<uint16_t> ClassOptionNames[] = {
+ ENUM_ENTRY(ClassOptions, Packed),
+ ENUM_ENTRY(ClassOptions, HasConstructorOrDestructor),
+ ENUM_ENTRY(ClassOptions, HasOverloadedOperator),
+ ENUM_ENTRY(ClassOptions, Nested),
+ ENUM_ENTRY(ClassOptions, ContainsNestedClass),
+ ENUM_ENTRY(ClassOptions, HasOverloadedAssignmentOperator),
+ ENUM_ENTRY(ClassOptions, HasConversionOperator),
+ ENUM_ENTRY(ClassOptions, ForwardReference),
+ ENUM_ENTRY(ClassOptions, Scoped),
+ ENUM_ENTRY(ClassOptions, HasUniqueName),
+ ENUM_ENTRY(ClassOptions, Sealed),
+ ENUM_ENTRY(ClassOptions, Intrinsic),
+};
+
+static const EnumEntry<uint8_t> MemberAccessNames[] = {
+ ENUM_ENTRY(MemberAccess, None), ENUM_ENTRY(MemberAccess, Private),
+ ENUM_ENTRY(MemberAccess, Protected), ENUM_ENTRY(MemberAccess, Public),
+};
+
+static const EnumEntry<uint16_t> MethodOptionNames[] = {
+ ENUM_ENTRY(MethodOptions, Pseudo),
+ ENUM_ENTRY(MethodOptions, NoInherit),
+ ENUM_ENTRY(MethodOptions, NoConstruct),
+ ENUM_ENTRY(MethodOptions, CompilerGenerated),
+ ENUM_ENTRY(MethodOptions, Sealed),
+};
+
+static const EnumEntry<uint16_t> MemberKindNames[] = {
+ ENUM_ENTRY(MethodKind, Vanilla),
+ ENUM_ENTRY(MethodKind, Virtual),
+ ENUM_ENTRY(MethodKind, Static),
+ ENUM_ENTRY(MethodKind, Friend),
+ ENUM_ENTRY(MethodKind, IntroducingVirtual),
+ ENUM_ENTRY(MethodKind, PureVirtual),
+ ENUM_ENTRY(MethodKind, PureIntroducingVirtual),
+};
+
+static const EnumEntry<uint8_t> PtrKindNames[] = {
+ ENUM_ENTRY(PointerKind, Near16),
+ ENUM_ENTRY(PointerKind, Far16),
+ ENUM_ENTRY(PointerKind, Huge16),
+ ENUM_ENTRY(PointerKind, BasedOnSegment),
+ ENUM_ENTRY(PointerKind, BasedOnValue),
+ ENUM_ENTRY(PointerKind, BasedOnSegmentValue),
+ ENUM_ENTRY(PointerKind, BasedOnAddress),
+ ENUM_ENTRY(PointerKind, BasedOnSegmentAddress),
+ ENUM_ENTRY(PointerKind, BasedOnType),
+ ENUM_ENTRY(PointerKind, BasedOnSelf),
+ ENUM_ENTRY(PointerKind, Near32),
+ ENUM_ENTRY(PointerKind, Far32),
+ ENUM_ENTRY(PointerKind, Near64),
+};
+
+static const EnumEntry<uint8_t> PtrModeNames[] = {
+ ENUM_ENTRY(PointerMode, Pointer),
+ ENUM_ENTRY(PointerMode, LValueReference),
+ ENUM_ENTRY(PointerMode, PointerToDataMember),
+ ENUM_ENTRY(PointerMode, PointerToMemberFunction),
+ ENUM_ENTRY(PointerMode, RValueReference),
+};
+
+static const EnumEntry<uint16_t> PtrMemberRepNames[] = {
+ ENUM_ENTRY(PointerToMemberRepresentation, Unknown),
+ ENUM_ENTRY(PointerToMemberRepresentation, SingleInheritanceData),
+ ENUM_ENTRY(PointerToMemberRepresentation, MultipleInheritanceData),
+ ENUM_ENTRY(PointerToMemberRepresentation, VirtualInheritanceData),
+ ENUM_ENTRY(PointerToMemberRepresentation, GeneralData),
+ ENUM_ENTRY(PointerToMemberRepresentation, SingleInheritanceFunction),
+ ENUM_ENTRY(PointerToMemberRepresentation, MultipleInheritanceFunction),
+ ENUM_ENTRY(PointerToMemberRepresentation, VirtualInheritanceFunction),
+ ENUM_ENTRY(PointerToMemberRepresentation, GeneralFunction),
+};
+
+static const EnumEntry<uint16_t> TypeModifierNames[] = {
+ ENUM_ENTRY(ModifierOptions, Const), ENUM_ENTRY(ModifierOptions, Volatile),
+ ENUM_ENTRY(ModifierOptions, Unaligned),
+};
+
+static const EnumEntry<uint8_t> CallingConventions[] = {
+ ENUM_ENTRY(CallingConvention, NearC),
+ ENUM_ENTRY(CallingConvention, FarC),
+ ENUM_ENTRY(CallingConvention, NearPascal),
+ ENUM_ENTRY(CallingConvention, FarPascal),
+ ENUM_ENTRY(CallingConvention, NearFast),
+ ENUM_ENTRY(CallingConvention, FarFast),
+ ENUM_ENTRY(CallingConvention, NearStdCall),
+ ENUM_ENTRY(CallingConvention, FarStdCall),
+ ENUM_ENTRY(CallingConvention, NearSysCall),
+ ENUM_ENTRY(CallingConvention, FarSysCall),
+ ENUM_ENTRY(CallingConvention, ThisCall),
+ ENUM_ENTRY(CallingConvention, MipsCall),
+ ENUM_ENTRY(CallingConvention, Generic),
+ ENUM_ENTRY(CallingConvention, AlphaCall),
+ ENUM_ENTRY(CallingConvention, PpcCall),
+ ENUM_ENTRY(CallingConvention, SHCall),
+ ENUM_ENTRY(CallingConvention, ArmCall),
+ ENUM_ENTRY(CallingConvention, AM33Call),
+ ENUM_ENTRY(CallingConvention, TriCall),
+ ENUM_ENTRY(CallingConvention, SH5Call),
+ ENUM_ENTRY(CallingConvention, M32RCall),
+ ENUM_ENTRY(CallingConvention, ClrCall),
+ ENUM_ENTRY(CallingConvention, Inline),
+ ENUM_ENTRY(CallingConvention, NearVector),
+};
+
+static const EnumEntry<uint8_t> FunctionOptionEnum[] = {
+ ENUM_ENTRY(FunctionOptions, CxxReturnUdt),
+ ENUM_ENTRY(FunctionOptions, Constructor),
+ ENUM_ENTRY(FunctionOptions, ConstructorWithVirtualBases),
+};
+
+static const EnumEntry<uint16_t> LabelTypeEnum[] = {
+ ENUM_ENTRY(LabelType, Near), ENUM_ENTRY(LabelType, Far),
+};
+
+#undef ENUM_ENTRY
+
+static StringRef getLeafTypeName(TypeLeafKind LT) {
+ switch (LT) {
+#define TYPE_RECORD(ename, value, name) \
+ case ename: \
+ return #name;
+#include "llvm/DebugInfo/CodeView/CodeViewTypes.def"
+ default:
+ break;
+ }
+ return "UnknownLeaf";
+}
+
+void TypeDumpVisitor::printTypeIndex(StringRef FieldName, TypeIndex TI) const {
+ codeview::printTypeIndex(*W, FieldName, TI, TpiTypes);
+}
+
+void TypeDumpVisitor::printItemIndex(StringRef FieldName, TypeIndex TI) const {
+ codeview::printTypeIndex(*W, FieldName, TI, getSourceTypes());
+}
+
+Error TypeDumpVisitor::visitTypeBegin(CVType &Record) {
+ return visitTypeBegin(Record, TypeIndex::fromArrayIndex(TpiTypes.size()));
+}
+
+Error TypeDumpVisitor::visitTypeBegin(CVType &Record, TypeIndex Index) {
+ W->startLine() << getLeafTypeName(Record.kind());
+ W->getOStream() << " (" << HexNumber(Index.getIndex()) << ")";
+ W->getOStream() << " {\n";
+ W->indent();
+ W->printEnum("TypeLeafKind", unsigned(Record.kind()),
+ makeArrayRef(LeafTypeNames));
+ return Error::success();
+}
+
+Error TypeDumpVisitor::visitTypeEnd(CVType &Record) {
+ if (PrintRecordBytes)
+ W->printBinaryBlock("LeafData", getBytesAsCharacters(Record.content()));
+
+ W->unindent();
+ W->startLine() << "}\n";
+ return Error::success();
+}
+
+Error TypeDumpVisitor::visitMemberBegin(CVMemberRecord &Record) {
+ W->startLine() << getLeafTypeName(Record.Kind);
+ W->getOStream() << " {\n";
+ W->indent();
+ W->printEnum("TypeLeafKind", unsigned(Record.Kind),
+ makeArrayRef(LeafTypeNames));
+ return Error::success();
+}
+
+Error TypeDumpVisitor::visitMemberEnd(CVMemberRecord &Record) {
+ if (PrintRecordBytes)
+ W->printBinaryBlock("LeafData", getBytesAsCharacters(Record.Data));
+
+ W->unindent();
+ W->startLine() << "}\n";
+ return Error::success();
+}
+
+Error TypeDumpVisitor::visitKnownRecord(CVType &CVR,
+ FieldListRecord &FieldList) {
+ if (auto EC = codeview::visitMemberRecordStream(FieldList.Data, *this))
+ return EC;
+
+ return Error::success();
+}
+
+Error TypeDumpVisitor::visitKnownRecord(CVType &CVR, StringIdRecord &String) {
+ printItemIndex("Id", String.getId());
+ W->printString("StringData", String.getString());
+ return Error::success();
+}
+
+Error TypeDumpVisitor::visitKnownRecord(CVType &CVR, ArgListRecord &Args) {
+ auto Indices = Args.getIndices();
+ uint32_t Size = Indices.size();
+ W->printNumber("NumArgs", Size);
+ ListScope Arguments(*W, "Arguments");
+ for (uint32_t I = 0; I < Size; ++I) {
+ printTypeIndex("ArgType", Indices[I]);
+ }
+ return Error::success();
+}
+
+Error TypeDumpVisitor::visitKnownRecord(CVType &CVR, StringListRecord &Strs) {
+ auto Indices = Strs.getIndices();
+ uint32_t Size = Indices.size();
+ W->printNumber("NumStrings", Size);
+ ListScope Arguments(*W, "Strings");
+ for (uint32_t I = 0; I < Size; ++I) {
+ printItemIndex("String", Indices[I]);
+ }
+ return Error::success();
+}
+
+Error TypeDumpVisitor::visitKnownRecord(CVType &CVR, ClassRecord &Class) {
+ uint16_t Props = static_cast<uint16_t>(Class.getOptions());
+ W->printNumber("MemberCount", Class.getMemberCount());
+ W->printFlags("Properties", Props, makeArrayRef(ClassOptionNames));
+ printTypeIndex("FieldList", Class.getFieldList());
+ printTypeIndex("DerivedFrom", Class.getDerivationList());
+ printTypeIndex("VShape", Class.getVTableShape());
+ W->printNumber("SizeOf", Class.getSize());
+ W->printString("Name", Class.getName());
+ if (Props & uint16_t(ClassOptions::HasUniqueName))
+ W->printString("LinkageName", Class.getUniqueName());
+ return Error::success();
+}
+
+Error TypeDumpVisitor::visitKnownRecord(CVType &CVR, UnionRecord &Union) {
+ uint16_t Props = static_cast<uint16_t>(Union.getOptions());
+ W->printNumber("MemberCount", Union.getMemberCount());
+ W->printFlags("Properties", Props, makeArrayRef(ClassOptionNames));
+ printTypeIndex("FieldList", Union.getFieldList());
+ W->printNumber("SizeOf", Union.getSize());
+ W->printString("Name", Union.getName());
+ if (Props & uint16_t(ClassOptions::HasUniqueName))
+ W->printString("LinkageName", Union.getUniqueName());
+ return Error::success();
+}
+
+Error TypeDumpVisitor::visitKnownRecord(CVType &CVR, EnumRecord &Enum) {
+ uint16_t Props = static_cast<uint16_t>(Enum.getOptions());
+ W->printNumber("NumEnumerators", Enum.getMemberCount());
+ W->printFlags("Properties", uint16_t(Enum.getOptions()),
+ makeArrayRef(ClassOptionNames));
+ printTypeIndex("UnderlyingType", Enum.getUnderlyingType());
+ printTypeIndex("FieldListType", Enum.getFieldList());
+ W->printString("Name", Enum.getName());
+ if (Props & uint16_t(ClassOptions::HasUniqueName))
+ W->printString("LinkageName", Enum.getUniqueName());
+ return Error::success();
+}
+
+Error TypeDumpVisitor::visitKnownRecord(CVType &CVR, ArrayRecord &AT) {
+ printTypeIndex("ElementType", AT.getElementType());
+ printTypeIndex("IndexType", AT.getIndexType());
+ W->printNumber("SizeOf", AT.getSize());
+ W->printString("Name", AT.getName());
+ return Error::success();
+}
+
+Error TypeDumpVisitor::visitKnownRecord(CVType &CVR, VFTableRecord &VFT) {
+ printTypeIndex("CompleteClass", VFT.getCompleteClass());
+ printTypeIndex("OverriddenVFTable", VFT.getOverriddenVTable());
+ W->printHex("VFPtrOffset", VFT.getVFPtrOffset());
+ W->printString("VFTableName", VFT.getName());
+ for (auto N : VFT.getMethodNames())
+ W->printString("MethodName", N);
+ return Error::success();
+}
+
+Error TypeDumpVisitor::visitKnownRecord(CVType &CVR, MemberFuncIdRecord &Id) {
+ printTypeIndex("ClassType", Id.getClassType());
+ printTypeIndex("FunctionType", Id.getFunctionType());
+ W->printString("Name", Id.getName());
+ return Error::success();
+}
+
+Error TypeDumpVisitor::visitKnownRecord(CVType &CVR, ProcedureRecord &Proc) {
+ printTypeIndex("ReturnType", Proc.getReturnType());
+ W->printEnum("CallingConvention", uint8_t(Proc.getCallConv()),
+ makeArrayRef(CallingConventions));
+ W->printFlags("FunctionOptions", uint8_t(Proc.getOptions()),
+ makeArrayRef(FunctionOptionEnum));
+ W->printNumber("NumParameters", Proc.getParameterCount());
+ printTypeIndex("ArgListType", Proc.getArgumentList());
+ return Error::success();
+}
+
+Error TypeDumpVisitor::visitKnownRecord(CVType &CVR, MemberFunctionRecord &MF) {
+ printTypeIndex("ReturnType", MF.getReturnType());
+ printTypeIndex("ClassType", MF.getClassType());
+ printTypeIndex("ThisType", MF.getThisType());
+ W->printEnum("CallingConvention", uint8_t(MF.getCallConv()),
+ makeArrayRef(CallingConventions));
+ W->printFlags("FunctionOptions", uint8_t(MF.getOptions()),
+ makeArrayRef(FunctionOptionEnum));
+ W->printNumber("NumParameters", MF.getParameterCount());
+ printTypeIndex("ArgListType", MF.getArgumentList());
+ W->printNumber("ThisAdjustment", MF.getThisPointerAdjustment());
+ return Error::success();
+}
+
+Error TypeDumpVisitor::visitKnownRecord(CVType &CVR,
+ MethodOverloadListRecord &MethodList) {
+ for (auto &M : MethodList.getMethods()) {
+ ListScope S(*W, "Method");
+ printMemberAttributes(M.getAccess(), M.getMethodKind(), M.getOptions());
+ printTypeIndex("Type", M.getType());
+ if (M.isIntroducingVirtual())
+ W->printHex("VFTableOffset", M.getVFTableOffset());
+ }
+ return Error::success();
+}
+
+Error TypeDumpVisitor::visitKnownRecord(CVType &CVR, FuncIdRecord &Func) {
+ printItemIndex("ParentScope", Func.getParentScope());
+ printTypeIndex("FunctionType", Func.getFunctionType());
+ W->printString("Name", Func.getName());
+ return Error::success();
+}
+
+Error TypeDumpVisitor::visitKnownRecord(CVType &CVR, TypeServer2Record &TS) {
+ W->printString("Guid", formatv("{0}", TS.getGuid()).str());
+ W->printNumber("Age", TS.getAge());
+ W->printString("Name", TS.getName());
+ return Error::success();
+}
+
+Error TypeDumpVisitor::visitKnownRecord(CVType &CVR, PointerRecord &Ptr) {
+ printTypeIndex("PointeeType", Ptr.getReferentType());
+ W->printEnum("PtrType", unsigned(Ptr.getPointerKind()),
+ makeArrayRef(PtrKindNames));
+ W->printEnum("PtrMode", unsigned(Ptr.getMode()), makeArrayRef(PtrModeNames));
+
+ W->printNumber("IsFlat", Ptr.isFlat());
+ W->printNumber("IsConst", Ptr.isConst());
+ W->printNumber("IsVolatile", Ptr.isVolatile());
+ W->printNumber("IsUnaligned", Ptr.isUnaligned());
+ W->printNumber("IsRestrict", Ptr.isRestrict());
+ W->printNumber("IsThisPtr&", Ptr.isLValueReferenceThisPtr());
+ W->printNumber("IsThisPtr&&", Ptr.isRValueReferenceThisPtr());
+ W->printNumber("SizeOf", Ptr.getSize());
+
+ if (Ptr.isPointerToMember()) {
+ const MemberPointerInfo &MI = Ptr.getMemberInfo();
+
+ printTypeIndex("ClassType", MI.getContainingType());
+ W->printEnum("Representation", uint16_t(MI.getRepresentation()),
+ makeArrayRef(PtrMemberRepNames));
+ }
+
+ return Error::success();
+}
+
+Error TypeDumpVisitor::visitKnownRecord(CVType &CVR, ModifierRecord &Mod) {
+ uint16_t Mods = static_cast<uint16_t>(Mod.getModifiers());
+ printTypeIndex("ModifiedType", Mod.getModifiedType());
+ W->printFlags("Modifiers", Mods, makeArrayRef(TypeModifierNames));
+
+ return Error::success();
+}
+
+Error TypeDumpVisitor::visitKnownRecord(CVType &CVR, BitFieldRecord &BitField) {
+ printTypeIndex("Type", BitField.getType());
+ W->printNumber("BitSize", BitField.getBitSize());
+ W->printNumber("BitOffset", BitField.getBitOffset());
+ return Error::success();
+}
+
+Error TypeDumpVisitor::visitKnownRecord(CVType &CVR,
+ VFTableShapeRecord &Shape) {
+ W->printNumber("VFEntryCount", Shape.getEntryCount());
+ return Error::success();
+}
+
+Error TypeDumpVisitor::visitKnownRecord(CVType &CVR,
+ UdtSourceLineRecord &Line) {
+ printTypeIndex("UDT", Line.getUDT());
+ printItemIndex("SourceFile", Line.getSourceFile());
+ W->printNumber("LineNumber", Line.getLineNumber());
+ return Error::success();
+}
+
+Error TypeDumpVisitor::visitKnownRecord(CVType &CVR,
+ UdtModSourceLineRecord &Line) {
+ printTypeIndex("UDT", Line.getUDT());
+ printItemIndex("SourceFile", Line.getSourceFile());
+ W->printNumber("LineNumber", Line.getLineNumber());
+ W->printNumber("Module", Line.getModule());
+ return Error::success();
+}
+
+Error TypeDumpVisitor::visitKnownRecord(CVType &CVR, BuildInfoRecord &Args) {
+ W->printNumber("NumArgs", static_cast<uint32_t>(Args.getArgs().size()));
+
+ ListScope Arguments(*W, "Arguments");
+ for (auto Arg : Args.getArgs()) {
+ printItemIndex("ArgType", Arg);
+ }
+ return Error::success();
+}
+
+void TypeDumpVisitor::printMemberAttributes(MemberAttributes Attrs) {
+ return printMemberAttributes(Attrs.getAccess(), Attrs.getMethodKind(),
+ Attrs.getFlags());
+}
+
+void TypeDumpVisitor::printMemberAttributes(MemberAccess Access,
+ MethodKind Kind,
+ MethodOptions Options) {
+ W->printEnum("AccessSpecifier", uint8_t(Access),
+ makeArrayRef(MemberAccessNames));
+ // Data members will be vanilla. Don't try to print a method kind for them.
+ if (Kind != MethodKind::Vanilla)
+ W->printEnum("MethodKind", unsigned(Kind), makeArrayRef(MemberKindNames));
+ if (Options != MethodOptions::None) {
+ W->printFlags("MethodOptions", unsigned(Options),
+ makeArrayRef(MethodOptionNames));
+ }
+}
+
+Error TypeDumpVisitor::visitUnknownMember(CVMemberRecord &Record) {
+ W->printHex("UnknownMember", unsigned(Record.Kind));
+ return Error::success();
+}
+
+Error TypeDumpVisitor::visitUnknownType(CVType &Record) {
+ W->printEnum("Kind", uint16_t(Record.kind()), makeArrayRef(LeafTypeNames));
+ W->printNumber("Length", uint32_t(Record.content().size()));
+ return Error::success();
+}
+
+Error TypeDumpVisitor::visitKnownMember(CVMemberRecord &CVR,
+ NestedTypeRecord &Nested) {
+ printTypeIndex("Type", Nested.getNestedType());
+ W->printString("Name", Nested.getName());
+ return Error::success();
+}
+
+Error TypeDumpVisitor::visitKnownMember(CVMemberRecord &CVR,
+ OneMethodRecord &Method) {
+ MethodKind K = Method.getMethodKind();
+ printMemberAttributes(Method.getAccess(), K, Method.getOptions());
+ printTypeIndex("Type", Method.getType());
+ // If virtual, then read the vftable offset.
+ if (Method.isIntroducingVirtual())
+ W->printHex("VFTableOffset", Method.getVFTableOffset());
+ W->printString("Name", Method.getName());
+ return Error::success();
+}
+
+Error TypeDumpVisitor::visitKnownMember(CVMemberRecord &CVR,
+ OverloadedMethodRecord &Method) {
+ W->printHex("MethodCount", Method.getNumOverloads());
+ printTypeIndex("MethodListIndex", Method.getMethodList());
+ W->printString("Name", Method.getName());
+ return Error::success();
+}
+
+Error TypeDumpVisitor::visitKnownMember(CVMemberRecord &CVR,
+ DataMemberRecord &Field) {
+ printMemberAttributes(Field.getAccess(), MethodKind::Vanilla,
+ MethodOptions::None);
+ printTypeIndex("Type", Field.getType());
+ W->printHex("FieldOffset", Field.getFieldOffset());
+ W->printString("Name", Field.getName());
+ return Error::success();
+}
+
+Error TypeDumpVisitor::visitKnownMember(CVMemberRecord &CVR,
+ StaticDataMemberRecord &Field) {
+ printMemberAttributes(Field.getAccess(), MethodKind::Vanilla,
+ MethodOptions::None);
+ printTypeIndex("Type", Field.getType());
+ W->printString("Name", Field.getName());
+ return Error::success();
+}
+
+Error TypeDumpVisitor::visitKnownMember(CVMemberRecord &CVR,
+ VFPtrRecord &VFTable) {
+ printTypeIndex("Type", VFTable.getType());
+ return Error::success();
+}
+
+Error TypeDumpVisitor::visitKnownMember(CVMemberRecord &CVR,
+ EnumeratorRecord &Enum) {
+ printMemberAttributes(Enum.getAccess(), MethodKind::Vanilla,
+ MethodOptions::None);
+ W->printNumber("EnumValue", Enum.getValue());
+ W->printString("Name", Enum.getName());
+ return Error::success();
+}
+
+Error TypeDumpVisitor::visitKnownMember(CVMemberRecord &CVR,
+ BaseClassRecord &Base) {
+ printMemberAttributes(Base.getAccess(), MethodKind::Vanilla,
+ MethodOptions::None);
+ printTypeIndex("BaseType", Base.getBaseType());
+ W->printHex("BaseOffset", Base.getBaseOffset());
+ return Error::success();
+}
+
+Error TypeDumpVisitor::visitKnownMember(CVMemberRecord &CVR,
+ VirtualBaseClassRecord &Base) {
+ printMemberAttributes(Base.getAccess(), MethodKind::Vanilla,
+ MethodOptions::None);
+ printTypeIndex("BaseType", Base.getBaseType());
+ printTypeIndex("VBPtrType", Base.getVBPtrType());
+ W->printHex("VBPtrOffset", Base.getVBPtrOffset());
+ W->printHex("VBTableIndex", Base.getVTableIndex());
+ return Error::success();
+}
+
+Error TypeDumpVisitor::visitKnownMember(CVMemberRecord &CVR,
+ ListContinuationRecord &Cont) {
+ printTypeIndex("ContinuationIndex", Cont.getContinuationIndex());
+ return Error::success();
+}
+
+Error TypeDumpVisitor::visitKnownRecord(CVType &CVR, LabelRecord &LR) {
+ W->printEnum("Mode", uint16_t(LR.Mode), makeArrayRef(LabelTypeEnum));
+ return Error::success();
+}
+
+Error TypeDumpVisitor::visitKnownRecord(CVType &CVR,
+ PrecompRecord &Precomp) {
+ W->printHex("StartIndex", Precomp.getStartTypeIndex());
+ W->printHex("Count", Precomp.getTypesCount());
+ W->printHex("Signature", Precomp.getSignature());
+ W->printString("PrecompFile", Precomp.getPrecompFilePath());
+ return Error::success();
+}
+
+Error TypeDumpVisitor::visitKnownRecord(CVType &CVR,
+ EndPrecompRecord &EndPrecomp) {
+ W->printHex("Signature", EndPrecomp.getSignature());
+ return Error::success();
+}
diff --git a/contrib/libs/llvm12/lib/DebugInfo/CodeView/TypeHashing.cpp b/contrib/libs/llvm12/lib/DebugInfo/CodeView/TypeHashing.cpp
index 797d80a4509..2dbc11a84f0 100644
--- a/contrib/libs/llvm12/lib/DebugInfo/CodeView/TypeHashing.cpp
+++ b/contrib/libs/llvm12/lib/DebugInfo/CodeView/TypeHashing.cpp
@@ -1,80 +1,80 @@
-//===- TypeHashing.cpp -------------------------------------------*- C++-*-===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-
-#include "llvm/DebugInfo/CodeView/TypeHashing.h"
-
-#include "llvm/DebugInfo/CodeView/TypeIndexDiscovery.h"
-#include "llvm/Support/SHA1.h"
-
-using namespace llvm;
-using namespace llvm::codeview;
-
-LocallyHashedType DenseMapInfo<LocallyHashedType>::Empty{0, {}};
-LocallyHashedType DenseMapInfo<LocallyHashedType>::Tombstone{hash_code(-1), {}};
-
-static std::array<uint8_t, 8> EmptyHash = {
- {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}};
-static std::array<uint8_t, 8> TombstoneHash = {
- {0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}};
-
-GloballyHashedType DenseMapInfo<GloballyHashedType>::Empty{EmptyHash};
-GloballyHashedType DenseMapInfo<GloballyHashedType>::Tombstone{TombstoneHash};
-
-LocallyHashedType LocallyHashedType::hashType(ArrayRef<uint8_t> RecordData) {
- return {llvm::hash_value(RecordData), RecordData};
-}
-
-GloballyHashedType
-GloballyHashedType::hashType(ArrayRef<uint8_t> RecordData,
- ArrayRef<GloballyHashedType> PreviousTypes,
- ArrayRef<GloballyHashedType> PreviousIds) {
- SmallVector<TiReference, 4> Refs;
- discoverTypeIndices(RecordData, Refs);
- SHA1 S;
- S.init();
- uint32_t Off = 0;
- S.update(RecordData.take_front(sizeof(RecordPrefix)));
- RecordData = RecordData.drop_front(sizeof(RecordPrefix));
- for (const auto &Ref : Refs) {
- // Hash any data that comes before this TiRef.
- uint32_t PreLen = Ref.Offset - Off;
- ArrayRef<uint8_t> PreData = RecordData.slice(Off, PreLen);
- S.update(PreData);
- auto Prev = (Ref.Kind == TiRefKind::IndexRef) ? PreviousIds : PreviousTypes;
-
- auto RefData = RecordData.slice(Ref.Offset, Ref.Count * sizeof(TypeIndex));
- // For each type index referenced, add in the previously computed hash
- // value of that type.
- ArrayRef<TypeIndex> Indices(
- reinterpret_cast<const TypeIndex *>(RefData.data()), Ref.Count);
- for (TypeIndex TI : Indices) {
- ArrayRef<uint8_t> BytesToHash;
- if (TI.isSimple() || TI.isNoneType()) {
- const uint8_t *IndexBytes = reinterpret_cast<const uint8_t *>(&TI);
- BytesToHash = makeArrayRef(IndexBytes, sizeof(TypeIndex));
- } else {
- if (TI.toArrayIndex() >= Prev.size() ||
- Prev[TI.toArrayIndex()].empty()) {
- // There are references to yet-unhashed records. Suspend hashing for
- // this record until all the other records are processed.
- return {};
- }
- BytesToHash = Prev[TI.toArrayIndex()].Hash;
- }
- S.update(BytesToHash);
- }
-
- Off = Ref.Offset + Ref.Count * sizeof(TypeIndex);
- }
-
- // Don't forget to add in any trailing bytes.
- auto TrailingBytes = RecordData.drop_front(Off);
- S.update(TrailingBytes);
-
- return {S.final().take_back(8)};
-}
+//===- TypeHashing.cpp -------------------------------------------*- C++-*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "llvm/DebugInfo/CodeView/TypeHashing.h"
+
+#include "llvm/DebugInfo/CodeView/TypeIndexDiscovery.h"
+#include "llvm/Support/SHA1.h"
+
+using namespace llvm;
+using namespace llvm::codeview;
+
+LocallyHashedType DenseMapInfo<LocallyHashedType>::Empty{0, {}};
+LocallyHashedType DenseMapInfo<LocallyHashedType>::Tombstone{hash_code(-1), {}};
+
+static std::array<uint8_t, 8> EmptyHash = {
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}};
+static std::array<uint8_t, 8> TombstoneHash = {
+ {0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}};
+
+GloballyHashedType DenseMapInfo<GloballyHashedType>::Empty{EmptyHash};
+GloballyHashedType DenseMapInfo<GloballyHashedType>::Tombstone{TombstoneHash};
+
+LocallyHashedType LocallyHashedType::hashType(ArrayRef<uint8_t> RecordData) {
+ return {llvm::hash_value(RecordData), RecordData};
+}
+
+GloballyHashedType
+GloballyHashedType::hashType(ArrayRef<uint8_t> RecordData,
+ ArrayRef<GloballyHashedType> PreviousTypes,
+ ArrayRef<GloballyHashedType> PreviousIds) {
+ SmallVector<TiReference, 4> Refs;
+ discoverTypeIndices(RecordData, Refs);
+ SHA1 S;
+ S.init();
+ uint32_t Off = 0;
+ S.update(RecordData.take_front(sizeof(RecordPrefix)));
+ RecordData = RecordData.drop_front(sizeof(RecordPrefix));
+ for (const auto &Ref : Refs) {
+ // Hash any data that comes before this TiRef.
+ uint32_t PreLen = Ref.Offset - Off;
+ ArrayRef<uint8_t> PreData = RecordData.slice(Off, PreLen);
+ S.update(PreData);
+ auto Prev = (Ref.Kind == TiRefKind::IndexRef) ? PreviousIds : PreviousTypes;
+
+ auto RefData = RecordData.slice(Ref.Offset, Ref.Count * sizeof(TypeIndex));
+ // For each type index referenced, add in the previously computed hash
+ // value of that type.
+ ArrayRef<TypeIndex> Indices(
+ reinterpret_cast<const TypeIndex *>(RefData.data()), Ref.Count);
+ for (TypeIndex TI : Indices) {
+ ArrayRef<uint8_t> BytesToHash;
+ if (TI.isSimple() || TI.isNoneType()) {
+ const uint8_t *IndexBytes = reinterpret_cast<const uint8_t *>(&TI);
+ BytesToHash = makeArrayRef(IndexBytes, sizeof(TypeIndex));
+ } else {
+ if (TI.toArrayIndex() >= Prev.size() ||
+ Prev[TI.toArrayIndex()].empty()) {
+ // There are references to yet-unhashed records. Suspend hashing for
+ // this record until all the other records are processed.
+ return {};
+ }
+ BytesToHash = Prev[TI.toArrayIndex()].Hash;
+ }
+ S.update(BytesToHash);
+ }
+
+ Off = Ref.Offset + Ref.Count * sizeof(TypeIndex);
+ }
+
+ // Don't forget to add in any trailing bytes.
+ auto TrailingBytes = RecordData.drop_front(Off);
+ S.update(TrailingBytes);
+
+ return {S.final().take_back(8)};
+}
diff --git a/contrib/libs/llvm12/lib/DebugInfo/CodeView/TypeIndex.cpp b/contrib/libs/llvm12/lib/DebugInfo/CodeView/TypeIndex.cpp
index 201197a728b..604d342448d 100644
--- a/contrib/libs/llvm12/lib/DebugInfo/CodeView/TypeIndex.cpp
+++ b/contrib/libs/llvm12/lib/DebugInfo/CodeView/TypeIndex.cpp
@@ -1,106 +1,106 @@
-//===-- TypeIndex.cpp - CodeView type index ---------------------*- C++ -*-===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-
-#include "llvm/DebugInfo/CodeView/TypeIndex.h"
-
-#include "llvm/DebugInfo/CodeView/TypeCollection.h"
-#include "llvm/Support/ScopedPrinter.h"
-
-using namespace llvm;
-using namespace llvm::codeview;
-
-namespace {
-struct SimpleTypeEntry {
- StringRef Name;
- SimpleTypeKind Kind;
-};
-
-/// The names here all end in "*". If the simple type is a pointer type, we
-/// return the whole name. Otherwise we lop off the last character in our
-/// StringRef.
-static const SimpleTypeEntry SimpleTypeNames[] = {
- {"void*", SimpleTypeKind::Void},
- {"<not translated>*", SimpleTypeKind::NotTranslated},
- {"HRESULT*", SimpleTypeKind::HResult},
- {"signed char*", SimpleTypeKind::SignedCharacter},
- {"unsigned char*", SimpleTypeKind::UnsignedCharacter},
- {"char*", SimpleTypeKind::NarrowCharacter},
- {"wchar_t*", SimpleTypeKind::WideCharacter},
- {"char16_t*", SimpleTypeKind::Character16},
- {"char32_t*", SimpleTypeKind::Character32},
- {"__int8*", SimpleTypeKind::SByte},
- {"unsigned __int8*", SimpleTypeKind::Byte},
- {"short*", SimpleTypeKind::Int16Short},
- {"unsigned short*", SimpleTypeKind::UInt16Short},
- {"__int16*", SimpleTypeKind::Int16},
- {"unsigned __int16*", SimpleTypeKind::UInt16},
- {"long*", SimpleTypeKind::Int32Long},
- {"unsigned long*", SimpleTypeKind::UInt32Long},
- {"int*", SimpleTypeKind::Int32},
- {"unsigned*", SimpleTypeKind::UInt32},
- {"__int64*", SimpleTypeKind::Int64Quad},
- {"unsigned __int64*", SimpleTypeKind::UInt64Quad},
- {"__int64*", SimpleTypeKind::Int64},
- {"unsigned __int64*", SimpleTypeKind::UInt64},
- {"__int128*", SimpleTypeKind::Int128},
- {"unsigned __int128*", SimpleTypeKind::UInt128},
- {"__half*", SimpleTypeKind::Float16},
- {"float*", SimpleTypeKind::Float32},
- {"float*", SimpleTypeKind::Float32PartialPrecision},
- {"__float48*", SimpleTypeKind::Float48},
- {"double*", SimpleTypeKind::Float64},
- {"long double*", SimpleTypeKind::Float80},
- {"__float128*", SimpleTypeKind::Float128},
- {"_Complex float*", SimpleTypeKind::Complex32},
- {"_Complex double*", SimpleTypeKind::Complex64},
- {"_Complex long double*", SimpleTypeKind::Complex80},
- {"_Complex __float128*", SimpleTypeKind::Complex128},
- {"bool*", SimpleTypeKind::Boolean8},
- {"__bool16*", SimpleTypeKind::Boolean16},
- {"__bool32*", SimpleTypeKind::Boolean32},
- {"__bool64*", SimpleTypeKind::Boolean64},
-};
-} // namespace
-
-StringRef TypeIndex::simpleTypeName(TypeIndex TI) {
- assert(TI.isNoneType() || TI.isSimple());
-
- if (TI.isNoneType())
- return "<no type>";
-
- if (TI == TypeIndex::NullptrT())
- return "std::nullptr_t";
-
- // This is a simple type.
- for (const auto &SimpleTypeName : SimpleTypeNames) {
- if (SimpleTypeName.Kind == TI.getSimpleKind()) {
- if (TI.getSimpleMode() == SimpleTypeMode::Direct)
- return SimpleTypeName.Name.drop_back(1);
- // Otherwise, this is a pointer type. We gloss over the distinction
- // between near, far, 64, 32, etc, and just give a pointer type.
- return SimpleTypeName.Name;
- }
- }
- return "<unknown simple type>";
-}
-
-void llvm::codeview::printTypeIndex(ScopedPrinter &Printer, StringRef FieldName,
- TypeIndex TI, TypeCollection &Types) {
- StringRef TypeName;
- if (!TI.isNoneType()) {
- if (TI.isSimple())
- TypeName = TypeIndex::simpleTypeName(TI);
- else
- TypeName = Types.getTypeName(TI);
- }
-
- if (!TypeName.empty())
- Printer.printHex(FieldName, TypeName, TI.getIndex());
- else
- Printer.printHex(FieldName, TI.getIndex());
-}
+//===-- TypeIndex.cpp - CodeView type index ---------------------*- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "llvm/DebugInfo/CodeView/TypeIndex.h"
+
+#include "llvm/DebugInfo/CodeView/TypeCollection.h"
+#include "llvm/Support/ScopedPrinter.h"
+
+using namespace llvm;
+using namespace llvm::codeview;
+
+namespace {
+struct SimpleTypeEntry {
+ StringRef Name;
+ SimpleTypeKind Kind;
+};
+
+/// The names here all end in "*". If the simple type is a pointer type, we
+/// return the whole name. Otherwise we lop off the last character in our
+/// StringRef.
+static const SimpleTypeEntry SimpleTypeNames[] = {
+ {"void*", SimpleTypeKind::Void},
+ {"<not translated>*", SimpleTypeKind::NotTranslated},
+ {"HRESULT*", SimpleTypeKind::HResult},
+ {"signed char*", SimpleTypeKind::SignedCharacter},
+ {"unsigned char*", SimpleTypeKind::UnsignedCharacter},
+ {"char*", SimpleTypeKind::NarrowCharacter},
+ {"wchar_t*", SimpleTypeKind::WideCharacter},
+ {"char16_t*", SimpleTypeKind::Character16},
+ {"char32_t*", SimpleTypeKind::Character32},
+ {"__int8*", SimpleTypeKind::SByte},
+ {"unsigned __int8*", SimpleTypeKind::Byte},
+ {"short*", SimpleTypeKind::Int16Short},
+ {"unsigned short*", SimpleTypeKind::UInt16Short},
+ {"__int16*", SimpleTypeKind::Int16},
+ {"unsigned __int16*", SimpleTypeKind::UInt16},
+ {"long*", SimpleTypeKind::Int32Long},
+ {"unsigned long*", SimpleTypeKind::UInt32Long},
+ {"int*", SimpleTypeKind::Int32},
+ {"unsigned*", SimpleTypeKind::UInt32},
+ {"__int64*", SimpleTypeKind::Int64Quad},
+ {"unsigned __int64*", SimpleTypeKind::UInt64Quad},
+ {"__int64*", SimpleTypeKind::Int64},
+ {"unsigned __int64*", SimpleTypeKind::UInt64},
+ {"__int128*", SimpleTypeKind::Int128},
+ {"unsigned __int128*", SimpleTypeKind::UInt128},
+ {"__half*", SimpleTypeKind::Float16},
+ {"float*", SimpleTypeKind::Float32},
+ {"float*", SimpleTypeKind::Float32PartialPrecision},
+ {"__float48*", SimpleTypeKind::Float48},
+ {"double*", SimpleTypeKind::Float64},
+ {"long double*", SimpleTypeKind::Float80},
+ {"__float128*", SimpleTypeKind::Float128},
+ {"_Complex float*", SimpleTypeKind::Complex32},
+ {"_Complex double*", SimpleTypeKind::Complex64},
+ {"_Complex long double*", SimpleTypeKind::Complex80},
+ {"_Complex __float128*", SimpleTypeKind::Complex128},
+ {"bool*", SimpleTypeKind::Boolean8},
+ {"__bool16*", SimpleTypeKind::Boolean16},
+ {"__bool32*", SimpleTypeKind::Boolean32},
+ {"__bool64*", SimpleTypeKind::Boolean64},
+};
+} // namespace
+
+StringRef TypeIndex::simpleTypeName(TypeIndex TI) {
+ assert(TI.isNoneType() || TI.isSimple());
+
+ if (TI.isNoneType())
+ return "<no type>";
+
+ if (TI == TypeIndex::NullptrT())
+ return "std::nullptr_t";
+
+ // This is a simple type.
+ for (const auto &SimpleTypeName : SimpleTypeNames) {
+ if (SimpleTypeName.Kind == TI.getSimpleKind()) {
+ if (TI.getSimpleMode() == SimpleTypeMode::Direct)
+ return SimpleTypeName.Name.drop_back(1);
+ // Otherwise, this is a pointer type. We gloss over the distinction
+ // between near, far, 64, 32, etc, and just give a pointer type.
+ return SimpleTypeName.Name;
+ }
+ }
+ return "<unknown simple type>";
+}
+
+void llvm::codeview::printTypeIndex(ScopedPrinter &Printer, StringRef FieldName,
+ TypeIndex TI, TypeCollection &Types) {
+ StringRef TypeName;
+ if (!TI.isNoneType()) {
+ if (TI.isSimple())
+ TypeName = TypeIndex::simpleTypeName(TI);
+ else
+ TypeName = Types.getTypeName(TI);
+ }
+
+ if (!TypeName.empty())
+ Printer.printHex(FieldName, TypeName, TI.getIndex());
+ else
+ Printer.printHex(FieldName, TI.getIndex());
+}
diff --git a/contrib/libs/llvm12/lib/DebugInfo/CodeView/TypeIndexDiscovery.cpp b/contrib/libs/llvm12/lib/DebugInfo/CodeView/TypeIndexDiscovery.cpp
index bc7759b12ef..682747a2b81 100644
--- a/contrib/libs/llvm12/lib/DebugInfo/CodeView/TypeIndexDiscovery.cpp
+++ b/contrib/libs/llvm12/lib/DebugInfo/CodeView/TypeIndexDiscovery.cpp
@@ -1,523 +1,523 @@
-//===- TypeIndexDiscovery.cpp -----------------------------------*- C++ -*-===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-
-#include "llvm/DebugInfo/CodeView/TypeIndexDiscovery.h"
+//===- TypeIndexDiscovery.cpp -----------------------------------*- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "llvm/DebugInfo/CodeView/TypeIndexDiscovery.h"
#include "llvm/DebugInfo/CodeView/TypeRecord.h"
-#include "llvm/ADT/ArrayRef.h"
-#include "llvm/Support/Endian.h"
-
-using namespace llvm;
-using namespace llvm::codeview;
-
-static inline MethodKind getMethodKind(uint16_t Attrs) {
- Attrs &= uint16_t(MethodOptions::MethodKindMask);
- Attrs >>= 2;
- return MethodKind(Attrs);
-}
-
-static inline bool isIntroVirtual(uint16_t Attrs) {
- MethodKind MK = getMethodKind(Attrs);
- return MK == MethodKind::IntroducingVirtual ||
- MK == MethodKind::PureIntroducingVirtual;
-}
-
-static inline PointerMode getPointerMode(uint32_t Attrs) {
- return static_cast<PointerMode>((Attrs >> PointerRecord::PointerModeShift) &
- PointerRecord::PointerModeMask);
-}
-
-static inline bool isMemberPointer(uint32_t Attrs) {
- PointerMode Mode = getPointerMode(Attrs);
- return Mode == PointerMode::PointerToDataMember ||
- Mode == PointerMode::PointerToMemberFunction;
-}
-
-static inline uint32_t getEncodedIntegerLength(ArrayRef<uint8_t> Data) {
- uint16_t N = support::endian::read16le(Data.data());
- if (N < LF_NUMERIC)
- return 2;
-
- assert(N <= LF_UQUADWORD);
-
- constexpr uint32_t Sizes[] = {
- 1, // LF_CHAR
- 2, // LF_SHORT
- 2, // LF_USHORT
- 4, // LF_LONG
- 4, // LF_ULONG
- 4, // LF_REAL32
- 8, // LF_REAL64
- 10, // LF_REAL80
- 16, // LF_REAL128
- 8, // LF_QUADWORD
- 8, // LF_UQUADWORD
- };
-
- return 2 + Sizes[N - LF_NUMERIC];
-}
-
-static inline uint32_t getCStringLength(ArrayRef<uint8_t> Data) {
- const char *S = reinterpret_cast<const char *>(Data.data());
- return strlen(S) + 1;
-}
-
-static void handleMethodOverloadList(ArrayRef<uint8_t> Content,
- SmallVectorImpl<TiReference> &Refs) {
- uint32_t Offset = 0;
-
- while (!Content.empty()) {
- // Array of:
- // 0: Attrs
- // 2: Padding
- // 4: TypeIndex
- // if (isIntroVirtual())
- // 8: VFTableOffset
-
- // At least 8 bytes are guaranteed. 4 extra bytes come iff function is an
- // intro virtual.
- uint32_t Len = 8;
-
- uint16_t Attrs = support::endian::read16le(Content.data());
- Refs.push_back({TiRefKind::TypeRef, Offset + 4, 1});
-
- if (LLVM_UNLIKELY(isIntroVirtual(Attrs)))
- Len += 4;
- Offset += Len;
- Content = Content.drop_front(Len);
- }
-}
-
-static uint32_t handleBaseClass(ArrayRef<uint8_t> Data, uint32_t Offset,
- SmallVectorImpl<TiReference> &Refs) {
- // 0: Kind
- // 2: Padding
- // 4: TypeIndex
- // 8: Encoded Integer
- Refs.push_back({TiRefKind::TypeRef, Offset + 4, 1});
- return 8 + getEncodedIntegerLength(Data.drop_front(8));
-}
-
-static uint32_t handleEnumerator(ArrayRef<uint8_t> Data, uint32_t Offset,
- SmallVectorImpl<TiReference> &Refs) {
- // 0: Kind
- // 2: Padding
- // 4: Encoded Integer
- // <next>: Name
- uint32_t Size = 4 + getEncodedIntegerLength(Data.drop_front(4));
- return Size + getCStringLength(Data.drop_front(Size));
-}
-
-static uint32_t handleDataMember(ArrayRef<uint8_t> Data, uint32_t Offset,
- SmallVectorImpl<TiReference> &Refs) {
- // 0: Kind
- // 2: Padding
- // 4: TypeIndex
- // 8: Encoded Integer
- // <next>: Name
- Refs.push_back({TiRefKind::TypeRef, Offset + 4, 1});
- uint32_t Size = 8 + getEncodedIntegerLength(Data.drop_front(8));
- return Size + getCStringLength(Data.drop_front(Size));
-}
-
-static uint32_t handleOverloadedMethod(ArrayRef<uint8_t> Data, uint32_t Offset,
- SmallVectorImpl<TiReference> &Refs) {
- // 0: Kind
- // 2: Padding
- // 4: TypeIndex
- // 8: Name
- Refs.push_back({TiRefKind::TypeRef, Offset + 4, 1});
- return 8 + getCStringLength(Data.drop_front(8));
-}
-
-static uint32_t handleOneMethod(ArrayRef<uint8_t> Data, uint32_t Offset,
- SmallVectorImpl<TiReference> &Refs) {
- // 0: Kind
- // 2: Attributes
- // 4: Type
- // if (isIntroVirtual)
- // 8: VFTableOffset
- // <next>: Name
- uint32_t Size = 8;
- Refs.push_back({TiRefKind::TypeRef, Offset + 4, 1});
-
- uint16_t Attrs = support::endian::read16le(Data.drop_front(2).data());
- if (LLVM_UNLIKELY(isIntroVirtual(Attrs)))
- Size += 4;
-
- return Size + getCStringLength(Data.drop_front(Size));
-}
-
-static uint32_t handleNestedType(ArrayRef<uint8_t> Data, uint32_t Offset,
- SmallVectorImpl<TiReference> &Refs) {
- // 0: Kind
- // 2: Padding
- // 4: TypeIndex
- // 8: Name
- Refs.push_back({TiRefKind::TypeRef, Offset + 4, 1});
- return 8 + getCStringLength(Data.drop_front(8));
-}
-
-static uint32_t handleStaticDataMember(ArrayRef<uint8_t> Data, uint32_t Offset,
- SmallVectorImpl<TiReference> &Refs) {
- // 0: Kind
- // 2: Padding
- // 4: TypeIndex
- // 8: Name
- Refs.push_back({TiRefKind::TypeRef, Offset + 4, 1});
- return 8 + getCStringLength(Data.drop_front(8));
-}
-
-static uint32_t handleVirtualBaseClass(ArrayRef<uint8_t> Data, uint32_t Offset,
- bool IsIndirect,
- SmallVectorImpl<TiReference> &Refs) {
- // 0: Kind
- // 2: Attrs
- // 4: TypeIndex
- // 8: TypeIndex
- // 12: Encoded Integer
- // <next>: Encoded Integer
- uint32_t Size = 12;
- Refs.push_back({TiRefKind::TypeRef, Offset + 4, 2});
- Size += getEncodedIntegerLength(Data.drop_front(Size));
- Size += getEncodedIntegerLength(Data.drop_front(Size));
- return Size;
-}
-
-static uint32_t handleVFPtr(ArrayRef<uint8_t> Data, uint32_t Offset,
- SmallVectorImpl<TiReference> &Refs) {
- // 0: Kind
- // 2: Padding
- // 4: TypeIndex
- Refs.push_back({TiRefKind::TypeRef, Offset + 4, 1});
- return 8;
-}
-
-static uint32_t handleListContinuation(ArrayRef<uint8_t> Data, uint32_t Offset,
- SmallVectorImpl<TiReference> &Refs) {
- // 0: Kind
- // 2: Padding
- // 4: TypeIndex
- Refs.push_back({TiRefKind::TypeRef, Offset + 4, 1});
- return 8;
-}
-
-static void handleFieldList(ArrayRef<uint8_t> Content,
- SmallVectorImpl<TiReference> &Refs) {
- uint32_t Offset = 0;
- uint32_t ThisLen = 0;
- while (!Content.empty()) {
- TypeLeafKind Kind =
- static_cast<TypeLeafKind>(support::endian::read16le(Content.data()));
- switch (Kind) {
- case LF_BCLASS:
- ThisLen = handleBaseClass(Content, Offset, Refs);
- break;
- case LF_ENUMERATE:
- ThisLen = handleEnumerator(Content, Offset, Refs);
- break;
- case LF_MEMBER:
- ThisLen = handleDataMember(Content, Offset, Refs);
- break;
- case LF_METHOD:
- ThisLen = handleOverloadedMethod(Content, Offset, Refs);
- break;
- case LF_ONEMETHOD:
- ThisLen = handleOneMethod(Content, Offset, Refs);
- break;
- case LF_NESTTYPE:
- ThisLen = handleNestedType(Content, Offset, Refs);
- break;
- case LF_STMEMBER:
- ThisLen = handleStaticDataMember(Content, Offset, Refs);
- break;
- case LF_VBCLASS:
- case LF_IVBCLASS:
- ThisLen =
- handleVirtualBaseClass(Content, Offset, Kind == LF_VBCLASS, Refs);
- break;
- case LF_VFUNCTAB:
- ThisLen = handleVFPtr(Content, Offset, Refs);
- break;
- case LF_INDEX:
- ThisLen = handleListContinuation(Content, Offset, Refs);
- break;
- default:
- return;
- }
- Content = Content.drop_front(ThisLen);
- Offset += ThisLen;
- if (!Content.empty()) {
- uint8_t Pad = Content.front();
- if (Pad >= LF_PAD0) {
- uint32_t Skip = Pad & 0x0F;
- Content = Content.drop_front(Skip);
- Offset += Skip;
- }
- }
- }
-}
-
-static void handlePointer(ArrayRef<uint8_t> Content,
- SmallVectorImpl<TiReference> &Refs) {
- Refs.push_back({TiRefKind::TypeRef, 0, 1});
-
- uint32_t Attrs = support::endian::read32le(Content.drop_front(4).data());
- if (isMemberPointer(Attrs))
- Refs.push_back({TiRefKind::TypeRef, 8, 1});
-}
-
-static void discoverTypeIndices(ArrayRef<uint8_t> Content, TypeLeafKind Kind,
- SmallVectorImpl<TiReference> &Refs) {
- uint32_t Count;
- // FIXME: In the future it would be nice if we could avoid hardcoding these
- // values. One idea is to define some structures representing these types
- // that would allow the use of offsetof().
- switch (Kind) {
- case TypeLeafKind::LF_FUNC_ID:
- Refs.push_back({TiRefKind::IndexRef, 0, 1});
- Refs.push_back({TiRefKind::TypeRef, 4, 1});
- break;
- case TypeLeafKind::LF_MFUNC_ID:
- Refs.push_back({TiRefKind::TypeRef, 0, 2});
- break;
- case TypeLeafKind::LF_STRING_ID:
- Refs.push_back({TiRefKind::IndexRef, 0, 1});
- break;
- case TypeLeafKind::LF_SUBSTR_LIST:
- Count = support::endian::read32le(Content.data());
- if (Count > 0)
- Refs.push_back({TiRefKind::IndexRef, 4, Count});
- break;
- case TypeLeafKind::LF_BUILDINFO:
- Count = support::endian::read16le(Content.data());
- if (Count > 0)
- Refs.push_back({TiRefKind::IndexRef, 2, Count});
- break;
- case TypeLeafKind::LF_UDT_SRC_LINE:
- Refs.push_back({TiRefKind::TypeRef, 0, 1});
- Refs.push_back({TiRefKind::IndexRef, 4, 1});
- break;
- case TypeLeafKind::LF_UDT_MOD_SRC_LINE:
- Refs.push_back({TiRefKind::TypeRef, 0, 1});
- break;
- case TypeLeafKind::LF_MODIFIER:
- Refs.push_back({TiRefKind::TypeRef, 0, 1});
- break;
- case TypeLeafKind::LF_PROCEDURE:
- Refs.push_back({TiRefKind::TypeRef, 0, 1});
- Refs.push_back({TiRefKind::TypeRef, 8, 1});
- break;
- case TypeLeafKind::LF_MFUNCTION:
- Refs.push_back({TiRefKind::TypeRef, 0, 3});
- Refs.push_back({TiRefKind::TypeRef, 16, 1});
- break;
- case TypeLeafKind::LF_ARGLIST:
- Count = support::endian::read32le(Content.data());
- if (Count > 0)
- Refs.push_back({TiRefKind::TypeRef, 4, Count});
- break;
- case TypeLeafKind::LF_ARRAY:
- Refs.push_back({TiRefKind::TypeRef, 0, 2});
- break;
- case TypeLeafKind::LF_CLASS:
- case TypeLeafKind::LF_STRUCTURE:
- case TypeLeafKind::LF_INTERFACE:
- Refs.push_back({TiRefKind::TypeRef, 4, 3});
- break;
- case TypeLeafKind::LF_UNION:
- Refs.push_back({TiRefKind::TypeRef, 4, 1});
- break;
- case TypeLeafKind::LF_ENUM:
- Refs.push_back({TiRefKind::TypeRef, 4, 2});
- break;
- case TypeLeafKind::LF_BITFIELD:
- Refs.push_back({TiRefKind::TypeRef, 0, 1});
- break;
- case TypeLeafKind::LF_VFTABLE:
- Refs.push_back({TiRefKind::TypeRef, 0, 2});
- break;
- case TypeLeafKind::LF_VTSHAPE:
- break;
- case TypeLeafKind::LF_METHODLIST:
- handleMethodOverloadList(Content, Refs);
- break;
- case TypeLeafKind::LF_FIELDLIST:
- handleFieldList(Content, Refs);
- break;
- case TypeLeafKind::LF_POINTER:
- handlePointer(Content, Refs);
- break;
- default:
- break;
- }
-}
-
-static bool discoverTypeIndices(ArrayRef<uint8_t> Content, SymbolKind Kind,
- SmallVectorImpl<TiReference> &Refs) {
- uint32_t Count;
- // FIXME: In the future it would be nice if we could avoid hardcoding these
- // values. One idea is to define some structures representing these types
- // that would allow the use of offsetof().
- switch (Kind) {
- case SymbolKind::S_GPROC32_ID:
- case SymbolKind::S_LPROC32_ID:
- case SymbolKind::S_LPROC32_DPC:
- case SymbolKind::S_LPROC32_DPC_ID:
- Refs.push_back({TiRefKind::IndexRef, 24, 1}); // LF_FUNC_ID
- break;
- case SymbolKind::S_GPROC32:
- case SymbolKind::S_LPROC32:
- Refs.push_back({TiRefKind::TypeRef, 24, 1}); // Type
- break;
- case SymbolKind::S_UDT:
- Refs.push_back({TiRefKind::TypeRef, 0, 1}); // UDT
- break;
- case SymbolKind::S_GDATA32:
- case SymbolKind::S_LDATA32:
- Refs.push_back({TiRefKind::TypeRef, 0, 1}); // Type
- break;
- case SymbolKind::S_BUILDINFO:
- Refs.push_back({TiRefKind::IndexRef, 0, 1}); // Compile flags
- break;
- case SymbolKind::S_LTHREAD32:
- case SymbolKind::S_GTHREAD32:
- Refs.push_back({TiRefKind::TypeRef, 0, 1}); // Type
- break;
- case SymbolKind::S_FILESTATIC:
- Refs.push_back({TiRefKind::TypeRef, 0, 1}); // Type
- break;
- case SymbolKind::S_LOCAL:
- Refs.push_back({TiRefKind::TypeRef, 0, 1}); // Type
- break;
- case SymbolKind::S_REGISTER:
- Refs.push_back({TiRefKind::TypeRef, 0, 1}); // Type
- break;
- case SymbolKind::S_CONSTANT:
- Refs.push_back({TiRefKind::TypeRef, 0, 1}); // Type
- break;
- case SymbolKind::S_BPREL32:
- case SymbolKind::S_REGREL32:
- Refs.push_back({TiRefKind::TypeRef, 4, 1}); // Type
- break;
- case SymbolKind::S_CALLSITEINFO:
- Refs.push_back({TiRefKind::TypeRef, 8, 1}); // Call signature
- break;
- case SymbolKind::S_CALLERS:
- case SymbolKind::S_CALLEES:
- case SymbolKind::S_INLINEES:
- // The record is a count followed by an array of type indices.
- Count = *reinterpret_cast<const ulittle32_t *>(Content.data());
- Refs.push_back({TiRefKind::IndexRef, 4, Count}); // Callees
- break;
- case SymbolKind::S_INLINESITE:
- Refs.push_back({TiRefKind::IndexRef, 8, 1}); // ID of inlinee
- break;
- case SymbolKind::S_HEAPALLOCSITE:
- Refs.push_back({TiRefKind::TypeRef, 8, 1}); // UDT allocated
- break;
-
- // Defranges don't have types, just registers and code offsets.
- case SymbolKind::S_DEFRANGE_REGISTER:
- case SymbolKind::S_DEFRANGE_REGISTER_REL:
- case SymbolKind::S_DEFRANGE_FRAMEPOINTER_REL:
- case SymbolKind::S_DEFRANGE_FRAMEPOINTER_REL_FULL_SCOPE:
- case SymbolKind::S_DEFRANGE_SUBFIELD_REGISTER:
- case SymbolKind::S_DEFRANGE_SUBFIELD:
- break;
-
- // No type references.
- case SymbolKind::S_LABEL32:
- case SymbolKind::S_OBJNAME:
- case SymbolKind::S_COMPILE:
- case SymbolKind::S_COMPILE2:
- case SymbolKind::S_COMPILE3:
- case SymbolKind::S_ENVBLOCK:
- case SymbolKind::S_BLOCK32:
- case SymbolKind::S_FRAMEPROC:
- case SymbolKind::S_THUNK32:
- case SymbolKind::S_FRAMECOOKIE:
- case SymbolKind::S_UNAMESPACE:
- break;
- // Scope ending symbols.
- case SymbolKind::S_END:
- case SymbolKind::S_INLINESITE_END:
- case SymbolKind::S_PROC_ID_END:
- break;
- default:
- return false; // Unknown symbol.
- }
- return true;
-}
-
-void llvm::codeview::discoverTypeIndices(const CVType &Type,
- SmallVectorImpl<TiReference> &Refs) {
- ::discoverTypeIndices(Type.content(), Type.kind(), Refs);
-}
-
-static void resolveTypeIndexReferences(ArrayRef<uint8_t> RecordData,
- ArrayRef<TiReference> Refs,
- SmallVectorImpl<TypeIndex> &Indices) {
- Indices.clear();
-
- if (Refs.empty())
- return;
-
- RecordData = RecordData.drop_front(sizeof(RecordPrefix));
-
- BinaryStreamReader Reader(RecordData, support::little);
- for (const auto &Ref : Refs) {
- Reader.setOffset(Ref.Offset);
- FixedStreamArray<TypeIndex> Run;
- cantFail(Reader.readArray(Run, Ref.Count));
- Indices.append(Run.begin(), Run.end());
- }
-}
-
-void llvm::codeview::discoverTypeIndices(const CVType &Type,
- SmallVectorImpl<TypeIndex> &Indices) {
- return discoverTypeIndices(Type.RecordData, Indices);
-}
-
-void llvm::codeview::discoverTypeIndices(ArrayRef<uint8_t> RecordData,
- SmallVectorImpl<TypeIndex> &Indices) {
- SmallVector<TiReference, 4> Refs;
- discoverTypeIndices(RecordData, Refs);
- resolveTypeIndexReferences(RecordData, Refs, Indices);
-}
-
-void llvm::codeview::discoverTypeIndices(ArrayRef<uint8_t> RecordData,
- SmallVectorImpl<TiReference> &Refs) {
- const RecordPrefix *P =
- reinterpret_cast<const RecordPrefix *>(RecordData.data());
- TypeLeafKind K = static_cast<TypeLeafKind>(uint16_t(P->RecordKind));
- ::discoverTypeIndices(RecordData.drop_front(sizeof(RecordPrefix)), K, Refs);
-}
-
-bool llvm::codeview::discoverTypeIndicesInSymbol(
- const CVSymbol &Sym, SmallVectorImpl<TiReference> &Refs) {
- SymbolKind K = Sym.kind();
- return ::discoverTypeIndices(Sym.content(), K, Refs);
-}
-
-bool llvm::codeview::discoverTypeIndicesInSymbol(
- ArrayRef<uint8_t> RecordData, SmallVectorImpl<TiReference> &Refs) {
- const RecordPrefix *P =
- reinterpret_cast<const RecordPrefix *>(RecordData.data());
- SymbolKind K = static_cast<SymbolKind>(uint16_t(P->RecordKind));
- return ::discoverTypeIndices(RecordData.drop_front(sizeof(RecordPrefix)), K,
- Refs);
-}
-
-bool llvm::codeview::discoverTypeIndicesInSymbol(
- ArrayRef<uint8_t> RecordData, SmallVectorImpl<TypeIndex> &Indices) {
- SmallVector<TiReference, 2> Refs;
- if (!discoverTypeIndicesInSymbol(RecordData, Refs))
- return false;
- resolveTypeIndexReferences(RecordData, Refs, Indices);
- return true;
-}
+#include "llvm/ADT/ArrayRef.h"
+#include "llvm/Support/Endian.h"
+
+using namespace llvm;
+using namespace llvm::codeview;
+
+static inline MethodKind getMethodKind(uint16_t Attrs) {
+ Attrs &= uint16_t(MethodOptions::MethodKindMask);
+ Attrs >>= 2;
+ return MethodKind(Attrs);
+}
+
+static inline bool isIntroVirtual(uint16_t Attrs) {
+ MethodKind MK = getMethodKind(Attrs);
+ return MK == MethodKind::IntroducingVirtual ||
+ MK == MethodKind::PureIntroducingVirtual;
+}
+
+static inline PointerMode getPointerMode(uint32_t Attrs) {
+ return static_cast<PointerMode>((Attrs >> PointerRecord::PointerModeShift) &
+ PointerRecord::PointerModeMask);
+}
+
+static inline bool isMemberPointer(uint32_t Attrs) {
+ PointerMode Mode = getPointerMode(Attrs);
+ return Mode == PointerMode::PointerToDataMember ||
+ Mode == PointerMode::PointerToMemberFunction;
+}
+
+static inline uint32_t getEncodedIntegerLength(ArrayRef<uint8_t> Data) {
+ uint16_t N = support::endian::read16le(Data.data());
+ if (N < LF_NUMERIC)
+ return 2;
+
+ assert(N <= LF_UQUADWORD);
+
+ constexpr uint32_t Sizes[] = {
+ 1, // LF_CHAR
+ 2, // LF_SHORT
+ 2, // LF_USHORT
+ 4, // LF_LONG
+ 4, // LF_ULONG
+ 4, // LF_REAL32
+ 8, // LF_REAL64
+ 10, // LF_REAL80
+ 16, // LF_REAL128
+ 8, // LF_QUADWORD
+ 8, // LF_UQUADWORD
+ };
+
+ return 2 + Sizes[N - LF_NUMERIC];
+}
+
+static inline uint32_t getCStringLength(ArrayRef<uint8_t> Data) {
+ const char *S = reinterpret_cast<const char *>(Data.data());
+ return strlen(S) + 1;
+}
+
+static void handleMethodOverloadList(ArrayRef<uint8_t> Content,
+ SmallVectorImpl<TiReference> &Refs) {
+ uint32_t Offset = 0;
+
+ while (!Content.empty()) {
+ // Array of:
+ // 0: Attrs
+ // 2: Padding
+ // 4: TypeIndex
+ // if (isIntroVirtual())
+ // 8: VFTableOffset
+
+ // At least 8 bytes are guaranteed. 4 extra bytes come iff function is an
+ // intro virtual.
+ uint32_t Len = 8;
+
+ uint16_t Attrs = support::endian::read16le(Content.data());
+ Refs.push_back({TiRefKind::TypeRef, Offset + 4, 1});
+
+ if (LLVM_UNLIKELY(isIntroVirtual(Attrs)))
+ Len += 4;
+ Offset += Len;
+ Content = Content.drop_front(Len);
+ }
+}
+
+static uint32_t handleBaseClass(ArrayRef<uint8_t> Data, uint32_t Offset,
+ SmallVectorImpl<TiReference> &Refs) {
+ // 0: Kind
+ // 2: Padding
+ // 4: TypeIndex
+ // 8: Encoded Integer
+ Refs.push_back({TiRefKind::TypeRef, Offset + 4, 1});
+ return 8 + getEncodedIntegerLength(Data.drop_front(8));
+}
+
+static uint32_t handleEnumerator(ArrayRef<uint8_t> Data, uint32_t Offset,
+ SmallVectorImpl<TiReference> &Refs) {
+ // 0: Kind
+ // 2: Padding
+ // 4: Encoded Integer
+ // <next>: Name
+ uint32_t Size = 4 + getEncodedIntegerLength(Data.drop_front(4));
+ return Size + getCStringLength(Data.drop_front(Size));
+}
+
+static uint32_t handleDataMember(ArrayRef<uint8_t> Data, uint32_t Offset,
+ SmallVectorImpl<TiReference> &Refs) {
+ // 0: Kind
+ // 2: Padding
+ // 4: TypeIndex
+ // 8: Encoded Integer
+ // <next>: Name
+ Refs.push_back({TiRefKind::TypeRef, Offset + 4, 1});
+ uint32_t Size = 8 + getEncodedIntegerLength(Data.drop_front(8));
+ return Size + getCStringLength(Data.drop_front(Size));
+}
+
+static uint32_t handleOverloadedMethod(ArrayRef<uint8_t> Data, uint32_t Offset,
+ SmallVectorImpl<TiReference> &Refs) {
+ // 0: Kind
+ // 2: Padding
+ // 4: TypeIndex
+ // 8: Name
+ Refs.push_back({TiRefKind::TypeRef, Offset + 4, 1});
+ return 8 + getCStringLength(Data.drop_front(8));
+}
+
+static uint32_t handleOneMethod(ArrayRef<uint8_t> Data, uint32_t Offset,
+ SmallVectorImpl<TiReference> &Refs) {
+ // 0: Kind
+ // 2: Attributes
+ // 4: Type
+ // if (isIntroVirtual)
+ // 8: VFTableOffset
+ // <next>: Name
+ uint32_t Size = 8;
+ Refs.push_back({TiRefKind::TypeRef, Offset + 4, 1});
+
+ uint16_t Attrs = support::endian::read16le(Data.drop_front(2).data());
+ if (LLVM_UNLIKELY(isIntroVirtual(Attrs)))
+ Size += 4;
+
+ return Size + getCStringLength(Data.drop_front(Size));
+}
+
+static uint32_t handleNestedType(ArrayRef<uint8_t> Data, uint32_t Offset,
+ SmallVectorImpl<TiReference> &Refs) {
+ // 0: Kind
+ // 2: Padding
+ // 4: TypeIndex
+ // 8: Name
+ Refs.push_back({TiRefKind::TypeRef, Offset + 4, 1});
+ return 8 + getCStringLength(Data.drop_front(8));
+}
+
+static uint32_t handleStaticDataMember(ArrayRef<uint8_t> Data, uint32_t Offset,
+ SmallVectorImpl<TiReference> &Refs) {
+ // 0: Kind
+ // 2: Padding
+ // 4: TypeIndex
+ // 8: Name
+ Refs.push_back({TiRefKind::TypeRef, Offset + 4, 1});
+ return 8 + getCStringLength(Data.drop_front(8));
+}
+
+static uint32_t handleVirtualBaseClass(ArrayRef<uint8_t> Data, uint32_t Offset,
+ bool IsIndirect,
+ SmallVectorImpl<TiReference> &Refs) {
+ // 0: Kind
+ // 2: Attrs
+ // 4: TypeIndex
+ // 8: TypeIndex
+ // 12: Encoded Integer
+ // <next>: Encoded Integer
+ uint32_t Size = 12;
+ Refs.push_back({TiRefKind::TypeRef, Offset + 4, 2});
+ Size += getEncodedIntegerLength(Data.drop_front(Size));
+ Size += getEncodedIntegerLength(Data.drop_front(Size));
+ return Size;
+}
+
+static uint32_t handleVFPtr(ArrayRef<uint8_t> Data, uint32_t Offset,
+ SmallVectorImpl<TiReference> &Refs) {
+ // 0: Kind
+ // 2: Padding
+ // 4: TypeIndex
+ Refs.push_back({TiRefKind::TypeRef, Offset + 4, 1});
+ return 8;
+}
+
+static uint32_t handleListContinuation(ArrayRef<uint8_t> Data, uint32_t Offset,
+ SmallVectorImpl<TiReference> &Refs) {
+ // 0: Kind
+ // 2: Padding
+ // 4: TypeIndex
+ Refs.push_back({TiRefKind::TypeRef, Offset + 4, 1});
+ return 8;
+}
+
+static void handleFieldList(ArrayRef<uint8_t> Content,
+ SmallVectorImpl<TiReference> &Refs) {
+ uint32_t Offset = 0;
+ uint32_t ThisLen = 0;
+ while (!Content.empty()) {
+ TypeLeafKind Kind =
+ static_cast<TypeLeafKind>(support::endian::read16le(Content.data()));
+ switch (Kind) {
+ case LF_BCLASS:
+ ThisLen = handleBaseClass(Content, Offset, Refs);
+ break;
+ case LF_ENUMERATE:
+ ThisLen = handleEnumerator(Content, Offset, Refs);
+ break;
+ case LF_MEMBER:
+ ThisLen = handleDataMember(Content, Offset, Refs);
+ break;
+ case LF_METHOD:
+ ThisLen = handleOverloadedMethod(Content, Offset, Refs);
+ break;
+ case LF_ONEMETHOD:
+ ThisLen = handleOneMethod(Content, Offset, Refs);
+ break;
+ case LF_NESTTYPE:
+ ThisLen = handleNestedType(Content, Offset, Refs);
+ break;
+ case LF_STMEMBER:
+ ThisLen = handleStaticDataMember(Content, Offset, Refs);
+ break;
+ case LF_VBCLASS:
+ case LF_IVBCLASS:
+ ThisLen =
+ handleVirtualBaseClass(Content, Offset, Kind == LF_VBCLASS, Refs);
+ break;
+ case LF_VFUNCTAB:
+ ThisLen = handleVFPtr(Content, Offset, Refs);
+ break;
+ case LF_INDEX:
+ ThisLen = handleListContinuation(Content, Offset, Refs);
+ break;
+ default:
+ return;
+ }
+ Content = Content.drop_front(ThisLen);
+ Offset += ThisLen;
+ if (!Content.empty()) {
+ uint8_t Pad = Content.front();
+ if (Pad >= LF_PAD0) {
+ uint32_t Skip = Pad & 0x0F;
+ Content = Content.drop_front(Skip);
+ Offset += Skip;
+ }
+ }
+ }
+}
+
+static void handlePointer(ArrayRef<uint8_t> Content,
+ SmallVectorImpl<TiReference> &Refs) {
+ Refs.push_back({TiRefKind::TypeRef, 0, 1});
+
+ uint32_t Attrs = support::endian::read32le(Content.drop_front(4).data());
+ if (isMemberPointer(Attrs))
+ Refs.push_back({TiRefKind::TypeRef, 8, 1});
+}
+
+static void discoverTypeIndices(ArrayRef<uint8_t> Content, TypeLeafKind Kind,
+ SmallVectorImpl<TiReference> &Refs) {
+ uint32_t Count;
+ // FIXME: In the future it would be nice if we could avoid hardcoding these
+ // values. One idea is to define some structures representing these types
+ // that would allow the use of offsetof().
+ switch (Kind) {
+ case TypeLeafKind::LF_FUNC_ID:
+ Refs.push_back({TiRefKind::IndexRef, 0, 1});
+ Refs.push_back({TiRefKind::TypeRef, 4, 1});
+ break;
+ case TypeLeafKind::LF_MFUNC_ID:
+ Refs.push_back({TiRefKind::TypeRef, 0, 2});
+ break;
+ case TypeLeafKind::LF_STRING_ID:
+ Refs.push_back({TiRefKind::IndexRef, 0, 1});
+ break;
+ case TypeLeafKind::LF_SUBSTR_LIST:
+ Count = support::endian::read32le(Content.data());
+ if (Count > 0)
+ Refs.push_back({TiRefKind::IndexRef, 4, Count});
+ break;
+ case TypeLeafKind::LF_BUILDINFO:
+ Count = support::endian::read16le(Content.data());
+ if (Count > 0)
+ Refs.push_back({TiRefKind::IndexRef, 2, Count});
+ break;
+ case TypeLeafKind::LF_UDT_SRC_LINE:
+ Refs.push_back({TiRefKind::TypeRef, 0, 1});
+ Refs.push_back({TiRefKind::IndexRef, 4, 1});
+ break;
+ case TypeLeafKind::LF_UDT_MOD_SRC_LINE:
+ Refs.push_back({TiRefKind::TypeRef, 0, 1});
+ break;
+ case TypeLeafKind::LF_MODIFIER:
+ Refs.push_back({TiRefKind::TypeRef, 0, 1});
+ break;
+ case TypeLeafKind::LF_PROCEDURE:
+ Refs.push_back({TiRefKind::TypeRef, 0, 1});
+ Refs.push_back({TiRefKind::TypeRef, 8, 1});
+ break;
+ case TypeLeafKind::LF_MFUNCTION:
+ Refs.push_back({TiRefKind::TypeRef, 0, 3});
+ Refs.push_back({TiRefKind::TypeRef, 16, 1});
+ break;
+ case TypeLeafKind::LF_ARGLIST:
+ Count = support::endian::read32le(Content.data());
+ if (Count > 0)
+ Refs.push_back({TiRefKind::TypeRef, 4, Count});
+ break;
+ case TypeLeafKind::LF_ARRAY:
+ Refs.push_back({TiRefKind::TypeRef, 0, 2});
+ break;
+ case TypeLeafKind::LF_CLASS:
+ case TypeLeafKind::LF_STRUCTURE:
+ case TypeLeafKind::LF_INTERFACE:
+ Refs.push_back({TiRefKind::TypeRef, 4, 3});
+ break;
+ case TypeLeafKind::LF_UNION:
+ Refs.push_back({TiRefKind::TypeRef, 4, 1});
+ break;
+ case TypeLeafKind::LF_ENUM:
+ Refs.push_back({TiRefKind::TypeRef, 4, 2});
+ break;
+ case TypeLeafKind::LF_BITFIELD:
+ Refs.push_back({TiRefKind::TypeRef, 0, 1});
+ break;
+ case TypeLeafKind::LF_VFTABLE:
+ Refs.push_back({TiRefKind::TypeRef, 0, 2});
+ break;
+ case TypeLeafKind::LF_VTSHAPE:
+ break;
+ case TypeLeafKind::LF_METHODLIST:
+ handleMethodOverloadList(Content, Refs);
+ break;
+ case TypeLeafKind::LF_FIELDLIST:
+ handleFieldList(Content, Refs);
+ break;
+ case TypeLeafKind::LF_POINTER:
+ handlePointer(Content, Refs);
+ break;
+ default:
+ break;
+ }
+}
+
+static bool discoverTypeIndices(ArrayRef<uint8_t> Content, SymbolKind Kind,
+ SmallVectorImpl<TiReference> &Refs) {
+ uint32_t Count;
+ // FIXME: In the future it would be nice if we could avoid hardcoding these
+ // values. One idea is to define some structures representing these types
+ // that would allow the use of offsetof().
+ switch (Kind) {
+ case SymbolKind::S_GPROC32_ID:
+ case SymbolKind::S_LPROC32_ID:
+ case SymbolKind::S_LPROC32_DPC:
+ case SymbolKind::S_LPROC32_DPC_ID:
+ Refs.push_back({TiRefKind::IndexRef, 24, 1}); // LF_FUNC_ID
+ break;
+ case SymbolKind::S_GPROC32:
+ case SymbolKind::S_LPROC32:
+ Refs.push_back({TiRefKind::TypeRef, 24, 1}); // Type
+ break;
+ case SymbolKind::S_UDT:
+ Refs.push_back({TiRefKind::TypeRef, 0, 1}); // UDT
+ break;
+ case SymbolKind::S_GDATA32:
+ case SymbolKind::S_LDATA32:
+ Refs.push_back({TiRefKind::TypeRef, 0, 1}); // Type
+ break;
+ case SymbolKind::S_BUILDINFO:
+ Refs.push_back({TiRefKind::IndexRef, 0, 1}); // Compile flags
+ break;
+ case SymbolKind::S_LTHREAD32:
+ case SymbolKind::S_GTHREAD32:
+ Refs.push_back({TiRefKind::TypeRef, 0, 1}); // Type
+ break;
+ case SymbolKind::S_FILESTATIC:
+ Refs.push_back({TiRefKind::TypeRef, 0, 1}); // Type
+ break;
+ case SymbolKind::S_LOCAL:
+ Refs.push_back({TiRefKind::TypeRef, 0, 1}); // Type
+ break;
+ case SymbolKind::S_REGISTER:
+ Refs.push_back({TiRefKind::TypeRef, 0, 1}); // Type
+ break;
+ case SymbolKind::S_CONSTANT:
+ Refs.push_back({TiRefKind::TypeRef, 0, 1}); // Type
+ break;
+ case SymbolKind::S_BPREL32:
+ case SymbolKind::S_REGREL32:
+ Refs.push_back({TiRefKind::TypeRef, 4, 1}); // Type
+ break;
+ case SymbolKind::S_CALLSITEINFO:
+ Refs.push_back({TiRefKind::TypeRef, 8, 1}); // Call signature
+ break;
+ case SymbolKind::S_CALLERS:
+ case SymbolKind::S_CALLEES:
+ case SymbolKind::S_INLINEES:
+ // The record is a count followed by an array of type indices.
+ Count = *reinterpret_cast<const ulittle32_t *>(Content.data());
+ Refs.push_back({TiRefKind::IndexRef, 4, Count}); // Callees
+ break;
+ case SymbolKind::S_INLINESITE:
+ Refs.push_back({TiRefKind::IndexRef, 8, 1}); // ID of inlinee
+ break;
+ case SymbolKind::S_HEAPALLOCSITE:
+ Refs.push_back({TiRefKind::TypeRef, 8, 1}); // UDT allocated
+ break;
+
+ // Defranges don't have types, just registers and code offsets.
+ case SymbolKind::S_DEFRANGE_REGISTER:
+ case SymbolKind::S_DEFRANGE_REGISTER_REL:
+ case SymbolKind::S_DEFRANGE_FRAMEPOINTER_REL:
+ case SymbolKind::S_DEFRANGE_FRAMEPOINTER_REL_FULL_SCOPE:
+ case SymbolKind::S_DEFRANGE_SUBFIELD_REGISTER:
+ case SymbolKind::S_DEFRANGE_SUBFIELD:
+ break;
+
+ // No type references.
+ case SymbolKind::S_LABEL32:
+ case SymbolKind::S_OBJNAME:
+ case SymbolKind::S_COMPILE:
+ case SymbolKind::S_COMPILE2:
+ case SymbolKind::S_COMPILE3:
+ case SymbolKind::S_ENVBLOCK:
+ case SymbolKind::S_BLOCK32:
+ case SymbolKind::S_FRAMEPROC:
+ case SymbolKind::S_THUNK32:
+ case SymbolKind::S_FRAMECOOKIE:
+ case SymbolKind::S_UNAMESPACE:
+ break;
+ // Scope ending symbols.
+ case SymbolKind::S_END:
+ case SymbolKind::S_INLINESITE_END:
+ case SymbolKind::S_PROC_ID_END:
+ break;
+ default:
+ return false; // Unknown symbol.
+ }
+ return true;
+}
+
+void llvm::codeview::discoverTypeIndices(const CVType &Type,
+ SmallVectorImpl<TiReference> &Refs) {
+ ::discoverTypeIndices(Type.content(), Type.kind(), Refs);
+}
+
+static void resolveTypeIndexReferences(ArrayRef<uint8_t> RecordData,
+ ArrayRef<TiReference> Refs,
+ SmallVectorImpl<TypeIndex> &Indices) {
+ Indices.clear();
+
+ if (Refs.empty())
+ return;
+
+ RecordData = RecordData.drop_front(sizeof(RecordPrefix));
+
+ BinaryStreamReader Reader(RecordData, support::little);
+ for (const auto &Ref : Refs) {
+ Reader.setOffset(Ref.Offset);
+ FixedStreamArray<TypeIndex> Run;
+ cantFail(Reader.readArray(Run, Ref.Count));
+ Indices.append(Run.begin(), Run.end());
+ }
+}
+
+void llvm::codeview::discoverTypeIndices(const CVType &Type,
+ SmallVectorImpl<TypeIndex> &Indices) {
+ return discoverTypeIndices(Type.RecordData, Indices);
+}
+
+void llvm::codeview::discoverTypeIndices(ArrayRef<uint8_t> RecordData,
+ SmallVectorImpl<TypeIndex> &Indices) {
+ SmallVector<TiReference, 4> Refs;
+ discoverTypeIndices(RecordData, Refs);
+ resolveTypeIndexReferences(RecordData, Refs, Indices);
+}
+
+void llvm::codeview::discoverTypeIndices(ArrayRef<uint8_t> RecordData,
+ SmallVectorImpl<TiReference> &Refs) {
+ const RecordPrefix *P =
+ reinterpret_cast<const RecordPrefix *>(RecordData.data());
+ TypeLeafKind K = static_cast<TypeLeafKind>(uint16_t(P->RecordKind));
+ ::discoverTypeIndices(RecordData.drop_front(sizeof(RecordPrefix)), K, Refs);
+}
+
+bool llvm::codeview::discoverTypeIndicesInSymbol(
+ const CVSymbol &Sym, SmallVectorImpl<TiReference> &Refs) {
+ SymbolKind K = Sym.kind();
+ return ::discoverTypeIndices(Sym.content(), K, Refs);
+}
+
+bool llvm::codeview::discoverTypeIndicesInSymbol(
+ ArrayRef<uint8_t> RecordData, SmallVectorImpl<TiReference> &Refs) {
+ const RecordPrefix *P =
+ reinterpret_cast<const RecordPrefix *>(RecordData.data());
+ SymbolKind K = static_cast<SymbolKind>(uint16_t(P->RecordKind));
+ return ::discoverTypeIndices(RecordData.drop_front(sizeof(RecordPrefix)), K,
+ Refs);
+}
+
+bool llvm::codeview::discoverTypeIndicesInSymbol(
+ ArrayRef<uint8_t> RecordData, SmallVectorImpl<TypeIndex> &Indices) {
+ SmallVector<TiReference, 2> Refs;
+ if (!discoverTypeIndicesInSymbol(RecordData, Refs))
+ return false;
+ resolveTypeIndexReferences(RecordData, Refs, Indices);
+ return true;
+}
diff --git a/contrib/libs/llvm12/lib/DebugInfo/CodeView/TypeRecordHelpers.cpp b/contrib/libs/llvm12/lib/DebugInfo/CodeView/TypeRecordHelpers.cpp
index 2b6fc8a0fef..8e632f3be46 100644
--- a/contrib/libs/llvm12/lib/DebugInfo/CodeView/TypeRecordHelpers.cpp
+++ b/contrib/libs/llvm12/lib/DebugInfo/CodeView/TypeRecordHelpers.cpp
@@ -1,52 +1,52 @@
-//===- TypeRecordHelpers.cpp ------------------------------------*- C++ -*-===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-
-#include "llvm/DebugInfo/CodeView/TypeRecordHelpers.h"
-
-#include "llvm/ADT/SmallVector.h"
-#include "llvm/DebugInfo/CodeView/TypeIndexDiscovery.h"
-#include "llvm/DebugInfo/CodeView/TypeDeserializer.h"
-
-using namespace llvm;
-using namespace llvm::codeview;
-
-template <typename RecordT> static ClassOptions getUdtOptions(CVType CVT) {
- RecordT Record;
- if (auto EC = TypeDeserializer::deserializeAs<RecordT>(CVT, Record)) {
- consumeError(std::move(EC));
- return ClassOptions::None;
- }
- return Record.getOptions();
-}
-
-bool llvm::codeview::isUdtForwardRef(CVType CVT) {
- ClassOptions UdtOptions = ClassOptions::None;
- switch (CVT.kind()) {
- case LF_STRUCTURE:
- case LF_CLASS:
- case LF_INTERFACE:
- UdtOptions = getUdtOptions<ClassRecord>(std::move(CVT));
- break;
- case LF_ENUM:
- UdtOptions = getUdtOptions<EnumRecord>(std::move(CVT));
- break;
- case LF_UNION:
- UdtOptions = getUdtOptions<UnionRecord>(std::move(CVT));
- break;
- default:
- return false;
- }
- return (UdtOptions & ClassOptions::ForwardReference) != ClassOptions::None;
-}
-
-TypeIndex llvm::codeview::getModifiedType(const CVType &CVT) {
- assert(CVT.kind() == LF_MODIFIER);
- SmallVector<TypeIndex, 1> Refs;
- discoverTypeIndices(CVT, Refs);
- return Refs.front();
-}
+//===- TypeRecordHelpers.cpp ------------------------------------*- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "llvm/DebugInfo/CodeView/TypeRecordHelpers.h"
+
+#include "llvm/ADT/SmallVector.h"
+#include "llvm/DebugInfo/CodeView/TypeIndexDiscovery.h"
+#include "llvm/DebugInfo/CodeView/TypeDeserializer.h"
+
+using namespace llvm;
+using namespace llvm::codeview;
+
+template <typename RecordT> static ClassOptions getUdtOptions(CVType CVT) {
+ RecordT Record;
+ if (auto EC = TypeDeserializer::deserializeAs<RecordT>(CVT, Record)) {
+ consumeError(std::move(EC));
+ return ClassOptions::None;
+ }
+ return Record.getOptions();
+}
+
+bool llvm::codeview::isUdtForwardRef(CVType CVT) {
+ ClassOptions UdtOptions = ClassOptions::None;
+ switch (CVT.kind()) {
+ case LF_STRUCTURE:
+ case LF_CLASS:
+ case LF_INTERFACE:
+ UdtOptions = getUdtOptions<ClassRecord>(std::move(CVT));
+ break;
+ case LF_ENUM:
+ UdtOptions = getUdtOptions<EnumRecord>(std::move(CVT));
+ break;
+ case LF_UNION:
+ UdtOptions = getUdtOptions<UnionRecord>(std::move(CVT));
+ break;
+ default:
+ return false;
+ }
+ return (UdtOptions & ClassOptions::ForwardReference) != ClassOptions::None;
+}
+
+TypeIndex llvm::codeview::getModifiedType(const CVType &CVT) {
+ assert(CVT.kind() == LF_MODIFIER);
+ SmallVector<TypeIndex, 1> Refs;
+ discoverTypeIndices(CVT, Refs);
+ return Refs.front();
+}
diff --git a/contrib/libs/llvm12/lib/DebugInfo/CodeView/TypeRecordMapping.cpp b/contrib/libs/llvm12/lib/DebugInfo/CodeView/TypeRecordMapping.cpp
index 32a3f9719c2..7ac37615614 100644
--- a/contrib/libs/llvm12/lib/DebugInfo/CodeView/TypeRecordMapping.cpp
+++ b/contrib/libs/llvm12/lib/DebugInfo/CodeView/TypeRecordMapping.cpp
@@ -1,710 +1,710 @@
-//===- TypeRecordMapping.cpp ------------------------------------*- C++ -*-===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-
-#include "llvm/DebugInfo/CodeView/TypeRecordMapping.h"
-#include "llvm/ADT/StringExtras.h"
-#include "llvm/DebugInfo/CodeView/EnumTables.h"
-
-using namespace llvm;
-using namespace llvm::codeview;
-
-namespace {
-
-#define error(X) \
- if (auto EC = X) \
- return EC;
-
-static const EnumEntry<TypeLeafKind> LeafTypeNames[] = {
-#define CV_TYPE(enum, val) {#enum, enum},
-#include "llvm/DebugInfo/CodeView/CodeViewTypes.def"
-};
-
-static StringRef getLeafTypeName(TypeLeafKind LT) {
- switch (LT) {
-#define TYPE_RECORD(ename, value, name) \
- case ename: \
- return #name;
-#include "llvm/DebugInfo/CodeView/CodeViewTypes.def"
- default:
- break;
- }
- return "UnknownLeaf";
-}
-
-template <typename T>
-static bool compEnumNames(const EnumEntry<T> &lhs, const EnumEntry<T> &rhs) {
- return lhs.Name < rhs.Name;
-}
-
-template <typename T, typename TFlag>
-static std::string getFlagNames(CodeViewRecordIO &IO, T Value,
- ArrayRef<EnumEntry<TFlag>> Flags) {
- if (!IO.isStreaming())
- return std::string("");
- typedef EnumEntry<TFlag> FlagEntry;
- typedef SmallVector<FlagEntry, 10> FlagVector;
- FlagVector SetFlags;
- for (const auto &Flag : Flags) {
- if (Flag.Value == 0)
- continue;
- if ((Value & Flag.Value) == Flag.Value) {
- SetFlags.push_back(Flag);
- }
- }
-
- llvm::sort(SetFlags, &compEnumNames<TFlag>);
-
- std::string FlagLabel;
- bool FirstOcc = true;
- for (const auto &Flag : SetFlags) {
- if (FirstOcc)
- FirstOcc = false;
- else
- FlagLabel += (" | ");
-
- FlagLabel += (Flag.Name.str() + " (0x" + utohexstr(Flag.Value) + ")");
- }
-
- if (!FlagLabel.empty()) {
- std::string LabelWithBraces(" ( ");
- LabelWithBraces += FlagLabel + " )";
- return LabelWithBraces;
- } else
- return FlagLabel;
-}
-
-template <typename T, typename TEnum>
-static StringRef getEnumName(CodeViewRecordIO &IO, T Value,
- ArrayRef<EnumEntry<TEnum>> EnumValues) {
- if (!IO.isStreaming())
- return "";
- StringRef Name;
- for (const auto &EnumItem : EnumValues) {
- if (EnumItem.Value == Value) {
- Name = EnumItem.Name;
- break;
- }
- }
-
- return Name;
-}
-
-static std::string getMemberAttributes(CodeViewRecordIO &IO,
- MemberAccess Access, MethodKind Kind,
- MethodOptions Options) {
- if (!IO.isStreaming())
- return "";
- std::string AccessSpecifier = std::string(
- getEnumName(IO, uint8_t(Access), makeArrayRef(getMemberAccessNames())));
- std::string MemberAttrs(AccessSpecifier);
- if (Kind != MethodKind::Vanilla) {
- std::string MethodKind = std::string(
- getEnumName(IO, unsigned(Kind), makeArrayRef(getMemberKindNames())));
- MemberAttrs += ", " + MethodKind;
- }
- if (Options != MethodOptions::None) {
- std::string MethodOptions = getFlagNames(
- IO, unsigned(Options), makeArrayRef(getMethodOptionNames()));
- MemberAttrs += ", " + MethodOptions;
- }
- return MemberAttrs;
-}
-
-struct MapOneMethodRecord {
- explicit MapOneMethodRecord(bool IsFromOverloadList)
- : IsFromOverloadList(IsFromOverloadList) {}
-
- Error operator()(CodeViewRecordIO &IO, OneMethodRecord &Method) const {
- std::string Attrs = getMemberAttributes(
- IO, Method.getAccess(), Method.getMethodKind(), Method.getOptions());
- error(IO.mapInteger(Method.Attrs.Attrs, "Attrs: " + Attrs));
- if (IsFromOverloadList) {
- uint16_t Padding = 0;
- error(IO.mapInteger(Padding));
- }
- error(IO.mapInteger(Method.Type, "Type"));
- if (Method.isIntroducingVirtual()) {
- error(IO.mapInteger(Method.VFTableOffset, "VFTableOffset"));
- } else if (IO.isReading())
- Method.VFTableOffset = -1;
-
- if (!IsFromOverloadList)
- error(IO.mapStringZ(Method.Name, "Name"));
-
- return Error::success();
- }
-
-private:
- bool IsFromOverloadList;
-};
-} // namespace
-
-static Error mapNameAndUniqueName(CodeViewRecordIO &IO, StringRef &Name,
- StringRef &UniqueName, bool HasUniqueName) {
- if (IO.isWriting()) {
- // Try to be smart about what we write here. We can't write anything too
- // large, so if we're going to go over the limit, truncate both the name
- // and unique name by the same amount.
- size_t BytesLeft = IO.maxFieldLength();
- if (HasUniqueName) {
- size_t BytesNeeded = Name.size() + UniqueName.size() + 2;
- StringRef N = Name;
- StringRef U = UniqueName;
- if (BytesNeeded > BytesLeft) {
- size_t BytesToDrop = (BytesNeeded - BytesLeft);
- size_t DropN = std::min(N.size(), BytesToDrop / 2);
- size_t DropU = std::min(U.size(), BytesToDrop - DropN);
-
- N = N.drop_back(DropN);
- U = U.drop_back(DropU);
- }
-
- error(IO.mapStringZ(N));
- error(IO.mapStringZ(U));
- } else {
- // Cap the length of the string at however many bytes we have available,
- // plus one for the required null terminator.
- auto N = StringRef(Name).take_front(BytesLeft - 1);
- error(IO.mapStringZ(N));
- }
- } else {
- // Reading & Streaming mode come after writing mode is executed for each
- // record. Truncating large names are done during writing, so its not
- // necessary to do it while reading or streaming.
- error(IO.mapStringZ(Name, "Name"));
- if (HasUniqueName)
- error(IO.mapStringZ(UniqueName, "LinkageName"));
- }
-
- return Error::success();
-}
-
-Error TypeRecordMapping::visitTypeBegin(CVType &CVR) {
- assert(!TypeKind.hasValue() && "Already in a type mapping!");
- assert(!MemberKind.hasValue() && "Already in a member mapping!");
-
- // FieldList and MethodList records can be any length because they can be
- // split with continuation records. All other record types cannot be
- // longer than the maximum record length.
- Optional<uint32_t> MaxLen;
- if (CVR.kind() != TypeLeafKind::LF_FIELDLIST &&
- CVR.kind() != TypeLeafKind::LF_METHODLIST)
- MaxLen = MaxRecordLength - sizeof(RecordPrefix);
- error(IO.beginRecord(MaxLen));
- TypeKind = CVR.kind();
-
- if (IO.isStreaming()) {
- auto RecordKind = CVR.kind();
- uint16_t RecordLen = CVR.length() - 2;
- std::string RecordKindName = std::string(
- getEnumName(IO, unsigned(RecordKind), makeArrayRef(LeafTypeNames)));
- error(IO.mapInteger(RecordLen, "Record length"));
- error(IO.mapEnum(RecordKind, "Record kind: " + RecordKindName));
- }
- return Error::success();
-}
-
-Error TypeRecordMapping::visitTypeBegin(CVType &CVR, TypeIndex Index) {
- if (IO.isStreaming())
- IO.emitRawComment(" " + getLeafTypeName(CVR.kind()) + " (0x" +
- utohexstr(Index.getIndex()) + ")");
- return visitTypeBegin(CVR);
-}
-
-Error TypeRecordMapping::visitTypeEnd(CVType &Record) {
- assert(TypeKind.hasValue() && "Not in a type mapping!");
- assert(!MemberKind.hasValue() && "Still in a member mapping!");
-
- error(IO.endRecord());
-
- TypeKind.reset();
- return Error::success();
-}
-
-Error TypeRecordMapping::visitMemberBegin(CVMemberRecord &Record) {
- assert(TypeKind.hasValue() && "Not in a type mapping!");
- assert(!MemberKind.hasValue() && "Already in a member mapping!");
-
- // The largest possible subrecord is one in which there is a record prefix,
- // followed by the subrecord, followed by a continuation, and that entire
+//===- TypeRecordMapping.cpp ------------------------------------*- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "llvm/DebugInfo/CodeView/TypeRecordMapping.h"
+#include "llvm/ADT/StringExtras.h"
+#include "llvm/DebugInfo/CodeView/EnumTables.h"
+
+using namespace llvm;
+using namespace llvm::codeview;
+
+namespace {
+
+#define error(X) \
+ if (auto EC = X) \
+ return EC;
+
+static const EnumEntry<TypeLeafKind> LeafTypeNames[] = {
+#define CV_TYPE(enum, val) {#enum, enum},
+#include "llvm/DebugInfo/CodeView/CodeViewTypes.def"
+};
+
+static StringRef getLeafTypeName(TypeLeafKind LT) {
+ switch (LT) {
+#define TYPE_RECORD(ename, value, name) \
+ case ename: \
+ return #name;
+#include "llvm/DebugInfo/CodeView/CodeViewTypes.def"
+ default:
+ break;
+ }
+ return "UnknownLeaf";
+}
+
+template <typename T>
+static bool compEnumNames(const EnumEntry<T> &lhs, const EnumEntry<T> &rhs) {
+ return lhs.Name < rhs.Name;
+}
+
+template <typename T, typename TFlag>
+static std::string getFlagNames(CodeViewRecordIO &IO, T Value,
+ ArrayRef<EnumEntry<TFlag>> Flags) {
+ if (!IO.isStreaming())
+ return std::string("");
+ typedef EnumEntry<TFlag> FlagEntry;
+ typedef SmallVector<FlagEntry, 10> FlagVector;
+ FlagVector SetFlags;
+ for (const auto &Flag : Flags) {
+ if (Flag.Value == 0)
+ continue;
+ if ((Value & Flag.Value) == Flag.Value) {
+ SetFlags.push_back(Flag);
+ }
+ }
+
+ llvm::sort(SetFlags, &compEnumNames<TFlag>);
+
+ std::string FlagLabel;
+ bool FirstOcc = true;
+ for (const auto &Flag : SetFlags) {
+ if (FirstOcc)
+ FirstOcc = false;
+ else
+ FlagLabel += (" | ");
+
+ FlagLabel += (Flag.Name.str() + " (0x" + utohexstr(Flag.Value) + ")");
+ }
+
+ if (!FlagLabel.empty()) {
+ std::string LabelWithBraces(" ( ");
+ LabelWithBraces += FlagLabel + " )";
+ return LabelWithBraces;
+ } else
+ return FlagLabel;
+}
+
+template <typename T, typename TEnum>
+static StringRef getEnumName(CodeViewRecordIO &IO, T Value,
+ ArrayRef<EnumEntry<TEnum>> EnumValues) {
+ if (!IO.isStreaming())
+ return "";
+ StringRef Name;
+ for (const auto &EnumItem : EnumValues) {
+ if (EnumItem.Value == Value) {
+ Name = EnumItem.Name;
+ break;
+ }
+ }
+
+ return Name;
+}
+
+static std::string getMemberAttributes(CodeViewRecordIO &IO,
+ MemberAccess Access, MethodKind Kind,
+ MethodOptions Options) {
+ if (!IO.isStreaming())
+ return "";
+ std::string AccessSpecifier = std::string(
+ getEnumName(IO, uint8_t(Access), makeArrayRef(getMemberAccessNames())));
+ std::string MemberAttrs(AccessSpecifier);
+ if (Kind != MethodKind::Vanilla) {
+ std::string MethodKind = std::string(
+ getEnumName(IO, unsigned(Kind), makeArrayRef(getMemberKindNames())));
+ MemberAttrs += ", " + MethodKind;
+ }
+ if (Options != MethodOptions::None) {
+ std::string MethodOptions = getFlagNames(
+ IO, unsigned(Options), makeArrayRef(getMethodOptionNames()));
+ MemberAttrs += ", " + MethodOptions;
+ }
+ return MemberAttrs;
+}
+
+struct MapOneMethodRecord {
+ explicit MapOneMethodRecord(bool IsFromOverloadList)
+ : IsFromOverloadList(IsFromOverloadList) {}
+
+ Error operator()(CodeViewRecordIO &IO, OneMethodRecord &Method) const {
+ std::string Attrs = getMemberAttributes(
+ IO, Method.getAccess(), Method.getMethodKind(), Method.getOptions());
+ error(IO.mapInteger(Method.Attrs.Attrs, "Attrs: " + Attrs));
+ if (IsFromOverloadList) {
+ uint16_t Padding = 0;
+ error(IO.mapInteger(Padding));
+ }
+ error(IO.mapInteger(Method.Type, "Type"));
+ if (Method.isIntroducingVirtual()) {
+ error(IO.mapInteger(Method.VFTableOffset, "VFTableOffset"));
+ } else if (IO.isReading())
+ Method.VFTableOffset = -1;
+
+ if (!IsFromOverloadList)
+ error(IO.mapStringZ(Method.Name, "Name"));
+
+ return Error::success();
+ }
+
+private:
+ bool IsFromOverloadList;
+};
+} // namespace
+
+static Error mapNameAndUniqueName(CodeViewRecordIO &IO, StringRef &Name,
+ StringRef &UniqueName, bool HasUniqueName) {
+ if (IO.isWriting()) {
+ // Try to be smart about what we write here. We can't write anything too
+ // large, so if we're going to go over the limit, truncate both the name
+ // and unique name by the same amount.
+ size_t BytesLeft = IO.maxFieldLength();
+ if (HasUniqueName) {
+ size_t BytesNeeded = Name.size() + UniqueName.size() + 2;
+ StringRef N = Name;
+ StringRef U = UniqueName;
+ if (BytesNeeded > BytesLeft) {
+ size_t BytesToDrop = (BytesNeeded - BytesLeft);
+ size_t DropN = std::min(N.size(), BytesToDrop / 2);
+ size_t DropU = std::min(U.size(), BytesToDrop - DropN);
+
+ N = N.drop_back(DropN);
+ U = U.drop_back(DropU);
+ }
+
+ error(IO.mapStringZ(N));
+ error(IO.mapStringZ(U));
+ } else {
+ // Cap the length of the string at however many bytes we have available,
+ // plus one for the required null terminator.
+ auto N = StringRef(Name).take_front(BytesLeft - 1);
+ error(IO.mapStringZ(N));
+ }
+ } else {
+ // Reading & Streaming mode come after writing mode is executed for each
+ // record. Truncating large names are done during writing, so its not
+ // necessary to do it while reading or streaming.
+ error(IO.mapStringZ(Name, "Name"));
+ if (HasUniqueName)
+ error(IO.mapStringZ(UniqueName, "LinkageName"));
+ }
+
+ return Error::success();
+}
+
+Error TypeRecordMapping::visitTypeBegin(CVType &CVR) {
+ assert(!TypeKind.hasValue() && "Already in a type mapping!");
+ assert(!MemberKind.hasValue() && "Already in a member mapping!");
+
+ // FieldList and MethodList records can be any length because they can be
+ // split with continuation records. All other record types cannot be
+ // longer than the maximum record length.
+ Optional<uint32_t> MaxLen;
+ if (CVR.kind() != TypeLeafKind::LF_FIELDLIST &&
+ CVR.kind() != TypeLeafKind::LF_METHODLIST)
+ MaxLen = MaxRecordLength - sizeof(RecordPrefix);
+ error(IO.beginRecord(MaxLen));
+ TypeKind = CVR.kind();
+
+ if (IO.isStreaming()) {
+ auto RecordKind = CVR.kind();
+ uint16_t RecordLen = CVR.length() - 2;
+ std::string RecordKindName = std::string(
+ getEnumName(IO, unsigned(RecordKind), makeArrayRef(LeafTypeNames)));
+ error(IO.mapInteger(RecordLen, "Record length"));
+ error(IO.mapEnum(RecordKind, "Record kind: " + RecordKindName));
+ }
+ return Error::success();
+}
+
+Error TypeRecordMapping::visitTypeBegin(CVType &CVR, TypeIndex Index) {
+ if (IO.isStreaming())
+ IO.emitRawComment(" " + getLeafTypeName(CVR.kind()) + " (0x" +
+ utohexstr(Index.getIndex()) + ")");
+ return visitTypeBegin(CVR);
+}
+
+Error TypeRecordMapping::visitTypeEnd(CVType &Record) {
+ assert(TypeKind.hasValue() && "Not in a type mapping!");
+ assert(!MemberKind.hasValue() && "Still in a member mapping!");
+
+ error(IO.endRecord());
+
+ TypeKind.reset();
+ return Error::success();
+}
+
+Error TypeRecordMapping::visitMemberBegin(CVMemberRecord &Record) {
+ assert(TypeKind.hasValue() && "Not in a type mapping!");
+ assert(!MemberKind.hasValue() && "Already in a member mapping!");
+
+ // The largest possible subrecord is one in which there is a record prefix,
+ // followed by the subrecord, followed by a continuation, and that entire
// sequence spawns `MaxRecordLength` bytes. So the record's length is
- // calculated as follows.
-
- constexpr uint32_t ContinuationLength = 8;
- error(IO.beginRecord(MaxRecordLength - sizeof(RecordPrefix) -
- ContinuationLength));
-
- MemberKind = Record.Kind;
- if (IO.isStreaming()) {
- std::string MemberKindName = std::string(getLeafTypeName(Record.Kind));
- MemberKindName +=
- " ( " +
- (getEnumName(IO, unsigned(Record.Kind), makeArrayRef(LeafTypeNames)))
- .str() +
- " )";
- error(IO.mapEnum(Record.Kind, "Member kind: " + MemberKindName));
- }
- return Error::success();
-}
-
-Error TypeRecordMapping::visitMemberEnd(CVMemberRecord &Record) {
- assert(TypeKind.hasValue() && "Not in a type mapping!");
- assert(MemberKind.hasValue() && "Not in a member mapping!");
-
- if (IO.isReading()) {
- if (auto EC = IO.skipPadding())
- return EC;
- }
-
- MemberKind.reset();
- error(IO.endRecord());
- return Error::success();
-}
-
-Error TypeRecordMapping::visitKnownRecord(CVType &CVR, ModifierRecord &Record) {
- std::string ModifierNames =
- getFlagNames(IO, static_cast<uint16_t>(Record.Modifiers),
- makeArrayRef(getTypeModifierNames()));
- error(IO.mapInteger(Record.ModifiedType, "ModifiedType"));
- error(IO.mapEnum(Record.Modifiers, "Modifiers" + ModifierNames));
- return Error::success();
-}
-
-Error TypeRecordMapping::visitKnownRecord(CVType &CVR,
- ProcedureRecord &Record) {
- std::string CallingConvName = std::string(getEnumName(
- IO, uint8_t(Record.CallConv), makeArrayRef(getCallingConventions())));
- std::string FuncOptionNames =
- getFlagNames(IO, static_cast<uint16_t>(Record.Options),
- makeArrayRef(getFunctionOptionEnum()));
- error(IO.mapInteger(Record.ReturnType, "ReturnType"));
- error(IO.mapEnum(Record.CallConv, "CallingConvention: " + CallingConvName));
- error(IO.mapEnum(Record.Options, "FunctionOptions" + FuncOptionNames));
- error(IO.mapInteger(Record.ParameterCount, "NumParameters"));
- error(IO.mapInteger(Record.ArgumentList, "ArgListType"));
-
- return Error::success();
-}
-
-Error TypeRecordMapping::visitKnownRecord(CVType &CVR,
- MemberFunctionRecord &Record) {
- std::string CallingConvName = std::string(getEnumName(
- IO, uint8_t(Record.CallConv), makeArrayRef(getCallingConventions())));
- std::string FuncOptionNames =
- getFlagNames(IO, static_cast<uint16_t>(Record.Options),
- makeArrayRef(getFunctionOptionEnum()));
- error(IO.mapInteger(Record.ReturnType, "ReturnType"));
- error(IO.mapInteger(Record.ClassType, "ClassType"));
- error(IO.mapInteger(Record.ThisType, "ThisType"));
- error(IO.mapEnum(Record.CallConv, "CallingConvention: " + CallingConvName));
- error(IO.mapEnum(Record.Options, "FunctionOptions" + FuncOptionNames));
- error(IO.mapInteger(Record.ParameterCount, "NumParameters"));
- error(IO.mapInteger(Record.ArgumentList, "ArgListType"));
- error(IO.mapInteger(Record.ThisPointerAdjustment, "ThisAdjustment"));
-
- return Error::success();
-}
-
-Error TypeRecordMapping::visitKnownRecord(CVType &CVR, ArgListRecord &Record) {
- error(IO.mapVectorN<uint32_t>(
- Record.ArgIndices,
- [](CodeViewRecordIO &IO, TypeIndex &N) {
- return IO.mapInteger(N, "Argument");
- },
- "NumArgs"));
- return Error::success();
-}
-
-Error TypeRecordMapping::visitKnownRecord(CVType &CVR,
- StringListRecord &Record) {
- error(IO.mapVectorN<uint32_t>(
- Record.StringIndices,
- [](CodeViewRecordIO &IO, TypeIndex &N) {
- return IO.mapInteger(N, "Strings");
- },
- "NumStrings"));
-
- return Error::success();
-}
-
-Error TypeRecordMapping::visitKnownRecord(CVType &CVR, PointerRecord &Record) {
-
- SmallString<128> Attr("Attrs: ");
-
- if (IO.isStreaming()) {
- std::string PtrType =
- std::string(getEnumName(IO, unsigned(Record.getPointerKind()),
- makeArrayRef(getPtrKindNames())));
- Attr += "[ Type: " + PtrType;
-
- std::string PtrMode = std::string(getEnumName(
- IO, unsigned(Record.getMode()), makeArrayRef(getPtrModeNames())));
- Attr += ", Mode: " + PtrMode;
-
- auto PtrSizeOf = Record.getSize();
- Attr += ", SizeOf: " + itostr(PtrSizeOf);
-
- if (Record.isFlat())
- Attr += ", isFlat";
- if (Record.isConst())
- Attr += ", isConst";
- if (Record.isVolatile())
- Attr += ", isVolatile";
- if (Record.isUnaligned())
- Attr += ", isUnaligned";
- if (Record.isRestrict())
- Attr += ", isRestricted";
- if (Record.isLValueReferenceThisPtr())
- Attr += ", isThisPtr&";
- if (Record.isRValueReferenceThisPtr())
- Attr += ", isThisPtr&&";
- Attr += " ]";
- }
-
- error(IO.mapInteger(Record.ReferentType, "PointeeType"));
- error(IO.mapInteger(Record.Attrs, Attr));
-
- if (Record.isPointerToMember()) {
- if (IO.isReading())
- Record.MemberInfo.emplace();
-
- MemberPointerInfo &M = *Record.MemberInfo;
- error(IO.mapInteger(M.ContainingType, "ClassType"));
- std::string PtrMemberGetRepresentation = std::string(getEnumName(
- IO, uint16_t(M.Representation), makeArrayRef(getPtrMemberRepNames())));
- error(IO.mapEnum(M.Representation,
- "Representation: " + PtrMemberGetRepresentation));
- }
-
- return Error::success();
-}
-
-Error TypeRecordMapping::visitKnownRecord(CVType &CVR, ArrayRecord &Record) {
- error(IO.mapInteger(Record.ElementType, "ElementType"));
- error(IO.mapInteger(Record.IndexType, "IndexType"));
- error(IO.mapEncodedInteger(Record.Size, "SizeOf"));
- error(IO.mapStringZ(Record.Name, "Name"));
-
- return Error::success();
-}
-
-Error TypeRecordMapping::visitKnownRecord(CVType &CVR, ClassRecord &Record) {
- assert((CVR.kind() == TypeLeafKind::LF_STRUCTURE) ||
- (CVR.kind() == TypeLeafKind::LF_CLASS) ||
- (CVR.kind() == TypeLeafKind::LF_INTERFACE));
-
- std::string PropertiesNames =
- getFlagNames(IO, static_cast<uint16_t>(Record.Options),
- makeArrayRef(getClassOptionNames()));
- error(IO.mapInteger(Record.MemberCount, "MemberCount"));
- error(IO.mapEnum(Record.Options, "Properties" + PropertiesNames));
- error(IO.mapInteger(Record.FieldList, "FieldList"));
- error(IO.mapInteger(Record.DerivationList, "DerivedFrom"));
- error(IO.mapInteger(Record.VTableShape, "VShape"));
- error(IO.mapEncodedInteger(Record.Size, "SizeOf"));
- error(mapNameAndUniqueName(IO, Record.Name, Record.UniqueName,
- Record.hasUniqueName()));
-
- return Error::success();
-}
-
-Error TypeRecordMapping::visitKnownRecord(CVType &CVR, UnionRecord &Record) {
- std::string PropertiesNames =
- getFlagNames(IO, static_cast<uint16_t>(Record.Options),
- makeArrayRef(getClassOptionNames()));
- error(IO.mapInteger(Record.MemberCount, "MemberCount"));
- error(IO.mapEnum(Record.Options, "Properties" + PropertiesNames));
- error(IO.mapInteger(Record.FieldList, "FieldList"));
- error(IO.mapEncodedInteger(Record.Size, "SizeOf"));
- error(mapNameAndUniqueName(IO, Record.Name, Record.UniqueName,
- Record.hasUniqueName()));
-
- return Error::success();
-}
-
-Error TypeRecordMapping::visitKnownRecord(CVType &CVR, EnumRecord &Record) {
- std::string PropertiesNames =
- getFlagNames(IO, static_cast<uint16_t>(Record.Options),
- makeArrayRef(getClassOptionNames()));
- error(IO.mapInteger(Record.MemberCount, "NumEnumerators"));
- error(IO.mapEnum(Record.Options, "Properties" + PropertiesNames));
- error(IO.mapInteger(Record.UnderlyingType, "UnderlyingType"));
- error(IO.mapInteger(Record.FieldList, "FieldListType"));
- error(mapNameAndUniqueName(IO, Record.Name, Record.UniqueName,
- Record.hasUniqueName()));
-
- return Error::success();
-}
-
-Error TypeRecordMapping::visitKnownRecord(CVType &CVR, BitFieldRecord &Record) {
- error(IO.mapInteger(Record.Type, "Type"));
- error(IO.mapInteger(Record.BitSize, "BitSize"));
- error(IO.mapInteger(Record.BitOffset, "BitOffset"));
-
- return Error::success();
-}
-
-Error TypeRecordMapping::visitKnownRecord(CVType &CVR,
- VFTableShapeRecord &Record) {
- uint16_t Size;
- if (!IO.isReading()) {
- ArrayRef<VFTableSlotKind> Slots = Record.getSlots();
- Size = Slots.size();
- error(IO.mapInteger(Size, "VFEntryCount"));
-
- for (size_t SlotIndex = 0; SlotIndex < Slots.size(); SlotIndex += 2) {
- uint8_t Byte = static_cast<uint8_t>(Slots[SlotIndex]) << 4;
- if ((SlotIndex + 1) < Slots.size()) {
- Byte |= static_cast<uint8_t>(Slots[SlotIndex + 1]);
- }
- error(IO.mapInteger(Byte));
- }
- } else {
- error(IO.mapInteger(Size));
- for (uint16_t I = 0; I < Size; I += 2) {
- uint8_t Byte;
- error(IO.mapInteger(Byte));
- Record.Slots.push_back(static_cast<VFTableSlotKind>(Byte & 0xF));
- if ((I + 1) < Size)
- Record.Slots.push_back(static_cast<VFTableSlotKind>(Byte >> 4));
- }
- }
-
- return Error::success();
-}
-
-Error TypeRecordMapping::visitKnownRecord(CVType &CVR, VFTableRecord &Record) {
- error(IO.mapInteger(Record.CompleteClass, "CompleteClass"));
- error(IO.mapInteger(Record.OverriddenVFTable, "OverriddenVFTable"));
- error(IO.mapInteger(Record.VFPtrOffset, "VFPtrOffset"));
- uint32_t NamesLen = 0;
- if (!IO.isReading()) {
- for (auto Name : Record.MethodNames)
- NamesLen += Name.size() + 1;
- }
- error(IO.mapInteger(NamesLen));
- error(IO.mapVectorTail(
- Record.MethodNames,
- [](CodeViewRecordIO &IO, StringRef &S) {
- return IO.mapStringZ(S, "MethodName");
- },
- "VFTableName"));
-
- return Error::success();
-}
-
-Error TypeRecordMapping::visitKnownRecord(CVType &CVR, StringIdRecord &Record) {
- error(IO.mapInteger(Record.Id, "Id"));
- error(IO.mapStringZ(Record.String, "StringData"));
-
- return Error::success();
-}
-
-Error TypeRecordMapping::visitKnownRecord(CVType &CVR,
- UdtSourceLineRecord &Record) {
- error(IO.mapInteger(Record.UDT, "UDT"));
- error(IO.mapInteger(Record.SourceFile, "SourceFile"));
- error(IO.mapInteger(Record.LineNumber, "LineNumber"));
-
- return Error::success();
-}
-
-Error TypeRecordMapping::visitKnownRecord(CVType &CVR,
- UdtModSourceLineRecord &Record) {
- error(IO.mapInteger(Record.UDT, "UDT"));
- error(IO.mapInteger(Record.SourceFile, "SourceFile"));
- error(IO.mapInteger(Record.LineNumber, "LineNumber"));
- error(IO.mapInteger(Record.Module, "Module"));
-
- return Error::success();
-}
-
-Error TypeRecordMapping::visitKnownRecord(CVType &CVR, FuncIdRecord &Record) {
- error(IO.mapInteger(Record.ParentScope, "ParentScope"));
- error(IO.mapInteger(Record.FunctionType, "FunctionType"));
- error(IO.mapStringZ(Record.Name, "Name"));
-
- return Error::success();
-}
-
-Error TypeRecordMapping::visitKnownRecord(CVType &CVR,
- MemberFuncIdRecord &Record) {
- error(IO.mapInteger(Record.ClassType, "ClassType"));
- error(IO.mapInteger(Record.FunctionType, "FunctionType"));
- error(IO.mapStringZ(Record.Name, "Name"));
-
- return Error::success();
-}
-
-Error TypeRecordMapping::visitKnownRecord(CVType &CVR,
- BuildInfoRecord &Record) {
- error(IO.mapVectorN<uint16_t>(
- Record.ArgIndices,
- [](CodeViewRecordIO &IO, TypeIndex &N) {
- return IO.mapInteger(N, "Argument");
- },
- "NumArgs"));
-
- return Error::success();
-}
-
-Error TypeRecordMapping::visitKnownRecord(CVType &CVR,
- MethodOverloadListRecord &Record) {
- // TODO: Split the list into multiple records if it's longer than 64KB, using
- // a subrecord of TypeRecordKind::Index to chain the records together.
- error(IO.mapVectorTail(Record.Methods, MapOneMethodRecord(true), "Method"));
-
- return Error::success();
-}
-
-Error TypeRecordMapping::visitKnownRecord(CVType &CVR,
- FieldListRecord &Record) {
- if (IO.isStreaming()) {
- if (auto EC = codeview::visitMemberRecordStream(Record.Data, *this))
- return EC;
- } else
- error(IO.mapByteVectorTail(Record.Data));
-
- return Error::success();
-}
-
-Error TypeRecordMapping::visitKnownRecord(CVType &CVR,
- TypeServer2Record &Record) {
- error(IO.mapGuid(Record.Guid, "Guid"));
- error(IO.mapInteger(Record.Age, "Age"));
- error(IO.mapStringZ(Record.Name, "Name"));
- return Error::success();
-}
-
-Error TypeRecordMapping::visitKnownRecord(CVType &CVR, LabelRecord &Record) {
- std::string ModeName = std::string(
- getEnumName(IO, uint16_t(Record.Mode), makeArrayRef(getLabelTypeEnum())));
- error(IO.mapEnum(Record.Mode, "Mode: " + ModeName));
- return Error::success();
-}
-
-Error TypeRecordMapping::visitKnownMember(CVMemberRecord &CVR,
- BaseClassRecord &Record) {
- std::string Attrs = getMemberAttributes(
- IO, Record.getAccess(), MethodKind::Vanilla, MethodOptions::None);
- error(IO.mapInteger(Record.Attrs.Attrs, "Attrs: " + Attrs));
- error(IO.mapInteger(Record.Type, "BaseType"));
- error(IO.mapEncodedInteger(Record.Offset, "BaseOffset"));
-
- return Error::success();
-}
-
-Error TypeRecordMapping::visitKnownMember(CVMemberRecord &CVR,
- EnumeratorRecord &Record) {
- std::string Attrs = getMemberAttributes(
- IO, Record.getAccess(), MethodKind::Vanilla, MethodOptions::None);
- error(IO.mapInteger(Record.Attrs.Attrs, "Attrs: " + Attrs));
-
- // FIXME: Handle full APInt such as __int128.
- error(IO.mapEncodedInteger(Record.Value, "EnumValue"));
- error(IO.mapStringZ(Record.Name, "Name"));
-
- return Error::success();
-}
-
-Error TypeRecordMapping::visitKnownMember(CVMemberRecord &CVR,
- DataMemberRecord &Record) {
- std::string Attrs = getMemberAttributes(
- IO, Record.getAccess(), MethodKind::Vanilla, MethodOptions::None);
- error(IO.mapInteger(Record.Attrs.Attrs, "Attrs: " + Attrs));
- error(IO.mapInteger(Record.Type, "Type"));
- error(IO.mapEncodedInteger(Record.FieldOffset, "FieldOffset"));
- error(IO.mapStringZ(Record.Name, "Name"));
-
- return Error::success();
-}
-
-Error TypeRecordMapping::visitKnownMember(CVMemberRecord &CVR,
- OverloadedMethodRecord &Record) {
- error(IO.mapInteger(Record.NumOverloads, "MethodCount"));
- error(IO.mapInteger(Record.MethodList, "MethodListIndex"));
- error(IO.mapStringZ(Record.Name, "Name"));
-
- return Error::success();
-}
-
-Error TypeRecordMapping::visitKnownMember(CVMemberRecord &CVR,
- OneMethodRecord &Record) {
- const bool IsFromOverloadList = (TypeKind == LF_METHODLIST);
- MapOneMethodRecord Mapper(IsFromOverloadList);
- return Mapper(IO, Record);
-}
-
-Error TypeRecordMapping::visitKnownMember(CVMemberRecord &CVR,
- NestedTypeRecord &Record) {
- uint16_t Padding = 0;
- error(IO.mapInteger(Padding, "Padding"));
- error(IO.mapInteger(Record.Type, "Type"));
- error(IO.mapStringZ(Record.Name, "Name"));
-
- return Error::success();
-}
-
-Error TypeRecordMapping::visitKnownMember(CVMemberRecord &CVR,
- StaticDataMemberRecord &Record) {
-
- std::string Attrs = getMemberAttributes(
- IO, Record.getAccess(), MethodKind::Vanilla, MethodOptions::None);
- error(IO.mapInteger(Record.Attrs.Attrs, "Attrs: " + Attrs));
- error(IO.mapInteger(Record.Type, "Type"));
- error(IO.mapStringZ(Record.Name, "Name"));
-
- return Error::success();
-}
-
-Error TypeRecordMapping::visitKnownMember(CVMemberRecord &CVR,
- VirtualBaseClassRecord &Record) {
-
- std::string Attrs = getMemberAttributes(
- IO, Record.getAccess(), MethodKind::Vanilla, MethodOptions::None);
- error(IO.mapInteger(Record.Attrs.Attrs, "Attrs: " + Attrs));
- error(IO.mapInteger(Record.BaseType, "BaseType"));
- error(IO.mapInteger(Record.VBPtrType, "VBPtrType"));
- error(IO.mapEncodedInteger(Record.VBPtrOffset, "VBPtrOffset"));
- error(IO.mapEncodedInteger(Record.VTableIndex, "VBTableIndex"));
-
- return Error::success();
-}
-
-Error TypeRecordMapping::visitKnownMember(CVMemberRecord &CVR,
- VFPtrRecord &Record) {
- uint16_t Padding = 0;
- error(IO.mapInteger(Padding, "Padding"));
- error(IO.mapInteger(Record.Type, "Type"));
-
- return Error::success();
-}
-
-Error TypeRecordMapping::visitKnownMember(CVMemberRecord &CVR,
- ListContinuationRecord &Record) {
- uint16_t Padding = 0;
- error(IO.mapInteger(Padding, "Padding"));
- error(IO.mapInteger(Record.ContinuationIndex, "ContinuationIndex"));
-
- return Error::success();
-}
-
-Error TypeRecordMapping::visitKnownRecord(CVType &CVR,
- PrecompRecord &Precomp) {
- error(IO.mapInteger(Precomp.StartTypeIndex, "StartIndex"));
- error(IO.mapInteger(Precomp.TypesCount, "Count"));
- error(IO.mapInteger(Precomp.Signature, "Signature"));
- error(IO.mapStringZ(Precomp.PrecompFilePath, "PrecompFile"));
- return Error::success();
-}
-
-Error TypeRecordMapping::visitKnownRecord(CVType &CVR,
- EndPrecompRecord &EndPrecomp) {
- error(IO.mapInteger(EndPrecomp.Signature, "Signature"));
- return Error::success();
-}
+ // calculated as follows.
+
+ constexpr uint32_t ContinuationLength = 8;
+ error(IO.beginRecord(MaxRecordLength - sizeof(RecordPrefix) -
+ ContinuationLength));
+
+ MemberKind = Record.Kind;
+ if (IO.isStreaming()) {
+ std::string MemberKindName = std::string(getLeafTypeName(Record.Kind));
+ MemberKindName +=
+ " ( " +
+ (getEnumName(IO, unsigned(Record.Kind), makeArrayRef(LeafTypeNames)))
+ .str() +
+ " )";
+ error(IO.mapEnum(Record.Kind, "Member kind: " + MemberKindName));
+ }
+ return Error::success();
+}
+
+Error TypeRecordMapping::visitMemberEnd(CVMemberRecord &Record) {
+ assert(TypeKind.hasValue() && "Not in a type mapping!");
+ assert(MemberKind.hasValue() && "Not in a member mapping!");
+
+ if (IO.isReading()) {
+ if (auto EC = IO.skipPadding())
+ return EC;
+ }
+
+ MemberKind.reset();
+ error(IO.endRecord());
+ return Error::success();
+}
+
+Error TypeRecordMapping::visitKnownRecord(CVType &CVR, ModifierRecord &Record) {
+ std::string ModifierNames =
+ getFlagNames(IO, static_cast<uint16_t>(Record.Modifiers),
+ makeArrayRef(getTypeModifierNames()));
+ error(IO.mapInteger(Record.ModifiedType, "ModifiedType"));
+ error(IO.mapEnum(Record.Modifiers, "Modifiers" + ModifierNames));
+ return Error::success();
+}
+
+Error TypeRecordMapping::visitKnownRecord(CVType &CVR,
+ ProcedureRecord &Record) {
+ std::string CallingConvName = std::string(getEnumName(
+ IO, uint8_t(Record.CallConv), makeArrayRef(getCallingConventions())));
+ std::string FuncOptionNames =
+ getFlagNames(IO, static_cast<uint16_t>(Record.Options),
+ makeArrayRef(getFunctionOptionEnum()));
+ error(IO.mapInteger(Record.ReturnType, "ReturnType"));
+ error(IO.mapEnum(Record.CallConv, "CallingConvention: " + CallingConvName));
+ error(IO.mapEnum(Record.Options, "FunctionOptions" + FuncOptionNames));
+ error(IO.mapInteger(Record.ParameterCount, "NumParameters"));
+ error(IO.mapInteger(Record.ArgumentList, "ArgListType"));
+
+ return Error::success();
+}
+
+Error TypeRecordMapping::visitKnownRecord(CVType &CVR,
+ MemberFunctionRecord &Record) {
+ std::string CallingConvName = std::string(getEnumName(
+ IO, uint8_t(Record.CallConv), makeArrayRef(getCallingConventions())));
+ std::string FuncOptionNames =
+ getFlagNames(IO, static_cast<uint16_t>(Record.Options),
+ makeArrayRef(getFunctionOptionEnum()));
+ error(IO.mapInteger(Record.ReturnType, "ReturnType"));
+ error(IO.mapInteger(Record.ClassType, "ClassType"));
+ error(IO.mapInteger(Record.ThisType, "ThisType"));
+ error(IO.mapEnum(Record.CallConv, "CallingConvention: " + CallingConvName));
+ error(IO.mapEnum(Record.Options, "FunctionOptions" + FuncOptionNames));
+ error(IO.mapInteger(Record.ParameterCount, "NumParameters"));
+ error(IO.mapInteger(Record.ArgumentList, "ArgListType"));
+ error(IO.mapInteger(Record.ThisPointerAdjustment, "ThisAdjustment"));
+
+ return Error::success();
+}
+
+Error TypeRecordMapping::visitKnownRecord(CVType &CVR, ArgListRecord &Record) {
+ error(IO.mapVectorN<uint32_t>(
+ Record.ArgIndices,
+ [](CodeViewRecordIO &IO, TypeIndex &N) {
+ return IO.mapInteger(N, "Argument");
+ },
+ "NumArgs"));
+ return Error::success();
+}
+
+Error TypeRecordMapping::visitKnownRecord(CVType &CVR,
+ StringListRecord &Record) {
+ error(IO.mapVectorN<uint32_t>(
+ Record.StringIndices,
+ [](CodeViewRecordIO &IO, TypeIndex &N) {
+ return IO.mapInteger(N, "Strings");
+ },
+ "NumStrings"));
+
+ return Error::success();
+}
+
+Error TypeRecordMapping::visitKnownRecord(CVType &CVR, PointerRecord &Record) {
+
+ SmallString<128> Attr("Attrs: ");
+
+ if (IO.isStreaming()) {
+ std::string PtrType =
+ std::string(getEnumName(IO, unsigned(Record.getPointerKind()),
+ makeArrayRef(getPtrKindNames())));
+ Attr += "[ Type: " + PtrType;
+
+ std::string PtrMode = std::string(getEnumName(
+ IO, unsigned(Record.getMode()), makeArrayRef(getPtrModeNames())));
+ Attr += ", Mode: " + PtrMode;
+
+ auto PtrSizeOf = Record.getSize();
+ Attr += ", SizeOf: " + itostr(PtrSizeOf);
+
+ if (Record.isFlat())
+ Attr += ", isFlat";
+ if (Record.isConst())
+ Attr += ", isConst";
+ if (Record.isVolatile())
+ Attr += ", isVolatile";
+ if (Record.isUnaligned())
+ Attr += ", isUnaligned";
+ if (Record.isRestrict())
+ Attr += ", isRestricted";
+ if (Record.isLValueReferenceThisPtr())
+ Attr += ", isThisPtr&";
+ if (Record.isRValueReferenceThisPtr())
+ Attr += ", isThisPtr&&";
+ Attr += " ]";
+ }
+
+ error(IO.mapInteger(Record.ReferentType, "PointeeType"));
+ error(IO.mapInteger(Record.Attrs, Attr));
+
+ if (Record.isPointerToMember()) {
+ if (IO.isReading())
+ Record.MemberInfo.emplace();
+
+ MemberPointerInfo &M = *Record.MemberInfo;
+ error(IO.mapInteger(M.ContainingType, "ClassType"));
+ std::string PtrMemberGetRepresentation = std::string(getEnumName(
+ IO, uint16_t(M.Representation), makeArrayRef(getPtrMemberRepNames())));
+ error(IO.mapEnum(M.Representation,
+ "Representation: " + PtrMemberGetRepresentation));
+ }
+
+ return Error::success();
+}
+
+Error TypeRecordMapping::visitKnownRecord(CVType &CVR, ArrayRecord &Record) {
+ error(IO.mapInteger(Record.ElementType, "ElementType"));
+ error(IO.mapInteger(Record.IndexType, "IndexType"));
+ error(IO.mapEncodedInteger(Record.Size, "SizeOf"));
+ error(IO.mapStringZ(Record.Name, "Name"));
+
+ return Error::success();
+}
+
+Error TypeRecordMapping::visitKnownRecord(CVType &CVR, ClassRecord &Record) {
+ assert((CVR.kind() == TypeLeafKind::LF_STRUCTURE) ||
+ (CVR.kind() == TypeLeafKind::LF_CLASS) ||
+ (CVR.kind() == TypeLeafKind::LF_INTERFACE));
+
+ std::string PropertiesNames =
+ getFlagNames(IO, static_cast<uint16_t>(Record.Options),
+ makeArrayRef(getClassOptionNames()));
+ error(IO.mapInteger(Record.MemberCount, "MemberCount"));
+ error(IO.mapEnum(Record.Options, "Properties" + PropertiesNames));
+ error(IO.mapInteger(Record.FieldList, "FieldList"));
+ error(IO.mapInteger(Record.DerivationList, "DerivedFrom"));
+ error(IO.mapInteger(Record.VTableShape, "VShape"));
+ error(IO.mapEncodedInteger(Record.Size, "SizeOf"));
+ error(mapNameAndUniqueName(IO, Record.Name, Record.UniqueName,
+ Record.hasUniqueName()));
+
+ return Error::success();
+}
+
+Error TypeRecordMapping::visitKnownRecord(CVType &CVR, UnionRecord &Record) {
+ std::string PropertiesNames =
+ getFlagNames(IO, static_cast<uint16_t>(Record.Options),
+ makeArrayRef(getClassOptionNames()));
+ error(IO.mapInteger(Record.MemberCount, "MemberCount"));
+ error(IO.mapEnum(Record.Options, "Properties" + PropertiesNames));
+ error(IO.mapInteger(Record.FieldList, "FieldList"));
+ error(IO.mapEncodedInteger(Record.Size, "SizeOf"));
+ error(mapNameAndUniqueName(IO, Record.Name, Record.UniqueName,
+ Record.hasUniqueName()));
+
+ return Error::success();
+}
+
+Error TypeRecordMapping::visitKnownRecord(CVType &CVR, EnumRecord &Record) {
+ std::string PropertiesNames =
+ getFlagNames(IO, static_cast<uint16_t>(Record.Options),
+ makeArrayRef(getClassOptionNames()));
+ error(IO.mapInteger(Record.MemberCount, "NumEnumerators"));
+ error(IO.mapEnum(Record.Options, "Properties" + PropertiesNames));
+ error(IO.mapInteger(Record.UnderlyingType, "UnderlyingType"));
+ error(IO.mapInteger(Record.FieldList, "FieldListType"));
+ error(mapNameAndUniqueName(IO, Record.Name, Record.UniqueName,
+ Record.hasUniqueName()));
+
+ return Error::success();
+}
+
+Error TypeRecordMapping::visitKnownRecord(CVType &CVR, BitFieldRecord &Record) {
+ error(IO.mapInteger(Record.Type, "Type"));
+ error(IO.mapInteger(Record.BitSize, "BitSize"));
+ error(IO.mapInteger(Record.BitOffset, "BitOffset"));
+
+ return Error::success();
+}
+
+Error TypeRecordMapping::visitKnownRecord(CVType &CVR,
+ VFTableShapeRecord &Record) {
+ uint16_t Size;
+ if (!IO.isReading()) {
+ ArrayRef<VFTableSlotKind> Slots = Record.getSlots();
+ Size = Slots.size();
+ error(IO.mapInteger(Size, "VFEntryCount"));
+
+ for (size_t SlotIndex = 0; SlotIndex < Slots.size(); SlotIndex += 2) {
+ uint8_t Byte = static_cast<uint8_t>(Slots[SlotIndex]) << 4;
+ if ((SlotIndex + 1) < Slots.size()) {
+ Byte |= static_cast<uint8_t>(Slots[SlotIndex + 1]);
+ }
+ error(IO.mapInteger(Byte));
+ }
+ } else {
+ error(IO.mapInteger(Size));
+ for (uint16_t I = 0; I < Size; I += 2) {
+ uint8_t Byte;
+ error(IO.mapInteger(Byte));
+ Record.Slots.push_back(static_cast<VFTableSlotKind>(Byte & 0xF));
+ if ((I + 1) < Size)
+ Record.Slots.push_back(static_cast<VFTableSlotKind>(Byte >> 4));
+ }
+ }
+
+ return Error::success();
+}
+
+Error TypeRecordMapping::visitKnownRecord(CVType &CVR, VFTableRecord &Record) {
+ error(IO.mapInteger(Record.CompleteClass, "CompleteClass"));
+ error(IO.mapInteger(Record.OverriddenVFTable, "OverriddenVFTable"));
+ error(IO.mapInteger(Record.VFPtrOffset, "VFPtrOffset"));
+ uint32_t NamesLen = 0;
+ if (!IO.isReading()) {
+ for (auto Name : Record.MethodNames)
+ NamesLen += Name.size() + 1;
+ }
+ error(IO.mapInteger(NamesLen));
+ error(IO.mapVectorTail(
+ Record.MethodNames,
+ [](CodeViewRecordIO &IO, StringRef &S) {
+ return IO.mapStringZ(S, "MethodName");
+ },
+ "VFTableName"));
+
+ return Error::success();
+}
+
+Error TypeRecordMapping::visitKnownRecord(CVType &CVR, StringIdRecord &Record) {
+ error(IO.mapInteger(Record.Id, "Id"));
+ error(IO.mapStringZ(Record.String, "StringData"));
+
+ return Error::success();
+}
+
+Error TypeRecordMapping::visitKnownRecord(CVType &CVR,
+ UdtSourceLineRecord &Record) {
+ error(IO.mapInteger(Record.UDT, "UDT"));
+ error(IO.mapInteger(Record.SourceFile, "SourceFile"));
+ error(IO.mapInteger(Record.LineNumber, "LineNumber"));
+
+ return Error::success();
+}
+
+Error TypeRecordMapping::visitKnownRecord(CVType &CVR,
+ UdtModSourceLineRecord &Record) {
+ error(IO.mapInteger(Record.UDT, "UDT"));
+ error(IO.mapInteger(Record.SourceFile, "SourceFile"));
+ error(IO.mapInteger(Record.LineNumber, "LineNumber"));
+ error(IO.mapInteger(Record.Module, "Module"));
+
+ return Error::success();
+}
+
+Error TypeRecordMapping::visitKnownRecord(CVType &CVR, FuncIdRecord &Record) {
+ error(IO.mapInteger(Record.ParentScope, "ParentScope"));
+ error(IO.mapInteger(Record.FunctionType, "FunctionType"));
+ error(IO.mapStringZ(Record.Name, "Name"));
+
+ return Error::success();
+}
+
+Error TypeRecordMapping::visitKnownRecord(CVType &CVR,
+ MemberFuncIdRecord &Record) {
+ error(IO.mapInteger(Record.ClassType, "ClassType"));
+ error(IO.mapInteger(Record.FunctionType, "FunctionType"));
+ error(IO.mapStringZ(Record.Name, "Name"));
+
+ return Error::success();
+}
+
+Error TypeRecordMapping::visitKnownRecord(CVType &CVR,
+ BuildInfoRecord &Record) {
+ error(IO.mapVectorN<uint16_t>(
+ Record.ArgIndices,
+ [](CodeViewRecordIO &IO, TypeIndex &N) {
+ return IO.mapInteger(N, "Argument");
+ },
+ "NumArgs"));
+
+ return Error::success();
+}
+
+Error TypeRecordMapping::visitKnownRecord(CVType &CVR,
+ MethodOverloadListRecord &Record) {
+ // TODO: Split the list into multiple records if it's longer than 64KB, using
+ // a subrecord of TypeRecordKind::Index to chain the records together.
+ error(IO.mapVectorTail(Record.Methods, MapOneMethodRecord(true), "Method"));
+
+ return Error::success();
+}
+
+Error TypeRecordMapping::visitKnownRecord(CVType &CVR,
+ FieldListRecord &Record) {
+ if (IO.isStreaming()) {
+ if (auto EC = codeview::visitMemberRecordStream(Record.Data, *this))
+ return EC;
+ } else
+ error(IO.mapByteVectorTail(Record.Data));
+
+ return Error::success();
+}
+
+Error TypeRecordMapping::visitKnownRecord(CVType &CVR,
+ TypeServer2Record &Record) {
+ error(IO.mapGuid(Record.Guid, "Guid"));
+ error(IO.mapInteger(Record.Age, "Age"));
+ error(IO.mapStringZ(Record.Name, "Name"));
+ return Error::success();
+}
+
+Error TypeRecordMapping::visitKnownRecord(CVType &CVR, LabelRecord &Record) {
+ std::string ModeName = std::string(
+ getEnumName(IO, uint16_t(Record.Mode), makeArrayRef(getLabelTypeEnum())));
+ error(IO.mapEnum(Record.Mode, "Mode: " + ModeName));
+ return Error::success();
+}
+
+Error TypeRecordMapping::visitKnownMember(CVMemberRecord &CVR,
+ BaseClassRecord &Record) {
+ std::string Attrs = getMemberAttributes(
+ IO, Record.getAccess(), MethodKind::Vanilla, MethodOptions::None);
+ error(IO.mapInteger(Record.Attrs.Attrs, "Attrs: " + Attrs));
+ error(IO.mapInteger(Record.Type, "BaseType"));
+ error(IO.mapEncodedInteger(Record.Offset, "BaseOffset"));
+
+ return Error::success();
+}
+
+Error TypeRecordMapping::visitKnownMember(CVMemberRecord &CVR,
+ EnumeratorRecord &Record) {
+ std::string Attrs = getMemberAttributes(
+ IO, Record.getAccess(), MethodKind::Vanilla, MethodOptions::None);
+ error(IO.mapInteger(Record.Attrs.Attrs, "Attrs: " + Attrs));
+
+ // FIXME: Handle full APInt such as __int128.
+ error(IO.mapEncodedInteger(Record.Value, "EnumValue"));
+ error(IO.mapStringZ(Record.Name, "Name"));
+
+ return Error::success();
+}
+
+Error TypeRecordMapping::visitKnownMember(CVMemberRecord &CVR,
+ DataMemberRecord &Record) {
+ std::string Attrs = getMemberAttributes(
+ IO, Record.getAccess(), MethodKind::Vanilla, MethodOptions::None);
+ error(IO.mapInteger(Record.Attrs.Attrs, "Attrs: " + Attrs));
+ error(IO.mapInteger(Record.Type, "Type"));
+ error(IO.mapEncodedInteger(Record.FieldOffset, "FieldOffset"));
+ error(IO.mapStringZ(Record.Name, "Name"));
+
+ return Error::success();
+}
+
+Error TypeRecordMapping::visitKnownMember(CVMemberRecord &CVR,
+ OverloadedMethodRecord &Record) {
+ error(IO.mapInteger(Record.NumOverloads, "MethodCount"));
+ error(IO.mapInteger(Record.MethodList, "MethodListIndex"));
+ error(IO.mapStringZ(Record.Name, "Name"));
+
+ return Error::success();
+}
+
+Error TypeRecordMapping::visitKnownMember(CVMemberRecord &CVR,
+ OneMethodRecord &Record) {
+ const bool IsFromOverloadList = (TypeKind == LF_METHODLIST);
+ MapOneMethodRecord Mapper(IsFromOverloadList);
+ return Mapper(IO, Record);
+}
+
+Error TypeRecordMapping::visitKnownMember(CVMemberRecord &CVR,
+ NestedTypeRecord &Record) {
+ uint16_t Padding = 0;
+ error(IO.mapInteger(Padding, "Padding"));
+ error(IO.mapInteger(Record.Type, "Type"));
+ error(IO.mapStringZ(Record.Name, "Name"));
+
+ return Error::success();
+}
+
+Error TypeRecordMapping::visitKnownMember(CVMemberRecord &CVR,
+ StaticDataMemberRecord &Record) {
+
+ std::string Attrs = getMemberAttributes(
+ IO, Record.getAccess(), MethodKind::Vanilla, MethodOptions::None);
+ error(IO.mapInteger(Record.Attrs.Attrs, "Attrs: " + Attrs));
+ error(IO.mapInteger(Record.Type, "Type"));
+ error(IO.mapStringZ(Record.Name, "Name"));
+
+ return Error::success();
+}
+
+Error TypeRecordMapping::visitKnownMember(CVMemberRecord &CVR,
+ VirtualBaseClassRecord &Record) {
+
+ std::string Attrs = getMemberAttributes(
+ IO, Record.getAccess(), MethodKind::Vanilla, MethodOptions::None);
+ error(IO.mapInteger(Record.Attrs.Attrs, "Attrs: " + Attrs));
+ error(IO.mapInteger(Record.BaseType, "BaseType"));
+ error(IO.mapInteger(Record.VBPtrType, "VBPtrType"));
+ error(IO.mapEncodedInteger(Record.VBPtrOffset, "VBPtrOffset"));
+ error(IO.mapEncodedInteger(Record.VTableIndex, "VBTableIndex"));
+
+ return Error::success();
+}
+
+Error TypeRecordMapping::visitKnownMember(CVMemberRecord &CVR,
+ VFPtrRecord &Record) {
+ uint16_t Padding = 0;
+ error(IO.mapInteger(Padding, "Padding"));
+ error(IO.mapInteger(Record.Type, "Type"));
+
+ return Error::success();
+}
+
+Error TypeRecordMapping::visitKnownMember(CVMemberRecord &CVR,
+ ListContinuationRecord &Record) {
+ uint16_t Padding = 0;
+ error(IO.mapInteger(Padding, "Padding"));
+ error(IO.mapInteger(Record.ContinuationIndex, "ContinuationIndex"));
+
+ return Error::success();
+}
+
+Error TypeRecordMapping::visitKnownRecord(CVType &CVR,
+ PrecompRecord &Precomp) {
+ error(IO.mapInteger(Precomp.StartTypeIndex, "StartIndex"));
+ error(IO.mapInteger(Precomp.TypesCount, "Count"));
+ error(IO.mapInteger(Precomp.Signature, "Signature"));
+ error(IO.mapStringZ(Precomp.PrecompFilePath, "PrecompFile"));
+ return Error::success();
+}
+
+Error TypeRecordMapping::visitKnownRecord(CVType &CVR,
+ EndPrecompRecord &EndPrecomp) {
+ error(IO.mapInteger(EndPrecomp.Signature, "Signature"));
+ return Error::success();
+}
diff --git a/contrib/libs/llvm12/lib/DebugInfo/CodeView/TypeStreamMerger.cpp b/contrib/libs/llvm12/lib/DebugInfo/CodeView/TypeStreamMerger.cpp
index f08fbb1df2a..587a68142a4 100644
--- a/contrib/libs/llvm12/lib/DebugInfo/CodeView/TypeStreamMerger.cpp
+++ b/contrib/libs/llvm12/lib/DebugInfo/CodeView/TypeStreamMerger.cpp
@@ -1,496 +1,496 @@
-//===-- TypeStreamMerger.cpp ------------------------------------*- C++ -*-===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-
-#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/TypeDeserializer.h"
-#include "llvm/DebugInfo/CodeView/TypeIndex.h"
-#include "llvm/DebugInfo/CodeView/TypeIndexDiscovery.h"
-#include "llvm/DebugInfo/CodeView/TypeRecord.h"
-#include "llvm/DebugInfo/CodeView/TypeRecordHelpers.h"
-#include "llvm/Support/Error.h"
-
-using namespace llvm;
-using namespace llvm::codeview;
-
-static inline size_t slotForIndex(TypeIndex Idx) {
- assert(!Idx.isSimple() && "simple type indices have no slots");
- return Idx.getIndex() - TypeIndex::FirstNonSimpleIndex;
-}
-
-namespace {
-
-/// Implementation of CodeView type stream merging.
-///
-/// A CodeView type stream is a series of records that reference each other
-/// through type indices. A type index is either "simple", meaning it is less
-/// than 0x1000 and refers to a builtin type, or it is complex, meaning it
-/// refers to a prior type record in the current stream. The type index of a
-/// record is equal to the number of records before it in the stream plus
-/// 0x1000.
-///
-/// Type records are only allowed to use type indices smaller than their own, so
+//===-- TypeStreamMerger.cpp ------------------------------------*- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#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/TypeDeserializer.h"
+#include "llvm/DebugInfo/CodeView/TypeIndex.h"
+#include "llvm/DebugInfo/CodeView/TypeIndexDiscovery.h"
+#include "llvm/DebugInfo/CodeView/TypeRecord.h"
+#include "llvm/DebugInfo/CodeView/TypeRecordHelpers.h"
+#include "llvm/Support/Error.h"
+
+using namespace llvm;
+using namespace llvm::codeview;
+
+static inline size_t slotForIndex(TypeIndex Idx) {
+ assert(!Idx.isSimple() && "simple type indices have no slots");
+ return Idx.getIndex() - TypeIndex::FirstNonSimpleIndex;
+}
+
+namespace {
+
+/// Implementation of CodeView type stream merging.
+///
+/// A CodeView type stream is a series of records that reference each other
+/// through type indices. A type index is either "simple", meaning it is less
+/// than 0x1000 and refers to a builtin type, or it is complex, meaning it
+/// refers to a prior type record in the current stream. The type index of a
+/// record is equal to the number of records before it in the stream plus
+/// 0x1000.
+///
+/// Type records are only allowed to use type indices smaller than their own, so
/// a type stream is effectively a topologically sorted DAG. Cycles occurring in
-/// the type graph of the source program are resolved with forward declarations
-/// of composite types. This class implements the following type stream merging
-/// algorithm, which relies on this DAG structure:
-///
-/// - Begin with a new empty stream, and a new empty hash table that maps from
-/// type record contents to new type index.
-/// - For each new type stream, maintain a map from source type index to
-/// destination type index.
-/// - For each record, copy it and rewrite its type indices to be valid in the
-/// destination type stream.
-/// - If the new type record is not already present in the destination stream
-/// hash table, append it to the destination type stream, assign it the next
-/// type index, and update the two hash tables.
-/// - If the type record already exists in the destination stream, discard it
-/// and update the type index map to forward the source type index to the
-/// existing destination type index.
-///
-/// As an additional complication, type stream merging actually produces two
-/// streams: an item (or IPI) stream and a type stream, as this is what is
-/// actually stored in the final PDB. We choose which records go where by
-/// looking at the record kind.
-class TypeStreamMerger {
-public:
- explicit TypeStreamMerger(SmallVectorImpl<TypeIndex> &SourceToDest)
- : IndexMap(SourceToDest) {
- // When dealing with precompiled headers objects, all data in SourceToDest
- // belongs to the precompiled headers object, and is assumed to be already
- // remapped to the target PDB. Any forthcoming type that will be merged in
- // might potentially back-reference this data. We also don't want to resolve
- // twice the types in the precompiled object.
- CurIndex += SourceToDest.size();
- }
-
- static const TypeIndex Untranslated;
-
- // Local hashing entry points
- Error mergeTypesAndIds(MergingTypeTableBuilder &DestIds,
- MergingTypeTableBuilder &DestTypes,
- const CVTypeArray &IdsAndTypes, Optional<uint32_t> &S);
- Error mergeIdRecords(MergingTypeTableBuilder &Dest,
- ArrayRef<TypeIndex> TypeSourceToDest,
- const CVTypeArray &Ids);
- Error mergeTypeRecords(MergingTypeTableBuilder &Dest,
- const CVTypeArray &Types);
-
- // Global hashing entry points
- Error mergeTypesAndIds(GlobalTypeTableBuilder &DestIds,
- GlobalTypeTableBuilder &DestTypes,
- const CVTypeArray &IdsAndTypes,
- ArrayRef<GloballyHashedType> Hashes,
- Optional<uint32_t> &S);
- Error mergeIdRecords(GlobalTypeTableBuilder &Dest,
- ArrayRef<TypeIndex> TypeSourceToDest,
- const CVTypeArray &Ids,
- ArrayRef<GloballyHashedType> Hashes);
- Error mergeTypeRecords(GlobalTypeTableBuilder &Dest, const CVTypeArray &Types,
- ArrayRef<GloballyHashedType> Hashes,
- Optional<uint32_t> &S);
-
-private:
- Error doit(const CVTypeArray &Types);
-
- Error remapAllTypes(const CVTypeArray &Types);
-
- Error remapType(const CVType &Type);
-
- void addMapping(TypeIndex Idx);
-
- inline bool remapTypeIndex(TypeIndex &Idx) {
- // If we're mapping a pure index stream, then IndexMap only contains
- // mappings from OldIdStream -> NewIdStream, in which case we will need to
- // use the 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 (!hasTypeStream())
- return remapIndex(Idx, TypeLookup);
-
- assert(TypeLookup.empty());
- return remapIndex(Idx, IndexMap);
- }
- inline bool remapItemIndex(TypeIndex &Idx) {
- assert(hasIdStream());
- return remapIndex(Idx, IndexMap);
- }
-
- bool hasTypeStream() const {
- return (UseGlobalHashes) ? (!!DestGlobalTypeStream) : (!!DestTypeStream);
- }
-
- bool hasIdStream() const {
- return (UseGlobalHashes) ? (!!DestGlobalIdStream) : (!!DestIdStream);
- }
-
- ArrayRef<uint8_t> remapIndices(const CVType &OriginalType,
- MutableArrayRef<uint8_t> Storage);
-
- inline bool remapIndex(TypeIndex &Idx, ArrayRef<TypeIndex> Map) {
- if (LLVM_LIKELY(remapIndexSimple(Idx, Map)))
- return true;
-
- return remapIndexFallback(Idx, Map);
- }
-
- inline bool remapIndexSimple(TypeIndex &Idx, ArrayRef<TypeIndex> Map) const {
- // Simple types are unchanged.
- if (Idx.isSimple())
- return true;
-
- // Check if this type index refers to a record we've already translated
- // successfully. If it refers to a type later in the stream or a record we
- // had to defer, defer it until later pass.
- unsigned MapPos = slotForIndex(Idx);
- if (LLVM_UNLIKELY(MapPos >= Map.size() || Map[MapPos] == Untranslated))
- return false;
-
- Idx = Map[MapPos];
- return true;
- }
-
- bool remapIndexFallback(TypeIndex &Idx, ArrayRef<TypeIndex> Map);
-
- Error errorCorruptRecord() const {
- return llvm::make_error<CodeViewError>(cv_error_code::corrupt_record);
- }
-
- Expected<bool> shouldRemapType(const CVType &Type);
-
- Optional<Error> LastError;
-
- bool UseGlobalHashes = false;
-
- bool IsSecondPass = false;
-
- unsigned NumBadIndices = 0;
-
- TypeIndex CurIndex{TypeIndex::FirstNonSimpleIndex};
-
- 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;
-
- /// Map from source type index to destination type index. Indexed by source
- /// type index minus 0x1000.
- SmallVectorImpl<TypeIndex> &IndexMap;
-
- /// Temporary storage that we use to copy a record's data while re-writing
- /// its type indices.
- SmallVector<uint8_t, 256> RemapStorage;
-
- Optional<uint32_t> PCHSignature;
-};
-
-} // end anonymous namespace
-
-const TypeIndex TypeStreamMerger::Untranslated(SimpleTypeKind::NotTranslated);
-
-void TypeStreamMerger::addMapping(TypeIndex Idx) {
- if (!IsSecondPass) {
- assert(IndexMap.size() == slotForIndex(CurIndex) &&
- "visitKnownRecord should add one index map entry");
- IndexMap.push_back(Idx);
- } else {
- assert(slotForIndex(CurIndex) < IndexMap.size());
- IndexMap[slotForIndex(CurIndex)] = Idx;
- }
-}
-
-bool TypeStreamMerger::remapIndexFallback(TypeIndex &Idx,
- ArrayRef<TypeIndex> Map) {
- size_t MapPos = slotForIndex(Idx);
-
- // If this is the second pass and this index isn't in the map, then it points
- // outside the current type stream, and this is a corrupt record.
- if (IsSecondPass && MapPos >= Map.size()) {
- // FIXME: Print a more useful error. We can give the current record and the
- // index that we think its pointing to.
- if (LastError)
- LastError = joinErrors(std::move(*LastError), errorCorruptRecord());
- else
- LastError = errorCorruptRecord();
- }
-
- ++NumBadIndices;
-
- // This type index is invalid. Remap this to "not translated by cvpack",
- // and return failure.
- Idx = Untranslated;
- return false;
-}
-
-// Local hashing entry points
-Error TypeStreamMerger::mergeTypeRecords(MergingTypeTableBuilder &Dest,
- const CVTypeArray &Types) {
- DestTypeStream = &Dest;
- UseGlobalHashes = false;
-
- return doit(Types);
-}
-
-Error TypeStreamMerger::mergeIdRecords(MergingTypeTableBuilder &Dest,
- ArrayRef<TypeIndex> TypeSourceToDest,
- const CVTypeArray &Ids) {
- DestIdStream = &Dest;
- TypeLookup = TypeSourceToDest;
- UseGlobalHashes = false;
-
- return doit(Ids);
-}
-
-Error TypeStreamMerger::mergeTypesAndIds(MergingTypeTableBuilder &DestIds,
- MergingTypeTableBuilder &DestTypes,
- const CVTypeArray &IdsAndTypes,
- Optional<uint32_t> &S) {
- DestIdStream = &DestIds;
- DestTypeStream = &DestTypes;
- UseGlobalHashes = false;
- auto Err = doit(IdsAndTypes);
- S = PCHSignature;
- return Err;
-}
-
-// Global hashing entry points
-Error TypeStreamMerger::mergeTypeRecords(GlobalTypeTableBuilder &Dest,
- const CVTypeArray &Types,
- ArrayRef<GloballyHashedType> Hashes,
- Optional<uint32_t> &S) {
- DestGlobalTypeStream = &Dest;
- UseGlobalHashes = true;
- GlobalHashes = Hashes;
- auto Err = doit(Types);
- S = PCHSignature;
- return Err;
-}
-
-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,
- Optional<uint32_t> &S) {
- DestGlobalIdStream = &DestIds;
- DestGlobalTypeStream = &DestTypes;
- UseGlobalHashes = true;
- GlobalHashes = Hashes;
- auto Err = doit(IdsAndTypes);
- S = PCHSignature;
- return Err;
-}
-
-Error TypeStreamMerger::doit(const CVTypeArray &Types) {
- if (auto EC = remapAllTypes(Types))
- return EC;
-
- // If we found bad indices but no other errors, try doing another pass and see
- // if we can resolve the indices that weren't in the map on the first pass.
- // This may require multiple passes, but we should always make progress. MASM
- // is the only known CodeView producer that makes type streams that aren't
- // topologically sorted. The standard library contains MASM-produced objects,
- // so this is important to handle correctly, but we don't have to be too
- // efficient. MASM type streams are usually very small.
- while (!LastError && NumBadIndices > 0) {
- unsigned BadIndicesRemaining = NumBadIndices;
- IsSecondPass = true;
- NumBadIndices = 0;
- CurIndex = TypeIndex(TypeIndex::FirstNonSimpleIndex);
-
- if (auto EC = remapAllTypes(Types))
- return EC;
-
- assert(NumBadIndices <= BadIndicesRemaining &&
- "second pass found more bad indices");
- if (!LastError && NumBadIndices == BadIndicesRemaining) {
- return llvm::make_error<CodeViewError>(
- cv_error_code::corrupt_record, "Input type graph contains cycles");
- }
- }
-
- if (LastError)
- return std::move(*LastError);
- return Error::success();
-}
-
-Error TypeStreamMerger::remapAllTypes(const CVTypeArray &Types) {
- BinaryStreamRef Stream = Types.getUnderlyingStream();
- ArrayRef<uint8_t> Buffer;
- cantFail(Stream.readBytes(0, Stream.getLength(), Buffer));
-
- return forEachCodeViewRecord<CVType>(
- Buffer, [this](const CVType &T) { return remapType(T); });
-}
-
-Error TypeStreamMerger::remapType(const CVType &Type) {
- auto R = shouldRemapType(Type);
- if (!R)
- return R.takeError();
-
- TypeIndex DestIdx = Untranslated;
- if (*R) {
- auto DoSerialize =
- [this, Type](MutableArrayRef<uint8_t> Storage) -> ArrayRef<uint8_t> {
- return remapIndices(Type, Storage);
- };
- unsigned AlignedSize = alignTo(Type.RecordData.size(), 4);
-
- if (LLVM_LIKELY(UseGlobalHashes)) {
- GlobalTypeTableBuilder &Dest =
- isIdRecord(Type.kind()) ? *DestGlobalIdStream : *DestGlobalTypeStream;
- GloballyHashedType H = GlobalHashes[CurIndex.toArrayIndex()];
- DestIdx = Dest.insertRecordAs(H, AlignedSize, DoSerialize);
- } else {
- MergingTypeTableBuilder &Dest =
- isIdRecord(Type.kind()) ? *DestIdStream : *DestTypeStream;
-
- RemapStorage.resize(AlignedSize);
- ArrayRef<uint8_t> Result = DoSerialize(RemapStorage);
- if (!Result.empty())
- DestIdx = Dest.insertRecordBytes(Result);
- }
- }
- addMapping(DestIdx);
-
- ++CurIndex;
- assert((IsSecondPass || IndexMap.size() == slotForIndex(CurIndex)) &&
- "visitKnownRecord should add one index map entry");
- return Error::success();
-}
-
-ArrayRef<uint8_t>
-TypeStreamMerger::remapIndices(const CVType &OriginalType,
- MutableArrayRef<uint8_t> Storage) {
- unsigned Align = OriginalType.RecordData.size() & 3;
- assert(Storage.size() == alignTo(OriginalType.RecordData.size(), 4) &&
- "The storage buffer size is not a multiple of 4 bytes which will "
- "cause misalignment in the output TPI stream!");
-
- SmallVector<TiReference, 4> Refs;
- discoverTypeIndices(OriginalType.RecordData, Refs);
- if (Refs.empty() && Align == 0)
- return OriginalType.RecordData;
-
- ::memcpy(Storage.data(), OriginalType.RecordData.data(),
- OriginalType.RecordData.size());
-
- uint8_t *DestContent = Storage.data() + sizeof(RecordPrefix);
-
- for (auto &Ref : Refs) {
- TypeIndex *DestTIs =
- reinterpret_cast<TypeIndex *>(DestContent + Ref.Offset);
-
- for (size_t I = 0; I < Ref.Count; ++I) {
- TypeIndex &TI = DestTIs[I];
- bool Success = (Ref.Kind == TiRefKind::IndexRef) ? remapItemIndex(TI)
- : remapTypeIndex(TI);
- if (LLVM_UNLIKELY(!Success))
- return {};
- }
- }
-
- if (Align > 0) {
- RecordPrefix *StorageHeader =
- reinterpret_cast<RecordPrefix *>(Storage.data());
- StorageHeader->RecordLen += 4 - Align;
-
- DestContent = Storage.data() + OriginalType.RecordData.size();
- for (; Align < 4; ++Align)
- *DestContent++ = LF_PAD4 - Align;
- }
- return Storage;
-}
-
-Error llvm::codeview::mergeTypeRecords(MergingTypeTableBuilder &Dest,
- SmallVectorImpl<TypeIndex> &SourceToDest,
- const CVTypeArray &Types) {
- TypeStreamMerger M(SourceToDest);
- return M.mergeTypeRecords(Dest, Types);
-}
-
-Error llvm::codeview::mergeIdRecords(MergingTypeTableBuilder &Dest,
- ArrayRef<TypeIndex> TypeSourceToDest,
- SmallVectorImpl<TypeIndex> &SourceToDest,
- const CVTypeArray &Ids) {
- TypeStreamMerger M(SourceToDest);
- return M.mergeIdRecords(Dest, TypeSourceToDest, Ids);
-}
-
-Error llvm::codeview::mergeTypeAndIdRecords(
- MergingTypeTableBuilder &DestIds, MergingTypeTableBuilder &DestTypes,
- SmallVectorImpl<TypeIndex> &SourceToDest, const CVTypeArray &IdsAndTypes,
- Optional<uint32_t> &PCHSignature) {
- TypeStreamMerger M(SourceToDest);
- return M.mergeTypesAndIds(DestIds, DestTypes, IdsAndTypes, PCHSignature);
-}
-
-Error llvm::codeview::mergeTypeAndIdRecords(
- GlobalTypeTableBuilder &DestIds, GlobalTypeTableBuilder &DestTypes,
- SmallVectorImpl<TypeIndex> &SourceToDest, const CVTypeArray &IdsAndTypes,
- ArrayRef<GloballyHashedType> Hashes, Optional<uint32_t> &PCHSignature) {
- TypeStreamMerger M(SourceToDest);
- return M.mergeTypesAndIds(DestIds, DestTypes, IdsAndTypes, Hashes,
- PCHSignature);
-}
-
-Error llvm::codeview::mergeTypeRecords(GlobalTypeTableBuilder &Dest,
- SmallVectorImpl<TypeIndex> &SourceToDest,
- const CVTypeArray &Types,
- ArrayRef<GloballyHashedType> Hashes,
- Optional<uint32_t> &PCHSignature) {
- TypeStreamMerger M(SourceToDest);
- return M.mergeTypeRecords(Dest, Types, Hashes, PCHSignature);
-}
-
-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);
-}
-
-Expected<bool> TypeStreamMerger::shouldRemapType(const CVType &Type) {
- // For object files containing precompiled types, we need to extract the
- // signature, through EndPrecompRecord. This is done here for performance
- // reasons, to avoid re-parsing the Types stream.
- if (Type.kind() == LF_ENDPRECOMP) {
- EndPrecompRecord EP;
- if (auto EC = TypeDeserializer::deserializeAs(const_cast<CVType &>(Type),
- EP))
- return joinErrors(std::move(EC), errorCorruptRecord());
- if (PCHSignature.hasValue())
- return errorCorruptRecord();
- PCHSignature.emplace(EP.getSignature());
- return false;
- }
- return true;
-}
+/// the type graph of the source program are resolved with forward declarations
+/// of composite types. This class implements the following type stream merging
+/// algorithm, which relies on this DAG structure:
+///
+/// - Begin with a new empty stream, and a new empty hash table that maps from
+/// type record contents to new type index.
+/// - For each new type stream, maintain a map from source type index to
+/// destination type index.
+/// - For each record, copy it and rewrite its type indices to be valid in the
+/// destination type stream.
+/// - If the new type record is not already present in the destination stream
+/// hash table, append it to the destination type stream, assign it the next
+/// type index, and update the two hash tables.
+/// - If the type record already exists in the destination stream, discard it
+/// and update the type index map to forward the source type index to the
+/// existing destination type index.
+///
+/// As an additional complication, type stream merging actually produces two
+/// streams: an item (or IPI) stream and a type stream, as this is what is
+/// actually stored in the final PDB. We choose which records go where by
+/// looking at the record kind.
+class TypeStreamMerger {
+public:
+ explicit TypeStreamMerger(SmallVectorImpl<TypeIndex> &SourceToDest)
+ : IndexMap(SourceToDest) {
+ // When dealing with precompiled headers objects, all data in SourceToDest
+ // belongs to the precompiled headers object, and is assumed to be already
+ // remapped to the target PDB. Any forthcoming type that will be merged in
+ // might potentially back-reference this data. We also don't want to resolve
+ // twice the types in the precompiled object.
+ CurIndex += SourceToDest.size();
+ }
+
+ static const TypeIndex Untranslated;
+
+ // Local hashing entry points
+ Error mergeTypesAndIds(MergingTypeTableBuilder &DestIds,
+ MergingTypeTableBuilder &DestTypes,
+ const CVTypeArray &IdsAndTypes, Optional<uint32_t> &S);
+ Error mergeIdRecords(MergingTypeTableBuilder &Dest,
+ ArrayRef<TypeIndex> TypeSourceToDest,
+ const CVTypeArray &Ids);
+ Error mergeTypeRecords(MergingTypeTableBuilder &Dest,
+ const CVTypeArray &Types);
+
+ // Global hashing entry points
+ Error mergeTypesAndIds(GlobalTypeTableBuilder &DestIds,
+ GlobalTypeTableBuilder &DestTypes,
+ const CVTypeArray &IdsAndTypes,
+ ArrayRef<GloballyHashedType> Hashes,
+ Optional<uint32_t> &S);
+ Error mergeIdRecords(GlobalTypeTableBuilder &Dest,
+ ArrayRef<TypeIndex> TypeSourceToDest,
+ const CVTypeArray &Ids,
+ ArrayRef<GloballyHashedType> Hashes);
+ Error mergeTypeRecords(GlobalTypeTableBuilder &Dest, const CVTypeArray &Types,
+ ArrayRef<GloballyHashedType> Hashes,
+ Optional<uint32_t> &S);
+
+private:
+ Error doit(const CVTypeArray &Types);
+
+ Error remapAllTypes(const CVTypeArray &Types);
+
+ Error remapType(const CVType &Type);
+
+ void addMapping(TypeIndex Idx);
+
+ inline bool remapTypeIndex(TypeIndex &Idx) {
+ // If we're mapping a pure index stream, then IndexMap only contains
+ // mappings from OldIdStream -> NewIdStream, in which case we will need to
+ // use the 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 (!hasTypeStream())
+ return remapIndex(Idx, TypeLookup);
+
+ assert(TypeLookup.empty());
+ return remapIndex(Idx, IndexMap);
+ }
+ inline bool remapItemIndex(TypeIndex &Idx) {
+ assert(hasIdStream());
+ return remapIndex(Idx, IndexMap);
+ }
+
+ bool hasTypeStream() const {
+ return (UseGlobalHashes) ? (!!DestGlobalTypeStream) : (!!DestTypeStream);
+ }
+
+ bool hasIdStream() const {
+ return (UseGlobalHashes) ? (!!DestGlobalIdStream) : (!!DestIdStream);
+ }
+
+ ArrayRef<uint8_t> remapIndices(const CVType &OriginalType,
+ MutableArrayRef<uint8_t> Storage);
+
+ inline bool remapIndex(TypeIndex &Idx, ArrayRef<TypeIndex> Map) {
+ if (LLVM_LIKELY(remapIndexSimple(Idx, Map)))
+ return true;
+
+ return remapIndexFallback(Idx, Map);
+ }
+
+ inline bool remapIndexSimple(TypeIndex &Idx, ArrayRef<TypeIndex> Map) const {
+ // Simple types are unchanged.
+ if (Idx.isSimple())
+ return true;
+
+ // Check if this type index refers to a record we've already translated
+ // successfully. If it refers to a type later in the stream or a record we
+ // had to defer, defer it until later pass.
+ unsigned MapPos = slotForIndex(Idx);
+ if (LLVM_UNLIKELY(MapPos >= Map.size() || Map[MapPos] == Untranslated))
+ return false;
+
+ Idx = Map[MapPos];
+ return true;
+ }
+
+ bool remapIndexFallback(TypeIndex &Idx, ArrayRef<TypeIndex> Map);
+
+ Error errorCorruptRecord() const {
+ return llvm::make_error<CodeViewError>(cv_error_code::corrupt_record);
+ }
+
+ Expected<bool> shouldRemapType(const CVType &Type);
+
+ Optional<Error> LastError;
+
+ bool UseGlobalHashes = false;
+
+ bool IsSecondPass = false;
+
+ unsigned NumBadIndices = 0;
+
+ TypeIndex CurIndex{TypeIndex::FirstNonSimpleIndex};
+
+ 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;
+
+ /// Map from source type index to destination type index. Indexed by source
+ /// type index minus 0x1000.
+ SmallVectorImpl<TypeIndex> &IndexMap;
+
+ /// Temporary storage that we use to copy a record's data while re-writing
+ /// its type indices.
+ SmallVector<uint8_t, 256> RemapStorage;
+
+ Optional<uint32_t> PCHSignature;
+};
+
+} // end anonymous namespace
+
+const TypeIndex TypeStreamMerger::Untranslated(SimpleTypeKind::NotTranslated);
+
+void TypeStreamMerger::addMapping(TypeIndex Idx) {
+ if (!IsSecondPass) {
+ assert(IndexMap.size() == slotForIndex(CurIndex) &&
+ "visitKnownRecord should add one index map entry");
+ IndexMap.push_back(Idx);
+ } else {
+ assert(slotForIndex(CurIndex) < IndexMap.size());
+ IndexMap[slotForIndex(CurIndex)] = Idx;
+ }
+}
+
+bool TypeStreamMerger::remapIndexFallback(TypeIndex &Idx,
+ ArrayRef<TypeIndex> Map) {
+ size_t MapPos = slotForIndex(Idx);
+
+ // If this is the second pass and this index isn't in the map, then it points
+ // outside the current type stream, and this is a corrupt record.
+ if (IsSecondPass && MapPos >= Map.size()) {
+ // FIXME: Print a more useful error. We can give the current record and the
+ // index that we think its pointing to.
+ if (LastError)
+ LastError = joinErrors(std::move(*LastError), errorCorruptRecord());
+ else
+ LastError = errorCorruptRecord();
+ }
+
+ ++NumBadIndices;
+
+ // This type index is invalid. Remap this to "not translated by cvpack",
+ // and return failure.
+ Idx = Untranslated;
+ return false;
+}
+
+// Local hashing entry points
+Error TypeStreamMerger::mergeTypeRecords(MergingTypeTableBuilder &Dest,
+ const CVTypeArray &Types) {
+ DestTypeStream = &Dest;
+ UseGlobalHashes = false;
+
+ return doit(Types);
+}
+
+Error TypeStreamMerger::mergeIdRecords(MergingTypeTableBuilder &Dest,
+ ArrayRef<TypeIndex> TypeSourceToDest,
+ const CVTypeArray &Ids) {
+ DestIdStream = &Dest;
+ TypeLookup = TypeSourceToDest;
+ UseGlobalHashes = false;
+
+ return doit(Ids);
+}
+
+Error TypeStreamMerger::mergeTypesAndIds(MergingTypeTableBuilder &DestIds,
+ MergingTypeTableBuilder &DestTypes,
+ const CVTypeArray &IdsAndTypes,
+ Optional<uint32_t> &S) {
+ DestIdStream = &DestIds;
+ DestTypeStream = &DestTypes;
+ UseGlobalHashes = false;
+ auto Err = doit(IdsAndTypes);
+ S = PCHSignature;
+ return Err;
+}
+
+// Global hashing entry points
+Error TypeStreamMerger::mergeTypeRecords(GlobalTypeTableBuilder &Dest,
+ const CVTypeArray &Types,
+ ArrayRef<GloballyHashedType> Hashes,
+ Optional<uint32_t> &S) {
+ DestGlobalTypeStream = &Dest;
+ UseGlobalHashes = true;
+ GlobalHashes = Hashes;
+ auto Err = doit(Types);
+ S = PCHSignature;
+ return Err;
+}
+
+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,
+ Optional<uint32_t> &S) {
+ DestGlobalIdStream = &DestIds;
+ DestGlobalTypeStream = &DestTypes;
+ UseGlobalHashes = true;
+ GlobalHashes = Hashes;
+ auto Err = doit(IdsAndTypes);
+ S = PCHSignature;
+ return Err;
+}
+
+Error TypeStreamMerger::doit(const CVTypeArray &Types) {
+ if (auto EC = remapAllTypes(Types))
+ return EC;
+
+ // If we found bad indices but no other errors, try doing another pass and see
+ // if we can resolve the indices that weren't in the map on the first pass.
+ // This may require multiple passes, but we should always make progress. MASM
+ // is the only known CodeView producer that makes type streams that aren't
+ // topologically sorted. The standard library contains MASM-produced objects,
+ // so this is important to handle correctly, but we don't have to be too
+ // efficient. MASM type streams are usually very small.
+ while (!LastError && NumBadIndices > 0) {
+ unsigned BadIndicesRemaining = NumBadIndices;
+ IsSecondPass = true;
+ NumBadIndices = 0;
+ CurIndex = TypeIndex(TypeIndex::FirstNonSimpleIndex);
+
+ if (auto EC = remapAllTypes(Types))
+ return EC;
+
+ assert(NumBadIndices <= BadIndicesRemaining &&
+ "second pass found more bad indices");
+ if (!LastError && NumBadIndices == BadIndicesRemaining) {
+ return llvm::make_error<CodeViewError>(
+ cv_error_code::corrupt_record, "Input type graph contains cycles");
+ }
+ }
+
+ if (LastError)
+ return std::move(*LastError);
+ return Error::success();
+}
+
+Error TypeStreamMerger::remapAllTypes(const CVTypeArray &Types) {
+ BinaryStreamRef Stream = Types.getUnderlyingStream();
+ ArrayRef<uint8_t> Buffer;
+ cantFail(Stream.readBytes(0, Stream.getLength(), Buffer));
+
+ return forEachCodeViewRecord<CVType>(
+ Buffer, [this](const CVType &T) { return remapType(T); });
+}
+
+Error TypeStreamMerger::remapType(const CVType &Type) {
+ auto R = shouldRemapType(Type);
+ if (!R)
+ return R.takeError();
+
+ TypeIndex DestIdx = Untranslated;
+ if (*R) {
+ auto DoSerialize =
+ [this, Type](MutableArrayRef<uint8_t> Storage) -> ArrayRef<uint8_t> {
+ return remapIndices(Type, Storage);
+ };
+ unsigned AlignedSize = alignTo(Type.RecordData.size(), 4);
+
+ if (LLVM_LIKELY(UseGlobalHashes)) {
+ GlobalTypeTableBuilder &Dest =
+ isIdRecord(Type.kind()) ? *DestGlobalIdStream : *DestGlobalTypeStream;
+ GloballyHashedType H = GlobalHashes[CurIndex.toArrayIndex()];
+ DestIdx = Dest.insertRecordAs(H, AlignedSize, DoSerialize);
+ } else {
+ MergingTypeTableBuilder &Dest =
+ isIdRecord(Type.kind()) ? *DestIdStream : *DestTypeStream;
+
+ RemapStorage.resize(AlignedSize);
+ ArrayRef<uint8_t> Result = DoSerialize(RemapStorage);
+ if (!Result.empty())
+ DestIdx = Dest.insertRecordBytes(Result);
+ }
+ }
+ addMapping(DestIdx);
+
+ ++CurIndex;
+ assert((IsSecondPass || IndexMap.size() == slotForIndex(CurIndex)) &&
+ "visitKnownRecord should add one index map entry");
+ return Error::success();
+}
+
+ArrayRef<uint8_t>
+TypeStreamMerger::remapIndices(const CVType &OriginalType,
+ MutableArrayRef<uint8_t> Storage) {
+ unsigned Align = OriginalType.RecordData.size() & 3;
+ assert(Storage.size() == alignTo(OriginalType.RecordData.size(), 4) &&
+ "The storage buffer size is not a multiple of 4 bytes which will "
+ "cause misalignment in the output TPI stream!");
+
+ SmallVector<TiReference, 4> Refs;
+ discoverTypeIndices(OriginalType.RecordData, Refs);
+ if (Refs.empty() && Align == 0)
+ return OriginalType.RecordData;
+
+ ::memcpy(Storage.data(), OriginalType.RecordData.data(),
+ OriginalType.RecordData.size());
+
+ uint8_t *DestContent = Storage.data() + sizeof(RecordPrefix);
+
+ for (auto &Ref : Refs) {
+ TypeIndex *DestTIs =
+ reinterpret_cast<TypeIndex *>(DestContent + Ref.Offset);
+
+ for (size_t I = 0; I < Ref.Count; ++I) {
+ TypeIndex &TI = DestTIs[I];
+ bool Success = (Ref.Kind == TiRefKind::IndexRef) ? remapItemIndex(TI)
+ : remapTypeIndex(TI);
+ if (LLVM_UNLIKELY(!Success))
+ return {};
+ }
+ }
+
+ if (Align > 0) {
+ RecordPrefix *StorageHeader =
+ reinterpret_cast<RecordPrefix *>(Storage.data());
+ StorageHeader->RecordLen += 4 - Align;
+
+ DestContent = Storage.data() + OriginalType.RecordData.size();
+ for (; Align < 4; ++Align)
+ *DestContent++ = LF_PAD4 - Align;
+ }
+ return Storage;
+}
+
+Error llvm::codeview::mergeTypeRecords(MergingTypeTableBuilder &Dest,
+ SmallVectorImpl<TypeIndex> &SourceToDest,
+ const CVTypeArray &Types) {
+ TypeStreamMerger M(SourceToDest);
+ return M.mergeTypeRecords(Dest, Types);
+}
+
+Error llvm::codeview::mergeIdRecords(MergingTypeTableBuilder &Dest,
+ ArrayRef<TypeIndex> TypeSourceToDest,
+ SmallVectorImpl<TypeIndex> &SourceToDest,
+ const CVTypeArray &Ids) {
+ TypeStreamMerger M(SourceToDest);
+ return M.mergeIdRecords(Dest, TypeSourceToDest, Ids);
+}
+
+Error llvm::codeview::mergeTypeAndIdRecords(
+ MergingTypeTableBuilder &DestIds, MergingTypeTableBuilder &DestTypes,
+ SmallVectorImpl<TypeIndex> &SourceToDest, const CVTypeArray &IdsAndTypes,
+ Optional<uint32_t> &PCHSignature) {
+ TypeStreamMerger M(SourceToDest);
+ return M.mergeTypesAndIds(DestIds, DestTypes, IdsAndTypes, PCHSignature);
+}
+
+Error llvm::codeview::mergeTypeAndIdRecords(
+ GlobalTypeTableBuilder &DestIds, GlobalTypeTableBuilder &DestTypes,
+ SmallVectorImpl<TypeIndex> &SourceToDest, const CVTypeArray &IdsAndTypes,
+ ArrayRef<GloballyHashedType> Hashes, Optional<uint32_t> &PCHSignature) {
+ TypeStreamMerger M(SourceToDest);
+ return M.mergeTypesAndIds(DestIds, DestTypes, IdsAndTypes, Hashes,
+ PCHSignature);
+}
+
+Error llvm::codeview::mergeTypeRecords(GlobalTypeTableBuilder &Dest,
+ SmallVectorImpl<TypeIndex> &SourceToDest,
+ const CVTypeArray &Types,
+ ArrayRef<GloballyHashedType> Hashes,
+ Optional<uint32_t> &PCHSignature) {
+ TypeStreamMerger M(SourceToDest);
+ return M.mergeTypeRecords(Dest, Types, Hashes, PCHSignature);
+}
+
+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);
+}
+
+Expected<bool> TypeStreamMerger::shouldRemapType(const CVType &Type) {
+ // For object files containing precompiled types, we need to extract the
+ // signature, through EndPrecompRecord. This is done here for performance
+ // reasons, to avoid re-parsing the Types stream.
+ if (Type.kind() == LF_ENDPRECOMP) {
+ EndPrecompRecord EP;
+ if (auto EC = TypeDeserializer::deserializeAs(const_cast<CVType &>(Type),
+ EP))
+ return joinErrors(std::move(EC), errorCorruptRecord());
+ if (PCHSignature.hasValue())
+ return errorCorruptRecord();
+ PCHSignature.emplace(EP.getSignature());
+ return false;
+ }
+ return true;
+}
diff --git a/contrib/libs/llvm12/lib/DebugInfo/CodeView/TypeTableCollection.cpp b/contrib/libs/llvm12/lib/DebugInfo/CodeView/TypeTableCollection.cpp
index fb2ceda9c14..e517e8846d6 100644
--- a/contrib/libs/llvm12/lib/DebugInfo/CodeView/TypeTableCollection.cpp
+++ b/contrib/libs/llvm12/lib/DebugInfo/CodeView/TypeTableCollection.cpp
@@ -1,65 +1,65 @@
-//===- TypeTableCollection.cpp -------------------------------- *- C++ --*-===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-
-#include "llvm/DebugInfo/CodeView/TypeTableCollection.h"
-
-#include "llvm/DebugInfo/CodeView/CVTypeVisitor.h"
-#include "llvm/DebugInfo/CodeView/RecordName.h"
-#include "llvm/Support/BinaryStreamReader.h"
-
-using namespace llvm;
-using namespace llvm::codeview;
-
-TypeTableCollection::TypeTableCollection(ArrayRef<ArrayRef<uint8_t>> Records)
- : NameStorage(Allocator), Records(Records) {
- Names.resize(Records.size());
-}
-
-Optional<TypeIndex> TypeTableCollection::getFirst() {
- if (empty())
- return None;
- return TypeIndex::fromArrayIndex(0);
-}
-
-Optional<TypeIndex> TypeTableCollection::getNext(TypeIndex Prev) {
- assert(contains(Prev));
- ++Prev;
- if (Prev.toArrayIndex() == size())
- return None;
- return Prev;
-}
-
-CVType TypeTableCollection::getType(TypeIndex Index) {
- assert(Index.toArrayIndex() < Records.size());
- return CVType(Records[Index.toArrayIndex()]);
-}
-
-StringRef TypeTableCollection::getTypeName(TypeIndex Index) {
- if (Index.isNoneType() || Index.isSimple())
- return TypeIndex::simpleTypeName(Index);
-
- uint32_t I = Index.toArrayIndex();
- if (Names[I].data() == nullptr) {
- StringRef Result = NameStorage.save(computeTypeName(*this, Index));
- Names[I] = Result;
- }
- return Names[I];
-}
-
-bool TypeTableCollection::contains(TypeIndex Index) {
- return Index.toArrayIndex() <= size();
-}
-
-uint32_t TypeTableCollection::size() { return Records.size(); }
-
-uint32_t TypeTableCollection::capacity() { return Records.size(); }
-
-bool TypeTableCollection::replaceType(TypeIndex &Index, CVType Data,
- bool Stabilize) {
- llvm_unreachable("Method cannot be called");
-}
+//===- TypeTableCollection.cpp -------------------------------- *- C++ --*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "llvm/DebugInfo/CodeView/TypeTableCollection.h"
+
+#include "llvm/DebugInfo/CodeView/CVTypeVisitor.h"
+#include "llvm/DebugInfo/CodeView/RecordName.h"
+#include "llvm/Support/BinaryStreamReader.h"
+
+using namespace llvm;
+using namespace llvm::codeview;
+
+TypeTableCollection::TypeTableCollection(ArrayRef<ArrayRef<uint8_t>> Records)
+ : NameStorage(Allocator), Records(Records) {
+ Names.resize(Records.size());
+}
+
+Optional<TypeIndex> TypeTableCollection::getFirst() {
+ if (empty())
+ return None;
+ return TypeIndex::fromArrayIndex(0);
+}
+
+Optional<TypeIndex> TypeTableCollection::getNext(TypeIndex Prev) {
+ assert(contains(Prev));
+ ++Prev;
+ if (Prev.toArrayIndex() == size())
+ return None;
+ return Prev;
+}
+
+CVType TypeTableCollection::getType(TypeIndex Index) {
+ assert(Index.toArrayIndex() < Records.size());
+ return CVType(Records[Index.toArrayIndex()]);
+}
+
+StringRef TypeTableCollection::getTypeName(TypeIndex Index) {
+ if (Index.isNoneType() || Index.isSimple())
+ return TypeIndex::simpleTypeName(Index);
+
+ uint32_t I = Index.toArrayIndex();
+ if (Names[I].data() == nullptr) {
+ StringRef Result = NameStorage.save(computeTypeName(*this, Index));
+ Names[I] = Result;
+ }
+ return Names[I];
+}
+
+bool TypeTableCollection::contains(TypeIndex Index) {
+ return Index.toArrayIndex() <= size();
+}
+
+uint32_t TypeTableCollection::size() { return Records.size(); }
+
+uint32_t TypeTableCollection::capacity() { return Records.size(); }
+
+bool TypeTableCollection::replaceType(TypeIndex &Index, CVType Data,
+ bool Stabilize) {
+ llvm_unreachable("Method cannot be called");
+}
diff --git a/contrib/libs/llvm12/lib/DebugInfo/CodeView/ya.make b/contrib/libs/llvm12/lib/DebugInfo/CodeView/ya.make
index b099dd11da9..8829a8f09f5 100644
--- a/contrib/libs/llvm12/lib/DebugInfo/CodeView/ya.make
+++ b/contrib/libs/llvm12/lib/DebugInfo/CodeView/ya.make
@@ -1,71 +1,71 @@
-# Generated by devtools/yamaker.
-
-LIBRARY()
-
+# Generated by devtools/yamaker.
+
+LIBRARY()
+
OWNER(
orivej
g:cpp-contrib
)
-
+
LICENSE(Apache-2.0 WITH LLVM-exception)
LICENSE_TEXTS(.yandex_meta/licenses.list.txt)
-PEERDIR(
+PEERDIR(
contrib/libs/llvm12
contrib/libs/llvm12/lib/DebugInfo/MSF
contrib/libs/llvm12/lib/Support
-)
-
+)
+
ADDINCL(
contrib/libs/llvm12/lib/DebugInfo/CodeView
)
-
-NO_COMPILER_WARNINGS()
-
-NO_UTIL()
-
-SRCS(
- AppendingTypeTableBuilder.cpp
- CVSymbolVisitor.cpp
- CVTypeVisitor.cpp
- CodeViewError.cpp
- CodeViewRecordIO.cpp
- ContinuationRecordBuilder.cpp
- DebugChecksumsSubsection.cpp
- DebugCrossExSubsection.cpp
- DebugCrossImpSubsection.cpp
- DebugFrameDataSubsection.cpp
- DebugInlineeLinesSubsection.cpp
- DebugLinesSubsection.cpp
- DebugStringTableSubsection.cpp
- DebugSubsection.cpp
- DebugSubsectionRecord.cpp
- DebugSubsectionVisitor.cpp
- DebugSymbolRVASubsection.cpp
- DebugSymbolsSubsection.cpp
- EnumTables.cpp
- Formatters.cpp
- GlobalTypeTableBuilder.cpp
- LazyRandomTypeCollection.cpp
- Line.cpp
- MergingTypeTableBuilder.cpp
- RecordName.cpp
- RecordSerialization.cpp
- SimpleTypeSerializer.cpp
- StringsAndChecksums.cpp
- SymbolDumper.cpp
- SymbolRecordHelpers.cpp
- SymbolRecordMapping.cpp
- SymbolSerializer.cpp
- TypeDumpVisitor.cpp
- TypeHashing.cpp
- TypeIndex.cpp
- TypeIndexDiscovery.cpp
- TypeRecordHelpers.cpp
- TypeRecordMapping.cpp
- TypeStreamMerger.cpp
- TypeTableCollection.cpp
-)
-
-END()
+
+NO_COMPILER_WARNINGS()
+
+NO_UTIL()
+
+SRCS(
+ AppendingTypeTableBuilder.cpp
+ CVSymbolVisitor.cpp
+ CVTypeVisitor.cpp
+ CodeViewError.cpp
+ CodeViewRecordIO.cpp
+ ContinuationRecordBuilder.cpp
+ DebugChecksumsSubsection.cpp
+ DebugCrossExSubsection.cpp
+ DebugCrossImpSubsection.cpp
+ DebugFrameDataSubsection.cpp
+ DebugInlineeLinesSubsection.cpp
+ DebugLinesSubsection.cpp
+ DebugStringTableSubsection.cpp
+ DebugSubsection.cpp
+ DebugSubsectionRecord.cpp
+ DebugSubsectionVisitor.cpp
+ DebugSymbolRVASubsection.cpp
+ DebugSymbolsSubsection.cpp
+ EnumTables.cpp
+ Formatters.cpp
+ GlobalTypeTableBuilder.cpp
+ LazyRandomTypeCollection.cpp
+ Line.cpp
+ MergingTypeTableBuilder.cpp
+ RecordName.cpp
+ RecordSerialization.cpp
+ SimpleTypeSerializer.cpp
+ StringsAndChecksums.cpp
+ SymbolDumper.cpp
+ SymbolRecordHelpers.cpp
+ SymbolRecordMapping.cpp
+ SymbolSerializer.cpp
+ TypeDumpVisitor.cpp
+ TypeHashing.cpp
+ TypeIndex.cpp
+ TypeIndexDiscovery.cpp
+ TypeRecordHelpers.cpp
+ TypeRecordMapping.cpp
+ TypeStreamMerger.cpp
+ TypeTableCollection.cpp
+)
+
+END()