Skip to content

Commit

Permalink
[codeview] Fix YAML for LF_TYPESERVER2 by hoisting PDB_UniqueId
Browse files Browse the repository at this point in the history
Summary:
We were treating the GUIDs in TypeServer2Record as strings, and the
non-ASCII bytes in the GUID would not round-trip through YAML.

We already had the PDB_UniqueId type portably represent a Windows GUID,
but we need to hoist that up to the DebugInfo/CodeView library so that
we can use it in the TypeServer2Record as well as in PDB parsing code.

Reviewers: inglorion, amccarth

Subscribers: llvm-commits, hiraditya

Differential Revision: https://reviews.llvm.org/D35495

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@308234 91177308-0d34-0410-b5e6-96231b3b80d8
  • Loading branch information
rnk committed Jul 17, 2017
1 parent e557455 commit 5c238d6
Show file tree
Hide file tree
Showing 28 changed files with 178 additions and 97 deletions.
2 changes: 1 addition & 1 deletion include/llvm/DebugInfo/CodeView/CodeViewRecordIO.h
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,7 @@ class CodeViewRecordIO {
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<StringRef> &Value);

Expand Down
10 changes: 9 additions & 1 deletion include/llvm/DebugInfo/CodeView/Formatters.h
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand All @@ -31,7 +32,7 @@ class GuidAdapter final : public FormatAdapter<ArrayRef<uint8_t>> {
explicit GuidAdapter(ArrayRef<uint8_t> Guid);
explicit GuidAdapter(StringRef Guid);

void format(raw_ostream &Stream, StringRef Style) override ;
void format(raw_ostream &Stream, StringRef Style) override;
};

} // end namespace detail
Expand Down Expand Up @@ -60,6 +61,13 @@ template <> struct format_provider<codeview::TypeIndex> {
}
};

template <> struct format_provider<codeview::GUID> {
static void format(const codeview::GUID &V, llvm::raw_ostream &Stream,
StringRef Style) {
Stream << V;
}
};

} // end namespace llvm

#endif // LLVM_DEBUGINFO_CODEVIEW_FORMATTERS_H
35 changes: 35 additions & 0 deletions include/llvm/DebugInfo/CodeView/GUID.h
Original file line number Diff line number Diff line change
@@ -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 <cstdint>
#include <cstring>

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
13 changes: 8 additions & 5 deletions include/llvm/DebugInfo/CodeView/TypeRecord.h
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down Expand Up @@ -539,15 +540,17 @@ class TypeServer2Record : public TypeRecord {
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;
};
Expand Down
2 changes: 1 addition & 1 deletion include/llvm/DebugInfo/PDB/DIA/DIARawSymbol.h
Original file line number Diff line number Diff line change
Expand Up @@ -106,7 +106,7 @@ class DIARawSymbol : public IPDBRawSymbol {
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;
Expand Down
2 changes: 1 addition & 1 deletion include/llvm/DebugInfo/PDB/IPDBRawSymbol.h
Original file line number Diff line number Diff line change
Expand Up @@ -118,7 +118,7 @@ class IPDBRawSymbol {
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;
Expand Down
7 changes: 0 additions & 7 deletions include/llvm/DebugInfo/PDB/Native/Formatters.h
Original file line number Diff line number Diff line change
Expand Up @@ -23,13 +23,6 @@
break;

namespace llvm {
template <> struct format_provider<pdb::PDB_UniqueId> {
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<pdb::PdbRaw_ImplVer> {
static void format(const pdb::PdbRaw_ImplVer &V, llvm::raw_ostream &Stream,
StringRef Style) {
Expand Down
5 changes: 3 additions & 2 deletions include/llvm/DebugInfo/PDB/Native/InfoStream.h
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down Expand Up @@ -39,7 +40,7 @@ class InfoStream {
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;
Expand Down Expand Up @@ -71,7 +72,7 @@ class InfoStream {
// 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;

Expand Down
4 changes: 2 additions & 2 deletions include/llvm/DebugInfo/PDB/Native/InfoStreamBuilder.h
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ class InfoStreamBuilder {
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();
Expand All @@ -54,7 +54,7 @@ class InfoStreamBuilder {
PdbRaw_ImplVer Ver;
uint32_t Sig;
uint32_t Age;
PDB_UniqueId Guid;
codeview::GUID Guid;

NamedStreamMap &NamedStreams;
};
Expand Down
2 changes: 1 addition & 1 deletion include/llvm/DebugInfo/PDB/Native/NativeExeSymbol.h
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ class NativeExeSymbol : public NativeRawSymbol {

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;

Expand Down
2 changes: 1 addition & 1 deletion include/llvm/DebugInfo/PDB/Native/NativeRawSymbol.h
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,7 @@ class NativeRawSymbol : public IPDBRawSymbol {
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;
Expand Down
14 changes: 2 additions & 12 deletions include/llvm/DebugInfo/PDB/Native/RawTypes.h
Original file line number Diff line number Diff line change
Expand Up @@ -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"

Expand Down Expand Up @@ -268,17 +269,6 @@ struct PublicsStreamHeader {
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 {
Expand Down Expand Up @@ -312,7 +302,7 @@ struct InfoStreamHeader {
support::ulittle32_t Version;
support::ulittle32_t Signature;
support::ulittle32_t Age;
PDB_UniqueId Guid;
codeview::GUID Guid;
};

/// The header preceeding the /names stream.
Expand Down
1 change: 0 additions & 1 deletion include/llvm/DebugInfo/PDB/PDBExtras.h
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,6 @@ raw_ostream &operator<<(raw_ostream &OS, const PDB_Checksum &Checksum);
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);

Expand Down
2 changes: 2 additions & 0 deletions include/llvm/ObjectYAML/CodeViewYAMLTypes.h
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,8 @@ ArrayRef<uint8_t> toDebugT(ArrayRef<LeafRecord>, BumpPtrAllocator &Alloc);

} // 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)

Expand Down
9 changes: 5 additions & 4 deletions lib/DebugInfo/CodeView/CodeViewRecordIO.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -168,18 +168,19 @@ Error CodeViewRecordIO::mapStringZ(StringRef &Value) {
return Error::success();
}

Error CodeViewRecordIO::mapGuid(StringRef &Guid) {
Error CodeViewRecordIO::mapGuid(GUID &Guid) {
constexpr uint32_t GuidSize = 16;
if (maxFieldLength() < GuidSize)
return make_error<CodeViewError>(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<uint8_t> GuidBytes;
if (auto EC = Reader->readBytes(GuidBytes, GuidSize))
return EC;
memcpy(Guid.Guid, GuidBytes.data(), GuidSize);
}
return Error::success();
}
Expand Down
7 changes: 7 additions & 0 deletions lib/DebugInfo/CodeView/Formatters.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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 <algorithm>
#include <cassert>
Expand Down Expand Up @@ -39,3 +40,9 @@ void GuidAdapter::format(raw_ostream &Stream, StringRef Style) {
}
Stream << "}";
}

raw_ostream &llvm::codeview::operator<<(raw_ostream &OS, const GUID &Guid) {
codeview::detail::GuidAdapter A(Guid.Guid);
A.format(OS, "");
return OS;
}
2 changes: 1 addition & 1 deletion lib/DebugInfo/CodeView/TypeDumpVisitor.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -354,7 +354,7 @@ Error TypeDumpVisitor::visitKnownRecord(CVType &CVR, FuncIdRecord &Func) {
}

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();
Expand Down
12 changes: 6 additions & 6 deletions lib/DebugInfo/PDB/DIA/DIARawSymbol.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -125,16 +125,16 @@ PrivateGetDIAValue(IDiaSymbol *Symbol,
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;
}
Expand Down Expand Up @@ -746,7 +746,7 @@ PDB_SymType DIARawSymbol::getSymTag() const {
&IDiaSymbol::get_symTag);
}

PDB_UniqueId DIARawSymbol::getGuid() const {
codeview::GUID DIARawSymbol::getGuid() const {
return PrivateGetDIAValue(Symbol, &IDiaSymbol::get_guid);
}

Expand Down
2 changes: 1 addition & 1 deletion lib/DebugInfo/PDB/Native/InfoStream.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -118,7 +118,7 @@ uint32_t InfoStream::getSignature() const { return Signature; }

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;
Expand Down
2 changes: 1 addition & 1 deletion lib/DebugInfo/PDB/Native/InfoStreamBuilder.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ void InfoStreamBuilder::setSignature(uint32_t S) { Sig = S; }

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);
Expand Down
4 changes: 2 additions & 2 deletions lib/DebugInfo/PDB/Native/NativeExeSymbol.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -56,12 +56,12 @@ std::string NativeExeSymbol::getSymbolsFileName() const {
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 {
Expand Down
4 changes: 1 addition & 3 deletions lib/DebugInfo/PDB/Native/NativeRawSymbol.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -323,9 +323,7 @@ PDB_SymType NativeRawSymbol::getSymTag() const {
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;
Expand Down
6 changes: 0 additions & 6 deletions lib/DebugInfo/PDB/PDBExtras.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -260,12 +260,6 @@ raw_ostream &llvm::pdb::operator<<(raw_ostream &OS,
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)
Expand Down
Loading

0 comments on commit 5c238d6

Please sign in to comment.