9
9
#include " llvm/MC/TargetRegistry.h"
10
10
#include " llvm/ADT/STLExtras.h"
11
11
#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"
12
16
#include " llvm/Support/raw_ostream.h"
13
17
#include < cassert>
14
18
#include < vector>
@@ -17,6 +21,86 @@ using namespace llvm;
17
21
// Clients are responsible for avoid race conditions in registration.
18
22
static Target *FirstTarget = nullptr ;
19
23
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
+
20
104
iterator_range<TargetRegistry::iterator> TargetRegistry::targets () {
21
105
return make_range (iterator (FirstTarget), iterator ());
22
106
}
0 commit comments