blob: 116766740e5843a36e015aaa76313d17ea70ce11 [file] [log] [blame]
Rui Ueyamae7378242015-12-04 23:11:05 +00001//===- PDB.cpp ------------------------------------------------------------===//
2//
3// The LLVM Linker
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
Rui Ueyama1d99ab32016-09-15 22:24:51 +000010#include "PDB.h"
Rui Ueyama09e0b5f2016-11-12 00:00:51 +000011#include "Chunks.h"
Rui Ueyamabe939b32016-11-21 17:22:35 +000012#include "Config.h"
Rui Ueyamae7378242015-12-04 23:11:05 +000013#include "Error.h"
Rui Ueyama09e0b5f2016-11-12 00:00:51 +000014#include "SymbolTable.h"
15#include "Symbols.h"
Saleem Abdulrasooldf8a13b2017-01-04 17:56:54 +000016#include "llvm/DebugInfo/CodeView/CVDebugRecord.h"
Zachary Turner526f4f22017-05-19 19:26:58 +000017#include "llvm/DebugInfo/CodeView/CVTypeVisitor.h"
18#include "llvm/DebugInfo/CodeView/LazyRandomTypeCollection.h"
Rui Ueyama24625fd2016-11-22 23:51:34 +000019#include "llvm/DebugInfo/CodeView/SymbolDumper.h"
Zachary Turner629cb7d2017-01-11 23:24:22 +000020#include "llvm/DebugInfo/CodeView/TypeDatabase.h"
21#include "llvm/DebugInfo/CodeView/TypeDumpVisitor.h"
Rui Ueyama52896622017-01-12 03:09:25 +000022#include "llvm/DebugInfo/CodeView/TypeStreamMerger.h"
23#include "llvm/DebugInfo/CodeView/TypeTableBuilder.h"
Rui Ueyamab28c6d42016-09-16 04:32:33 +000024#include "llvm/DebugInfo/MSF/MSFBuilder.h"
Rui Ueyama7f382992016-09-15 18:55:18 +000025#include "llvm/DebugInfo/MSF/MSFCommon.h"
Adrian McCarthy6b6b8c42017-01-25 22:38:55 +000026#include "llvm/DebugInfo/PDB/Native/DbiStream.h"
27#include "llvm/DebugInfo/PDB/Native/DbiStreamBuilder.h"
28#include "llvm/DebugInfo/PDB/Native/InfoStream.h"
29#include "llvm/DebugInfo/PDB/Native/InfoStreamBuilder.h"
30#include "llvm/DebugInfo/PDB/Native/PDBFile.h"
31#include "llvm/DebugInfo/PDB/Native/PDBFileBuilder.h"
Reid Kleckner8cbdd0c2017-06-13 15:49:13 +000032#include "llvm/DebugInfo/PDB/Native/DbiModuleDescriptorBuilder.h"
Rafael Espindolaa0f30da2017-05-02 20:19:42 +000033#include "llvm/DebugInfo/PDB/Native/PDBStringTableBuilder.h"
Zachary Turner7b327d02017-02-16 23:35:45 +000034#include "llvm/DebugInfo/PDB/Native/PDBTypeServerHandler.h"
Adrian McCarthy6b6b8c42017-01-25 22:38:55 +000035#include "llvm/DebugInfo/PDB/Native/TpiStream.h"
36#include "llvm/DebugInfo/PDB/Native/TpiStreamBuilder.h"
Rui Ueyama20df4ec2016-10-31 21:09:21 +000037#include "llvm/Object/COFF.h"
Zachary Turnerd9dc2822017-03-02 20:52:51 +000038#include "llvm/Support/BinaryByteStream.h"
Rui Ueyama1763c0d2015-12-08 18:39:55 +000039#include "llvm/Support/Endian.h"
Rui Ueyamae7378242015-12-04 23:11:05 +000040#include "llvm/Support/FileOutputBuffer.h"
Zachary Turner7b327d02017-02-16 23:35:45 +000041#include "llvm/Support/Path.h"
Rui Ueyamabe939b32016-11-21 17:22:35 +000042#include "llvm/Support/ScopedPrinter.h"
Rui Ueyamae7378242015-12-04 23:11:05 +000043#include <memory>
44
Rui Ueyama1d99ab32016-09-15 22:24:51 +000045using namespace lld;
Rui Ueyama09e0b5f2016-11-12 00:00:51 +000046using namespace lld::coff;
Rui Ueyamae7378242015-12-04 23:11:05 +000047using namespace llvm;
Rui Ueyamabe939b32016-11-21 17:22:35 +000048using namespace llvm::codeview;
Rui Ueyama1763c0d2015-12-08 18:39:55 +000049using namespace llvm::support;
50using namespace llvm::support::endian;
Rui Ueyamae7378242015-12-04 23:11:05 +000051
Rui Ueyama09e0b5f2016-11-12 00:00:51 +000052using llvm::object::coff_section;
53
Rui Ueyamab28c6d42016-09-16 04:32:33 +000054static ExitOnError ExitOnErr;
55
Rui Ueyama09e0b5f2016-11-12 00:00:51 +000056// Returns a list of all SectionChunks.
Reid Kleckner8cbdd0c2017-06-13 15:49:13 +000057static void addSectionContribs(SymbolTable *Symtab, pdb::DbiStreamBuilder &DbiBuilder) {
Rui Ueyama09e0b5f2016-11-12 00:00:51 +000058 for (Chunk *C : Symtab->getChunks())
59 if (auto *SC = dyn_cast<SectionChunk>(C))
Reid Kleckner8cbdd0c2017-06-13 15:49:13 +000060 DbiBuilder.addSectionContrib(SC->File->ModuleDBI, SC->Header);
Rui Ueyama09e0b5f2016-11-12 00:00:51 +000061}
62
Rui Ueyamabe939b32016-11-21 17:22:35 +000063static SectionChunk *findByName(std::vector<SectionChunk *> &Sections,
64 StringRef Name) {
65 for (SectionChunk *C : Sections)
66 if (C->getSectionName() == Name)
67 return C;
68 return nullptr;
69}
70
Rui Ueyama52896622017-01-12 03:09:25 +000071static ArrayRef<uint8_t> getDebugSection(ObjectFile *File, StringRef SecName) {
72 SectionChunk *Sec = findByName(File->getDebugChunks(), SecName);
Rui Ueyamac5cb7372016-12-01 01:22:48 +000073 if (!Sec)
Rui Ueyama26186c72016-12-09 04:46:54 +000074 return {};
Rui Ueyamac5cb7372016-12-01 01:22:48 +000075
76 // First 4 bytes are section magic.
77 ArrayRef<uint8_t> Data = Sec->getContents();
78 if (Data.size() < 4)
Rui Ueyama52896622017-01-12 03:09:25 +000079 fatal(SecName + " too short");
Rui Ueyamac5cb7372016-12-01 01:22:48 +000080 if (read32le(Data.data()) != COFF::DEBUG_SECTION_MAGIC)
Rui Ueyama52896622017-01-12 03:09:25 +000081 fatal(SecName + " has an invalid magic");
Rui Ueyama26186c72016-12-09 04:46:54 +000082 return Data.slice(4);
83}
Rui Ueyamac5cb7372016-12-01 01:22:48 +000084
Reid Kleckner5d577522017-03-24 17:26:38 +000085static void addTypeInfo(pdb::TpiStreamBuilder &TpiBuilder,
Reid Kleckner13fc4112017-04-04 00:56:34 +000086 codeview::TypeTableBuilder &TypeTable) {
Reid Kleckner5d577522017-03-24 17:26:38 +000087 // Start the TPI or IPI stream header.
88 TpiBuilder.setVersionHeader(pdb::PdbTpiV80);
Rui Ueyama52896622017-01-12 03:09:25 +000089
Reid Kleckner5d577522017-03-24 17:26:38 +000090 // Flatten the in memory type table.
Reid Kleckner5d577522017-03-24 17:26:38 +000091 TypeTable.ForEachRecord([&](TypeIndex TI, ArrayRef<uint8_t> Rec) {
Reid Kleckner13fc4112017-04-04 00:56:34 +000092 // FIXME: Hash types.
93 TpiBuilder.addTypeRecord(Rec, None);
Reid Kleckner5d577522017-03-24 17:26:38 +000094 });
Reid Kleckner5d577522017-03-24 17:26:38 +000095}
96
Reid Kleckner8cbdd0c2017-06-13 15:49:13 +000097// Add all object files to the PDB. Merge .debug$T sections into IpiData and
98// TpiData.
99static void addObjectsToPDB(SymbolTable *Symtab, pdb::PDBFileBuilder &Builder,
100 codeview::TypeTableBuilder &TypeTable,
101 codeview::TypeTableBuilder &IDTable) {
Zachary Turner2897e032017-05-25 21:16:03 +0000102 // Follow type servers. If the same type server is encountered more than
103 // once for this instance of `PDBTypeServerHandler` (for example if many
104 // object files reference the same TypeServer), the types from the
105 // TypeServer will only be visited once.
106 pdb::PDBTypeServerHandler Handler;
107
Rui Ueyama52896622017-01-12 03:09:25 +0000108 // Visit all .debug$T sections to add them to Builder.
Rui Ueyama52896622017-01-12 03:09:25 +0000109 for (ObjectFile *File : Symtab->ObjectFiles) {
Reid Kleckner8cbdd0c2017-06-13 15:49:13 +0000110 // Add a module descriptor for every object file. We need to put an absolute
111 // path to the object into the PDB. If this is a plain object, we make its
112 // path absolute. If it's an object in an archive, we make the archive path
113 // absolute.
114 bool InArchive = !File->ParentName.empty();
115 SmallString<128> Path = InArchive ? File->ParentName : File->getName();
116 sys::fs::make_absolute(Path);
117 StringRef Name = InArchive ? File->getName() : StringRef(Path);
118 File->ModuleDBI = &ExitOnErr(Builder.getDbiBuilder().addModuleInfo(Name));
119 File->ModuleDBI->setObjFileName(Path);
120
121 // FIXME: Walk the .debug$S sections and add them. Do things like recording
122 // source files.
123
Rui Ueyama52896622017-01-12 03:09:25 +0000124 ArrayRef<uint8_t> Data = getDebugSection(File, ".debug$T");
125 if (Data.empty())
126 continue;
127
Reid Kleckner5d577522017-03-24 17:26:38 +0000128 BinaryByteStream Stream(Data, support::little);
Rui Ueyama52896622017-01-12 03:09:25 +0000129 codeview::CVTypeArray Types;
Zachary Turner120faca2017-02-27 22:11:43 +0000130 BinaryStreamReader Reader(Stream);
Zachary Turnerb32ec022017-05-18 23:04:08 +0000131 SmallVector<TypeIndex, 128> SourceToDest;
Zachary Turner7b327d02017-02-16 23:35:45 +0000132 Handler.addSearchPath(llvm::sys::path::parent_path(File->getName()));
Rui Ueyama52896622017-01-12 03:09:25 +0000133 if (auto EC = Reader.readArray(Types, Reader.getLength()))
134 fatal(EC, "Reader::readArray failed");
Zachary Turnerd4136e92017-05-22 21:07:43 +0000135 if (auto Err = codeview::mergeTypeAndIdRecords(
Zachary Turnerbb642312017-05-24 00:26:27 +0000136 IDTable, TypeTable, SourceToDest, &Handler, Types))
Rui Ueyamaa9b29612017-02-02 00:47:10 +0000137 fatal(Err, "codeview::mergeTypeStreams failed");
Rui Ueyama52896622017-01-12 03:09:25 +0000138 }
139
Reid Kleckner5d577522017-03-24 17:26:38 +0000140 // Construct TPI stream contents.
Reid Kleckner13fc4112017-04-04 00:56:34 +0000141 addTypeInfo(Builder.getTpiBuilder(), TypeTable);
Reid Kleckner5d577522017-03-24 17:26:38 +0000142
143 // Construct IPI stream contents.
Reid Kleckner13fc4112017-04-04 00:56:34 +0000144 addTypeInfo(Builder.getIpiBuilder(), IDTable);
Rui Ueyama52896622017-01-12 03:09:25 +0000145}
146
Rui Ueyama26186c72016-12-09 04:46:54 +0000147static void dumpDebugT(ScopedPrinter &W, ObjectFile *File) {
Rui Ueyama52896622017-01-12 03:09:25 +0000148 ListScope LS(W, "DebugT");
149 ArrayRef<uint8_t> Data = getDebugSection(File, ".debug$T");
Rui Ueyama26186c72016-12-09 04:46:54 +0000150 if (Data.empty())
151 return;
152
Zachary Turner526f4f22017-05-19 19:26:58 +0000153 LazyRandomTypeCollection Types(Data, 100);
154 TypeDumpVisitor TDV(Types, &W, false);
Zachary Turner7b327d02017-02-16 23:35:45 +0000155 // Use a default implementation that does not follow type servers and instead
156 // just dumps the contents of the TypeServer2 record.
Zachary Turner526f4f22017-05-19 19:26:58 +0000157 if (auto EC = codeview::visitTypeStream(Types, TDV))
Rui Ueyamac5cb7372016-12-01 01:22:48 +0000158 fatal(EC, "CVTypeDumper::dump failed");
159}
160
161static void dumpDebugS(ScopedPrinter &W, ObjectFile *File) {
Rui Ueyama52896622017-01-12 03:09:25 +0000162 ListScope LS(W, "DebugS");
163 ArrayRef<uint8_t> Data = getDebugSection(File, ".debug$S");
164 if (Data.empty())
Rui Ueyamac5cb7372016-12-01 01:22:48 +0000165 return;
166
Zachary Turner695ed562017-02-28 00:04:07 +0000167 BinaryByteStream Stream(Data, llvm::support::little);
Rui Ueyamac5cb7372016-12-01 01:22:48 +0000168 CVSymbolArray Symbols;
Zachary Turner120faca2017-02-27 22:11:43 +0000169 BinaryStreamReader Reader(Stream);
Rui Ueyamac5cb7372016-12-01 01:22:48 +0000170 if (auto EC = Reader.readArray(Symbols, Reader.getLength()))
171 fatal(EC, "StreamReader.readArray<CVSymbolArray> failed");
172
Zachary Turner5634ccf2017-05-05 22:06:06 +0000173 TypeDatabase TDB(0);
Zachary Turnerebd3ae82017-06-01 21:52:41 +0000174 CVSymbolDumper SymbolDumper(W, TDB, CodeViewContainer::ObjectFile, nullptr,
175 false);
Rui Ueyamac5cb7372016-12-01 01:22:48 +0000176 if (auto EC = SymbolDumper.dump(Symbols))
177 fatal(EC, "CVSymbolDumper::dump failed");
178}
179
Rui Ueyamabe939b32016-11-21 17:22:35 +0000180// Dump CodeView debug info. This is for debugging.
181static void dumpCodeView(SymbolTable *Symtab) {
182 ScopedPrinter W(outs());
183
184 for (ObjectFile *File : Symtab->ObjectFiles) {
Rui Ueyamac5cb7372016-12-01 01:22:48 +0000185 dumpDebugT(W, File);
186 dumpDebugS(W, File);
Rui Ueyamabe939b32016-11-21 17:22:35 +0000187 }
188}
189
Rui Ueyama09e0b5f2016-11-12 00:00:51 +0000190// Creates a PDB file.
191void coff::createPDB(StringRef Path, SymbolTable *Symtab,
Saleem Abdulrasooldf8a13b2017-01-04 17:56:54 +0000192 ArrayRef<uint8_t> SectionTable,
193 const llvm::codeview::DebugInfo *DI) {
Rui Ueyamabe939b32016-11-21 17:22:35 +0000194 if (Config->DumpPdb)
195 dumpCodeView(Symtab);
196
Rui Ueyamab28c6d42016-09-16 04:32:33 +0000197 BumpPtrAllocator Alloc;
198 pdb::PDBFileBuilder Builder(Alloc);
Rui Ueyama12979542016-09-30 20:53:45 +0000199 ExitOnErr(Builder.initialize(4096)); // 4096 is blocksize
Rui Ueyama7f382992016-09-15 18:55:18 +0000200
Rui Ueyama8d3fb5d2016-10-05 22:08:58 +0000201 // Create streams in MSF for predefined streams, namely
202 // PDB, TPI, DBI and IPI.
203 for (int I = 0; I < (int)pdb::kSpecialStreamCount; ++I)
204 ExitOnErr(Builder.getMsfBuilder().addStream(0));
Rui Ueyama7f382992016-09-15 18:55:18 +0000205
Rui Ueyamabb542b32016-09-16 22:51:17 +0000206 // Add an Info stream.
207 auto &InfoBuilder = Builder.getInfoBuilder();
Saleem Abdulrasool0acd6dd2017-02-07 04:28:02 +0000208 InfoBuilder.setAge(DI ? DI->PDB70.Age : 0);
209
210 pdb::PDB_UniqueId uuid{};
211 if (DI)
212 memcpy(&uuid, &DI->PDB70.Signature, sizeof(uuid));
213 InfoBuilder.setGuid(uuid);
Rui Ueyamabb542b32016-09-16 22:51:17 +0000214 // Should be the current time, but set 0 for reproducibilty.
215 InfoBuilder.setSignature(0);
Rui Ueyamabb542b32016-09-16 22:51:17 +0000216 InfoBuilder.setVersion(pdb::PdbRaw_ImplVer::PdbImplVC70);
Rui Ueyama7f382992016-09-15 18:55:18 +0000217
Rui Ueyama1343fac2016-10-06 22:52:01 +0000218 // Add an empty DPI stream.
Reid Kleckner8cbdd0c2017-06-13 15:49:13 +0000219 pdb::DbiStreamBuilder &DbiBuilder = Builder.getDbiBuilder();
Rui Ueyama1343fac2016-10-06 22:52:01 +0000220 DbiBuilder.setVersionHeader(pdb::PdbDbiV110);
221
Reid Kleckner13fc4112017-04-04 00:56:34 +0000222 codeview::TypeTableBuilder TypeTable(BAlloc);
223 codeview::TypeTableBuilder IDTable(BAlloc);
Reid Kleckner8cbdd0c2017-06-13 15:49:13 +0000224 addObjectsToPDB(Symtab, Builder, TypeTable, IDTable);
Rui Ueyamad381c982016-10-05 21:37:25 +0000225
Rui Ueyama09e0b5f2016-11-12 00:00:51 +0000226 // Add Section Contributions.
Reid Kleckner8cbdd0c2017-06-13 15:49:13 +0000227 addSectionContribs(Symtab, DbiBuilder);
Rui Ueyama09e0b5f2016-11-12 00:00:51 +0000228
Rui Ueyama20df4ec2016-10-31 21:09:21 +0000229 // Add Section Map stream.
230 ArrayRef<object::coff_section> Sections = {
Rui Ueyama6294a242016-11-04 17:41:29 +0000231 (const object::coff_section *)SectionTable.data(),
Rui Ueyama20df4ec2016-10-31 21:09:21 +0000232 SectionTable.size() / sizeof(object::coff_section)};
233 std::vector<pdb::SecMapEntry> SectionMap =
234 pdb::DbiStreamBuilder::createSectionMap(Sections);
235 DbiBuilder.setSectionMap(SectionMap);
236
Zachary Turnerea4e6072017-03-15 22:18:53 +0000237 ExitOnErr(DbiBuilder.addModuleInfo("* Linker *"));
Rui Ueyamac91f7162016-11-16 01:10:46 +0000238
Rui Ueyama9f66f822016-10-11 19:45:07 +0000239 // Add COFF section header stream.
240 ExitOnErr(
241 DbiBuilder.addDbgStream(pdb::DbgHeaderType::SectionHdr, SectionTable));
242
Rui Ueyama3e9d6bb2016-09-26 23:53:55 +0000243 // Write to a file.
Rui Ueyama5c82eea2016-09-30 20:39:04 +0000244 ExitOnErr(Builder.commit(Path));
Rui Ueyamae7378242015-12-04 23:11:05 +0000245}