Index: lld/trunk/COFF/PDB.cpp =================================================================== --- lld/trunk/COFF/PDB.cpp +++ lld/trunk/COFF/PDB.cpp @@ -507,7 +507,7 @@ auto &InfoBuilder = Builder.getInfoBuilder(); InfoBuilder.setAge(DI ? DI->PDB70.Age : 0); - pdb::PDB_UniqueId uuid{}; + GUID uuid{}; if (DI) memcpy(&uuid, &DI->PDB70.Signature, sizeof(uuid)); InfoBuilder.setGuid(uuid); Index: lld/trunk/test/COFF/pdb-type-server-missing.yaml =================================================================== --- lld/trunk/test/COFF/pdb-type-server-missing.yaml +++ lld/trunk/test/COFF/pdb-type-server-missing.yaml @@ -82,7 +82,7 @@ Types: - Kind: LF_TYPESERVER2 TypeServer2: - Guid: ' ? "?kB??RX?2??' # FIXME: yaml-ize this as hex. + Guid: '{01DF191B-22BF-6B42-96CE-5258B8329FE5}' Age: 18 Name: 'C:\src\llvm-project\build\definitely_not_found_for_sure.pdb' - Name: '.text$mn' Index: llvm/trunk/include/llvm/DebugInfo/CodeView/CodeViewRecordIO.h =================================================================== --- llvm/trunk/include/llvm/DebugInfo/CodeView/CodeViewRecordIO.h +++ llvm/trunk/include/llvm/DebugInfo/CodeView/CodeViewRecordIO.h @@ -84,7 +84,7 @@ Error mapEncodedInteger(uint64_t &Value); Error mapEncodedInteger(APSInt &Value); Error mapStringZ(StringRef &Value); - Error mapGuid(StringRef &Guid); + Error mapGuid(GUID &Guid); Error mapStringZVectorZ(std::vector &Value); Index: llvm/trunk/include/llvm/DebugInfo/CodeView/Formatters.h =================================================================== --- llvm/trunk/include/llvm/DebugInfo/CodeView/Formatters.h +++ llvm/trunk/include/llvm/DebugInfo/CodeView/Formatters.h @@ -12,6 +12,7 @@ #include "llvm/ADT/ArrayRef.h" #include "llvm/ADT/StringRef.h" +#include "llvm/DebugInfo/CodeView/GUID.h" #include "llvm/DebugInfo/CodeView/TypeIndex.h" #include "llvm/Support/FormatAdapters.h" #include "llvm/Support/FormatVariadic.h" @@ -31,7 +32,7 @@ explicit GuidAdapter(ArrayRef Guid); explicit GuidAdapter(StringRef Guid); - void format(raw_ostream &Stream, StringRef Style) override ; + void format(raw_ostream &Stream, StringRef Style) override; }; } // end namespace detail @@ -60,6 +61,13 @@ } }; +template <> struct format_provider { + static void format(const codeview::GUID &V, llvm::raw_ostream &Stream, + StringRef Style) { + Stream << V; + } +}; + } // end namespace llvm #endif // LLVM_DEBUGINFO_CODEVIEW_FORMATTERS_H Index: llvm/trunk/include/llvm/DebugInfo/CodeView/GUID.h =================================================================== --- llvm/trunk/include/llvm/DebugInfo/CodeView/GUID.h +++ llvm/trunk/include/llvm/DebugInfo/CodeView/GUID.h @@ -0,0 +1,35 @@ +//===- GUID.h ---------------------------------------------------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_DEBUGINFO_CODEVIEW_GUID_H +#define LLVM_DEBUGINFO_CODEVIEW_GUID_H + +#include +#include + +namespace llvm { +class raw_ostream; + +namespace codeview { + +/// This represents the 'GUID' type from windows.h. +struct GUID { + uint8_t Guid[16]; +}; + +inline bool operator==(const GUID &LHS, const GUID &RHS) { + return 0 == ::memcmp(LHS.Guid, RHS.Guid, sizeof(LHS.Guid)); +} + +raw_ostream &operator<<(raw_ostream &OS, const GUID &Guid); + +} // namespace codeview +} // namespace llvm + +#endif Index: llvm/trunk/include/llvm/DebugInfo/CodeView/TypeRecord.h =================================================================== --- llvm/trunk/include/llvm/DebugInfo/CodeView/TypeRecord.h +++ llvm/trunk/include/llvm/DebugInfo/CodeView/TypeRecord.h @@ -18,6 +18,7 @@ #include "llvm/ADT/iterator_range.h" #include "llvm/DebugInfo/CodeView/CVRecord.h" #include "llvm/DebugInfo/CodeView/CodeView.h" +#include "llvm/DebugInfo/CodeView/GUID.h" #include "llvm/DebugInfo/CodeView/TypeIndex.h" #include "llvm/Support/BinaryStreamArray.h" #include "llvm/Support/Endian.h" @@ -539,15 +540,17 @@ public: TypeServer2Record() = default; explicit TypeServer2Record(TypeRecordKind Kind) : TypeRecord(Kind) {} - TypeServer2Record(StringRef Guid, uint32_t Age, StringRef Name) - : TypeRecord(TypeRecordKind::TypeServer2), Guid(Guid), Age(Age), - Name(Name) {} + TypeServer2Record(StringRef GuidStr, uint32_t Age, StringRef Name) + : TypeRecord(TypeRecordKind::TypeServer2), Age(Age), Name(Name) { + assert(GuidStr.size() == 16 && "guid isn't 16 bytes"); + ::memcpy(Guid.Guid, GuidStr.data(), 16); + } - StringRef getGuid() const { return Guid; } + const GUID &getGuid() const { return Guid; } uint32_t getAge() const { return Age; } StringRef getName() const { return Name; } - StringRef Guid; + GUID Guid; uint32_t Age; StringRef Name; }; Index: llvm/trunk/include/llvm/DebugInfo/PDB/DIA/DIARawSymbol.h =================================================================== --- llvm/trunk/include/llvm/DebugInfo/PDB/DIA/DIARawSymbol.h +++ llvm/trunk/include/llvm/DebugInfo/PDB/DIA/DIARawSymbol.h @@ -106,7 +106,7 @@ getVirtualBaseTableType() const override; PDB_DataKind getDataKind() const override; PDB_SymType getSymTag() const override; - PDB_UniqueId getGuid() const override; + codeview::GUID getGuid() const override; int32_t getOffset() const override; int32_t getThisAdjust() const override; int32_t getVirtualBasePointerOffset() const override; Index: llvm/trunk/include/llvm/DebugInfo/PDB/IPDBRawSymbol.h =================================================================== --- llvm/trunk/include/llvm/DebugInfo/PDB/IPDBRawSymbol.h +++ llvm/trunk/include/llvm/DebugInfo/PDB/IPDBRawSymbol.h @@ -118,7 +118,7 @@ virtual uint32_t getVirtualTableShapeId() const = 0; virtual PDB_DataKind getDataKind() const = 0; virtual PDB_SymType getSymTag() const = 0; - virtual PDB_UniqueId getGuid() const = 0; + virtual codeview::GUID getGuid() const = 0; virtual int32_t getOffset() const = 0; virtual int32_t getThisAdjust() const = 0; virtual int32_t getVirtualBasePointerOffset() const = 0; Index: llvm/trunk/include/llvm/DebugInfo/PDB/Native/Formatters.h =================================================================== --- llvm/trunk/include/llvm/DebugInfo/PDB/Native/Formatters.h +++ llvm/trunk/include/llvm/DebugInfo/PDB/Native/Formatters.h @@ -23,13 +23,6 @@ break; namespace llvm { -template <> struct format_provider { - static void format(const pdb::PDB_UniqueId &V, llvm::raw_ostream &Stream, - StringRef Style) { - codeview::fmt_guid(V.Guid).format(Stream, Style); - } -}; - template <> struct format_provider { static void format(const pdb::PdbRaw_ImplVer &V, llvm::raw_ostream &Stream, StringRef Style) { Index: llvm/trunk/include/llvm/DebugInfo/PDB/Native/InfoStream.h =================================================================== --- llvm/trunk/include/llvm/DebugInfo/PDB/Native/InfoStream.h +++ llvm/trunk/include/llvm/DebugInfo/PDB/Native/InfoStream.h @@ -12,6 +12,7 @@ #include "llvm/ADT/BitmaskEnum.h" #include "llvm/ADT/StringMap.h" +#include "llvm/DebugInfo/CodeView/GUID.h" #include "llvm/DebugInfo/MSF/MappedBlockStream.h" #include "llvm/DebugInfo/PDB/Native/NamedStreamMap.h" #include "llvm/DebugInfo/PDB/Native/RawConstants.h" @@ -39,7 +40,7 @@ PdbRaw_ImplVer getVersion() const; uint32_t getSignature() const; uint32_t getAge() const; - PDB_UniqueId getGuid() const; + codeview::GUID getGuid() const; uint32_t getNamedStreamMapByteSize() const; PdbRaw_Features getFeatures() const; @@ -71,7 +72,7 @@ // Due to the aforementioned limitations with `Signature`, this is a new // signature present on VC70 and higher PDBs which is guaranteed to be // universally unique. - PDB_UniqueId Guid; + codeview::GUID Guid; BinarySubstreamRef SubNamedStreams; Index: llvm/trunk/include/llvm/DebugInfo/PDB/Native/InfoStreamBuilder.h =================================================================== --- llvm/trunk/include/llvm/DebugInfo/PDB/Native/InfoStreamBuilder.h +++ llvm/trunk/include/llvm/DebugInfo/PDB/Native/InfoStreamBuilder.h @@ -37,7 +37,7 @@ void setVersion(PdbRaw_ImplVer V); void setSignature(uint32_t S); void setAge(uint32_t A); - void setGuid(PDB_UniqueId G); + void setGuid(codeview::GUID G); void addFeature(PdbRaw_FeatureSig Sig); uint32_t finalize(); @@ -54,7 +54,7 @@ PdbRaw_ImplVer Ver; uint32_t Sig; uint32_t Age; - PDB_UniqueId Guid; + codeview::GUID Guid; NamedStreamMap &NamedStreams; }; Index: llvm/trunk/include/llvm/DebugInfo/PDB/Native/NativeExeSymbol.h =================================================================== --- llvm/trunk/include/llvm/DebugInfo/PDB/Native/NativeExeSymbol.h +++ llvm/trunk/include/llvm/DebugInfo/PDB/Native/NativeExeSymbol.h @@ -27,7 +27,7 @@ uint32_t getAge() const override; std::string getSymbolsFileName() const override; - PDB_UniqueId getGuid() const override; + codeview::GUID getGuid() const override; bool hasCTypes() const override; bool hasPrivateSymbols() const override; Index: llvm/trunk/include/llvm/DebugInfo/PDB/Native/NativeRawSymbol.h =================================================================== --- llvm/trunk/include/llvm/DebugInfo/PDB/Native/NativeRawSymbol.h +++ llvm/trunk/include/llvm/DebugInfo/PDB/Native/NativeRawSymbol.h @@ -111,7 +111,7 @@ getVirtualBaseTableType() const override; PDB_DataKind getDataKind() const override; PDB_SymType getSymTag() const override; - PDB_UniqueId getGuid() const override; + codeview::GUID getGuid() const override; int32_t getOffset() const override; int32_t getThisAdjust() const override; int32_t getVirtualBasePointerOffset() const override; Index: llvm/trunk/include/llvm/DebugInfo/PDB/Native/RawTypes.h =================================================================== --- llvm/trunk/include/llvm/DebugInfo/PDB/Native/RawTypes.h +++ llvm/trunk/include/llvm/DebugInfo/PDB/Native/RawTypes.h @@ -10,6 +10,7 @@ #ifndef LLVM_DEBUGINFO_PDB_RAW_RAWTYPES_H #define LLVM_DEBUGINFO_PDB_RAW_RAWTYPES_H +#include "llvm/DebugInfo/CodeView/GUID.h" #include "llvm/DebugInfo/CodeView/TypeRecord.h" #include "llvm/Support/Endian.h" @@ -268,17 +269,6 @@ support::ulittle32_t NumSections; }; -/// Defines a 128-bit unique identifier. This maps to a GUID on Windows, but -/// is abstracted here for the purposes of non-Windows platforms that don't have -/// the GUID structure defined. -struct PDB_UniqueId { - uint8_t Guid[16]; -}; - -inline bool operator==(const PDB_UniqueId &LHS, const PDB_UniqueId &RHS) { - return 0 == ::memcmp(LHS.Guid, RHS.Guid, sizeof(LHS.Guid)); -} - // The header preceeding the global TPI stream. // This corresponds to `HDR` in PDB/dbi/tpi.h. struct TpiStreamHeader { @@ -312,7 +302,7 @@ support::ulittle32_t Version; support::ulittle32_t Signature; support::ulittle32_t Age; - PDB_UniqueId Guid; + codeview::GUID Guid; }; /// The header preceeding the /names stream. Index: llvm/trunk/include/llvm/DebugInfo/PDB/PDBExtras.h =================================================================== --- llvm/trunk/include/llvm/DebugInfo/PDB/PDBExtras.h +++ llvm/trunk/include/llvm/DebugInfo/PDB/PDBExtras.h @@ -32,7 +32,6 @@ raw_ostream &operator<<(raw_ostream &OS, const PDB_Lang &Lang); raw_ostream &operator<<(raw_ostream &OS, const PDB_SymType &Tag); raw_ostream &operator<<(raw_ostream &OS, const PDB_MemberAccess &Access); -raw_ostream &operator<<(raw_ostream &OS, const PDB_UniqueId &Guid); raw_ostream &operator<<(raw_ostream &OS, const PDB_UdtType &Type); raw_ostream &operator<<(raw_ostream &OS, const PDB_Machine &Machine); Index: llvm/trunk/include/llvm/ObjectYAML/CodeViewYAMLTypes.h =================================================================== --- llvm/trunk/include/llvm/ObjectYAML/CodeViewYAMLTypes.h +++ llvm/trunk/include/llvm/ObjectYAML/CodeViewYAMLTypes.h @@ -60,6 +60,8 @@ } // end namespace llvm +LLVM_YAML_DECLARE_SCALAR_TRAITS(codeview::GUID, true) + LLVM_YAML_DECLARE_MAPPING_TRAITS(CodeViewYAML::LeafRecord) LLVM_YAML_DECLARE_MAPPING_TRAITS(CodeViewYAML::MemberRecord) Index: llvm/trunk/lib/DebugInfo/CodeView/CodeViewRecordIO.cpp =================================================================== --- llvm/trunk/lib/DebugInfo/CodeView/CodeViewRecordIO.cpp +++ llvm/trunk/lib/DebugInfo/CodeView/CodeViewRecordIO.cpp @@ -168,18 +168,19 @@ return Error::success(); } -Error CodeViewRecordIO::mapGuid(StringRef &Guid) { +Error CodeViewRecordIO::mapGuid(GUID &Guid) { constexpr uint32_t GuidSize = 16; if (maxFieldLength() < GuidSize) return make_error(cv_error_code::insufficient_buffer); if (isWriting()) { - assert(Guid.size() == 16 && "Invalid Guid Size!"); - if (auto EC = Writer->writeFixedString(Guid)) + if (auto EC = Writer->writeBytes(Guid.Guid)) return EC; } else { - if (auto EC = Reader->readFixedString(Guid, 16)) + ArrayRef GuidBytes; + if (auto EC = Reader->readBytes(GuidBytes, GuidSize)) return EC; + memcpy(Guid.Guid, GuidBytes.data(), GuidSize); } return Error::success(); } Index: llvm/trunk/lib/DebugInfo/CodeView/Formatters.cpp =================================================================== --- llvm/trunk/lib/DebugInfo/CodeView/Formatters.cpp +++ llvm/trunk/lib/DebugInfo/CodeView/Formatters.cpp @@ -9,6 +9,7 @@ #include "llvm/DebugInfo/CodeView/Formatters.h" #include "llvm/ADT/ArrayRef.h" +#include "llvm/DebugInfo/CodeView/GUID.h" #include "llvm/Support/raw_ostream.h" #include #include @@ -39,3 +40,9 @@ } Stream << "}"; } + +raw_ostream &llvm::codeview::operator<<(raw_ostream &OS, const GUID &Guid) { + codeview::detail::GuidAdapter A(Guid.Guid); + A.format(OS, ""); + return OS; +} Index: llvm/trunk/lib/DebugInfo/CodeView/TypeDumpVisitor.cpp =================================================================== --- llvm/trunk/lib/DebugInfo/CodeView/TypeDumpVisitor.cpp +++ llvm/trunk/lib/DebugInfo/CodeView/TypeDumpVisitor.cpp @@ -354,7 +354,7 @@ } Error TypeDumpVisitor::visitKnownRecord(CVType &CVR, TypeServer2Record &TS) { - W->printString("Guid", formatv("{0}", fmt_guid(TS.getGuid())).str()); + W->printString("Guid", formatv("{0}", TS.getGuid()).str()); W->printNumber("Age", TS.getAge()); W->printString("Name", TS.getName()); return Error::success(); Index: llvm/trunk/lib/DebugInfo/PDB/DIA/DIARawSymbol.cpp =================================================================== --- llvm/trunk/lib/DebugInfo/PDB/DIA/DIARawSymbol.cpp +++ llvm/trunk/lib/DebugInfo/PDB/DIA/DIARawSymbol.cpp @@ -125,16 +125,16 @@ return Result8; } -PDB_UniqueId +codeview::GUID PrivateGetDIAValue(IDiaSymbol *Symbol, HRESULT (__stdcall IDiaSymbol::*Method)(GUID *)) { GUID Result; if (S_OK != (Symbol->*Method)(&Result)) - return PDB_UniqueId(); + return codeview::GUID(); - static_assert(sizeof(PDB_UniqueId) == sizeof(GUID), - "PDB_UniqueId is the wrong size!"); - PDB_UniqueId IdResult; + static_assert(sizeof(codeview::GUID) == sizeof(GUID), + "GUID is the wrong size!"); + codeview::GUID IdResult; ::memcpy(&IdResult, &Result, sizeof(GUID)); return IdResult; } @@ -746,7 +746,7 @@ &IDiaSymbol::get_symTag); } -PDB_UniqueId DIARawSymbol::getGuid() const { +codeview::GUID DIARawSymbol::getGuid() const { return PrivateGetDIAValue(Symbol, &IDiaSymbol::get_guid); } Index: llvm/trunk/lib/DebugInfo/PDB/Native/InfoStream.cpp =================================================================== --- llvm/trunk/lib/DebugInfo/PDB/Native/InfoStream.cpp +++ llvm/trunk/lib/DebugInfo/PDB/Native/InfoStream.cpp @@ -118,7 +118,7 @@ uint32_t InfoStream::getAge() const { return Age; } -PDB_UniqueId InfoStream::getGuid() const { return Guid; } +GUID InfoStream::getGuid() const { return Guid; } uint32_t InfoStream::getNamedStreamMapByteSize() const { return NamedStreamMapByteSize; Index: llvm/trunk/lib/DebugInfo/PDB/Native/InfoStreamBuilder.cpp =================================================================== --- llvm/trunk/lib/DebugInfo/PDB/Native/InfoStreamBuilder.cpp +++ llvm/trunk/lib/DebugInfo/PDB/Native/InfoStreamBuilder.cpp @@ -34,7 +34,7 @@ void InfoStreamBuilder::setAge(uint32_t A) { Age = A; } -void InfoStreamBuilder::setGuid(PDB_UniqueId G) { Guid = G; } +void InfoStreamBuilder::setGuid(GUID G) { Guid = G; } void InfoStreamBuilder::addFeature(PdbRaw_FeatureSig Sig) { Features.push_back(Sig); Index: llvm/trunk/lib/DebugInfo/PDB/Native/NativeExeSymbol.cpp =================================================================== --- llvm/trunk/lib/DebugInfo/PDB/Native/NativeExeSymbol.cpp +++ llvm/trunk/lib/DebugInfo/PDB/Native/NativeExeSymbol.cpp @@ -56,12 +56,12 @@ return File.getFilePath(); } -PDB_UniqueId NativeExeSymbol::getGuid() const { +codeview::GUID NativeExeSymbol::getGuid() const { auto IS = File.getPDBInfoStream(); if (IS) return IS->getGuid(); consumeError(IS.takeError()); - return PDB_UniqueId{{0}}; + return codeview::GUID{{0}}; } bool NativeExeSymbol::hasCTypes() const { Index: llvm/trunk/lib/DebugInfo/PDB/Native/NativeRawSymbol.cpp =================================================================== --- llvm/trunk/lib/DebugInfo/PDB/Native/NativeRawSymbol.cpp +++ llvm/trunk/lib/DebugInfo/PDB/Native/NativeRawSymbol.cpp @@ -323,9 +323,7 @@ return PDB_SymType::None; } -PDB_UniqueId NativeRawSymbol::getGuid() const { - return PDB_UniqueId{{0}}; -} +codeview::GUID NativeRawSymbol::getGuid() const { return codeview::GUID{{0}}; } int32_t NativeRawSymbol::getOffset() const { return 0; Index: llvm/trunk/lib/DebugInfo/PDB/PDBExtras.cpp =================================================================== --- llvm/trunk/lib/DebugInfo/PDB/PDBExtras.cpp +++ llvm/trunk/lib/DebugInfo/PDB/PDBExtras.cpp @@ -260,12 +260,6 @@ return OS; } -raw_ostream &llvm::pdb::operator<<(raw_ostream &OS, const PDB_UniqueId &Guid) { - codeview::detail::GuidAdapter A(Guid.Guid); - A.format(OS, ""); - return OS; -} - raw_ostream &llvm::pdb::operator<<(raw_ostream &OS, const PDB_UdtType &Type) { switch (Type) { CASE_OUTPUT_ENUM_CLASS_STR(PDB_UdtType, Class, "class", OS) Index: llvm/trunk/lib/ObjectYAML/CodeViewYAMLTypes.cpp =================================================================== --- llvm/trunk/lib/ObjectYAML/CodeViewYAMLTypes.cpp +++ llvm/trunk/lib/ObjectYAML/CodeViewYAMLTypes.cpp @@ -141,6 +141,33 @@ } // end namespace CodeViewYAML } // end namespace llvm +void ScalarTraits::output(const GUID &G, void *, llvm::raw_ostream &OS) { + OS << G; +} + +StringRef ScalarTraits::input(StringRef Scalar, void *Ctx, GUID &S) { + if (Scalar.size() != 38) + return "GUID strings are 38 characters long"; + if (Scalar[0] != '{' || Scalar[37] != '}') + return "GUID is not enclosed in {}"; + if (Scalar[9] != '-' || Scalar[14] != '-' || Scalar[19] != '-' || + Scalar[24] != '-') + return "GUID sections are not properly delineated with dashes"; + + uint8_t *OutBuffer = S.Guid; + for (auto Iter = Scalar.begin(); Iter != Scalar.end();) { + if (*Iter == '-' || *Iter == '{' || *Iter == '}') { + ++Iter; + continue; + } + uint8_t Value = (llvm::hexDigitValue(*Iter++) << 4); + Value |= llvm::hexDigitValue(*Iter++); + *OutBuffer++ = Value; + } + + return ""; +} + void ScalarTraits::output(const TypeIndex &S, void *, raw_ostream &OS) { OS << S.getIndex(); Index: llvm/trunk/test/ObjectYAML/CodeView/guid.yaml =================================================================== --- llvm/trunk/test/ObjectYAML/CodeView/guid.yaml +++ llvm/trunk/test/ObjectYAML/CodeView/guid.yaml @@ -0,0 +1,59 @@ +# RUN: yaml2obj %s | obj2yaml | FileCheck %s + +--- !COFF +header: + Machine: IMAGE_FILE_MACHINE_AMD64 + Characteristics: [ ] +sections: + - Name: '.debug$T' + Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA, IMAGE_SCN_MEM_DISCARDABLE, IMAGE_SCN_MEM_READ ] + Alignment: 1 + Types: + - Kind: LF_TYPESERVER2 + TypeServer2: + Guid: '{01DF191B-22BF-6B42-96CE-5258B8329FE5}' + Age: 24 + Name: 'C:\src\llvm-project\build\vc140.pdb' +symbols: + - Name: '.debug$T' + Value: 0 + SectionNumber: 1 + SimpleType: IMAGE_SYM_TYPE_NULL + ComplexType: IMAGE_SYM_DTYPE_NULL + StorageClass: IMAGE_SYM_CLASS_STATIC + SectionDefinition: + Length: 64 + NumberOfRelocations: 0 + NumberOfLinenumbers: 0 + CheckSum: 0 + Number: 0 +... + +# CHECK: --- !COFF +# CHECK: header: +# CHECK: Machine: IMAGE_FILE_MACHINE_AMD64 +# CHECK: Characteristics: [ ] +# CHECK: sections: +# CHECK: - Name: '.debug$T' +# CHECK: Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA, IMAGE_SCN_MEM_DISCARDABLE, IMAGE_SCN_MEM_READ ] +# CHECK: Alignment: 1 +# CHECK: Types: +# CHECK: - Kind: LF_TYPESERVER2 +# CHECK: TypeServer2: +# CHECK: Guid: '{01DF191B-22BF-6B42-96CE-5258B8329FE5}' +# CHECK: Age: 24 +# CHECK: Name: 'C:\src\llvm-project\build\vc140.pdb' +# CHECK: symbols: +# CHECK: - Name: '.debug$T' +# CHECK: Value: 0 +# CHECK: SectionNumber: 1 +# CHECK: SimpleType: IMAGE_SYM_TYPE_NULL +# CHECK: ComplexType: IMAGE_SYM_DTYPE_NULL +# CHECK: StorageClass: IMAGE_SYM_CLASS_STATIC +# CHECK: SectionDefinition: +# CHECK: Length: 64 +# CHECK: NumberOfRelocations: 0 +# CHECK: NumberOfLinenumbers: 0 +# CHECK: CheckSum: 0 +# CHECK: Number: 0 +# CHECK: ... Index: llvm/trunk/tools/llvm-pdbutil/MinimalTypeDumper.cpp =================================================================== --- llvm/trunk/tools/llvm-pdbutil/MinimalTypeDumper.cpp +++ llvm/trunk/tools/llvm-pdbutil/MinimalTypeDumper.cpp @@ -395,8 +395,7 @@ Error MinimalTypeDumpVisitor::visitKnownRecord(CVType &CVR, TypeServer2Record &TS) { - P.formatLine("name = {0}, age = {1}, guid = {2}", TS.Name, TS.Age, - fmt_guid(TS.Guid)); + P.formatLine("name = {0}, age = {1}, guid = {2}", TS.Name, TS.Age, TS.Guid); return Error::success(); } Index: llvm/trunk/tools/llvm-pdbutil/PdbYaml.h =================================================================== --- llvm/trunk/tools/llvm-pdbutil/PdbYaml.h +++ llvm/trunk/tools/llvm-pdbutil/PdbYaml.h @@ -57,7 +57,7 @@ PdbRaw_ImplVer Version = PdbImplVC70; uint32_t Signature = 0; uint32_t Age = 1; - PDB_UniqueId Guid; + codeview::GUID Guid; std::vector Features; std::vector NamedStreams; }; Index: llvm/trunk/tools/llvm-pdbutil/PdbYaml.cpp =================================================================== --- llvm/trunk/tools/llvm-pdbutil/PdbYaml.cpp +++ llvm/trunk/tools/llvm-pdbutil/PdbYaml.cpp @@ -38,41 +38,6 @@ namespace llvm { namespace yaml { -template <> struct ScalarTraits { - static void output(const llvm::pdb::PDB_UniqueId &S, void *, - llvm::raw_ostream &OS) { - OS << S; - } - - static StringRef input(StringRef Scalar, void *Ctx, - llvm::pdb::PDB_UniqueId &S) { - if (Scalar.size() != 38) - return "GUID strings are 38 characters long"; - if (Scalar[0] != '{' || Scalar[37] != '}') - return "GUID is not enclosed in {}"; - if (Scalar[9] != '-' || Scalar[14] != '-' || Scalar[19] != '-' || - Scalar[24] != '-') - return "GUID sections are not properly delineated with dashes"; - - uint8_t *OutBuffer = S.Guid; - for (auto Iter = Scalar.begin(); Iter != Scalar.end();) { - if (*Iter == '-' || *Iter == '{' || *Iter == '}') { - ++Iter; - continue; - } - uint8_t Value = (llvm::hexDigitValue(*Iter) << 4); - ++Iter; - Value |= llvm::hexDigitValue(*Iter); - ++Iter; - *OutBuffer++ = Value; - } - - return ""; - } - - static bool mustQuote(StringRef Scalar) { return needsQuotes(Scalar); } -}; - template <> struct ScalarEnumerationTraits { static void enumeration(IO &io, llvm::pdb::PDB_Machine &Value) { io.enumCase(Value, "Invalid", PDB_Machine::Invalid);