Skip to content

Commit 88c2137

Browse files
committed
[DWARFLinker][dsymutil][NFC] Move DwarfStreamer into DWARFLinker.
For implementing "remove obsolete debug info in lld", it is neccesary to have DWARF generation code implementation. dsymutil uses DwarfStreamer for that purpose. DwarfStreamer uses AsmPrinter. It is considered OK to use AsmPrinter based code in lld(D74169). This patch moves DwarfStreamer implementation into DWARFLinker, so that it could be reused from lld. Generally, a better place for such a common DWARF generation code would be not DWARFLinker but an additional separate library. Such a library could contain a single version of DWARF generation routines and could also be independent of AsmPrinter. At the current moment, DwarfStreamer does not pretend to be such a general implementation of DWARF generation. So I decided to put it into DWARFLinker since it is the only user of DwarfStreamer. Testing: it passes "check-all" lit testing. MD5 checksum for clang .dSYM bundle matches for the dsymutil with/without that patch. Reviewed By: JDevlieghere Differential revision: https://reviews.llvm.org/D77169
1 parent f524194 commit 88c2137

File tree

7 files changed

+91
-72
lines changed

7 files changed

+91
-72
lines changed

llvm/tools/dsymutil/DwarfStreamer.h renamed to llvm/include/llvm/DWARFLinker/DWARFStreamer.h

Lines changed: 43 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,56 +1,57 @@
1-
//===- tools/dsymutil/DwarfStreamer.h - Dwarf Streamer ----------*- C++ -*-===//
1+
//===- DwarfStreamer.h ------------------------------------------*- C++ -*-===//
22
//
33
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
44
// See https://llvm.org/LICENSE.txt for license information.
55
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
66
//
77
//===----------------------------------------------------------------------===//
88

9-
#ifndef LLVM_TOOLS_DSYMUTIL_DWARFSTREAMER_H
10-
#define LLVM_TOOLS_DSYMUTIL_DWARFSTREAMER_H
9+
#ifndef LLVM_DWARFLINKER_DWARFSTREAMER_H
10+
#define LLVM_DWARFLINKER_DWARFSTREAMER_H
1111

12-
#include "DebugMap.h"
13-
#include "LinkUtils.h"
1412
#include "llvm/CodeGen/AccelTable.h"
1513
#include "llvm/CodeGen/AsmPrinter.h"
16-
#include "llvm/CodeGen/NonRelocatableStringpool.h"
1714
#include "llvm/DWARFLinker/DWARFLinker.h"
18-
#include "llvm/DWARFLinker/DWARFLinkerCompileUnit.h"
19-
#include "llvm/DebugInfo/DWARF/DWARFDebugLine.h"
20-
#include "llvm/DebugInfo/DWARF/DWARFDebugRangeList.h"
21-
#include "llvm/MC/MCAsmBackend.h"
2215
#include "llvm/MC/MCAsmInfo.h"
23-
#include "llvm/MC/MCCodeEmitter.h"
2416
#include "llvm/MC/MCContext.h"
25-
#include "llvm/MC/MCDwarf.h"
2617
#include "llvm/MC/MCInstrInfo.h"
2718
#include "llvm/MC/MCObjectFileInfo.h"
28-
#include "llvm/MC/MCObjectWriter.h"
2919
#include "llvm/MC/MCRegisterInfo.h"
30-
#include "llvm/MC/MCSection.h"
31-
#include "llvm/MC/MCStreamer.h"
32-
#include "llvm/MC/MCSubtargetInfo.h"
33-
#include "llvm/MC/MCSymbol.h"
34-
#include "llvm/MC/MCTargetOptions.h"
3520
#include "llvm/Target/TargetMachine.h"
36-
#include "llvm/Target/TargetOptions.h"
3721

3822
namespace llvm {
39-
namespace dsymutil {
23+
24+
enum class OutputFileType {
25+
Object,
26+
Assembly,
27+
};
28+
29+
/// User of DwarfStreamer should call initialization code
30+
/// for AsmPrinter:
31+
///
32+
/// InitializeAllTargetInfos();
33+
/// InitializeAllTargetMCs();
34+
/// InitializeAllTargets();
35+
/// InitializeAllAsmPrinters();
36+
37+
class MCCodeEmitter;
4038

4139
/// The Dwarf streaming logic.
4240
///
4341
/// All interactions with the MC layer that is used to build the debug
4442
/// information binary representation are handled in this class.
4543
class DwarfStreamer : public DwarfEmitter {
4644
public:
47-
DwarfStreamer(raw_fd_ostream &OutFile, LinkOptions Options)
48-
: OutFile(OutFile), Options(std::move(Options)) {}
45+
DwarfStreamer(OutputFileType OutFileType, raw_pwrite_stream &OutFile,
46+
std::function<StringRef(StringRef Input)> Translator,
47+
bool Minimize, messageHandler Error, messageHandler Warning)
48+
: OutFile(OutFile), OutFileType(OutFileType), Translator(Translator),
49+
Minimize(Minimize), ErrorHandler(Error), WarningHandler(Warning) {}
4950

5051
bool init(Triple TheTriple);
5152

5253
/// Dump the file to the disk.
53-
bool finish(const DebugMap &, SymbolMapTranslator &T);
54+
void finish();
5455

5556
AsmPrinter &getAsmPrinter() const { return *Asm; }
5657

@@ -158,6 +159,16 @@ class DwarfStreamer : public DwarfEmitter {
158159
}
159160

160161
private:
162+
inline void error(const Twine &Error, StringRef Context = "") {
163+
if (ErrorHandler)
164+
ErrorHandler(Error, Context, nullptr);
165+
}
166+
167+
inline void warn(const Twine &Warning, StringRef Context = "") {
168+
if (WarningHandler)
169+
WarningHandler(Warning, Context, nullptr);
170+
}
171+
161172
/// \defgroup MCObjects MC layer objects constructed by the streamer
162173
/// @{
163174
std::unique_ptr<MCRegisterInfo> MRI;
@@ -174,10 +185,11 @@ class DwarfStreamer : public DwarfEmitter {
174185
std::unique_ptr<AsmPrinter> Asm;
175186
/// @}
176187

177-
/// The file we stream the linked Dwarf to.
178-
raw_fd_ostream &OutFile;
179-
180-
LinkOptions Options;
188+
/// The output file we stream the linked Dwarf to.
189+
raw_pwrite_stream &OutFile;
190+
OutputFileType OutFileType = OutputFileType::Object;
191+
std::function<StringRef(StringRef Input)> Translator;
192+
bool Minimize = true;
181193

182194
uint64_t RangesSectionSize = 0;
183195
uint64_t LocSectionSize = 0;
@@ -197,9 +209,11 @@ class DwarfStreamer : public DwarfEmitter {
197209
void emitPubSectionForUnit(MCSection *Sec, StringRef Name,
198210
const CompileUnit &Unit,
199211
const std::vector<CompileUnit::AccelInfo> &Names);
212+
213+
messageHandler ErrorHandler = nullptr;
214+
messageHandler WarningHandler = nullptr;
200215
};
201216

202-
} // end namespace dsymutil
203217
} // end namespace llvm
204218

205-
#endif // LLVM_TOOLS_DSYMUTIL_DWARFSTREAMER_H
219+
#endif // LLVM_DWARFLINKER_DWARFSTREAMER_H

llvm/lib/DWARFLinker/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ add_llvm_component_library(LLVMDWARFLinker
22
DWARFLinkerCompileUnit.cpp
33
DWARFLinkerDeclContext.cpp
44
DWARFLinker.cpp
5+
DWARFStreamer.cpp
56

67
DEPENDS
78
intrinsics_gen

llvm/tools/dsymutil/DwarfStreamer.cpp renamed to llvm/lib/DWARFLinker/DWARFStreamer.cpp

Lines changed: 28 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,34 @@
1-
//===- tools/dsymutil/DwarfStreamer.cpp - Dwarf Streamer ------------------===//
1+
//===- DwarfStreamer.cpp --------------------------------------------------===//
22
//
33
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
44
// See https://llvm.org/LICENSE.txt for license information.
55
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
66
//
77
//===----------------------------------------------------------------------===//
88

9-
#include "DwarfStreamer.h"
10-
#include "LinkUtils.h"
11-
#include "MachOUtils.h"
9+
#include "llvm/DWARFLinker/DWARFStreamer.h"
1210
#include "llvm/ADT/Triple.h"
11+
#include "llvm/CodeGen/NonRelocatableStringpool.h"
1312
#include "llvm/DWARFLinker/DWARFLinkerCompileUnit.h"
1413
#include "llvm/DebugInfo/DWARF/DWARFContext.h"
14+
#include "llvm/MC/MCAsmBackend.h"
15+
#include "llvm/MC/MCCodeEmitter.h"
16+
#include "llvm/MC/MCDwarf.h"
17+
#include "llvm/MC/MCObjectWriter.h"
18+
#include "llvm/MC/MCSection.h"
19+
#include "llvm/MC/MCStreamer.h"
20+
#include "llvm/MC/MCSubtargetInfo.h"
21+
#include "llvm/MC/MCSymbol.h"
1522
#include "llvm/MC/MCTargetOptions.h"
1623
#include "llvm/MC/MCTargetOptionsCommandFlags.h"
1724
#include "llvm/Support/LEB128.h"
1825
#include "llvm/Support/TargetRegistry.h"
19-
#include "llvm/Target/TargetMachine.h"
2026
#include "llvm/Target/TargetOptions.h"
2127

2228
namespace llvm {
2329

2430
static mc::RegisterMCTargetOptionsFlags MOF;
2531

26-
namespace dsymutil {
27-
2832
bool DwarfStreamer::init(Triple TheTriple) {
2933
std::string ErrorStr;
3034
std::string TripleName;
@@ -34,40 +38,41 @@ bool DwarfStreamer::init(Triple TheTriple) {
3438
const Target *TheTarget =
3539
TargetRegistry::lookupTarget(TripleName, TheTriple, ErrorStr);
3640
if (!TheTarget)
37-
return error(ErrorStr, Context);
41+
return error(ErrorStr, Context), false;
3842
TripleName = TheTriple.getTriple();
3943

4044
// Create all the MC Objects.
4145
MRI.reset(TheTarget->createMCRegInfo(TripleName));
4246
if (!MRI)
43-
return error(Twine("no register info for target ") + TripleName, Context);
47+
return error(Twine("no register info for target ") + TripleName, Context),
48+
false;
4449

4550
MCTargetOptions MCOptions = mc::InitMCTargetOptionsFromFlags();
4651
MAI.reset(TheTarget->createMCAsmInfo(*MRI, TripleName, MCOptions));
4752
if (!MAI)
48-
return error("no asm info for target " + TripleName, Context);
53+
return error("no asm info for target " + TripleName, Context), false;
4954

5055
MOFI.reset(new MCObjectFileInfo);
5156
MC.reset(new MCContext(MAI.get(), MRI.get(), MOFI.get()));
5257
MOFI->InitMCObjectFileInfo(TheTriple, /*PIC*/ false, *MC);
5358

5459
MSTI.reset(TheTarget->createMCSubtargetInfo(TripleName, "", ""));
5560
if (!MSTI)
56-
return error("no subtarget info for target " + TripleName, Context);
61+
return error("no subtarget info for target " + TripleName, Context), false;
5762

5863
MAB = TheTarget->createMCAsmBackend(*MSTI, *MRI, MCOptions);
5964
if (!MAB)
60-
return error("no asm backend for target " + TripleName, Context);
65+
return error("no asm backend for target " + TripleName, Context), false;
6166

6267
MII.reset(TheTarget->createMCInstrInfo());
6368
if (!MII)
64-
return error("no instr info info for target " + TripleName, Context);
69+
return error("no instr info info for target " + TripleName, Context), false;
6570

6671
MCE = TheTarget->createMCCodeEmitter(*MII, *MRI, *MC);
6772
if (!MCE)
68-
return error("no code emitter for target " + TripleName, Context);
73+
return error("no code emitter for target " + TripleName, Context), false;
6974

70-
switch (Options.FileType) {
75+
switch (OutFileType) {
7176
case OutputFileType::Assembly: {
7277
MIP = TheTarget->createMCInstPrinter(TheTriple, MAI->getAssemblerDialect(),
7378
*MAI, *MII, *MRI);
@@ -88,17 +93,17 @@ bool DwarfStreamer::init(Triple TheTriple) {
8893
}
8994

9095
if (!MS)
91-
return error("no object streamer for target " + TripleName, Context);
96+
return error("no object streamer for target " + TripleName, Context), false;
9297

9398
// Finally create the AsmPrinter we'll use to emit the DIEs.
9499
TM.reset(TheTarget->createTargetMachine(TripleName, "", "", TargetOptions(),
95100
None));
96101
if (!TM)
97-
return error("no target machine for target " + TripleName, Context);
102+
return error("no target machine for target " + TripleName, Context), false;
98103

99104
Asm.reset(TheTarget->createAsmPrinter(*TM, std::unique_ptr<MCStreamer>(MS)));
100105
if (!Asm)
101-
return error("no asm printer for target " + TripleName, Context);
106+
return error("no asm printer for target " + TripleName, Context), false;
102107

103108
RangesSectionSize = 0;
104109
LocSectionSize = 0;
@@ -109,15 +114,7 @@ bool DwarfStreamer::init(Triple TheTriple) {
109114
return true;
110115
}
111116

112-
bool DwarfStreamer::finish(const DebugMap &DM, SymbolMapTranslator &T) {
113-
bool Result = true;
114-
if (DM.getTriple().isOSDarwin() && !DM.getBinaryPath().empty() &&
115-
Options.FileType == OutputFileType::Object)
116-
Result = MachOUtils::generateDsymCompanion(DM, T, *MS, OutFile);
117-
else
118-
MS->Finish();
119-
return Result;
120-
}
117+
void DwarfStreamer::finish() { MS->Finish(); }
121118

122119
void DwarfStreamer::switchToDebugInfoSection(unsigned DwarfVersion) {
123120
MS->SwitchSection(MOFI->getDwarfInfoSection());
@@ -660,7 +657,7 @@ void DwarfStreamer::translateLineTable(DataExtractor Data, uint64_t Offset) {
660657
if (Dir[0] == 0)
661658
break;
662659

663-
StringRef Translated = Options.Translator(Dir);
660+
StringRef Translated = Translator(Dir);
664661
Asm->OutStreamer->emitBytes(Translated);
665662
Asm->emitInt8(0);
666663
LineSectionSize += Translated.size() + 1;
@@ -672,7 +669,7 @@ void DwarfStreamer::translateLineTable(DataExtractor Data, uint64_t Offset) {
672669
if (File[0] == 0)
673670
break;
674671

675-
StringRef Translated = Options.Translator(File);
672+
StringRef Translated = Translator(File);
676673
Asm->OutStreamer->emitBytes(Translated);
677674
Asm->emitInt8(0);
678675
LineSectionSize += Translated.size() + 1;
@@ -740,15 +737,15 @@ void DwarfStreamer::emitPubSectionForUnit(
740737

741738
/// Emit .debug_pubnames for \p Unit.
742739
void DwarfStreamer::emitPubNamesForUnit(const CompileUnit &Unit) {
743-
if (Options.Minimize)
740+
if (Minimize)
744741
return;
745742
emitPubSectionForUnit(MC->getObjectFileInfo()->getDwarfPubNamesSection(),
746743
"names", Unit, Unit.getPubnames());
747744
}
748745

749746
/// Emit .debug_pubtypes for \p Unit.
750747
void DwarfStreamer::emitPubTypesForUnit(const CompileUnit &Unit) {
751-
if (Options.Minimize)
748+
if (Minimize)
752749
return;
753750
emitPubSectionForUnit(MC->getObjectFileInfo()->getDwarfPubTypesSection(),
754751
"types", Unit, Unit.getPubtypes());
@@ -776,5 +773,4 @@ void DwarfStreamer::emitFDE(uint32_t CIEOffset, uint32_t AddrSize,
776773
FrameSectionSize += FDEBytes.size() + 8 + AddrSize;
777774
}
778775

779-
} // namespace dsymutil
780776
} // namespace llvm

llvm/tools/dsymutil/CMakeLists.txt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@ add_llvm_tool(dsymutil
2424
CFBundle.cpp
2525
DebugMap.cpp
2626
DwarfLinkerForBinary.cpp
27-
DwarfStreamer.cpp
2827
MachODebugMapParser.cpp
2928
MachOUtils.cpp
3029
SymbolMap.cpp

llvm/tools/dsymutil/DwarfLinkerForBinary.cpp

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
#include "DwarfLinkerForBinary.h"
1010
#include "BinaryHolder.h"
1111
#include "DebugMap.h"
12-
#include "DwarfStreamer.h"
1312
#include "MachOUtils.h"
1413
#include "dsymutil.h"
1514
#include "llvm/ADT/ArrayRef.h"
@@ -163,7 +162,14 @@ bool DwarfLinkerForBinary::createStreamer(const Triple &TheTriple,
163162
if (Options.NoOutput)
164163
return true;
165164

166-
Streamer = std::make_unique<DwarfStreamer>(OutFile, Options);
165+
Streamer = std::make_unique<DwarfStreamer>(
166+
Options.FileType, OutFile, Options.Translator, Options.Minimize,
167+
[&](const Twine &Error, StringRef Context, const DWARFDie *) {
168+
error(Error, Context);
169+
},
170+
[&](const Twine &Warning, StringRef Context, const DWARFDie *) {
171+
warn(Warning, Context);
172+
});
167173
return Streamer->init(TheTriple);
168174
}
169175

@@ -318,7 +324,7 @@ bool DwarfLinkerForBinary::link(const DebugMap &Map) {
318324
reportWarning(Warning, Context, DIE);
319325
});
320326
GeneralLinker.setErrorHandler(
321-
[&](const Twine &Error, StringRef Context, const DWARFDie *DIE) {
327+
[&](const Twine &Error, StringRef Context, const DWARFDie *) {
322328
error(Error, Context);
323329
});
324330
GeneralLinker.setObjFileLoader(
@@ -442,7 +448,14 @@ bool DwarfLinkerForBinary::link(const DebugMap &Map) {
442448
return error(toString(std::move(E)));
443449
}
444450

445-
return Streamer->finish(Map, Options.Translator);
451+
if (Map.getTriple().isOSDarwin() && !Map.getBinaryPath().empty() &&
452+
Options.FileType == OutputFileType::Object)
453+
return MachOUtils::generateDsymCompanion(
454+
Map, Options.Translator, *Streamer->getAsmPrinter().OutStreamer,
455+
OutFile);
456+
457+
Streamer->finish();
458+
return true;
446459
}
447460

448461
static bool isMachOPairedReloc(uint64_t RelocType, uint64_t Arch) {

llvm/tools/dsymutil/DwarfLinkerForBinary.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,11 @@
1111

1212
#include "BinaryHolder.h"
1313
#include "DebugMap.h"
14-
#include "DwarfStreamer.h"
1514
#include "LinkUtils.h"
1615
#include "llvm/DWARFLinker/DWARFLinker.h"
1716
#include "llvm/DWARFLinker/DWARFLinkerCompileUnit.h"
1817
#include "llvm/DWARFLinker/DWARFLinkerDeclContext.h"
18+
#include "llvm/DWARFLinker/DWARFStreamer.h"
1919
#include "llvm/DebugInfo/DWARF/DWARFContext.h"
2020
#include "llvm/Remarks/RemarkFormat.h"
2121
#include "llvm/Remarks/RemarkLinker.h"

llvm/tools/dsymutil/LinkUtils.h

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,16 +16,12 @@
1616
#include "llvm/Support/WithColor.h"
1717

1818
#include "llvm/DWARFLinker/DWARFLinker.h"
19+
#include "llvm/DWARFLinker/DWARFStreamer.h"
1920
#include <string>
2021

2122
namespace llvm {
2223
namespace dsymutil {
2324

24-
enum class OutputFileType {
25-
Object,
26-
Assembly,
27-
};
28-
2925
struct LinkOptions {
3026
/// Verbosity
3127
bool Verbose = false;

0 commit comments

Comments
 (0)