Skip to content

Commit d69eb7b

Browse files
committed
[MC] Move createMC{Object,Asm}Streamer to .cpp
Currently, the template arguments are incomplete types and unique_ptr&& has to be used. Moving the implementation to .cpp allows us to use complete types and unique_ptr. In addition, add a createMCObjectStreamer overload without unused bool parameters. The existing createMCObjectStreamer overload, with unused and confusing bool parameters, will be deprecated.
1 parent c8e69fa commit d69eb7b

File tree

2 files changed

+91
-60
lines changed

2 files changed

+91
-60
lines changed

llvm/include/llvm/MC/TargetRegistry.h

Lines changed: 7 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -525,78 +525,25 @@ class Target {
525525
/// \param TAB The target assembler backend object. Takes ownership.
526526
/// \param OW The stream object.
527527
/// \param Emitter The target independent assembler object.Takes ownership.
528+
MCStreamer *createMCObjectStreamer(const Triple &T, MCContext &Ctx,
529+
std::unique_ptr<MCAsmBackend> TAB,
530+
std::unique_ptr<MCObjectWriter> OW,
531+
std::unique_ptr<MCCodeEmitter> Emitter,
532+
const MCSubtargetInfo &STI) const;
528533
MCStreamer *createMCObjectStreamer(const Triple &T, MCContext &Ctx,
529534
std::unique_ptr<MCAsmBackend> &&TAB,
530535
std::unique_ptr<MCObjectWriter> &&OW,
531536
std::unique_ptr<MCCodeEmitter> &&Emitter,
532537
const MCSubtargetInfo &STI, bool, bool,
533-
bool) const {
534-
MCStreamer *S = nullptr;
535-
switch (T.getObjectFormat()) {
536-
case Triple::UnknownObjectFormat:
537-
llvm_unreachable("Unknown object format");
538-
case Triple::COFF:
539-
assert((T.isOSWindows() || T.isUEFI()) &&
540-
"only Windows and UEFI COFF are supported");
541-
S = COFFStreamerCtorFn(Ctx, std::move(TAB), std::move(OW),
542-
std::move(Emitter));
543-
break;
544-
case Triple::MachO:
545-
if (MachOStreamerCtorFn)
546-
S = MachOStreamerCtorFn(Ctx, std::move(TAB), std::move(OW),
547-
std::move(Emitter));
548-
else
549-
S = createMachOStreamer(Ctx, std::move(TAB), std::move(OW),
550-
std::move(Emitter), false);
551-
break;
552-
case Triple::ELF:
553-
if (ELFStreamerCtorFn)
554-
S = ELFStreamerCtorFn(T, Ctx, std::move(TAB), std::move(OW),
555-
std::move(Emitter));
556-
else
557-
S = createELFStreamer(Ctx, std::move(TAB), std::move(OW),
558-
std::move(Emitter));
559-
break;
560-
case Triple::Wasm:
561-
S = createWasmStreamer(Ctx, std::move(TAB), std::move(OW),
562-
std::move(Emitter));
563-
break;
564-
case Triple::GOFF:
565-
S = createGOFFStreamer(Ctx, std::move(TAB), std::move(OW),
566-
std::move(Emitter));
567-
break;
568-
case Triple::XCOFF:
569-
S = XCOFFStreamerCtorFn(T, Ctx, std::move(TAB), std::move(OW),
570-
std::move(Emitter));
571-
break;
572-
case Triple::SPIRV:
573-
S = createSPIRVStreamer(Ctx, std::move(TAB), std::move(OW),
574-
std::move(Emitter));
575-
break;
576-
case Triple::DXContainer:
577-
S = createDXContainerStreamer(Ctx, std::move(TAB), std::move(OW),
578-
std::move(Emitter));
579-
break;
580-
}
581-
if (ObjectTargetStreamerCtorFn)
582-
ObjectTargetStreamerCtorFn(*S, STI);
583-
return S;
584-
}
538+
bool) const;
585539

586540
MCStreamer *createAsmStreamer(MCContext &Ctx,
587541
std::unique_ptr<formatted_raw_ostream> OS,
588542
bool IsVerboseAsm, bool UseDwarfDirectory,
589543
MCInstPrinter *InstPrint,
590544
std::unique_ptr<MCCodeEmitter> &&CE,
591545
std::unique_ptr<MCAsmBackend> &&TAB,
592-
bool ShowInst) const {
593-
formatted_raw_ostream &OSRef = *OS;
594-
MCStreamer *S = llvm::createAsmStreamer(
595-
Ctx, std::move(OS), IsVerboseAsm, UseDwarfDirectory, InstPrint,
596-
std::move(CE), std::move(TAB), ShowInst);
597-
createAsmTargetStreamer(*S, OSRef, InstPrint, IsVerboseAsm);
598-
return S;
599-
}
546+
bool ShowInst) const;
600547

601548
MCTargetStreamer *createAsmTargetStreamer(MCStreamer &S,
602549
formatted_raw_ostream &OS,

llvm/lib/MC/TargetRegistry.cpp

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,10 @@
99
#include "llvm/MC/TargetRegistry.h"
1010
#include "llvm/ADT/STLExtras.h"
1111
#include "llvm/ADT/StringRef.h"
12+
#include "llvm/MC/MCAsmBackend.h"
13+
#include "llvm/MC/MCCodeEmitter.h"
14+
#include "llvm/MC/MCObjectStreamer.h"
15+
#include "llvm/MC/MCObjectWriter.h"
1216
#include "llvm/Support/raw_ostream.h"
1317
#include <cassert>
1418
#include <vector>
@@ -17,6 +21,86 @@ using namespace llvm;
1721
// Clients are responsible for avoid race conditions in registration.
1822
static Target *FirstTarget = nullptr;
1923

24+
MCStreamer *Target::createMCObjectStreamer(
25+
const Triple &T, MCContext &Ctx, std::unique_ptr<MCAsmBackend> TAB,
26+
std::unique_ptr<MCObjectWriter> OW, std::unique_ptr<MCCodeEmitter> Emitter,
27+
const MCSubtargetInfo &STI) const {
28+
MCStreamer *S = nullptr;
29+
switch (T.getObjectFormat()) {
30+
case Triple::UnknownObjectFormat:
31+
llvm_unreachable("Unknown object format");
32+
case Triple::COFF:
33+
assert((T.isOSWindows() || T.isUEFI()) &&
34+
"only Windows and UEFI COFF are supported");
35+
S = COFFStreamerCtorFn(Ctx, std::move(TAB), std::move(OW),
36+
std::move(Emitter));
37+
break;
38+
case Triple::MachO:
39+
if (MachOStreamerCtorFn)
40+
S = MachOStreamerCtorFn(Ctx, std::move(TAB), std::move(OW),
41+
std::move(Emitter));
42+
else
43+
S = createMachOStreamer(Ctx, std::move(TAB), std::move(OW),
44+
std::move(Emitter), false);
45+
break;
46+
case Triple::ELF:
47+
if (ELFStreamerCtorFn)
48+
S = ELFStreamerCtorFn(T, Ctx, std::move(TAB), std::move(OW),
49+
std::move(Emitter));
50+
else
51+
S = createELFStreamer(Ctx, std::move(TAB), std::move(OW),
52+
std::move(Emitter));
53+
break;
54+
case Triple::Wasm:
55+
S = createWasmStreamer(Ctx, std::move(TAB), std::move(OW),
56+
std::move(Emitter));
57+
break;
58+
case Triple::GOFF:
59+
S = createGOFFStreamer(Ctx, std::move(TAB), std::move(OW),
60+
std::move(Emitter));
61+
break;
62+
case Triple::XCOFF:
63+
S = XCOFFStreamerCtorFn(T, Ctx, std::move(TAB), std::move(OW),
64+
std::move(Emitter));
65+
break;
66+
case Triple::SPIRV:
67+
S = createSPIRVStreamer(Ctx, std::move(TAB), std::move(OW),
68+
std::move(Emitter));
69+
break;
70+
case Triple::DXContainer:
71+
S = createDXContainerStreamer(Ctx, std::move(TAB), std::move(OW),
72+
std::move(Emitter));
73+
break;
74+
}
75+
if (ObjectTargetStreamerCtorFn)
76+
ObjectTargetStreamerCtorFn(*S, STI);
77+
return S;
78+
}
79+
80+
MCStreamer *Target::createMCObjectStreamer(
81+
const Triple &T, MCContext &Ctx, std::unique_ptr<MCAsmBackend> &&TAB,
82+
std::unique_ptr<MCObjectWriter> &&OW,
83+
std::unique_ptr<MCCodeEmitter> &&Emitter, const MCSubtargetInfo &STI, bool,
84+
bool, bool) const {
85+
return createMCObjectStreamer(T, Ctx, std::move(TAB), std::move(OW),
86+
std::move(Emitter), STI);
87+
}
88+
89+
MCStreamer *Target::createAsmStreamer(MCContext &Ctx,
90+
std::unique_ptr<formatted_raw_ostream> OS,
91+
bool IsVerboseAsm, bool UseDwarfDirectory,
92+
MCInstPrinter *InstPrint,
93+
std::unique_ptr<MCCodeEmitter> &&CE,
94+
std::unique_ptr<MCAsmBackend> &&TAB,
95+
bool ShowInst) const {
96+
formatted_raw_ostream &OSRef = *OS;
97+
MCStreamer *S = llvm::createAsmStreamer(
98+
Ctx, std::move(OS), IsVerboseAsm, UseDwarfDirectory, InstPrint,
99+
std::move(CE), std::move(TAB), ShowInst);
100+
createAsmTargetStreamer(*S, OSRef, InstPrint, IsVerboseAsm);
101+
return S;
102+
}
103+
20104
iterator_range<TargetRegistry::iterator> TargetRegistry::targets() {
21105
return make_range(iterator(FirstTarget), iterator());
22106
}

0 commit comments

Comments
 (0)