diff --git a/llvm/include/llvm/DebugInfo/CodeView/CVTypeVisitor.h b/llvm/include/llvm/DebugInfo/CodeView/CVTypeVisitor.h index 7d20bb0a7bde..7538cb2c2548 100644 --- a/llvm/include/llvm/DebugInfo/CodeView/CVTypeVisitor.h +++ b/llvm/include/llvm/DebugInfo/CodeView/CVTypeVisitor.h @@ -11,7 +11,6 @@ #include "llvm/DebugInfo/CodeView/CVRecord.h" #include "llvm/DebugInfo/CodeView/TypeRecord.h" -#include "llvm/DebugInfo/CodeView/TypeVisitorCallbackPipeline.h" #include "llvm/Support/Error.h" namespace llvm { @@ -31,9 +30,6 @@ enum VisitorDataSource { Error visitTypeRecord(CVType &Record, TypeIndex Index, TypeVisitorCallbacks &Callbacks, VisitorDataSource Source = VDS_BytesPresent); -Error visitTypeRecord(CVType &Record, TypeIndex Index, - TypeVisitorCallbackPipeline &Callbacks, - VisitorDataSource Source = VDS_BytesPresent); Error visitTypeRecord(CVType &Record, TypeVisitorCallbacks &Callbacks, VisitorDataSource Source = VDS_BytesPresent); diff --git a/llvm/include/llvm/DebugInfo/CodeView/CodeViewRecordIO.h b/llvm/include/llvm/DebugInfo/CodeView/CodeViewRecordIO.h index d3bad4cd405c..b2476f16d100 100644 --- a/llvm/include/llvm/DebugInfo/CodeView/CodeViewRecordIO.h +++ b/llvm/include/llvm/DebugInfo/CodeView/CodeViewRecordIO.h @@ -24,64 +24,28 @@ #include namespace llvm { - namespace codeview { -class CodeViewRecordStreamer { -public: - virtual void EmitBytes(StringRef Data) = 0; - virtual void EmitIntValue(uint64_t Value, unsigned Size) = 0; - virtual void EmitBinaryData(StringRef Data) = 0; - virtual ~CodeViewRecordStreamer() = default; -}; - class CodeViewRecordIO { uint32_t getCurrentOffset() const { - if (isWriting()) - return Writer->getOffset(); - else if (isReading()) - return Reader->getOffset(); - else - return 0; + return (isWriting()) ? Writer->getOffset() : Reader->getOffset(); } public: - // deserializes records to structures explicit CodeViewRecordIO(BinaryStreamReader &Reader) : Reader(&Reader) {} - - // serializes records to buffer explicit CodeViewRecordIO(BinaryStreamWriter &Writer) : Writer(&Writer) {} - // writes records to assembly file using MC library interface - explicit CodeViewRecordIO(CodeViewRecordStreamer &Streamer) - : Streamer(&Streamer) {} - Error beginRecord(Optional MaxLength); Error endRecord(); Error mapInteger(TypeIndex &TypeInd); - bool isStreaming() const { - return (Streamer != nullptr) && (Reader == nullptr) && (Writer == nullptr); - } - bool isReading() const { - return (Reader != nullptr) && (Streamer == nullptr) && (Writer == nullptr); - } - bool isWriting() const { - return (Writer != nullptr) && (Streamer == nullptr) && (Reader == nullptr); - } + bool isReading() const { return Reader != nullptr; } + bool isWriting() const { return !isReading(); } uint32_t maxFieldLength() const; template Error mapObject(T &Value) { - if (isStreaming()) { - StringRef BytesSR = - StringRef((reinterpret_cast(&Value)), sizeof(Value)); - Streamer->EmitBytes(BytesSR); - incrStreamedLen(sizeof(T)); - return Error::success(); - } - if (isWriting()) return Writer->writeObject(Value); @@ -93,12 +57,6 @@ public: } template Error mapInteger(T &Value) { - if (isStreaming()) { - Streamer->EmitIntValue((int)Value, sizeof(T)); - incrStreamedLen(sizeof(T)); - return Error::success(); - } - if (isWriting()) return Writer->writeInteger(Value); @@ -106,21 +64,18 @@ public: } template Error mapEnum(T &Value) { - if (!isStreaming() && sizeof(Value) > maxFieldLength()) + if (sizeof(Value) > maxFieldLength()) return make_error(cv_error_code::insufficient_buffer); using U = typename std::underlying_type::type; U X; - - if (isWriting() || isStreaming()) + if (isWriting()) X = static_cast(Value); if (auto EC = mapInteger(X)) return EC; - if (isReading()) Value = static_cast(X); - return Error::success(); } @@ -135,16 +90,7 @@ public: template Error mapVectorN(T &Items, const ElementMapper &Mapper) { SizeType Size; - if (isStreaming()) { - Size = static_cast(Items.size()); - Streamer->EmitIntValue(Size, sizeof(Size)); - incrStreamedLen(sizeof(Size)); // add 1 for the delimiter - - for (auto &X : Items) { - if (auto EC = Mapper(*this, X)) - return EC; - } - } else if (isWriting()) { + if (isWriting()) { Size = static_cast(Items.size()); if (auto EC = Writer->writeInteger(Size)) return EC; @@ -169,7 +115,7 @@ public: template Error mapVectorTail(T &Items, const ElementMapper &Mapper) { - if (isStreaming() || isWriting()) { + if (isWriting()) { for (auto &Item : Items) { if (auto EC = Mapper(*this, Item)) return EC; @@ -192,28 +138,10 @@ public: Error padToAlignment(uint32_t Align); Error skipPadding(); - uint64_t getStreamedLen() { - if (isStreaming()) - return StreamedLen; - return 0; - } - private: - void emitEncodedSignedInteger(const int64_t &Value); - void emitEncodedUnsignedInteger(const uint64_t &Value); Error writeEncodedSignedInteger(const int64_t &Value); Error writeEncodedUnsignedInteger(const uint64_t &Value); - void incrStreamedLen(const uint64_t &Len) { - if (isStreaming()) - StreamedLen += Len; - } - - void resetStreamedLen() { - if (isStreaming()) - StreamedLen = 4; // The record prefix is 4 bytes long - } - struct RecordLimit { uint32_t BeginOffset; Optional MaxLength; @@ -234,8 +162,6 @@ private: BinaryStreamReader *Reader = nullptr; BinaryStreamWriter *Writer = nullptr; - CodeViewRecordStreamer *Streamer = nullptr; - uint64_t StreamedLen = 0; }; } // end namespace codeview diff --git a/llvm/include/llvm/DebugInfo/CodeView/TypeRecordMapping.h b/llvm/include/llvm/DebugInfo/CodeView/TypeRecordMapping.h index 4c309c10ff0c..b885d54afce6 100644 --- a/llvm/include/llvm/DebugInfo/CodeView/TypeRecordMapping.h +++ b/llvm/include/llvm/DebugInfo/CodeView/TypeRecordMapping.h @@ -23,11 +23,9 @@ class TypeRecordMapping : public TypeVisitorCallbacks { public: explicit TypeRecordMapping(BinaryStreamReader &Reader) : IO(Reader) {} explicit TypeRecordMapping(BinaryStreamWriter &Writer) : IO(Writer) {} - explicit TypeRecordMapping(CodeViewRecordStreamer &Streamer) : IO(Streamer) {} using TypeVisitorCallbacks::visitTypeBegin; Error visitTypeBegin(CVType &Record) override; - Error visitTypeBegin(CVType &Record, TypeIndex Index) override; Error visitTypeEnd(CVType &Record) override; Error visitMemberBegin(CVMemberRecord &Record) override; diff --git a/llvm/include/llvm/DebugInfo/CodeView/TypeVisitorCallbackPipeline.h b/llvm/include/llvm/DebugInfo/CodeView/TypeVisitorCallbackPipeline.h index 169715be2d52..fb0b579d6a06 100644 --- a/llvm/include/llvm/DebugInfo/CodeView/TypeVisitorCallbackPipeline.h +++ b/llvm/include/llvm/DebugInfo/CodeView/TypeVisitorCallbackPipeline.h @@ -82,11 +82,6 @@ public: Pipeline.push_back(&Callbacks); } - void addCallbackToPipelineFront(TypeVisitorCallbacks &Callbacks) { - auto CallBackItr = Pipeline.begin(); - Pipeline.insert(CallBackItr, &Callbacks); - } - #define TYPE_RECORD(EnumName, EnumVal, Name) \ Error visitKnownRecord(CVType &CVR, Name##Record &Record) override { \ return visitKnownRecordImpl(CVR, Record); \ diff --git a/llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp b/llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp index 61fe69843381..9f8ed86b50e9 100644 --- a/llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp +++ b/llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp @@ -51,7 +51,6 @@ #include "llvm/DebugInfo/CodeView/TypeIndex.h" #include "llvm/DebugInfo/CodeView/TypeRecord.h" #include "llvm/DebugInfo/CodeView/TypeTableCollection.h" -#include "llvm/DebugInfo/CodeView/TypeVisitorCallbackPipeline.h" #include "llvm/IR/Constants.h" #include "llvm/IR/DataLayout.h" #include "llvm/IR/DebugInfoMetadata.h" @@ -95,24 +94,6 @@ using namespace llvm; using namespace llvm::codeview; -namespace { -class CVMCAdapter : public CodeViewRecordStreamer { -public: - CVMCAdapter(MCStreamer &OS) : OS(&OS) {} - - void EmitBytes(StringRef Data) { OS->EmitBytes(Data); } - - void EmitIntValue(uint64_t Value, unsigned Size) { - OS->EmitIntValue(Value, Size); - } - - void EmitBinaryData(StringRef Data) { OS->EmitBinaryData(Data); } - -private: - MCStreamer *OS = nullptr; -}; -} // namespace - static CPUType mapArchToCVCPUType(Triple::ArchType Type) { switch (Type) { case Triple::ArchType::x86: @@ -636,40 +617,26 @@ void CodeViewDebug::emitTypeInformation() { // This will fail if the record data is invalid. CVType Record = Table.getType(*B); - TypeVisitorCallbackPipeline Pipeline; - CVMCAdapter CVMCOS(OS); - TypeRecordMapping typeMapping(CVMCOS); - SmallString<512> CommentBlock; - raw_svector_ostream CommentOS(CommentBlock); - if (OS.isVerboseAsm()) { // Emit a block comment describing the type record for readability. + SmallString<512> CommentBlock; + raw_svector_ostream CommentOS(CommentBlock); ScopedPrinter SP(CommentOS); SP.setPrefix(CommentPrefix); TypeDumpVisitor TDV(Table, &SP, false); - Pipeline.addCallbackToPipeline(TDV); - } - Pipeline.addCallbackToPipeline(typeMapping); - auto RecordLen = Record.length(); - auto RecordKind = Record.kind(); - OS.EmitIntValue(RecordLen - 2, 2); - OS.EmitIntValue(RecordKind, sizeof(RecordKind)); - - Error E = codeview::visitTypeRecord(Record, *B, Pipeline); - - if (E) { - logAllUnhandledErrors(std::move(E), errs(), "error: "); - llvm_unreachable("produced malformed type record"); - } - - if (OS.isVerboseAsm()) { + Error E = codeview::visitTypeRecord(Record, *B, TDV); + if (E) { + logAllUnhandledErrors(std::move(E), errs(), "error: "); + llvm_unreachable("produced malformed type record"); + } // emitRawComment will insert its own tab and comment string before // the first line, so strip off our first one. It also prints its own // newline. OS.emitRawComment( CommentOS.str().drop_front(CommentPrefix.size() - 1).rtrim()); } + OS.EmitBinaryData(Record.str_data()); B = Table.getNext(*B); } } diff --git a/llvm/lib/DebugInfo/CodeView/CVTypeVisitor.cpp b/llvm/lib/DebugInfo/CodeView/CVTypeVisitor.cpp index ec4773d571c8..dd6f75f97a4a 100644 --- a/llvm/lib/DebugInfo/CodeView/CVTypeVisitor.cpp +++ b/llvm/lib/DebugInfo/CodeView/CVTypeVisitor.cpp @@ -209,14 +209,6 @@ struct VisitHelper { } } - VisitHelper(TypeVisitorCallbackPipeline &Callbacks, VisitorDataSource Source) - : Visitor((Source == VDS_BytesPresent) ? Pipeline : Callbacks) { - if (Source == VDS_BytesPresent) { - Pipeline = Callbacks; - Pipeline.addCallbackToPipelineFront(Deserializer); - } - } - TypeDeserializer Deserializer; TypeVisitorCallbackPipeline Pipeline; CVTypeVisitor Visitor; @@ -230,13 +222,6 @@ Error llvm::codeview::visitTypeRecord(CVType &Record, TypeIndex Index, return V.Visitor.visitTypeRecord(Record, Index); } -Error llvm::codeview::visitTypeRecord(CVType &Record, TypeIndex Index, - TypeVisitorCallbackPipeline &Callbacks, - VisitorDataSource Source) { - VisitHelper V(Callbacks, Source); - return V.Visitor.visitTypeRecord(Record, Index); -} - Error llvm::codeview::visitTypeRecord(CVType &Record, TypeVisitorCallbacks &Callbacks, VisitorDataSource Source) { diff --git a/llvm/lib/DebugInfo/CodeView/CodeViewRecordIO.cpp b/llvm/lib/DebugInfo/CodeView/CodeViewRecordIO.cpp index 2b69a1e0768f..92c795ab8fa6 100644 --- a/llvm/lib/DebugInfo/CodeView/CodeViewRecordIO.cpp +++ b/llvm/lib/DebugInfo/CodeView/CodeViewRecordIO.cpp @@ -20,7 +20,6 @@ Error CodeViewRecordIO::beginRecord(Optional MaxLength) { Limit.MaxLength = MaxLength; Limit.BeginOffset = getCurrentOffset(); Limits.push_back(Limit); - resetStreamedLen(); return Error::success(); } @@ -35,29 +34,10 @@ Error CodeViewRecordIO::endRecord() { // 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(LF_PAD0 + PaddingBytes); - StringRef BytesSR = StringRef(&Pad, sizeof(Pad)); - Streamer->EmitBytes(BytesSR); - --PaddingBytes; - } - } 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 @@ -98,10 +78,7 @@ Error CodeViewRecordIO::skipPadding() { } Error CodeViewRecordIO::mapByteVectorTail(ArrayRef &Bytes) { - if (isStreaming()) { - Streamer->EmitBinaryData(toStringRef(Bytes)); - incrStreamedLen(Bytes.size()); - } else if (isWriting()) { + if (isWriting()) { if (auto EC = Writer->writeBytes(Bytes)) return EC; } else { @@ -122,28 +99,21 @@ Error CodeViewRecordIO::mapByteVectorTail(std::vector &Bytes) { } Error CodeViewRecordIO::mapInteger(TypeIndex &TypeInd) { - if (isStreaming()) { - Streamer->EmitIntValue(TypeInd.getIndex(), sizeof(TypeInd.getIndex())); - incrStreamedLen(sizeof(TypeInd.getIndex())); - } else if (isWriting()) { + 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(); } + + uint32_t I; + if (auto EC = Reader->readInteger(I)) + return EC; + TypeInd.setIndex(I); return Error::success(); } Error CodeViewRecordIO::mapEncodedInteger(int64_t &Value) { - if (isStreaming()) { - if (Value >= 0) - emitEncodedUnsignedInteger(static_cast(Value)); - else - emitEncodedSignedInteger(Value); - } else if (isWriting()) { + if (isWriting()) { if (Value >= 0) { if (auto EC = writeEncodedUnsignedInteger(static_cast(Value))) return EC; @@ -162,9 +132,7 @@ Error CodeViewRecordIO::mapEncodedInteger(int64_t &Value) { } Error CodeViewRecordIO::mapEncodedInteger(uint64_t &Value) { - if (isStreaming()) - emitEncodedUnsignedInteger(Value); - else if (isWriting()) { + if (isWriting()) { if (auto EC = writeEncodedUnsignedInteger(Value)) return EC; } else { @@ -177,26 +145,17 @@ Error CodeViewRecordIO::mapEncodedInteger(uint64_t &Value) { } Error CodeViewRecordIO::mapEncodedInteger(APSInt &Value) { - if (isStreaming()) { - if (Value.isSigned()) - emitEncodedSignedInteger(Value.getSExtValue()); - else - emitEncodedUnsignedInteger(Value.getZExtValue()); - } else if (isWriting()) { + if (isWriting()) { if (Value.isSigned()) return writeEncodedSignedInteger(Value.getSExtValue()); return writeEncodedUnsignedInteger(Value.getZExtValue()); - } else - return consume(*Reader, Value); - return Error::success(); + } + + return consume(*Reader, Value); } Error CodeViewRecordIO::mapStringZ(StringRef &Value) { - if (isStreaming()) { - auto NullTerminatedString = StringRef(Value.data(), Value.size() + 1); - Streamer->EmitBytes(NullTerminatedString); - incrStreamedLen(NullTerminatedString.size()); - } else if (isWriting()) { + if (isWriting()) { // Truncate if we attempt to write too much. StringRef S = Value.take_front(maxFieldLength() - 1); if (auto EC = Writer->writeCString(S)) @@ -210,15 +169,6 @@ Error CodeViewRecordIO::mapStringZ(StringRef &Value) { Error CodeViewRecordIO::mapGuid(GUID &Guid) { constexpr uint32_t GuidSize = 16; - - if (isStreaming()) { - StringRef GuidSR = - StringRef((reinterpret_cast(&Guid)), GuidSize); - Streamer->EmitBytes(GuidSR); - incrStreamedLen(GuidSize); - return Error::success(); - } - if (maxFieldLength() < GuidSize) return make_error(cv_error_code::insufficient_buffer); @@ -235,14 +185,12 @@ Error CodeViewRecordIO::mapGuid(GUID &Guid) { } Error CodeViewRecordIO::mapStringZVectorZ(std::vector &Value) { - - if (!isReading()) { + if (isWriting()) { for (auto V : Value) { if (auto EC = mapStringZ(V)) return EC; } - uint8_t FinalZero = 0; - if (auto EC = mapInteger(FinalZero)) + if (auto EC = Writer->writeInteger(0)) return EC; } else { StringRef S; @@ -257,46 +205,6 @@ Error CodeViewRecordIO::mapStringZVectorZ(std::vector &Value) { return Error::success(); } -void CodeViewRecordIO::emitEncodedSignedInteger(const int64_t &Value) { - assert(Value < 0 && "Encoded integer is not signed!"); - if (Value >= std::numeric_limits::min()) { - Streamer->EmitIntValue(LF_CHAR, 2); - Streamer->EmitIntValue(Value, 1); - incrStreamedLen(3); - } else if (Value >= std::numeric_limits::min()) { - Streamer->EmitIntValue(LF_SHORT, 2); - Streamer->EmitIntValue(Value, 2); - incrStreamedLen(4); - } else if (Value >= std::numeric_limits::min()) { - Streamer->EmitIntValue(LF_LONG, 2); - Streamer->EmitIntValue(Value, 4); - incrStreamedLen(6); - } else { - Streamer->EmitIntValue(LF_QUADWORD, 2); - Streamer->EmitIntValue(Value, 4); - incrStreamedLen(6); - } -} - -void CodeViewRecordIO::emitEncodedUnsignedInteger(const uint64_t &Value) { - if (Value < LF_NUMERIC) { - Streamer->EmitIntValue(Value, 2); - incrStreamedLen(2); - } else if (Value <= std::numeric_limits::max()) { - Streamer->EmitIntValue(LF_USHORT, 2); - Streamer->EmitIntValue(Value, 2); - incrStreamedLen(4); - } else if (Value <= std::numeric_limits::max()) { - Streamer->EmitIntValue(LF_ULONG, 2); - Streamer->EmitIntValue(Value, 4); - incrStreamedLen(6); - } else { - Streamer->EmitIntValue(LF_UQUADWORD, 2); - Streamer->EmitIntValue(Value, 8); - incrStreamedLen(6); - } -} - Error CodeViewRecordIO::writeEncodedSignedInteger(const int64_t &Value) { assert(Value < 0 && "Encoded integer is not signed!"); if (Value >= std::numeric_limits::min()) { diff --git a/llvm/lib/DebugInfo/CodeView/TypeRecordMapping.cpp b/llvm/lib/DebugInfo/CodeView/TypeRecordMapping.cpp index 104e310d41b9..12fb50d6ddcf 100644 --- a/llvm/lib/DebugInfo/CodeView/TypeRecordMapping.cpp +++ b/llvm/lib/DebugInfo/CodeView/TypeRecordMapping.cpp @@ -29,7 +29,7 @@ struct MapOneMethodRecord { error(IO.mapInteger(Method.Type)); if (Method.isIntroducingVirtual()) { error(IO.mapInteger(Method.VFTableOffset)); - } else if (IO.isReading()) + } else if (!IO.isWriting()) Method.VFTableOffset = -1; if (!IsFromOverloadList) @@ -72,9 +72,6 @@ static Error mapNameAndUniqueName(CodeViewRecordIO &IO, StringRef &Name, 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)); if (HasUniqueName) error(IO.mapStringZ(UniqueName)); @@ -99,10 +96,6 @@ Error TypeRecordMapping::visitTypeBegin(CVType &CVR) { return Error::success(); } -Error TypeRecordMapping::visitTypeBegin(CVType &CVR, TypeIndex Index) { - return visitTypeBegin(CVR); -} - Error TypeRecordMapping::visitTypeEnd(CVType &Record) { assert(TypeKind.hasValue() && "Not in a type mapping!"); assert(!MemberKind.hasValue() && "Still in a member mapping!"); @@ -133,7 +126,7 @@ 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 (!IO.isWriting()) { if (auto EC = IO.skipPadding()) return EC; } @@ -146,6 +139,7 @@ Error TypeRecordMapping::visitMemberEnd(CVMemberRecord &Record) { Error TypeRecordMapping::visitKnownRecord(CVType &CVR, ModifierRecord &Record) { error(IO.mapInteger(Record.ModifiedType)); error(IO.mapEnum(Record.Modifiers)); + return Error::success(); } @@ -178,6 +172,7 @@ Error TypeRecordMapping::visitKnownRecord(CVType &CVR, ArgListRecord &Record) { error(IO.mapVectorN( Record.ArgIndices, [](CodeViewRecordIO &IO, TypeIndex &N) { return IO.mapInteger(N); })); + return Error::success(); } @@ -195,7 +190,7 @@ Error TypeRecordMapping::visitKnownRecord(CVType &CVR, PointerRecord &Record) { error(IO.mapInteger(Record.Attrs)); if (Record.isPointerToMember()) { - if (IO.isReading()) + if (!IO.isWriting()) Record.MemberInfo.emplace(); MemberPointerInfo &M = *Record.MemberInfo; @@ -265,7 +260,7 @@ Error TypeRecordMapping::visitKnownRecord(CVType &CVR, BitFieldRecord &Record) { Error TypeRecordMapping::visitKnownRecord(CVType &CVR, VFTableShapeRecord &Record) { uint16_t Size; - if (!IO.isReading()) { + if (IO.isWriting()) { ArrayRef Slots = Record.getSlots(); Size = Slots.size(); error(IO.mapInteger(Size)); @@ -296,7 +291,7 @@ Error TypeRecordMapping::visitKnownRecord(CVType &CVR, VFTableRecord &Record) { error(IO.mapInteger(Record.OverriddenVFTable)); error(IO.mapInteger(Record.VFPtrOffset)); uint32_t NamesLen = 0; - if (!IO.isReading()) { + if (IO.isWriting()) { for (auto Name : Record.MethodNames) NamesLen += Name.size() + 1; } diff --git a/llvm/test/DebugInfo/COFF/anonymous-struct.ll b/llvm/test/DebugInfo/COFF/anonymous-struct.ll index 3b31f23fd2ef..7bd857e0924c 100644 --- a/llvm/test/DebugInfo/COFF/anonymous-struct.ll +++ b/llvm/test/DebugInfo/COFF/anonymous-struct.ll @@ -1,5 +1,4 @@ ; RUN: llc < %s -filetype=obj | llvm-readobj - --codeview | FileCheck %s -; RUN: llc < %s | llvm-mc -filetype=obj --triple=i686-windows | llvm-readobj - --codeview | FileCheck %s ; C++ source to regenerate: ; struct S { diff --git a/llvm/test/DebugInfo/COFF/big-type.ll b/llvm/test/DebugInfo/COFF/big-type.ll index 1e1e8bc9c918..67059eeab0cd 100644 --- a/llvm/test/DebugInfo/COFF/big-type.ll +++ b/llvm/test/DebugInfo/COFF/big-type.ll @@ -1,5 +1,4 @@ ; RUN: llc -filetype=obj < %s | llvm-readobj - --codeview | FileCheck %s -; RUN: llc < %s | llvm-mc -filetype=obj --triple=x86_64-windows | llvm-readobj - --codeview | FileCheck %s ; We need three continuation records for this. diff --git a/llvm/test/DebugInfo/COFF/class-options-common.ll b/llvm/test/DebugInfo/COFF/class-options-common.ll index 46350552e079..e832328f5c35 100644 --- a/llvm/test/DebugInfo/COFF/class-options-common.ll +++ b/llvm/test/DebugInfo/COFF/class-options-common.ll @@ -1,5 +1,4 @@ ; RUN: llc < %s -filetype=obj | llvm-readobj - --codeview | FileCheck %s -; RUN: llc < %s | llvm-mc -filetype=obj --triple=x86_64-windows | llvm-readobj - --codeview | FileCheck %s ; ; Command to generate function-options.ll ; $ clang++ class-options-common.cpp -S -emit-llvm -g -gcodeview -o class-options-common.ll diff --git a/llvm/test/DebugInfo/COFF/const-unnamed-member.ll b/llvm/test/DebugInfo/COFF/const-unnamed-member.ll index 5a012ce49bcd..1dfe885a766a 100644 --- a/llvm/test/DebugInfo/COFF/const-unnamed-member.ll +++ b/llvm/test/DebugInfo/COFF/const-unnamed-member.ll @@ -1,5 +1,4 @@ ; RUN: llc -filetype=obj < %s | llvm-readobj --codeview - | FileCheck %s -; RUN: llc < %s | llvm-mc -filetype=obj --triple=i686-windows | llvm-readobj --codeview - | FileCheck %s ; Objective-C++ source demonstrating the issue: ; void (^b)(void) = []() {}; diff --git a/llvm/test/DebugInfo/COFF/defer-complete-type.ll b/llvm/test/DebugInfo/COFF/defer-complete-type.ll index 8b4e57afaa22..3ece1fd8cc64 100644 --- a/llvm/test/DebugInfo/COFF/defer-complete-type.ll +++ b/llvm/test/DebugInfo/COFF/defer-complete-type.ll @@ -1,5 +1,4 @@ ; RUN: llc < %s -filetype=obj | llvm-readobj - --codeview | FileCheck %s -; RUN: llc < %s | llvm-mc -filetype=obj --triple=x86_64-windows | llvm-readobj - --codeview | FileCheck %s ; Both A and B should get forward declarations and complete definitions for this ; example. diff --git a/llvm/test/DebugInfo/COFF/enum-co.ll b/llvm/test/DebugInfo/COFF/enum-co.ll index bdd4d0f70bd1..2059918ba84f 100644 --- a/llvm/test/DebugInfo/COFF/enum-co.ll +++ b/llvm/test/DebugInfo/COFF/enum-co.ll @@ -1,5 +1,4 @@ ; RUN: llc < %s -filetype=obj | llvm-readobj - --codeview | FileCheck %s -; RUN: llc < %s | llvm-mc -filetype=obj --triple=x86_64-windows | llvm-readobj - --codeview | FileCheck %s ; Command to generate enum-co.ll ; $ clang++ enum-co.cpp -S -emit-llvm -g -gcodeview -o enum-co.ll diff --git a/llvm/test/DebugInfo/COFF/enum.ll b/llvm/test/DebugInfo/COFF/enum.ll index 6580c512371f..15bbce0d4687 100644 --- a/llvm/test/DebugInfo/COFF/enum.ll +++ b/llvm/test/DebugInfo/COFF/enum.ll @@ -1,5 +1,4 @@ ; RUN: llc < %s -filetype=obj | llvm-readobj - --codeview | FileCheck %s -; RUN: llc < %s | llvm-mc -filetype=obj --triple=i686-windows | llvm-readobj - --codeview | FileCheck %s ; Generated from the following C++ source: ; enum E : int { BLAH }; diff --git a/llvm/test/DebugInfo/COFF/function-options.ll b/llvm/test/DebugInfo/COFF/function-options.ll index 76831e7d488f..50058dec9432 100644 --- a/llvm/test/DebugInfo/COFF/function-options.ll +++ b/llvm/test/DebugInfo/COFF/function-options.ll @@ -1,5 +1,4 @@ ; RUN: llc < %s -filetype=obj | llvm-readobj - --codeview | FileCheck %s -; RUN: llc < %s | llvm-mc -filetype=obj --triple=x86_64-windows | llvm-readobj - --codeview | FileCheck %s ; ; Command to generate function-options.ll ; $ clang++ function-options.cpp -S -emit-llvm -g -gcodeview -o function-options.ll diff --git a/llvm/test/DebugInfo/COFF/globals.ll b/llvm/test/DebugInfo/COFF/globals.ll index a9a437db7394..22f3f3238f8b 100644 --- a/llvm/test/DebugInfo/COFF/globals.ll +++ b/llvm/test/DebugInfo/COFF/globals.ll @@ -1,6 +1,5 @@ ; RUN: llc < %s | FileCheck %s --check-prefix=ASM ; RUN: llc < %s -filetype=obj | llvm-readobj - --codeview | FileCheck %s --check-prefix=OBJ -; RUN: llc < %s | llvm-mc -filetype=obj --triple=x86_64-windows | llvm-readobj - --codeview | FileCheck %s --check-prefix=OBJ ; RUN: llc < %s -filetype=obj | obj2yaml | FileCheck %s --check-prefix=YAML ; C++ source to regenerate: diff --git a/llvm/test/DebugInfo/COFF/inheritance.ll b/llvm/test/DebugInfo/COFF/inheritance.ll index b2f487a8f35c..2e10a10cc4c8 100644 --- a/llvm/test/DebugInfo/COFF/inheritance.ll +++ b/llvm/test/DebugInfo/COFF/inheritance.ll @@ -1,5 +1,4 @@ ; RUN: llc < %s -filetype=obj -o - | llvm-readobj - --codeview | FileCheck %s -; RUN: llc < %s -o - | llvm-mc -filetype=obj --triple=x86_64-windows | llvm-readobj - --codeview | FileCheck %s ; C++ source to regenerate: ; $ cat t.cpp diff --git a/llvm/test/DebugInfo/COFF/inlining-padding.ll b/llvm/test/DebugInfo/COFF/inlining-padding.ll index 404ff6df4b39..1b2d1138be32 100644 --- a/llvm/test/DebugInfo/COFF/inlining-padding.ll +++ b/llvm/test/DebugInfo/COFF/inlining-padding.ll @@ -1,5 +1,4 @@ ; RUN: llc < %s -filetype=obj -o - | llvm-readobj --codeview --codeview-subsection-bytes | FileCheck %s -; RUN: llc < %s -o - | llvm-mc -filetype=obj --triple=x86_64-windows | llvm-readobj --codeview --codeview-subsection-bytes | FileCheck %s ; Check how we pad out the LF_FUNC_ID records. The 00F3F2F1 bytes in LeafData are ; what's interesting here. diff --git a/llvm/test/DebugInfo/COFF/inlining-same-name.ll b/llvm/test/DebugInfo/COFF/inlining-same-name.ll index 5267b4787757..4bca6f7d2622 100644 --- a/llvm/test/DebugInfo/COFF/inlining-same-name.ll +++ b/llvm/test/DebugInfo/COFF/inlining-same-name.ll @@ -1,5 +1,4 @@ ; RUN: llc -mtriple=x86_64-windows-msvc < %s -filetype=obj -o - | llvm-readobj - --codeview | FileCheck %s -; RUN: llc -mtriple=x86_64-windows-msvc < %s -o - | llvm-mc -filetype=obj --triple=x86_64-windows | llvm-readobj - --codeview | FileCheck %s ; We should only get one func id record, and both inlinees should point to it, ; even though there are two DISubprograms. diff --git a/llvm/test/DebugInfo/COFF/inlining.ll b/llvm/test/DebugInfo/COFF/inlining.ll index 981ae5aad8ef..64e1253dce32 100644 --- a/llvm/test/DebugInfo/COFF/inlining.ll +++ b/llvm/test/DebugInfo/COFF/inlining.ll @@ -81,6 +81,8 @@ ; ASM: # Arguments [ ; ASM: # ] ; ASM: # } +; ASM: .byte 0x06, 0x00, 0x01, 0x12 +; ASM: .byte 0x00, 0x00, 0x00, 0x00 ; ASM: # Procedure (0x1001) { ; ASM: # TypeLeafKind: LF_PROCEDURE (0x1008) ; ASM: # ReturnType: void (0x3) @@ -90,18 +92,30 @@ ; ASM: # NumParameters: 0 ; ASM: # ArgListType: () (0x1000) ; ASM: # } +; ASM: .byte 0x0e, 0x00, 0x08, 0x10 +; ASM: .byte 0x03, 0x00, 0x00, 0x00 +; ASM: .byte 0x00, 0x00, 0x00, 0x00 +; ASM: .byte 0x00, 0x10, 0x00, 0x00 ; ASM: # FuncId (0x1002) { ; ASM: # TypeLeafKind: LF_FUNC_ID (0x1601) ; ASM: # ParentScope: 0x0 ; ASM: # FunctionType: void () (0x1001) ; ASM: # Name: bar ; ASM: # } +; ASM: .byte 0x0e, 0x00, 0x01, 0x16 +; ASM: .byte 0x00, 0x00, 0x00, 0x00 +; ASM: .byte 0x01, 0x10, 0x00, 0x00 +; ASM: .byte 0x62, 0x61, 0x72, 0x00 ; ASM: # FuncId (0x1003) { ; ASM: # TypeLeafKind: LF_FUNC_ID (0x1601) ; ASM: # ParentScope: 0x0 ; ASM: # FunctionType: void () (0x1001) ; ASM: # Name: foo ; ASM: # } +; ASM: .byte 0x0e, 0x00, 0x01, 0x16 +; ASM: .byte 0x00, 0x00, 0x00, 0x00 +; ASM: .byte 0x01, 0x10, 0x00, 0x00 +; ASM: .byte 0x66, 0x6f, 0x6f, 0x00 ; We should only the LF_FUNC_ID records that we needed to reference. ; OBJ: CodeViewTypes [ diff --git a/llvm/test/DebugInfo/COFF/lambda.ll b/llvm/test/DebugInfo/COFF/lambda.ll index 45a374bbb9ac..83e8e02e2e6f 100644 --- a/llvm/test/DebugInfo/COFF/lambda.ll +++ b/llvm/test/DebugInfo/COFF/lambda.ll @@ -1,5 +1,4 @@ ; RUN: llc < %s -filetype=obj | llvm-readobj - --codeview | FileCheck %s -; RUN: llc < %s | llvm-mc -filetype=obj --triple=i686-windows | llvm-readobj - --codeview | FileCheck %s ; ; Verify lambda routines are emitted properly in CodeView. ; diff --git a/llvm/test/DebugInfo/COFF/long-type-name.ll b/llvm/test/DebugInfo/COFF/long-type-name.ll index 1488e0891fc8..93ac80ae7115 100644 --- a/llvm/test/DebugInfo/COFF/long-type-name.ll +++ b/llvm/test/DebugInfo/COFF/long-type-name.ll @@ -1,5 +1,4 @@ ; RUN: llc %s -o - -filetype=obj | llvm-readobj --codeview | FileCheck %s -; RUN: llc %s -o - | llvm-mc -filetype=obj --triple=x86_64-windows | llvm-readobj --codeview | FileCheck %s ; CHECK: Struct (0x1000) { ; CHECK: TypeLeafKind: LF_STRUCTURE (0x1505) diff --git a/llvm/test/DebugInfo/COFF/nested-types.ll b/llvm/test/DebugInfo/COFF/nested-types.ll index c68e4314925a..9579dafee2c5 100644 --- a/llvm/test/DebugInfo/COFF/nested-types.ll +++ b/llvm/test/DebugInfo/COFF/nested-types.ll @@ -1,5 +1,4 @@ ; RUN: llc < %s -filetype=obj | llvm-readobj - --codeview | FileCheck %s -; RUN: llc < %s | llvm-mc -filetype=obj --triple=x86_64-windows | llvm-readobj - --codeview | FileCheck %s ; C++ source to regenerate: ; struct HasNested { diff --git a/llvm/test/DebugInfo/COFF/retained-types.ll b/llvm/test/DebugInfo/COFF/retained-types.ll index 8d4253b827a5..9e26b82cfe1f 100644 --- a/llvm/test/DebugInfo/COFF/retained-types.ll +++ b/llvm/test/DebugInfo/COFF/retained-types.ll @@ -1,5 +1,4 @@ ; RUN: llc < %s -filetype=obj | llvm-readobj - --codeview | FileCheck %s -; RUN: llc < %s | llvm-mc -filetype=obj --triple=x86_64-windows | llvm-readobj - --codeview | FileCheck %s ; This test checks that types which are used in expressions, but for which ; there are no variables, known as retained types, get emitted. diff --git a/llvm/test/DebugInfo/COFF/scopes.ll b/llvm/test/DebugInfo/COFF/scopes.ll index 23509b4c5b69..a644ea9c5b32 100644 --- a/llvm/test/DebugInfo/COFF/scopes.ll +++ b/llvm/test/DebugInfo/COFF/scopes.ll @@ -1,5 +1,4 @@ ; RUN: llc < %s -filetype=obj | llvm-readobj - --codeview | FileCheck %s -; RUN: llc < %s | llvm-mc -filetype=obj --triple=x86_64-windows | llvm-readobj - --codeview | FileCheck %s ; Check that we keep namespace scopes around the same way MSVC does. ; We do function scopes slightly differently, but everything should be alright. diff --git a/llvm/test/DebugInfo/COFF/static-methods.ll b/llvm/test/DebugInfo/COFF/static-methods.ll index 1e51f80c5dde..eb1925676296 100644 --- a/llvm/test/DebugInfo/COFF/static-methods.ll +++ b/llvm/test/DebugInfo/COFF/static-methods.ll @@ -1,5 +1,4 @@ ; RUN: llc < %s -filetype=obj | llvm-readobj - --codeview | FileCheck %s -; RUN: llc < %s | llvm-mc -filetype=obj --triple=i686-windows | llvm-readobj - --codeview | FileCheck %s ; Check for the appropriate MethodKind below. diff --git a/llvm/test/DebugInfo/COFF/type-quals.ll b/llvm/test/DebugInfo/COFF/type-quals.ll index fbe7f6c5b70d..605dc187adc7 100644 --- a/llvm/test/DebugInfo/COFF/type-quals.ll +++ b/llvm/test/DebugInfo/COFF/type-quals.ll @@ -1,5 +1,4 @@ ; RUN: llc < %s -filetype=obj | llvm-readobj - --codeview | FileCheck %s -; RUN: llc < %s | llvm-mc -filetype=obj --triple=x86_64-windows | llvm-readobj - --codeview | FileCheck %s ; C++ source to regenerate: ; $ cat m.cpp diff --git a/llvm/test/DebugInfo/COFF/types-array-advanced.ll b/llvm/test/DebugInfo/COFF/types-array-advanced.ll index 3aa0686e2032..ea10142bd6e1 100644 --- a/llvm/test/DebugInfo/COFF/types-array-advanced.ll +++ b/llvm/test/DebugInfo/COFF/types-array-advanced.ll @@ -1,5 +1,4 @@ ; RUN: llc < %s -filetype=obj | llvm-readobj - --codeview | FileCheck %s -; RUN: llc < %s | llvm-mc -filetype=obj --triple=i686-windows | llvm-readobj - --codeview | FileCheck %s ; C++ source to regenerate: ; $ cat t.cpp diff --git a/llvm/test/DebugInfo/COFF/types-array-unsized.ll b/llvm/test/DebugInfo/COFF/types-array-unsized.ll index abfcbbfebd32..c9e800c356de 100644 --- a/llvm/test/DebugInfo/COFF/types-array-unsized.ll +++ b/llvm/test/DebugInfo/COFF/types-array-unsized.ll @@ -1,5 +1,4 @@ ; RUN: llc -filetype=obj < %s | llvm-readobj --codeview | FileCheck %s -; RUN: llc < %s | llvm-mc -filetype=obj --triple=x86_64-windows | llvm-readobj --codeview | FileCheck %s ; We should emit two array types: one used to describe the static data member, ; and the other used by the S_GDATA32 for the definition. diff --git a/llvm/test/DebugInfo/COFF/types-array.ll b/llvm/test/DebugInfo/COFF/types-array.ll index 7473c83f1a20..852d39546d88 100644 --- a/llvm/test/DebugInfo/COFF/types-array.ll +++ b/llvm/test/DebugInfo/COFF/types-array.ll @@ -1,5 +1,4 @@ ; RUN: llc < %s -filetype=obj | llvm-readobj - --codeview | FileCheck %s -; RUN: llc < %s | llvm-mc -filetype=obj --triple=i686-windows | llvm-readobj - --codeview | FileCheck %s ; C++ source to regenerate: ; $ cat t.cpp diff --git a/llvm/test/DebugInfo/COFF/types-basic.ll b/llvm/test/DebugInfo/COFF/types-basic.ll index 343615a2e652..773b2a1cc1e9 100644 --- a/llvm/test/DebugInfo/COFF/types-basic.ll +++ b/llvm/test/DebugInfo/COFF/types-basic.ll @@ -1,6 +1,4 @@ ; RUN: llc < %s -filetype=obj | llvm-readobj - --codeview | FileCheck %s -; RUN: llc < %s | llvm-mc -filetype=obj --triple=x86_64-windows | llvm-readobj - --codeview | FileCheck %s -; RUN: llc < %s | FileCheck %s --check-prefix=ASM ; C++ source to regenerate: ; $ cat t.cpp @@ -347,373 +345,6 @@ ; CHECK: ] ; CHECK: ] - - -; ASM: .section .debug$T,"dr" -; ASM: .p2align 2 -; ASM: .long 4 # Debug section magic -; ASM: .short 18 -; ASM: .short 4609 -; ASM: .long 3 -; ASM: .long 64 -; ASM: .long 65 -; ASM: .long 19 -; ASM: # ArgList (0x1000) { -; ASM: # TypeLeafKind: LF_ARGLIST (0x1201) -; ASM: # NumArgs: 3 -; ASM: # Arguments [ -; ASM: # ArgType: float (0x40) -; ASM: # ArgType: double (0x41) -; ASM: # ArgType: __int64 (0x13) -; ASM: # ] -; ASM: # } -; ASM: .short 14 -; ASM: .short 4104 -; ASM: .long 3 -; ASM: .byte 0 -; ASM: .byte 0 -; ASM: .short 3 -; ASM: .long 4096 -; ASM: # Procedure (0x1001) { -; ASM: # TypeLeafKind: LF_PROCEDURE (0x1008) -; ASM: # ReturnType: void (0x3) -; ASM: # CallingConvention: NearC (0x0) -; ASM: # FunctionOptions [ (0x0) -; ASM: # ] -; ASM: # NumParameters: 3 -; ASM: # ArgListType: (float, double, __int64) (0x1000) -; ASM: # } -; ASM: .short 14 -; ASM: .short 5633 -; ASM: .long 0 -; ASM: .long 4097 -; ASM: .asciz "f" -; ASM: .byte 242 -; ASM: .byte 241 -; ASM: # FuncId (0x1002) { -; ASM: # TypeLeafKind: LF_FUNC_ID (0x1601) -; ASM: # ParentScope: 0x0 -; ASM: # FunctionType: void (float, double, __int64) (0x1001) -; ASM: # Name: f -; ASM: # } -; ASM: .short 10 -; ASM: .short 4097 -; ASM: .long 116 -; ASM: .short 1 -; ASM: .byte 242 -; ASM: .byte 241 -; ASM: # Modifier (0x1003) { -; ASM: # TypeLeafKind: LF_MODIFIER (0x1001) -; ASM: # ModifiedType: int (0x74) -; ASM: # Modifiers [ (0x1) -; ASM: # Const (0x1) -; ASM: # ] -; ASM: # } -; ASM: .short 10 -; ASM: .short 4098 -; ASM: .long 4099 -; ASM: .long 65548 -; ASM: # Pointer (0x1004) { -; ASM: # TypeLeafKind: LF_POINTER (0x1002) -; ASM: # PointeeType: const int (0x1003) -; ASM: # PtrType: Near64 (0xC) -; ASM: # PtrMode: Pointer (0x0) -; ASM: # IsFlat: 0 -; ASM: # IsConst: 0 -; ASM: # IsVolatile: 0 -; ASM: # IsUnaligned: 0 -; ASM: # IsRestrict: 0 -; ASM: # IsThisPtr&: 0 -; ASM: # IsThisPtr&&: 0 -; ASM: # SizeOf: 8 -; ASM: # } -; ASM: .short 22 -; ASM: .short 5381 -; ASM: .short 0 -; ASM: .short 128 -; ASM: .long 0 -; ASM: .long 0 -; ASM: .long 0 -; ASM: .short 0 -; ASM: .asciz "A" -; ASM: # Struct (0x1005) { -; ASM: # TypeLeafKind: LF_STRUCTURE (0x1505) -; ASM: # MemberCount: 0 -; ASM: # Properties [ (0x80) -; ASM: # ForwardReference (0x80) -; ASM: # ] -; ASM: # FieldList: 0x0 -; ASM: # DerivedFrom: 0x0 -; ASM: # VShape: 0x0 -; ASM: # SizeOf: 0 -; ASM: # Name: A -; ASM: # } -; ASM: .short 18 -; ASM: .short 4098 -; ASM: .long 116 -; ASM: .long 32844 -; ASM: .long 4101 -; ASM: .short 4 -; ASM: .byte 242 -; ASM: .byte 241 -; ASM: # Pointer (0x1006) { -; ASM: # TypeLeafKind: LF_POINTER (0x1002) -; ASM: # PointeeType: int (0x74) -; ASM: # PtrType: Near64 (0xC) -; ASM: # PtrMode: PointerToDataMember (0x2) -; ASM: # IsFlat: 0 -; ASM: # IsConst: 0 -; ASM: # IsVolatile: 0 -; ASM: # IsUnaligned: 0 -; ASM: # IsRestrict: 0 -; ASM: # IsThisPtr&: 0 -; ASM: # IsThisPtr&&: 0 -; ASM: # SizeOf: 4 -; ASM: # ClassType: A (0x1005) -; ASM: # Representation: GeneralData (0x4) -; ASM: # } -; ASM: .short 10 -; ASM: .short 4098 -; ASM: .long 4101 -; ASM: .long 66572 -; ASM: # Pointer (0x1007) { -; ASM: # TypeLeafKind: LF_POINTER (0x1002) -; ASM: # PointeeType: A (0x1005) -; ASM: # PtrType: Near64 (0xC) -; ASM: # PtrMode: Pointer (0x0) -; ASM: # IsFlat: 0 -; ASM: # IsConst: 1 -; ASM: # IsVolatile: 0 -; ASM: # IsUnaligned: 0 -; ASM: # IsRestrict: 0 -; ASM: # IsThisPtr&: 0 -; ASM: # IsThisPtr&&: 0 -; ASM: # SizeOf: 8 -; ASM: # } -; ASM: .short 6 -; ASM: .short 4609 -; ASM: .long 0 -; ASM: # ArgList (0x1008) { -; ASM: # TypeLeafKind: LF_ARGLIST (0x1201) -; ASM: # NumArgs: 0 -; ASM: # Arguments [ -; ASM: # ] -; ASM: # } -; ASM: .short 26 -; ASM: .short 4105 -; ASM: .long 3 -; ASM: .long 4101 -; ASM: .long 4103 -; ASM: .byte 0 -; ASM: .byte 0 -; ASM: .short 0 -; ASM: .long 4104 -; ASM: .long 0 -; ASM: # MemberFunction (0x1009) { -; ASM: # TypeLeafKind: LF_MFUNCTION (0x1009) -; ASM: # ReturnType: void (0x3) -; ASM: # ClassType: A (0x1005) -; ASM: # ThisType: A* const (0x1007) -; ASM: # CallingConvention: NearC (0x0) -; ASM: # FunctionOptions [ (0x0) -; ASM: # ] -; ASM: # NumParameters: 0 -; ASM: # ArgListType: () (0x1008) -; ASM: # ThisAdjustment: 0 -; ASM: # } -; ASM: .short 30 -; ASM: .short 4611 -; ASM: .byte 0x0d, 0x15, 0x03, 0x00 -; ASM: .byte 0x74, 0x00, 0x00, 0x00 -; ASM: .byte 0x00, 0x00, 0x61, 0x00 -; ASM: .byte 0x11, 0x15, 0x03, 0x00 -; ASM: .byte 0x09, 0x10, 0x00, 0x00 -; ASM: .byte 0x41, 0x3a, 0x3a, 0x66 -; ASM: .byte 0x00, 0xf3, 0xf2, 0xf1 -; ASM: # FieldList (0x100A) { -; ASM: # TypeLeafKind: LF_FIELDLIST (0x1203) -; ASM: # DataMember { -; ASM: # TypeLeafKind: LF_MEMBER (0x150D) -; ASM: # AccessSpecifier: Public (0x3) -; ASM: # Type: int (0x74) -; ASM: # FieldOffset: 0x0 -; ASM: # Name: a -; ASM: # } -; ASM: # OneMethod { -; ASM: # TypeLeafKind: LF_ONEMETHOD (0x1511) -; ASM: # AccessSpecifier: Public (0x3) -; ASM: # Type: void A::() (0x1009) -; ASM: # Name: A::f -; ASM: # } -; ASM: # } -; ASM: .short 22 -; ASM: .short 5381 -; ASM: .short 2 -; ASM: .short 0 -; ASM: .long 4106 -; ASM: .long 0 -; ASM: .long 0 -; ASM: .short 4 -; ASM: .asciz "A" -; ASM: # Struct (0x100B) { -; ASM: # TypeLeafKind: LF_STRUCTURE (0x1505) -; ASM: # MemberCount: 2 -; ASM: # Properties [ (0x0) -; ASM: # ] -; ASM: # FieldList: (0x100A) -; ASM: # DerivedFrom: 0x0 -; ASM: # VShape: 0x0 -; ASM: # SizeOf: 4 -; ASM: # Name: A -; ASM: # } -; ASM: .short 30 -; ASM: .short 5637 -; ASM: .long 0 -; ASM: .asciz "D:\\src\\llvm\\build\\t.cpp" -; ASM: # StringId (0x100C) { -; ASM: # TypeLeafKind: LF_STRING_ID (0x1605) -; ASM: # Id: 0x0 -; ASM: # StringData: D:\src\llvm\build\t.cpp -; ASM: # } -; ASM: .short 14 -; ASM: .short 5638 -; ASM: .long 4107 -; ASM: .long 4108 -; ASM: .long 1 -; ASM: # UdtSourceLine (0x100D) { -; ASM: # TypeLeafKind: LF_UDT_SRC_LINE (0x1606) -; ASM: # UDT: A (0x100B) -; ASM: # SourceFile: D:\src\llvm\build\t.cpp (0x100C) -; ASM: # LineNumber: 1 -; ASM: # } -; ASM: .short 18 -; ASM: .short 4098 -; ASM: .long 4105 -; ASM: .long 65644 -; ASM: .long 4101 -; ASM: .short 8 -; ASM: .byte 242 -; ASM: .byte 241 -; ASM: # Pointer (0x100E) { -; ASM: # TypeLeafKind: LF_POINTER (0x1002) -; ASM: # PointeeType: void A::() (0x1009) -; ASM: # PtrType: Near64 (0xC) -; ASM: # PtrMode: PointerToMemberFunction (0x3) -; ASM: # IsFlat: 0 -; ASM: # IsConst: 0 -; ASM: # IsVolatile: 0 -; ASM: # IsUnaligned: 0 -; ASM: # IsRestrict: 0 -; ASM: # IsThisPtr&: 0 -; ASM: # IsThisPtr&&: 0 -; ASM: # SizeOf: 8 -; ASM: # ClassType: A (0x1005) -; ASM: # Representation: GeneralFunction (0x8) -; ASM: # } -; ASM: .short 10 -; ASM: .short 4097 -; ASM: .long 3 -; ASM: .short 1 -; ASM: .byte 242 -; ASM: .byte 241 -; ASM: # Modifier (0x100F) { -; ASM: # TypeLeafKind: LF_MODIFIER (0x1001) -; ASM: # ModifiedType: void (0x3) -; ASM: # Modifiers [ (0x1) -; ASM: # Const (0x1) -; ASM: # ] -; ASM: # } -; ASM: .short 10 -; ASM: .short 4098 -; ASM: .long 4111 -; ASM: .long 65548 -; ASM: # Pointer (0x1010) { -; ASM: # TypeLeafKind: LF_POINTER (0x1002) -; ASM: # PointeeType: const void (0x100F) -; ASM: # PtrType: Near64 (0xC) -; ASM: # PtrMode: Pointer (0x0) -; ASM: # IsFlat: 0 -; ASM: # IsConst: 0 -; ASM: # IsVolatile: 0 -; ASM: # IsUnaligned: 0 -; ASM: # IsRestrict: 0 -; ASM: # IsThisPtr&: 0 -; ASM: # IsThisPtr&&: 0 -; ASM: # SizeOf: 8 -; ASM: # } -; ASM: .short 14 -; ASM: .short 4104 -; ASM: .long 3 -; ASM: .byte 0 -; ASM: .byte 0 -; ASM: .short 0 -; ASM: .long 4104 -; ASM: # Procedure (0x1011) { -; ASM: # TypeLeafKind: LF_PROCEDURE (0x1008) -; ASM: # ReturnType: void (0x3) -; ASM: # CallingConvention: NearC (0x0) -; ASM: # FunctionOptions [ (0x0) -; ASM: # ] -; ASM: # NumParameters: 0 -; ASM: # ArgListType: () (0x1008) -; ASM: # } -; ASM: .short 22 -; ASM: .short 5633 -; ASM: .long 0 -; ASM: .long 4113 -; ASM: .asciz "CharTypes" -; ASM: .byte 242 -; ASM: .byte 241 -; ASM: # FuncId (0x1012) { -; ASM: # TypeLeafKind: LF_FUNC_ID (0x1601) -; ASM: # ParentScope: 0x0 -; ASM: # FunctionType: void () (0x1011) -; ASM: # Name: CharTypes -; ASM: # } -; ASM: .short 26 -; ASM: .short 5637 -; ASM: .long 0 -; ASM: .asciz "D:\\src\\llvm\\build" -; ASM: .byte 242 -; ASM: .byte 241 -; ASM: # StringId (0x1013) { -; ASM: # TypeLeafKind: LF_STRING_ID (0x1605) -; ASM: # Id: 0x0 -; ASM: # StringData: D:\src\llvm\build -; ASM: # } -; ASM: .short 14 -; ASM: .short 5637 -; ASM: .long 0 -; ASM: .asciz "t.cpp" -; ASM: .byte 242 -; ASM: .byte 241 -; ASM: # StringId (0x1014) { -; ASM: # TypeLeafKind: LF_STRING_ID (0x1605) -; ASM: # Id: 0x0 -; ASM: # StringData: t.cpp -; ASM: # } -; ASM: .short 26 -; ASM: .short 5635 -; ASM: .short 5 -; ASM: .long 4115 -; ASM: .long 0 -; ASM: .long 4116 -; ASM: .long 0 -; ASM: .long 0 -; ASM: .byte 242 -; ASM: .byte 241 -; ASM: # BuildInfo (0x1015) { -; ASM: # TypeLeafKind: LF_BUILDINFO (0x1603) -; ASM: # NumArgs: 5 -; ASM: # Arguments [ -; ASM: # ArgType: D:\src\llvm\build (0x1013) -; ASM: # ArgType: 0x0 -; ASM: # ArgType: t.cpp (0x1014) -; ASM: # ArgType: 0x0 -; ASM: # ArgType: 0x0 -; ASM: # ] -; ASM: # } - ; ModuleID = 't.cpp' source_filename = "t.cpp" target datalayout = "e-m:w-i64:64-f80:128-n8:16:32:64-S128" diff --git a/llvm/test/DebugInfo/COFF/types-calling-conv.ll b/llvm/test/DebugInfo/COFF/types-calling-conv.ll index 0adac0095bbd..f0a4fe1ea8bb 100644 --- a/llvm/test/DebugInfo/COFF/types-calling-conv.ll +++ b/llvm/test/DebugInfo/COFF/types-calling-conv.ll @@ -1,5 +1,4 @@ ; RUN: llc < %s -filetype=obj -o - | llvm-readobj - --codeview | FileCheck %s -; RUN: llc < %s -o - | llvm-mc -filetype=obj --triple=i386-windows | llvm-readobj - --codeview | FileCheck %s ; C++ source to regenerate: ; $ cat t.cpp diff --git a/llvm/test/DebugInfo/COFF/types-cvarargs.ll b/llvm/test/DebugInfo/COFF/types-cvarargs.ll index 80b1252e81d1..88b59e4fe00b 100644 --- a/llvm/test/DebugInfo/COFF/types-cvarargs.ll +++ b/llvm/test/DebugInfo/COFF/types-cvarargs.ll @@ -1,5 +1,4 @@ ; RUN: llc < %s -filetype=obj | llvm-readobj - --codeview | FileCheck %s -; RUN: llc < %s | llvm-mc -filetype=obj --triple=x86_64-windows | llvm-readobj - --codeview | FileCheck %s ; C++ source to regenerate: ; $ cat t.cpp diff --git a/llvm/test/DebugInfo/COFF/types-data-members.ll b/llvm/test/DebugInfo/COFF/types-data-members.ll index 842df34c5e8e..d8cff6b7a080 100644 --- a/llvm/test/DebugInfo/COFF/types-data-members.ll +++ b/llvm/test/DebugInfo/COFF/types-data-members.ll @@ -1,5 +1,4 @@ ; RUN: llc < %s -filetype=obj | llvm-readobj - --codeview | FileCheck %s -; RUN: llc < %s | llvm-mc -filetype=obj --triple=x86_64-windows | llvm-readobj - --codeview | FileCheck %s ; C++ source to regenerate: ; $ cat t.cpp diff --git a/llvm/test/DebugInfo/COFF/types-empty-member-fn.ll b/llvm/test/DebugInfo/COFF/types-empty-member-fn.ll index 4cbe0a1fd2cc..003b9c89b134 100644 --- a/llvm/test/DebugInfo/COFF/types-empty-member-fn.ll +++ b/llvm/test/DebugInfo/COFF/types-empty-member-fn.ll @@ -1,5 +1,4 @@ ; RUN: llc < %s -filetype=obj | llvm-readobj - --codeview | FileCheck %s -; RUN: llc < %s | llvm-mc -filetype=obj --triple=x86_64-windows | llvm-readobj - --codeview | FileCheck %s ; ModuleID = 'foo.3a1fbbbh-cgu.0' source_filename = "foo.3a1fbbbh-cgu.0" diff --git a/llvm/test/DebugInfo/COFF/types-method-ref-qualifiers.ll b/llvm/test/DebugInfo/COFF/types-method-ref-qualifiers.ll index 64033f595ee4..cf4781798f00 100644 --- a/llvm/test/DebugInfo/COFF/types-method-ref-qualifiers.ll +++ b/llvm/test/DebugInfo/COFF/types-method-ref-qualifiers.ll @@ -1,5 +1,4 @@ ; RUN: llc < %s -filetype=obj | llvm-readobj - --codeview | FileCheck %s -; RUN: llc < %s | llvm-mc -filetype=obj --triple=x86_64-windows | llvm-readobj - --codeview | FileCheck %s ; C++ source to regenerate: ; struct A { diff --git a/llvm/test/DebugInfo/COFF/types-nested-class.ll b/llvm/test/DebugInfo/COFF/types-nested-class.ll index 4110329a0054..0893db7240ac 100644 --- a/llvm/test/DebugInfo/COFF/types-nested-class.ll +++ b/llvm/test/DebugInfo/COFF/types-nested-class.ll @@ -1,5 +1,4 @@ ; RUN: llc < %s -filetype=obj | llvm-readobj - --codeview | FileCheck %s -; RUN: llc < %s | llvm-mc -filetype=obj --triple=x86_64-windows | llvm-readobj - --codeview | FileCheck %s ; C++ source to regenerate: ; $ cat hello.cpp diff --git a/llvm/test/DebugInfo/COFF/types-non-virtual-methods.ll b/llvm/test/DebugInfo/COFF/types-non-virtual-methods.ll index bc789d5e70ca..dfe1589ab3f0 100644 --- a/llvm/test/DebugInfo/COFF/types-non-virtual-methods.ll +++ b/llvm/test/DebugInfo/COFF/types-non-virtual-methods.ll @@ -1,5 +1,4 @@ ; RUN: llc < %s -filetype=obj | llvm-readobj - --codeview | FileCheck %s -; RUN: llc < %s | llvm-mc -filetype=obj --triple=i686-windows | llvm-readobj - --codeview | FileCheck %s ; C++ source to regenerate: ; $ cat t.cpp diff --git a/llvm/test/DebugInfo/COFF/types-ptr-to-member.ll b/llvm/test/DebugInfo/COFF/types-ptr-to-member.ll index d565fee2114e..33b536ae656a 100644 --- a/llvm/test/DebugInfo/COFF/types-ptr-to-member.ll +++ b/llvm/test/DebugInfo/COFF/types-ptr-to-member.ll @@ -1,5 +1,4 @@ ; RUN: llc < %s -filetype=obj | llvm-readobj - --codeview | FileCheck %s -; RUN: llc < %s | llvm-mc -filetype=obj --triple=x86_64-windows | llvm-readobj - --codeview | FileCheck %s ; C++ source to regenerate: ; $ cat t.cpp diff --git a/llvm/test/DebugInfo/COFF/types-recursive-struct.ll b/llvm/test/DebugInfo/COFF/types-recursive-struct.ll index cdefec3d05ff..34ca2b11fa1d 100644 --- a/llvm/test/DebugInfo/COFF/types-recursive-struct.ll +++ b/llvm/test/DebugInfo/COFF/types-recursive-struct.ll @@ -1,5 +1,4 @@ ; RUN: llc < %s -filetype=obj | llvm-readobj - --codeview | FileCheck %s -; RUN: llc < %s | llvm-mc -filetype=obj --triple=x86_64-windows | llvm-readobj - --codeview | FileCheck %s ; This test ensures that circular type references through pointer types don't ; cause infinite recursion. It also tests that we always refer to the forward diff --git a/llvm/test/DebugInfo/COFF/unnamed.ll b/llvm/test/DebugInfo/COFF/unnamed.ll index 5c21d052ffe6..c845785a27bb 100644 --- a/llvm/test/DebugInfo/COFF/unnamed.ll +++ b/llvm/test/DebugInfo/COFF/unnamed.ll @@ -1,5 +1,4 @@ ; RUN: llc < %s -filetype=obj | llvm-readobj - --codeview | FileCheck %s -; RUN: llc < %s | llvm-mc -filetype=obj --triple=x86_64-windows | llvm-readobj - --codeview | FileCheck %s ; ; Verify CodeView emission does not emit forward references for unnamed ; structs/unions. If a forward reference is emitted for an unnamed composite diff --git a/llvm/test/DebugInfo/COFF/vftables.ll b/llvm/test/DebugInfo/COFF/vftables.ll index 4acacb343d0d..250ee28639ad 100644 --- a/llvm/test/DebugInfo/COFF/vftables.ll +++ b/llvm/test/DebugInfo/COFF/vftables.ll @@ -1,5 +1,4 @@ ; RUN: llc < %s -filetype=obj | llvm-readobj - --codeview | FileCheck %s -; RUN: llc < %s | llvm-mc -filetype=obj --triple=x86_64-windows | llvm-readobj - --codeview | FileCheck %s ; C++ source to regenerate: ; struct A { diff --git a/llvm/test/DebugInfo/COFF/virtual-method-kinds.ll b/llvm/test/DebugInfo/COFF/virtual-method-kinds.ll index f7533267118b..ea478d886a22 100644 --- a/llvm/test/DebugInfo/COFF/virtual-method-kinds.ll +++ b/llvm/test/DebugInfo/COFF/virtual-method-kinds.ll @@ -1,5 +1,4 @@ ; RUN: llc < %s -filetype=obj | llvm-readobj - --codeview | FileCheck %s -; RUN: llc < %s | llvm-mc -filetype=obj --triple=x86_64-windows | llvm-readobj - --codeview | FileCheck %s ; Check for the appropriate MethodKind below. diff --git a/llvm/test/DebugInfo/COFF/virtual-methods.ll b/llvm/test/DebugInfo/COFF/virtual-methods.ll index f429f035ae43..f2e68c579d49 100644 --- a/llvm/test/DebugInfo/COFF/virtual-methods.ll +++ b/llvm/test/DebugInfo/COFF/virtual-methods.ll @@ -1,5 +1,4 @@ ; RUN: llc < %s -filetype=obj | llvm-readobj - --codeview | FileCheck %s -; RUN: llc < %s | llvm-mc -filetype=obj --triple=x86_64-windows | llvm-readobj - --codeview | FileCheck %s ; C++ source used to generate IR: ; $ cat t.cpp diff --git a/llvm/test/DebugInfo/COFF/vtable-optzn-array.ll b/llvm/test/DebugInfo/COFF/vtable-optzn-array.ll index 2c9d2b763415..2b5e25b2ca1d 100644 --- a/llvm/test/DebugInfo/COFF/vtable-optzn-array.ll +++ b/llvm/test/DebugInfo/COFF/vtable-optzn-array.ll @@ -1,5 +1,4 @@ ; RUN: llc < %s -filetype=obj -o - | llvm-readobj - --codeview | FileCheck %s -; RUN: llc < %s -o - | llvm-mc -filetype=obj --triple=x86_64-windows | llvm-readobj - --codeview | FileCheck %s ; We used to crash on this input because UnicodeString is a forward declaration ; with no size. Our array type logic wanted to assert the size of the elements