diff options
| author | Dimitry Andric <dim@FreeBSD.org> | 2017-07-13 19:25:18 +0000 | 
|---|---|---|
| committer | Dimitry Andric <dim@FreeBSD.org> | 2017-07-13 19:25:18 +0000 | 
| commit | ca089b24d48ef6fa8da2d0bb8c25bb802c4a95c0 (patch) | |
| tree | 3a28a772df9b17aef34f49e3c727965ad28c0c93 /lib/DebugInfo | |
| parent | 9df3605dea17e84f8183581f6103bd0c79e2a606 (diff) | |
Notes
Diffstat (limited to 'lib/DebugInfo')
19 files changed, 361 insertions, 172 deletions
diff --git a/lib/DebugInfo/CodeView/SymbolDumper.cpp b/lib/DebugInfo/CodeView/SymbolDumper.cpp index b9fa9b6a6ad7..c2c02f8de03f 100644 --- a/lib/DebugInfo/CodeView/SymbolDumper.cpp +++ b/lib/DebugInfo/CodeView/SymbolDumper.cpp @@ -62,6 +62,18 @@ private:  };  } +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"); @@ -86,18 +98,23 @@ void CVSymbolDumperImpl::printTypeIndex(StringRef FieldName, TypeIndex TI) {  }  Error CVSymbolDumperImpl::visitSymbolBegin(CVSymbol &CVR) { +  W.startLine() << getSymbolKindName(CVR.Type); +  W.getOStream() << " {\n"; +  W.indent(); +  W.printEnum("Kind", unsigned(CVR.Type), 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) { -  DictScope S(W, "BlockStart"); -    StringRef LinkageName;    W.printHex("PtrParent", Block.Parent);    W.printHex("PtrEnd", Block.End); @@ -113,7 +130,6 @@ Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR, BlockSym &Block) {  }  Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR, Thunk32Sym &Thunk) { -  DictScope S(W, "Thunk32");    W.printNumber("Parent", Thunk.Parent);    W.printNumber("End", Thunk.End);    W.printNumber("Next", Thunk.Next); @@ -126,7 +142,6 @@ Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR, Thunk32Sym &Thunk) {  Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR,                                             TrampolineSym &Tramp) { -  DictScope S(W, "Trampoline");    W.printEnum("Type", uint16_t(Tramp.Type), getTrampolineNames());    W.printNumber("Size", Tramp.Size);    W.printNumber("ThunkOff", Tramp.ThunkOffset); @@ -137,7 +152,6 @@ Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR,  }  Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR, SectionSym &Section) { -  DictScope S(W, "Section");    W.printNumber("SectionNumber", Section.SectionNumber);    W.printNumber("Alignment", Section.Alignment);    W.printNumber("Rva", Section.Rva); @@ -152,7 +166,6 @@ Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR, SectionSym &Section) {  Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR,                                             CoffGroupSym &CoffGroup) { -  DictScope S(W, "COFF Group");    W.printNumber("Size", CoffGroup.Size);    W.printFlags("Characteristics", CoffGroup.Characteristics,                 getImageSectionCharacteristicNames(), @@ -165,8 +178,6 @@ Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR,  Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR,                                             BPRelativeSym &BPRel) { -  DictScope S(W, "BPRelativeSym"); -    W.printNumber("Offset", BPRel.Offset);    printTypeIndex("Type", BPRel.Type);    W.printString("VarName", BPRel.Name); @@ -175,16 +186,12 @@ Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR,  Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR,                                             BuildInfoSym &BuildInfo) { -  DictScope S(W, "BuildInfo"); -    W.printNumber("BuildId", BuildInfo.BuildId);    return Error::success();  }  Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR,                                             CallSiteInfoSym &CallSiteInfo) { -  DictScope S(W, "CallSiteInfo"); -    StringRef LinkageName;    if (ObjDelegate) {      ObjDelegate->printRelocatedField("CodeOffset", @@ -200,8 +207,6 @@ Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR,  Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR,                                             EnvBlockSym &EnvBlock) { -  DictScope S(W, "EnvBlock"); -    ListScope L(W, "Entries");    for (auto Entry : EnvBlock.Fields) {      W.printString(Entry); @@ -211,7 +216,6 @@ Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR,  Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR,                                             FileStaticSym &FileStatic) { -  DictScope S(W, "FileStatic");    printTypeIndex("Index", FileStatic.Index);    W.printNumber("ModFilenameOffset", FileStatic.ModFilenameOffset);    W.printFlags("Flags", uint16_t(FileStatic.Flags), getLocalFlagNames()); @@ -220,7 +224,6 @@ Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR,  }  Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR, ExportSym &Export) { -  DictScope S(W, "Export");    W.printNumber("Ordinal", Export.Ordinal);    W.printFlags("Flags", uint16_t(Export.Flags), getExportSymFlagNames());    W.printString("Name", Export.Name); @@ -229,8 +232,6 @@ Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR, ExportSym &Export) {  Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR,                                             Compile2Sym &Compile2) { -  DictScope S(W, "CompilerFlags2"); -    W.printEnum("Language", Compile2.getLanguage(), getSourceLanguageNames());    W.printFlags("Flags", Compile2.getFlags(), getCompileSym2FlagNames());    W.printEnum("Machine", unsigned(Compile2.Machine), getCPUTypeNames()); @@ -254,8 +255,6 @@ Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR,  Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR,                                             Compile3Sym &Compile3) { -  DictScope S(W, "CompilerFlags3"); -    W.printEnum("Language", Compile3.getLanguage(), getSourceLanguageNames());    W.printFlags("Flags", Compile3.getFlags(), getCompileSym3FlagNames());    W.printEnum("Machine", unsigned(Compile3.Machine), getCPUTypeNames()); @@ -281,8 +280,6 @@ Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR,  Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR,                                             ConstantSym &Constant) { -  DictScope S(W, "Constant"); -    printTypeIndex("Type", Constant.Type);    W.printNumber("Value", Constant.Value);    W.printString("Name", Constant.Name); @@ -290,9 +287,6 @@ Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR,  }  Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR, DataSym &Data) { -  DictScope S(W, "DataSym"); - -  W.printEnum("Kind", uint16_t(CVR.kind()), getSymbolTypeNames());    StringRef LinkageName;    if (ObjDelegate) {      ObjDelegate->printRelocatedField("DataOffset", Data.getRelocationOffset(), @@ -308,15 +302,12 @@ Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR, DataSym &Data) {  Error CVSymbolDumperImpl::visitKnownRecord(      CVSymbol &CVR,      DefRangeFramePointerRelFullScopeSym &DefRangeFramePointerRelFullScope) { -  DictScope S(W, "DefRangeFramePointerRelFullScope");    W.printNumber("Offset", DefRangeFramePointerRelFullScope.Offset);    return Error::success();  }  Error CVSymbolDumperImpl::visitKnownRecord(      CVSymbol &CVR, DefRangeFramePointerRelSym &DefRangeFramePointerRel) { -  DictScope S(W, "DefRangeFramePointerRel"); -    W.printNumber("Offset", DefRangeFramePointerRel.Offset);    printLocalVariableAddrRange(DefRangeFramePointerRel.Range,                                DefRangeFramePointerRel.getRelocationOffset()); @@ -326,8 +317,6 @@ Error CVSymbolDumperImpl::visitKnownRecord(  Error CVSymbolDumperImpl::visitKnownRecord(      CVSymbol &CVR, DefRangeRegisterRelSym &DefRangeRegisterRel) { -  DictScope S(W, "DefRangeRegisterRel"); -    W.printNumber("BaseRegister", DefRangeRegisterRel.Hdr.Register);    W.printBoolean("HasSpilledUDTMember",                   DefRangeRegisterRel.hasSpilledUDTMember()); @@ -341,8 +330,6 @@ Error CVSymbolDumperImpl::visitKnownRecord(  Error CVSymbolDumperImpl::visitKnownRecord(      CVSymbol &CVR, DefRangeRegisterSym &DefRangeRegister) { -  DictScope S(W, "DefRangeRegister"); -    W.printNumber("Register", DefRangeRegister.Hdr.Register);    W.printNumber("MayHaveNoName", DefRangeRegister.Hdr.MayHaveNoName);    printLocalVariableAddrRange(DefRangeRegister.Range, @@ -353,8 +340,6 @@ Error CVSymbolDumperImpl::visitKnownRecord(  Error CVSymbolDumperImpl::visitKnownRecord(      CVSymbol &CVR, DefRangeSubfieldRegisterSym &DefRangeSubfieldRegister) { -  DictScope S(W, "DefRangeSubfieldRegister"); -    W.printNumber("Register", DefRangeSubfieldRegister.Hdr.Register);    W.printNumber("MayHaveNoName", DefRangeSubfieldRegister.Hdr.MayHaveNoName);    W.printNumber("OffsetInParent", DefRangeSubfieldRegister.Hdr.OffsetInParent); @@ -366,8 +351,6 @@ Error CVSymbolDumperImpl::visitKnownRecord(  Error CVSymbolDumperImpl::visitKnownRecord(      CVSymbol &CVR, DefRangeSubfieldSym &DefRangeSubfield) { -  DictScope S(W, "DefRangeSubfield"); -    if (ObjDelegate) {      DebugStringTableSubsectionRef Strings = ObjDelegate->getStringTable();      auto ExpectedProgram = Strings.getString(DefRangeSubfield.Program); @@ -387,8 +370,6 @@ Error CVSymbolDumperImpl::visitKnownRecord(  Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR,                                             DefRangeSym &DefRange) { -  DictScope S(W, "DefRange"); -    if (ObjDelegate) {      DebugStringTableSubsectionRef Strings = ObjDelegate->getStringTable();      auto ExpectedProgram = Strings.getString(DefRange.Program); @@ -406,8 +387,6 @@ Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR,  Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR,                                             FrameCookieSym &FrameCookie) { -  DictScope S(W, "FrameCookie"); -    StringRef LinkageName;    if (ObjDelegate) {      ObjDelegate->printRelocatedField("CodeOffset", @@ -423,8 +402,6 @@ Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR,  Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR,                                             FrameProcSym &FrameProc) { -  DictScope S(W, "FrameProc"); -    W.printHex("TotalFrameBytes", FrameProc.TotalFrameBytes);    W.printHex("PaddingFrameBytes", FrameProc.PaddingFrameBytes);    W.printHex("OffsetToPadding", FrameProc.OffsetToPadding); @@ -440,8 +417,6 @@ Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR,  Error CVSymbolDumperImpl::visitKnownRecord(      CVSymbol &CVR, HeapAllocationSiteSym &HeapAllocSite) { -  DictScope S(W, "HeapAllocationSite"); -    StringRef LinkageName;    if (ObjDelegate) {      ObjDelegate->printRelocatedField("CodeOffset", @@ -458,8 +433,6 @@ Error CVSymbolDumperImpl::visitKnownRecord(  Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR,                                             InlineSiteSym &InlineSite) { -  DictScope S(W, "InlineSite"); -    W.printHex("PtrParent", InlineSite.Parent);    W.printHex("PtrEnd", InlineSite.End);    printTypeIndex("Inlinee", InlineSite.Inlinee); @@ -515,7 +488,6 @@ Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR,  Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR,                                             RegisterSym &Register) { -  DictScope S(W, "RegisterSym");    printTypeIndex("Type", Register.Index);    W.printEnum("Seg", uint16_t(Register.Register), getRegisterNames());    W.printString("Name", Register.Name); @@ -523,7 +495,6 @@ Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR,  }  Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR, PublicSym32 &Public) { -  DictScope S(W, "PublicSym");    W.printFlags("Flags", uint32_t(Public.Flags), getPublicSymFlagNames());    W.printNumber("Seg", Public.Segment);    W.printNumber("Off", Public.Offset); @@ -532,7 +503,6 @@ Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR, PublicSym32 &Public) {  }  Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR, ProcRefSym &ProcRef) { -  DictScope S(W, "ProcRef");    W.printNumber("SumName", ProcRef.SumName);    W.printNumber("SymOffset", ProcRef.SymOffset);    W.printNumber("Mod", ProcRef.Module); @@ -541,8 +511,6 @@ Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR, ProcRefSym &ProcRef) {  }  Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR, LabelSym &Label) { -  DictScope S(W, "Label"); -    StringRef LinkageName;    if (ObjDelegate) {      ObjDelegate->printRelocatedField("CodeOffset", Label.getRelocationOffset(), @@ -558,8 +526,6 @@ Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR, LabelSym &Label) {  }  Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR, LocalSym &Local) { -  DictScope S(W, "Local"); -    printTypeIndex("Type", Local.Type);    W.printFlags("Flags", uint16_t(Local.Flags), getLocalFlagNames());    W.printString("VarName", Local.Name); @@ -567,16 +533,12 @@ Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR, LocalSym &Local) {  }  Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR, ObjNameSym &ObjName) { -  DictScope S(W, "ObjectName"); -    W.printHex("Signature", ObjName.Signature);    W.printString("ObjectName", ObjName.Name);    return Error::success();  }  Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR, ProcSym &Proc) { -  DictScope S(W, "ProcStart"); -    if (InFunctionScope)      return llvm::make_error<CodeViewError>(          "Visiting a ProcSym while inside function scope!"); @@ -584,7 +546,6 @@ Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR, ProcSym &Proc) {    InFunctionScope = true;    StringRef LinkageName; -  W.printEnum("Kind", uint16_t(CVR.kind()), getSymbolTypeNames());    W.printHex("PtrParent", Proc.Parent);    W.printHex("PtrEnd", Proc.End);    W.printHex("PtrNext", Proc.Next); @@ -607,13 +568,6 @@ Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR, ProcSym &Proc) {  Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR,                                             ScopeEndSym &ScopeEnd) { -  if (CVR.kind() == SymbolKind::S_END) -    DictScope S(W, "BlockEnd"); -  else if (CVR.kind() == SymbolKind::S_PROC_ID_END) -    DictScope S(W, "ProcEnd"); -  else if (CVR.kind() == SymbolKind::S_INLINESITE_END) -    DictScope S(W, "InlineSiteEnd"); -    InFunctionScope = false;    return Error::success();  } @@ -627,8 +581,6 @@ Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR, CallerSym &Caller) {  Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR,                                             RegRelativeSym &RegRel) { -  DictScope S(W, "RegRelativeSym"); -    W.printHex("Offset", RegRel.Offset);    printTypeIndex("Type", RegRel.Type);    W.printEnum("Register", uint16_t(RegRel.Register), getRegisterNames()); @@ -638,8 +590,6 @@ Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR,  Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR,                                             ThreadLocalDataSym &Data) { -  DictScope S(W, "ThreadLocalDataSym"); -    StringRef LinkageName;    if (ObjDelegate) {      ObjDelegate->printRelocatedField("DataOffset", Data.getRelocationOffset(), @@ -653,15 +603,12 @@ Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR,  }  Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR, UDTSym &UDT) { -  DictScope S(W, "UDT");    printTypeIndex("Type", UDT.Type);    W.printString("UDTName", UDT.Name);    return Error::success();  }  Error CVSymbolDumperImpl::visitUnknownSymbol(CVSymbol &CVR) { -  DictScope S(W, "UnknownSym"); -  W.printEnum("Kind", uint16_t(CVR.kind()), getSymbolTypeNames());    W.printNumber("Length", CVR.length());    return Error::success();  } diff --git a/lib/DebugInfo/CodeView/TypeIndexDiscovery.cpp b/lib/DebugInfo/CodeView/TypeIndexDiscovery.cpp index 72cb9e2e3544..0d935c4472ae 100644 --- a/lib/DebugInfo/CodeView/TypeIndexDiscovery.cpp +++ b/lib/DebugInfo/CodeView/TypeIndexDiscovery.cpp @@ -382,6 +382,13 @@ static bool discoverTypeIndices(ArrayRef<uint8_t> Content, SymbolKind Kind,    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; @@ -403,6 +410,10 @@ static bool discoverTypeIndices(ArrayRef<uint8_t> Content, SymbolKind Kind,    case SymbolKind::S_INLINESITE:      Refs.push_back({TiRefKind::IndexRef, 8, 1}); // ID of inlinee      break; +  case SymbolKind::S_HEAPALLOCSITE: +    // FIXME: It's not clear if this is a type or item reference. +    Refs.push_back({TiRefKind::IndexRef, 8, 1}); // signature +    break;    // Defranges don't have types, just registers and code offsets.    case SymbolKind::S_DEFRANGE_REGISTER: @@ -419,6 +430,7 @@ static bool discoverTypeIndices(ArrayRef<uint8_t> Content, SymbolKind Kind,    case SymbolKind::S_COMPILE:    case SymbolKind::S_COMPILE2:    case SymbolKind::S_COMPILE3: +  case SymbolKind::S_ENVBLOCK:    case SymbolKind::S_BLOCK32:    case SymbolKind::S_FRAMEPROC:      break; diff --git a/lib/DebugInfo/DWARF/DWARFContext.cpp b/lib/DebugInfo/DWARF/DWARFContext.cpp index a18d4efec07a..495e09fbae35 100644 --- a/lib/DebugInfo/DWARF/DWARFContext.cpp +++ b/lib/DebugInfo/DWARF/DWARFContext.cpp @@ -591,10 +591,10 @@ void DWARFContext::parseCompileUnits() {  void DWARFContext::parseTypeUnits() {    if (!TUs.empty())      return; -  for (const auto &I : getTypesSections()) { +  forEachTypesSections([&](const DWARFSection &S) {      TUs.emplace_back(); -    TUs.back().parse(*this, I.second); -  } +    TUs.back().parse(*this, S); +  });  }  void DWARFContext::parseDWOCompileUnits() { @@ -604,10 +604,10 @@ void DWARFContext::parseDWOCompileUnits() {  void DWARFContext::parseDWOTypeUnits() {    if (!DWOTUs.empty())      return; -  for (const auto &I : getTypesDWOSections()) { +  forEachTypesDWOSections([&](const DWARFSection &S) {      DWOTUs.emplace_back(); -    DWOTUs.back().parseDWO(*this, I.second); -  } +    DWOTUs.back().parseDWO(*this, S); +  });  }  DWARFCompileUnit *DWARFContext::getCompileUnitForOffset(uint32_t Offset) { @@ -937,27 +937,23 @@ DWARFContextInMemory::DWARFContextInMemory(      : FileName(Obj.getFileName()), IsLittleEndian(Obj.isLittleEndian()),        AddressSize(Obj.getBytesInAddress()) {    for (const SectionRef &Section : Obj.sections()) { -    StringRef name; -    Section.getName(name); +    StringRef Name; +    Section.getName(Name);      // Skip BSS and Virtual sections, they aren't interesting. -    bool IsBSS = Section.isBSS(); -    if (IsBSS) -      continue; -    bool IsVirtual = Section.isVirtual(); -    if (IsVirtual) +    if (Section.isBSS() || Section.isVirtual())        continue; -    StringRef data; +    StringRef Data;      section_iterator RelocatedSection = Section.getRelocatedSection();      // Try to obtain an already relocated version of this section.      // Else use the unrelocated section from the object file. We'll have to      // apply relocations ourselves later. -    if (!L || !L->getLoadedSectionContents(*RelocatedSection, data)) -      Section.getContents(data); +    if (!L || !L->getLoadedSectionContents(*RelocatedSection, Data)) +      Section.getContents(Data); -    if (auto Err = maybeDecompress(Section, name, data)) { +    if (auto Err = maybeDecompress(Section, Name, Data)) {        ErrorPolicy EP = HandleError( -          createError("failed to decompress '" + name + "', ", std::move(Err))); +          createError("failed to decompress '" + Name + "', ", std::move(Err)));        if (EP == ErrorPolicy::Halt)          return;        continue; @@ -965,27 +961,27 @@ DWARFContextInMemory::DWARFContextInMemory(      // Compressed sections names in GNU style starts from ".z",      // at this point section is decompressed and we drop compression prefix. -    name = name.substr( -        name.find_first_not_of("._z")); // Skip ".", "z" and "_" prefixes. +    Name = Name.substr( +        Name.find_first_not_of("._z")); // Skip ".", "z" and "_" prefixes. + +    // Map platform specific debug section names to DWARF standard section +    // names. +    Name = Obj.mapDebugSectionName(Name); -    if (StringRef *SectionData = MapSectionToMember(name)) { -      *SectionData = data; -      if (name == "debug_ranges") { +    if (StringRef *SectionData = mapSectionToMember(Name)) { +      *SectionData = Data; +      if (Name == "debug_ranges") {          // FIXME: Use the other dwo range section when we emit it. -        RangeDWOSection.Data = data; +        RangeDWOSection.Data = Data;        } -    } else if (name == "debug_types") { +    } else if (Name == "debug_types") {        // Find debug_types data by section rather than name as there are        // multiple, comdat grouped, debug_types sections. -      TypesSections[Section].Data = data; -    } else if (name == "debug_types.dwo") { -      TypesDWOSections[Section].Data = data; +      TypesSections[Section].Data = Data; +    } else if (Name == "debug_types.dwo") { +      TypesDWOSections[Section].Data = Data;      } -    // Map platform specific debug section names to DWARF standard section -    // names. -    name = Obj.mapDebugSectionName(name); -      if (RelocatedSection == Obj.section_end())        continue; @@ -1012,21 +1008,8 @@ DWARFContextInMemory::DWARFContextInMemory(      // TODO: Add support for relocations in other sections as needed.      // Record relocations for the debug_info and debug_line sections. -    RelocAddrMap *Map = -        StringSwitch<RelocAddrMap *>(RelSecName) -            .Case("debug_info", &InfoSection.Relocs) -            .Case("debug_loc", &LocSection.Relocs) -            .Case("debug_info.dwo", &InfoDWOSection.Relocs) -            .Case("debug_line", &LineSection.Relocs) -            .Case("debug_str_offsets", &StringOffsetSection.Relocs) -            .Case("debug_ranges", &RangeSection.Relocs) -            .Case("debug_addr", &AddrSection.Relocs) -            .Case("apple_names", &AppleNamesSection.Relocs) -            .Case("apple_types", &AppleTypesSection.Relocs) -            .Case("apple_namespaces", &AppleNamespacesSection.Relocs) -            .Case("apple_namespac", &AppleNamespacesSection.Relocs) -            .Case("apple_objc", &AppleObjCSection.Relocs) -            .Default(nullptr); +    DWARFSection *Sec = mapNameToDWARFSection(RelSecName); +    RelocAddrMap *Map = Sec ? &Sec->Relocs : nullptr;      if (!Map) {        // Find debug_types relocs by section rather than name as there are        // multiple, comdat grouped, debug_types sections. @@ -1059,10 +1042,10 @@ DWARFContextInMemory::DWARFContextInMemory(        object::RelocVisitor V(Obj);        uint64_t Val = V.visit(Reloc.getType(), Reloc, SymInfoOrErr->Address);        if (V.error()) { -        SmallString<32> Name; -        Reloc.getTypeName(Name); +        SmallString<32> Type; +        Reloc.getTypeName(Type);          ErrorPolicy EP = HandleError( -            createError("failed to compute relocation: " + Name + ", ", +            createError("failed to compute relocation: " + Type + ", ",                          errorCodeToError(object_error::parse_failed)));          if (EP == ErrorPolicy::Halt)            return; @@ -1079,40 +1062,47 @@ DWARFContextInMemory::DWARFContextInMemory(      bool isLittleEndian)      : IsLittleEndian(isLittleEndian), AddressSize(AddrSize) {    for (const auto &SecIt : Sections) { -    if (StringRef *SectionData = MapSectionToMember(SecIt.first())) +    if (StringRef *SectionData = mapSectionToMember(SecIt.first()))        *SectionData = SecIt.second->getBuffer();    }  } -StringRef *DWARFContextInMemory::MapSectionToMember(StringRef Name) { +DWARFSection *DWARFContextInMemory::mapNameToDWARFSection(StringRef Name) { +  return StringSwitch<DWARFSection *>(Name) +      .Case("debug_info", &InfoSection) +      .Case("debug_loc", &LocSection) +      .Case("debug_line", &LineSection) +      .Case("debug_str_offsets", &StringOffsetSection) +      .Case("debug_ranges", &RangeSection) +      .Case("debug_info.dwo", &InfoDWOSection) +      .Case("debug_loc.dwo", &LocDWOSection) +      .Case("debug_line.dwo", &LineDWOSection) +      .Case("debug_str_offsets.dwo", &StringOffsetDWOSection) +      .Case("debug_addr", &AddrSection) +      .Case("apple_names", &AppleNamesSection) +      .Case("apple_types", &AppleTypesSection) +      .Case("apple_namespaces", &AppleNamespacesSection) +      .Case("apple_namespac", &AppleNamespacesSection) +      .Case("apple_objc", &AppleObjCSection) +      .Default(nullptr); +} + +StringRef *DWARFContextInMemory::mapSectionToMember(StringRef Name) { +  if (DWARFSection *Sec = mapNameToDWARFSection(Name)) +    return &Sec->Data;    return StringSwitch<StringRef *>(Name) -      .Case("debug_info", &InfoSection.Data)        .Case("debug_abbrev", &AbbrevSection) -      .Case("debug_loc", &LocSection.Data) -      .Case("debug_line", &LineSection.Data)        .Case("debug_aranges", &ARangeSection)        .Case("debug_frame", &DebugFrameSection)        .Case("eh_frame", &EHFrameSection)        .Case("debug_str", &StringSection) -      .Case("debug_str_offsets", &StringOffsetSection.Data) -      .Case("debug_ranges", &RangeSection.Data)        .Case("debug_macinfo", &MacinfoSection)        .Case("debug_pubnames", &PubNamesSection)        .Case("debug_pubtypes", &PubTypesSection)        .Case("debug_gnu_pubnames", &GnuPubNamesSection)        .Case("debug_gnu_pubtypes", &GnuPubTypesSection) -      .Case("debug_info.dwo", &InfoDWOSection.Data)        .Case("debug_abbrev.dwo", &AbbrevDWOSection) -      .Case("debug_loc.dwo", &LocDWOSection.Data) -      .Case("debug_line.dwo", &LineDWOSection.Data)        .Case("debug_str.dwo", &StringDWOSection) -      .Case("debug_str_offsets.dwo", &StringOffsetDWOSection.Data) -      .Case("debug_addr", &AddrSection.Data) -      .Case("apple_names", &AppleNamesSection.Data) -      .Case("apple_types", &AppleTypesSection.Data) -      .Case("apple_namespaces", &AppleNamespacesSection.Data) -      .Case("apple_namespac", &AppleNamespacesSection.Data) -      .Case("apple_objc", &AppleObjCSection.Data)        .Case("debug_cu_index", &CUIndexSection)        .Case("debug_tu_index", &TUIndexSection)        .Case("gdb_index", &GdbIndexSection) diff --git a/lib/DebugInfo/DWARF/DWARFDie.cpp b/lib/DebugInfo/DWARF/DWARFDie.cpp index ef416f72ad17..111f0bbd4444 100644 --- a/lib/DebugInfo/DWARF/DWARFDie.cpp +++ b/lib/DebugInfo/DWARF/DWARFDie.cpp @@ -395,7 +395,7 @@ DWARFDie::attribute_iterator::attribute_iterator(DWARFDie D, bool End) :  void DWARFDie::attribute_iterator::updateForIndex(      const DWARFAbbreviationDeclaration &AbbrDecl, uint32_t I) {    Index = I; -  // AbbrDecl must be valid befor calling this function. +  // AbbrDecl must be valid before calling this function.    auto NumAttrs = AbbrDecl.getNumAttributes();    if (Index < NumAttrs) {      AttrValue.Attr = AbbrDecl.getAttrByIndex(Index); diff --git a/lib/DebugInfo/PDB/CMakeLists.txt b/lib/DebugInfo/PDB/CMakeLists.txt index e9fd29ccc4ca..ff01c948e099 100644 --- a/lib/DebugInfo/PDB/CMakeLists.txt +++ b/lib/DebugInfo/PDB/CMakeLists.txt @@ -41,6 +41,7 @@ add_pdb_impl_folder(Native    Native/InfoStream.cpp    Native/InfoStreamBuilder.cpp    Native/ModuleDebugStream.cpp +  Native/NativeBuiltinSymbol.cpp    Native/NativeCompilandSymbol.cpp    Native/NativeEnumModules.cpp    Native/NativeExeSymbol.cpp @@ -53,6 +54,7 @@ add_pdb_impl_folder(Native    Native/PDBStringTableBuilder.cpp    Native/PDBTypeServerHandler.cpp    Native/PublicsStream.cpp +  Native/PublicsStreamBuilder.cpp    Native/RawError.cpp    Native/SymbolStream.cpp    Native/TpiHashing.cpp diff --git a/lib/DebugInfo/PDB/Native/DbiModuleDescriptorBuilder.cpp b/lib/DebugInfo/PDB/Native/DbiModuleDescriptorBuilder.cpp index 745dd742aadc..897f78c51032 100644 --- a/lib/DebugInfo/PDB/Native/DbiModuleDescriptorBuilder.cpp +++ b/lib/DebugInfo/PDB/Native/DbiModuleDescriptorBuilder.cpp @@ -65,6 +65,10 @@ void DbiModuleDescriptorBuilder::setObjFileName(StringRef Name) {    ObjFileName = Name;  } +void DbiModuleDescriptorBuilder::setPdbFilePathNI(uint32_t NI) { +  PdbFilePathNI = NI; +} +  void DbiModuleDescriptorBuilder::addSymbol(CVSymbol Symbol) {    Symbols.push_back(Symbol);    // Symbols written to a PDB file are required to be 4 byte aligned.  The same @@ -111,7 +115,7 @@ void DbiModuleDescriptorBuilder::finalize() {    (void)Layout.Mod;         // Set in constructor    (void)Layout.ModDiStream; // Set in finalizeMsfLayout    Layout.NumFiles = SourceFiles.size(); -  Layout.PdbFilePathNI = 0; +  Layout.PdbFilePathNI = PdbFilePathNI;    Layout.SrcFileNameNI = 0;    // This value includes both the signature field as well as the record bytes diff --git a/lib/DebugInfo/PDB/Native/DbiStream.cpp b/lib/DebugInfo/PDB/Native/DbiStream.cpp index a1f0671dec3e..0eeac7e4c084 100644 --- a/lib/DebugInfo/PDB/Native/DbiStream.cpp +++ b/lib/DebugInfo/PDB/Native/DbiStream.cpp @@ -225,6 +225,10 @@ void DbiStream::visitSectionContributions(    }  } +Expected<StringRef> DbiStream::getECName(uint32_t NI) const { +  return ECNames.getStringForID(NI); +} +  Error DbiStream::initializeSectionContributionData() {    if (SecContrSubstream.empty())      return Error::success(); @@ -248,6 +252,9 @@ Error DbiStream::initializeSectionHeadersData() {      return Error::success();    uint32_t StreamNum = getDebugStreamIndex(DbgHeaderType::SectionHdr); +  if (StreamNum == kInvalidStreamIndex) +    return Error::success(); +    if (StreamNum >= Pdb.getNumStreams())      return make_error<RawError>(raw_error_code::no_stream); diff --git a/lib/DebugInfo/PDB/Native/DbiStreamBuilder.cpp b/lib/DebugInfo/PDB/Native/DbiStreamBuilder.cpp index aad247ea185f..25076e40fc98 100644 --- a/lib/DebugInfo/PDB/Native/DbiStreamBuilder.cpp +++ b/lib/DebugInfo/PDB/Native/DbiStreamBuilder.cpp @@ -49,9 +49,17 @@ void DbiStreamBuilder::setSectionMap(ArrayRef<SecMapEntry> SecMap) {    SectionMap = SecMap;  } +void DbiStreamBuilder::setSymbolRecordStreamIndex(uint32_t Index) { +  SymRecordStreamIndex = Index; +} + +void DbiStreamBuilder::setPublicsStreamIndex(uint32_t Index) { +  PublicsStreamIndex = Index; +} +  Error DbiStreamBuilder::addDbgStream(pdb::DbgHeaderType Type,                                       ArrayRef<uint8_t> Data) { -  if (DbgStreams[(int)Type].StreamNumber) +  if (DbgStreams[(int)Type].StreamNumber != kInvalidStreamIndex)      return make_error<RawError>(raw_error_code::duplicate_entry,                                  "The specified stream type already exists");    auto ExpectedIndex = Msf.addStream(Data.size()); @@ -63,11 +71,16 @@ Error DbiStreamBuilder::addDbgStream(pdb::DbgHeaderType Type,    return Error::success();  } +uint32_t DbiStreamBuilder::addECName(StringRef Name) { +  return ECNamesBuilder.insert(Name); +} +  uint32_t DbiStreamBuilder::calculateSerializedLength() const {    // For now we only support serializing the header.    return sizeof(DbiStreamHeader) + calculateFileInfoSubstreamSize() +           calculateModiSubstreamSize() + calculateSectionContribsStreamSize() + -         calculateSectionMapStreamSize() + calculateDbgStreamsSize(); +         calculateSectionMapStreamSize() + calculateDbgStreamsSize() + +         ECNamesBuilder.calculateSerializedSize();  }  Expected<DbiModuleDescriptorBuilder &> @@ -247,15 +260,15 @@ Error DbiStreamBuilder::finalize() {    H->PdbDllVersion = PdbDllVersion;    H->MachineType = static_cast<uint16_t>(MachineType); -  H->ECSubstreamSize = 0; +  H->ECSubstreamSize = ECNamesBuilder.calculateSerializedSize();    H->FileInfoSize = FileInfoBuffer.getLength();    H->ModiSubstreamSize = calculateModiSubstreamSize();    H->OptionalDbgHdrSize = DbgStreams.size() * sizeof(uint16_t);    H->SecContrSubstreamSize = calculateSectionContribsStreamSize();    H->SectionMapSize = calculateSectionMapStreamSize();    H->TypeServerSize = 0; -  H->SymRecordStreamIndex = kInvalidStreamIndex; -  H->PublicSymbolStreamIndex = kInvalidStreamIndex; +  H->SymRecordStreamIndex = SymRecordStreamIndex; +  H->PublicSymbolStreamIndex = PublicsStreamIndex;    H->MFCTypeServerIndex = kInvalidStreamIndex;    H->GlobalSymbolStreamIndex = kInvalidStreamIndex; @@ -383,6 +396,9 @@ Error DbiStreamBuilder::commit(const msf::MSFLayout &Layout,    if (auto EC = Writer.writeStreamRef(FileInfoBuffer))      return EC; +  if (auto EC = ECNamesBuilder.commit(Writer)) +    return EC; +    for (auto &Stream : DbgStreams)      if (auto EC = Writer.writeInteger(Stream.StreamNumber))        return EC; diff --git a/lib/DebugInfo/PDB/Native/NamedStreamMap.cpp b/lib/DebugInfo/PDB/Native/NamedStreamMap.cpp index 354b8c0e07ff..6cdf6dde04d9 100644 --- a/lib/DebugInfo/PDB/Native/NamedStreamMap.cpp +++ b/lib/DebugInfo/PDB/Native/NamedStreamMap.cpp @@ -86,7 +86,8 @@ Error NamedStreamMap::commit(BinaryStreamWriter &Writer) const {    for (const auto &Name : OrderedStreamNames) {      auto Item = Mapping.find(Name); -    assert(Item != Mapping.end()); +    if (Item == Mapping.end()) +      continue;      if (auto EC = Writer.writeCString(Item->getKey()))        return EC;    } @@ -108,7 +109,8 @@ uint32_t NamedStreamMap::finalize() {    for (const auto &Name : OrderedStreamNames) {      auto Item = Mapping.find(Name); -    assert(Item != Mapping.end()); +    if (Item == Mapping.end()) +      continue;      FinalizedHashTable.set(FinalizedInfo->StringDataBytes, Item->getValue());      FinalizedInfo->StringDataBytes += Item->getKeyLength() + 1;    } diff --git a/lib/DebugInfo/PDB/Native/NativeBuiltinSymbol.cpp b/lib/DebugInfo/PDB/Native/NativeBuiltinSymbol.cpp new file mode 100644 index 000000000000..60416f69e137 --- /dev/null +++ b/lib/DebugInfo/PDB/Native/NativeBuiltinSymbol.cpp @@ -0,0 +1,48 @@ +//===- NativeBuiltinSymbol.cpp ------------------------------------ C++ -*-===// +// +//                     The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#include "llvm/DebugInfo/PDB/Native/NativeBuiltinSymbol.h" + +#include "llvm/DebugInfo/PDB/Native/NativeSession.h" + +namespace llvm { +namespace pdb { + +NativeBuiltinSymbol::NativeBuiltinSymbol(NativeSession &PDBSession, +                                         SymIndexId Id, PDB_BuiltinType T, +                                         uint64_t L) +    : NativeRawSymbol(PDBSession, Id), Session(PDBSession), Type(T), Length(L) { +} + +NativeBuiltinSymbol::~NativeBuiltinSymbol() {} + +std::unique_ptr<NativeRawSymbol> NativeBuiltinSymbol::clone() const { +  return llvm::make_unique<NativeBuiltinSymbol>(Session, SymbolId, Type, Length); +} + +void NativeBuiltinSymbol::dump(raw_ostream &OS, int Indent) const { +  // TODO:  Apparently nothing needs this yet. +} + +PDB_SymType NativeBuiltinSymbol::getSymTag() const { +  return PDB_SymType::BuiltinType; +} + +PDB_BuiltinType NativeBuiltinSymbol::getBuiltinType() const { return Type; } + +bool NativeBuiltinSymbol::isConstType() const { return false; } + +uint64_t NativeBuiltinSymbol::getLength() const { return Length; } + +bool NativeBuiltinSymbol::isUnalignedType() const { return false; } + +bool NativeBuiltinSymbol::isVolatileType() const { return false; } + +} // namespace pdb +} // namespace llvm diff --git a/lib/DebugInfo/PDB/Native/NativeCompilandSymbol.cpp b/lib/DebugInfo/PDB/Native/NativeCompilandSymbol.cpp index 180c169ec209..7132a99a9f16 100644 --- a/lib/DebugInfo/PDB/Native/NativeCompilandSymbol.cpp +++ b/lib/DebugInfo/PDB/Native/NativeCompilandSymbol.cpp @@ -15,7 +15,7 @@ namespace llvm {  namespace pdb {  NativeCompilandSymbol::NativeCompilandSymbol(NativeSession &Session, -                                             uint32_t SymbolId, +                                             SymIndexId SymbolId,                                               DbiModuleDescriptor MI)      : NativeRawSymbol(Session, SymbolId), Module(MI) {} diff --git a/lib/DebugInfo/PDB/Native/NativeExeSymbol.cpp b/lib/DebugInfo/PDB/Native/NativeExeSymbol.cpp index 6206155b9fb6..cb0830f453c8 100644 --- a/lib/DebugInfo/PDB/Native/NativeExeSymbol.cpp +++ b/lib/DebugInfo/PDB/Native/NativeExeSymbol.cpp @@ -18,7 +18,7 @@  namespace llvm {  namespace pdb { -NativeExeSymbol::NativeExeSymbol(NativeSession &Session, uint32_t SymbolId) +NativeExeSymbol::NativeExeSymbol(NativeSession &Session, SymIndexId SymbolId)      : NativeRawSymbol(Session, SymbolId), File(Session.getPDBFile()) {}  std::unique_ptr<NativeRawSymbol> NativeExeSymbol::clone() const { diff --git a/lib/DebugInfo/PDB/Native/NativeRawSymbol.cpp b/lib/DebugInfo/PDB/Native/NativeRawSymbol.cpp index b4f5c96ce66b..92612bcea4ac 100644 --- a/lib/DebugInfo/PDB/Native/NativeRawSymbol.cpp +++ b/lib/DebugInfo/PDB/Native/NativeRawSymbol.cpp @@ -13,7 +13,7 @@  using namespace llvm;  using namespace llvm::pdb; -NativeRawSymbol::NativeRawSymbol(NativeSession &PDBSession, uint32_t SymbolId) +NativeRawSymbol::NativeRawSymbol(NativeSession &PDBSession, SymIndexId SymbolId)      : Session(PDBSession), SymbolId(SymbolId) {}  void NativeRawSymbol::dump(raw_ostream &OS, int Indent) const {} diff --git a/lib/DebugInfo/PDB/Native/NativeSession.cpp b/lib/DebugInfo/PDB/Native/NativeSession.cpp index 93d43d9ef341..76de0d8f9e7e 100644 --- a/lib/DebugInfo/PDB/Native/NativeSession.cpp +++ b/lib/DebugInfo/PDB/Native/NativeSession.cpp @@ -10,9 +10,11 @@  #include "llvm/DebugInfo/PDB/Native/NativeSession.h"  #include "llvm/ADT/STLExtras.h" +#include "llvm/DebugInfo/CodeView/TypeIndex.h"  #include "llvm/DebugInfo/PDB/GenericError.h"  #include "llvm/DebugInfo/PDB/IPDBEnumChildren.h"  #include "llvm/DebugInfo/PDB/IPDBSourceFile.h" +#include "llvm/DebugInfo/PDB/Native/NativeBuiltinSymbol.h"  #include "llvm/DebugInfo/PDB/Native/NativeCompilandSymbol.h"  #include "llvm/DebugInfo/PDB/Native/NativeExeSymbol.h"  #include "llvm/DebugInfo/PDB/Native/PDBFile.h" @@ -33,6 +35,28 @@ using namespace llvm;  using namespace llvm::msf;  using namespace llvm::pdb; +namespace { +// Maps codeview::SimpleTypeKind of a built-in type to the parameters necessary +// to instantiate a NativeBuiltinSymbol for that type. +static const struct BuiltinTypeEntry { +  codeview::SimpleTypeKind Kind; +  PDB_BuiltinType Type; +  uint32_t Size; +} BuiltinTypes[] = { +    {codeview::SimpleTypeKind::Int32, PDB_BuiltinType::Int, 4}, +    {codeview::SimpleTypeKind::UInt32, PDB_BuiltinType::UInt, 4}, +    {codeview::SimpleTypeKind::UInt32Long, PDB_BuiltinType::UInt, 4}, +    {codeview::SimpleTypeKind::UInt64Quad, PDB_BuiltinType::UInt, 8}, +    {codeview::SimpleTypeKind::NarrowCharacter, PDB_BuiltinType::Char, 1}, +    {codeview::SimpleTypeKind::SignedCharacter, PDB_BuiltinType::Char, 1}, +    {codeview::SimpleTypeKind::UnsignedCharacter, PDB_BuiltinType::UInt, 1}, +    {codeview::SimpleTypeKind::UInt16Short, PDB_BuiltinType::UInt, 2}, +    {codeview::SimpleTypeKind::Boolean8, PDB_BuiltinType::Bool, 1} +    // This table can be grown as necessary, but these are the only types we've +    // needed so far. +}; +} // namespace +  NativeSession::NativeSession(std::unique_ptr<PDBFile> PdbFile,                               std::unique_ptr<BumpPtrAllocator> Allocator)      : Pdb(std::move(PdbFile)), Allocator(std::move(Allocator)) {} @@ -71,19 +95,51 @@ Error NativeSession::createFromExe(StringRef Path,  std::unique_ptr<PDBSymbolCompiland>  NativeSession::createCompilandSymbol(DbiModuleDescriptor MI) { -  const auto Id = static_cast<uint32_t>(SymbolCache.size()); +  const auto Id = static_cast<SymIndexId>(SymbolCache.size());    SymbolCache.push_back(        llvm::make_unique<NativeCompilandSymbol>(*this, Id, MI));    return llvm::make_unique<PDBSymbolCompiland>(        *this, std::unique_ptr<IPDBRawSymbol>(SymbolCache[Id]->clone()));  } +SymIndexId NativeSession::findSymbolByTypeIndex(codeview::TypeIndex Index) { +  // First see if it's already in our cache. +  const auto Entry = TypeIndexToSymbolId.find(Index); +  if (Entry != TypeIndexToSymbolId.end()) +    return Entry->second; + +  // Symbols for built-in types are created on the fly. +  if (Index.isSimple()) { +    // FIXME:  We will eventually need to handle pointers to other simple types, +    // which are still simple types in the world of CodeView TypeIndexes. +    if (Index.getSimpleMode() != codeview::SimpleTypeMode::Direct) +      return 0; +    const auto Kind = Index.getSimpleKind(); +    const auto It = +        std::find_if(std::begin(BuiltinTypes), std::end(BuiltinTypes), +                     [Kind](const BuiltinTypeEntry &Builtin) { +                       return Builtin.Kind == Kind; +                     }); +    if (It == std::end(BuiltinTypes)) +      return 0; +    SymIndexId Id = SymbolCache.size(); +    SymbolCache.emplace_back( +        llvm::make_unique<NativeBuiltinSymbol>(*this, Id, It->Type, It->Size)); +    TypeIndexToSymbolId[Index] = Id; +    return Id; +  } + +  // TODO:  Look up PDB type by type index + +  return 0; +} +  uint64_t NativeSession::getLoadAddress() const { return 0; }  void NativeSession::setLoadAddress(uint64_t Address) {}  std::unique_ptr<PDBSymbolExe> NativeSession::getGlobalScope() { -  const auto Id = static_cast<uint32_t>(SymbolCache.size()); +  const auto Id = static_cast<SymIndexId>(SymbolCache.size());    SymbolCache.push_back(llvm::make_unique<NativeExeSymbol>(*this, Id));    auto RawSymbol = SymbolCache[Id]->clone();    auto PdbSymbol(PDBSymbol::create(*this, std::move(RawSymbol))); diff --git a/lib/DebugInfo/PDB/Native/PDBFile.cpp b/lib/DebugInfo/PDB/Native/PDBFile.cpp index 4f6ebb0cb342..0b6492efc70f 100644 --- a/lib/DebugInfo/PDB/Native/PDBFile.cpp +++ b/lib/DebugInfo/PDB/Native/PDBFile.cpp @@ -385,8 +385,11 @@ bool PDBFile::hasPDBDbiStream() const { return StreamDBI < getNumStreams(); }  bool PDBFile::hasPDBGlobalsStream() {    auto DbiS = getPDBDbiStream(); -  if (!DbiS) +  if (!DbiS) { +    consumeError(DbiS.takeError());      return false; +  } +    return DbiS->getGlobalSymbolStreamIndex() < getNumStreams();  } @@ -396,8 +399,10 @@ bool PDBFile::hasPDBIpiStream() const { return StreamIPI < getNumStreams(); }  bool PDBFile::hasPDBPublicsStream() {    auto DbiS = getPDBDbiStream(); -  if (!DbiS) +  if (!DbiS) { +    consumeError(DbiS.takeError());      return false; +  }    return DbiS->getPublicSymbolStreamIndex() < getNumStreams();  } diff --git a/lib/DebugInfo/PDB/Native/PDBFileBuilder.cpp b/lib/DebugInfo/PDB/Native/PDBFileBuilder.cpp index 12b0c3b36c1d..9f35fd73629c 100644 --- a/lib/DebugInfo/PDB/Native/PDBFileBuilder.cpp +++ b/lib/DebugInfo/PDB/Native/PDBFileBuilder.cpp @@ -18,6 +18,7 @@  #include "llvm/DebugInfo/PDB/Native/InfoStream.h"  #include "llvm/DebugInfo/PDB/Native/InfoStreamBuilder.h"  #include "llvm/DebugInfo/PDB/Native/PDBStringTableBuilder.h" +#include "llvm/DebugInfo/PDB/Native/PublicsStreamBuilder.h"  #include "llvm/DebugInfo/PDB/Native/RawError.h"  #include "llvm/DebugInfo/PDB/Native/TpiStream.h"  #include "llvm/DebugInfo/PDB/Native/TpiStreamBuilder.h" @@ -33,6 +34,8 @@ using namespace llvm::support;  PDBFileBuilder::PDBFileBuilder(BumpPtrAllocator &Allocator)      : Allocator(Allocator) {} +PDBFileBuilder::~PDBFileBuilder() {} +  Error PDBFileBuilder::initialize(uint32_t BlockSize) {    auto ExpectedMsf = MSFBuilder::create(Allocator, BlockSize);    if (!ExpectedMsf) @@ -71,6 +74,12 @@ PDBStringTableBuilder &PDBFileBuilder::getStringTableBuilder() {    return Strings;  } +PublicsStreamBuilder &PDBFileBuilder::getPublicsBuilder() { +  if (!Publics) +    Publics = llvm::make_unique<PublicsStreamBuilder>(*Msf); +  return *Publics; +} +  Error PDBFileBuilder::addNamedStream(StringRef Name, uint32_t Size) {    auto ExpectedStream = Msf->addStream(Size);    if (!ExpectedStream) @@ -96,8 +105,6 @@ Expected<msf::MSFLayout> PDBFileBuilder::finalizeMsfLayout() {      return std::move(EC);    if (auto EC = addNamedStream("/LinkInfo", 0))      return std::move(EC); -  if (auto EC = addNamedStream("/src/headerblock", 0)) -    return std::move(EC);    if (Info) {      if (auto EC = Info->finalizeMsfLayout()) @@ -115,6 +122,14 @@ Expected<msf::MSFLayout> PDBFileBuilder::finalizeMsfLayout() {      if (auto EC = Ipi->finalizeMsfLayout())        return std::move(EC);    } +  if (Publics) { +    if (auto EC = Publics->finalizeMsfLayout()) +      return std::move(EC); +    if (Dbi) { +      Dbi->setPublicsStreamIndex(Publics->getStreamIndex()); +      Dbi->setSymbolRecordStreamIndex(Publics->getRecordStreamIdx()); +    } +  }    return Msf->build();  } @@ -194,5 +209,13 @@ Error PDBFileBuilder::commit(StringRef Filename) {        return EC;    } +  if (Publics) { +    auto PS = WritableMappedBlockStream::createIndexedStream( +        Layout, Buffer, Publics->getStreamIndex(), Allocator); +    BinaryStreamWriter PSWriter(*PS); +    if (auto EC = Publics->commit(PSWriter)) +      return EC; +  } +    return Buffer.commit();  } diff --git a/lib/DebugInfo/PDB/Native/PDBStringTable.cpp b/lib/DebugInfo/PDB/Native/PDBStringTable.cpp index f9f8ac219d35..acd45f7a6219 100644 --- a/lib/DebugInfo/PDB/Native/PDBStringTable.cpp +++ b/lib/DebugInfo/PDB/Native/PDBStringTable.cpp @@ -21,7 +21,7 @@ using namespace llvm;  using namespace llvm::support;  using namespace llvm::pdb; -uint32_t PDBStringTable::getByteSize() const { return ByteSize; } +uint32_t PDBStringTable::getByteSize() const { return Header->ByteSize; }  uint32_t PDBStringTable::getNameCount() const { return NameCount; }  uint32_t PDBStringTable::getHashVersion() const { return Header->HashVersion; }  uint32_t PDBStringTable::getSignature() const { return Header->Signature; } diff --git a/lib/DebugInfo/PDB/Native/PublicsStream.cpp b/lib/DebugInfo/PDB/Native/PublicsStream.cpp index 8f3474b9ce19..9c3e654f808b 100644 --- a/lib/DebugInfo/PDB/Native/PublicsStream.cpp +++ b/lib/DebugInfo/PDB/Native/PublicsStream.cpp @@ -41,19 +41,6 @@ using namespace llvm::msf;  using namespace llvm::support;  using namespace llvm::pdb; -// This is PSGSIHDR struct defined in -// https://github.com/Microsoft/microsoft-pdb/blob/master/PDB/dbi/gsi.h -struct PublicsStream::HeaderInfo { -  ulittle32_t SymHash; -  ulittle32_t AddrMap; -  ulittle32_t NumThunks; -  ulittle32_t SizeOfThunk; -  ulittle16_t ISectThunkTable; -  char Padding[2]; -  ulittle32_t OffThunkTable; -  ulittle32_t NumSections; -}; -  PublicsStream::PublicsStream(PDBFile &File,                               std::unique_ptr<MappedBlockStream> Stream)      : Pdb(File), Stream(std::move(Stream)) {} @@ -72,7 +59,8 @@ Error PublicsStream::reload() {    BinaryStreamReader Reader(*Stream);    // Check stream size. -  if (Reader.bytesRemaining() < sizeof(HeaderInfo) + sizeof(GSIHashHeader)) +  if (Reader.bytesRemaining() < +      sizeof(PublicsStreamHeader) + sizeof(GSIHashHeader))      return make_error<RawError>(raw_error_code::corrupt_file,                                  "Publics Stream does not contain a header."); diff --git a/lib/DebugInfo/PDB/Native/PublicsStreamBuilder.cpp b/lib/DebugInfo/PDB/Native/PublicsStreamBuilder.cpp new file mode 100644 index 000000000000..28c4a8fc35d9 --- /dev/null +++ b/lib/DebugInfo/PDB/Native/PublicsStreamBuilder.cpp @@ -0,0 +1,89 @@ +//===- DbiStreamBuilder.cpp - PDB Dbi Stream Creation -----------*- C++ -*-===// +// +//                     The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#include "llvm/DebugInfo/PDB/Native/PublicsStreamBuilder.h" + +#include "llvm/DebugInfo/MSF/MSFBuilder.h" +#include "llvm/DebugInfo/MSF/MSFCommon.h" +#include "llvm/DebugInfo/MSF/MappedBlockStream.h" + +#include "GSI.h" + +using namespace llvm; +using namespace llvm::msf; +using namespace llvm::pdb; + +PublicsStreamBuilder::PublicsStreamBuilder(msf::MSFBuilder &Msf) : Msf(Msf) {} + +PublicsStreamBuilder::~PublicsStreamBuilder() {} + +uint32_t PublicsStreamBuilder::calculateSerializedLength() const { +  uint32_t Size = 0; +  Size += sizeof(PublicsStreamHeader); +  Size += sizeof(GSIHashHeader); +  Size += HashRecords.size() * sizeof(PSHashRecord); +  size_t BitmapSizeInBits = alignTo(IPHR_HASH + 1, 32); +  uint32_t NumBitmapEntries = BitmapSizeInBits / 8; +  Size += NumBitmapEntries; + +  // FIXME: Account for hash buckets.  For now since we we write a zero-bitmap +  // indicating that no hash buckets are valid, we also write zero byets of hash +  // bucket data. +  Size += 0; +  return Size; +} + +Error PublicsStreamBuilder::finalizeMsfLayout() { +  Expected<uint32_t> Idx = Msf.addStream(calculateSerializedLength()); +  if (!Idx) +    return Idx.takeError(); +  StreamIdx = *Idx; + +  Expected<uint32_t> RecordIdx = Msf.addStream(0); +  if (!RecordIdx) +    return RecordIdx.takeError(); +  RecordStreamIdx = *RecordIdx; +  return Error::success(); +} + +Error PublicsStreamBuilder::commit(BinaryStreamWriter &PublicsWriter) { +  PublicsStreamHeader PSH; +  GSIHashHeader GSH; + +  // FIXME: Figure out what to put for these values. +  PSH.AddrMap = 0; +  PSH.ISectThunkTable = 0; +  PSH.NumSections = 0; +  PSH.NumThunks = 0; +  PSH.OffThunkTable = 0; +  PSH.SizeOfThunk = 0; +  PSH.SymHash = 0; + +  GSH.VerSignature = GSIHashHeader::HdrSignature; +  GSH.VerHdr = GSIHashHeader::HdrVersion; +  GSH.HrSize = 0; +  GSH.NumBuckets = 0; + +  if (auto EC = PublicsWriter.writeObject(PSH)) +    return EC; +  if (auto EC = PublicsWriter.writeObject(GSH)) +    return EC; +  if (auto EC = PublicsWriter.writeArray(makeArrayRef(HashRecords))) +    return EC; + +  size_t BitmapSizeInBits = alignTo(IPHR_HASH + 1, 32); +  uint32_t NumBitmapEntries = BitmapSizeInBits / 8; +  std::vector<uint8_t> BitmapData(NumBitmapEntries); +  // FIXME: Build an actual bitmap +  if (auto EC = PublicsWriter.writeBytes(makeArrayRef(BitmapData))) +    return EC; + +  // FIXME: Write actual hash buckets. +  return Error::success(); +}  | 
