blob: 923fc64c77341f999b412a16bc02c1b82ddb6d95 [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 Turnera9054dd2017-01-11 00:35:43 +000017#include "llvm/DebugInfo/CodeView/CVTypeDumper.h"
Rui Ueyama24625fd2016-11-22 23:51:34 +000018#include "llvm/DebugInfo/CodeView/SymbolDumper.h"
Zachary Turner629cb7d2017-01-11 23:24:22 +000019#include "llvm/DebugInfo/CodeView/TypeDatabase.h"
20#include "llvm/DebugInfo/CodeView/TypeDumpVisitor.h"
Rui Ueyama52896622017-01-12 03:09:25 +000021#include "llvm/DebugInfo/CodeView/TypeStreamMerger.h"
22#include "llvm/DebugInfo/CodeView/TypeTableBuilder.h"
Rui Ueyama24625fd2016-11-22 23:51:34 +000023#include "llvm/DebugInfo/MSF/ByteStream.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"
Rui Ueyamab28c6d42016-09-16 04:32:33 +000026#include "llvm/DebugInfo/PDB/Raw/DbiStream.h"
27#include "llvm/DebugInfo/PDB/Raw/DbiStreamBuilder.h"
28#include "llvm/DebugInfo/PDB/Raw/InfoStream.h"
29#include "llvm/DebugInfo/PDB/Raw/InfoStreamBuilder.h"
30#include "llvm/DebugInfo/PDB/Raw/PDBFile.h"
31#include "llvm/DebugInfo/PDB/Raw/PDBFileBuilder.h"
32#include "llvm/DebugInfo/PDB/Raw/TpiStream.h"
33#include "llvm/DebugInfo/PDB/Raw/TpiStreamBuilder.h"
Rui Ueyama20df4ec2016-10-31 21:09:21 +000034#include "llvm/Object/COFF.h"
Rui Ueyama1763c0d2015-12-08 18:39:55 +000035#include "llvm/Support/Endian.h"
Rui Ueyamae7378242015-12-04 23:11:05 +000036#include "llvm/Support/FileOutputBuffer.h"
Rui Ueyamabe939b32016-11-21 17:22:35 +000037#include "llvm/Support/ScopedPrinter.h"
Rui Ueyamae7378242015-12-04 23:11:05 +000038#include <memory>
39
Rui Ueyama1d99ab32016-09-15 22:24:51 +000040using namespace lld;
Rui Ueyama09e0b5f2016-11-12 00:00:51 +000041using namespace lld::coff;
Rui Ueyamae7378242015-12-04 23:11:05 +000042using namespace llvm;
Rui Ueyamabe939b32016-11-21 17:22:35 +000043using namespace llvm::codeview;
Rui Ueyama1763c0d2015-12-08 18:39:55 +000044using namespace llvm::support;
45using namespace llvm::support::endian;
Rui Ueyamae7378242015-12-04 23:11:05 +000046
Rui Ueyama09e0b5f2016-11-12 00:00:51 +000047using llvm::object::coff_section;
48
Rui Ueyamab28c6d42016-09-16 04:32:33 +000049static ExitOnError ExitOnErr;
50
Rui Ueyama09e0b5f2016-11-12 00:00:51 +000051// Returns a list of all SectionChunks.
52static std::vector<coff_section> getInputSections(SymbolTable *Symtab) {
53 std::vector<coff_section> V;
54 for (Chunk *C : Symtab->getChunks())
55 if (auto *SC = dyn_cast<SectionChunk>(C))
56 V.push_back(*SC->Header);
57 return V;
58}
59
Rui Ueyamabe939b32016-11-21 17:22:35 +000060static SectionChunk *findByName(std::vector<SectionChunk *> &Sections,
61 StringRef Name) {
62 for (SectionChunk *C : Sections)
63 if (C->getSectionName() == Name)
64 return C;
65 return nullptr;
66}
67
Rui Ueyama52896622017-01-12 03:09:25 +000068static ArrayRef<uint8_t> getDebugSection(ObjectFile *File, StringRef SecName) {
69 SectionChunk *Sec = findByName(File->getDebugChunks(), SecName);
Rui Ueyamac5cb7372016-12-01 01:22:48 +000070 if (!Sec)
Rui Ueyama26186c72016-12-09 04:46:54 +000071 return {};
Rui Ueyamac5cb7372016-12-01 01:22:48 +000072
73 // First 4 bytes are section magic.
74 ArrayRef<uint8_t> Data = Sec->getContents();
75 if (Data.size() < 4)
Rui Ueyama52896622017-01-12 03:09:25 +000076 fatal(SecName + " too short");
Rui Ueyamac5cb7372016-12-01 01:22:48 +000077 if (read32le(Data.data()) != COFF::DEBUG_SECTION_MAGIC)
Rui Ueyama52896622017-01-12 03:09:25 +000078 fatal(SecName + " has an invalid magic");
Rui Ueyama26186c72016-12-09 04:46:54 +000079 return Data.slice(4);
80}
Rui Ueyamac5cb7372016-12-01 01:22:48 +000081
Rui Ueyama52896622017-01-12 03:09:25 +000082// Merge .debug$T sections and returns it.
83static std::vector<uint8_t> mergeDebugT(SymbolTable *Symtab) {
84 ScopedPrinter W(outs());
85
86 // Visit all .debug$T sections to add them to Builder.
87 codeview::TypeTableBuilder Builder(BAlloc);
88 for (ObjectFile *File : Symtab->ObjectFiles) {
89 ArrayRef<uint8_t> Data = getDebugSection(File, ".debug$T");
90 if (Data.empty())
91 continue;
92
93 msf::ByteStream Stream(Data);
94 codeview::CVTypeArray Types;
95 msf::StreamReader Reader(Stream);
96 if (auto EC = Reader.readArray(Types, Reader.getLength()))
97 fatal(EC, "Reader::readArray failed");
98 if (!codeview::mergeTypeStreams(Builder, Types))
99 fatal("codeview::mergeTypeStreams failed");
100 }
101
102 // Construct section contents.
103 std::vector<uint8_t> V;
104 Builder.ForEachRecord([&](TypeIndex TI, ArrayRef<uint8_t> Rec) {
105 V.insert(V.end(), Rec.begin(), Rec.end());
106 });
107 return V;
108}
109
Rui Ueyama26186c72016-12-09 04:46:54 +0000110static void dumpDebugT(ScopedPrinter &W, ObjectFile *File) {
Rui Ueyama52896622017-01-12 03:09:25 +0000111 ListScope LS(W, "DebugT");
112 ArrayRef<uint8_t> Data = getDebugSection(File, ".debug$T");
Rui Ueyama26186c72016-12-09 04:46:54 +0000113 if (Data.empty())
114 return;
115
Zachary Turner629cb7d2017-01-11 23:24:22 +0000116 TypeDatabase TDB;
117 TypeDumpVisitor TDV(TDB, &W, false);
118 CVTypeDumper TypeDumper(TDB);
119 if (auto EC = TypeDumper.dump(Data, TDV))
Rui Ueyamac5cb7372016-12-01 01:22:48 +0000120 fatal(EC, "CVTypeDumper::dump failed");
121}
122
123static void dumpDebugS(ScopedPrinter &W, ObjectFile *File) {
Rui Ueyama52896622017-01-12 03:09:25 +0000124 ListScope LS(W, "DebugS");
125 ArrayRef<uint8_t> Data = getDebugSection(File, ".debug$S");
126 if (Data.empty())
Rui Ueyamac5cb7372016-12-01 01:22:48 +0000127 return;
128
Rui Ueyama52896622017-01-12 03:09:25 +0000129 msf::ByteStream Stream(Data);
Rui Ueyamac5cb7372016-12-01 01:22:48 +0000130 CVSymbolArray Symbols;
131 msf::StreamReader Reader(Stream);
132 if (auto EC = Reader.readArray(Symbols, Reader.getLength()))
133 fatal(EC, "StreamReader.readArray<CVSymbolArray> failed");
134
Zachary Turner629cb7d2017-01-11 23:24:22 +0000135 TypeDatabase TDB;
136 CVSymbolDumper SymbolDumper(W, TDB, nullptr, false);
Rui Ueyamac5cb7372016-12-01 01:22:48 +0000137 if (auto EC = SymbolDumper.dump(Symbols))
138 fatal(EC, "CVSymbolDumper::dump failed");
139}
140
Rui Ueyamabe939b32016-11-21 17:22:35 +0000141// Dump CodeView debug info. This is for debugging.
142static void dumpCodeView(SymbolTable *Symtab) {
143 ScopedPrinter W(outs());
144
145 for (ObjectFile *File : Symtab->ObjectFiles) {
Rui Ueyamac5cb7372016-12-01 01:22:48 +0000146 dumpDebugT(W, File);
147 dumpDebugS(W, File);
Rui Ueyamabe939b32016-11-21 17:22:35 +0000148 }
149}
150
Rui Ueyama52896622017-01-12 03:09:25 +0000151static void addTypeInfo(pdb::TpiStreamBuilder &TpiBuilder,
152 ArrayRef<uint8_t> Data) {
153 msf::ByteStream Stream(Data);
154 codeview::CVTypeArray Records;
155 msf::StreamReader Reader(Stream);
156 if (auto EC = Reader.readArray(Records, Reader.getLength()))
157 fatal(EC, "Reader.readArray failed");
158 for (const codeview::CVType &Rec : Records)
159 TpiBuilder.addTypeRecord(Rec);
Rui Ueyama26186c72016-12-09 04:46:54 +0000160}
161
Rui Ueyama09e0b5f2016-11-12 00:00:51 +0000162// Creates a PDB file.
163void coff::createPDB(StringRef Path, SymbolTable *Symtab,
Saleem Abdulrasooldf8a13b2017-01-04 17:56:54 +0000164 ArrayRef<uint8_t> SectionTable,
165 const llvm::codeview::DebugInfo *DI) {
Rui Ueyamabe939b32016-11-21 17:22:35 +0000166 if (Config->DumpPdb)
167 dumpCodeView(Symtab);
168
Rui Ueyamab28c6d42016-09-16 04:32:33 +0000169 BumpPtrAllocator Alloc;
170 pdb::PDBFileBuilder Builder(Alloc);
Rui Ueyama12979542016-09-30 20:53:45 +0000171 ExitOnErr(Builder.initialize(4096)); // 4096 is blocksize
Rui Ueyama7f382992016-09-15 18:55:18 +0000172
Rui Ueyama8d3fb5d2016-10-05 22:08:58 +0000173 // Create streams in MSF for predefined streams, namely
174 // PDB, TPI, DBI and IPI.
175 for (int I = 0; I < (int)pdb::kSpecialStreamCount; ++I)
176 ExitOnErr(Builder.getMsfBuilder().addStream(0));
Rui Ueyama7f382992016-09-15 18:55:18 +0000177
Rui Ueyamabb542b32016-09-16 22:51:17 +0000178 // Add an Info stream.
179 auto &InfoBuilder = Builder.getInfoBuilder();
Saleem Abdulrasooldf8a13b2017-01-04 17:56:54 +0000180 InfoBuilder.setAge(DI->PDB70.Age);
181 InfoBuilder.setGuid(
182 *reinterpret_cast<const pdb::PDB_UniqueId *>(&DI->PDB70.Signature));
Rui Ueyamabb542b32016-09-16 22:51:17 +0000183 // Should be the current time, but set 0 for reproducibilty.
184 InfoBuilder.setSignature(0);
Rui Ueyamabb542b32016-09-16 22:51:17 +0000185 InfoBuilder.setVersion(pdb::PdbRaw_ImplVer::PdbImplVC70);
Rui Ueyama7f382992016-09-15 18:55:18 +0000186
Rui Ueyama1343fac2016-10-06 22:52:01 +0000187 // Add an empty DPI stream.
188 auto &DbiBuilder = Builder.getDbiBuilder();
189 DbiBuilder.setVersionHeader(pdb::PdbDbiV110);
190
Rui Ueyamab28c6d42016-09-16 04:32:33 +0000191 // Add an empty TPI stream.
192 auto &TpiBuilder = Builder.getTpiBuilder();
193 TpiBuilder.setVersionHeader(pdb::PdbTpiV80);
Rui Ueyama52896622017-01-12 03:09:25 +0000194 std::vector<uint8_t> TpiData;
195 if (Config->DebugPdb) {
196 TpiData = mergeDebugT(Symtab);
197 addTypeInfo(TpiBuilder, TpiData);
198 }
Rui Ueyama1763c0d2015-12-08 18:39:55 +0000199
Rui Ueyamad381c982016-10-05 21:37:25 +0000200 // Add an empty IPI stream.
201 auto &IpiBuilder = Builder.getIpiBuilder();
202 IpiBuilder.setVersionHeader(pdb::PdbTpiV80);
203
Rui Ueyama09e0b5f2016-11-12 00:00:51 +0000204 // Add Section Contributions.
Rui Ueyama09e0b5f2016-11-12 00:00:51 +0000205 std::vector<pdb::SectionContrib> Contribs =
Vitaly Buka4cf112c2016-11-14 20:21:41 +0000206 pdb::DbiStreamBuilder::createSectionContribs(getInputSections(Symtab));
Rui Ueyama09e0b5f2016-11-12 00:00:51 +0000207 DbiBuilder.setSectionContribs(Contribs);
208
Rui Ueyama20df4ec2016-10-31 21:09:21 +0000209 // Add Section Map stream.
210 ArrayRef<object::coff_section> Sections = {
Rui Ueyama6294a242016-11-04 17:41:29 +0000211 (const object::coff_section *)SectionTable.data(),
Rui Ueyama20df4ec2016-10-31 21:09:21 +0000212 SectionTable.size() / sizeof(object::coff_section)};
213 std::vector<pdb::SecMapEntry> SectionMap =
214 pdb::DbiStreamBuilder::createSectionMap(Sections);
215 DbiBuilder.setSectionMap(SectionMap);
216
Rui Ueyamac91f7162016-11-16 01:10:46 +0000217 ExitOnErr(DbiBuilder.addModuleInfo("", "* Linker *"));
218
Rui Ueyama9f66f822016-10-11 19:45:07 +0000219 // Add COFF section header stream.
220 ExitOnErr(
221 DbiBuilder.addDbgStream(pdb::DbgHeaderType::SectionHdr, SectionTable));
222
Rui Ueyama3e9d6bb2016-09-26 23:53:55 +0000223 // Write to a file.
Rui Ueyama5c82eea2016-09-30 20:39:04 +0000224 ExitOnErr(Builder.commit(Path));
Rui Ueyamae7378242015-12-04 23:11:05 +0000225}