[llvm] d69eb7b - [MC] Move createMC{Object,Asm}Streamer to .cpp
Fangrui Song via llvm-commits
llvm-commits at lists.llvm.org
Sat Jul 20 20:59:31 PDT 2024
Author: Fangrui Song
Date: 2024-07-20T20:59:26-07:00
New Revision: d69eb7b7ffb33d0be716759a38a235868671705d
URL: https://github.com/llvm/llvm-project/commit/d69eb7b7ffb33d0be716759a38a235868671705d
DIFF: https://github.com/llvm/llvm-project/commit/d69eb7b7ffb33d0be716759a38a235868671705d.diff
LOG: [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.
Added:
Modified:
llvm/include/llvm/MC/TargetRegistry.h
llvm/lib/MC/TargetRegistry.cpp
Removed:
################################################################################
diff --git a/llvm/include/llvm/MC/TargetRegistry.h b/llvm/include/llvm/MC/TargetRegistry.h
index bb4566aa65e03..e09318ba18f5a 100644
--- a/llvm/include/llvm/MC/TargetRegistry.h
+++ b/llvm/include/llvm/MC/TargetRegistry.h
@@ -525,63 +525,17 @@ class Target {
/// \param TAB The target assembler backend object. Takes ownership.
/// \param OW The stream object.
/// \param Emitter The target independent assembler object.Takes ownership.
+ MCStreamer *createMCObjectStreamer(const Triple &T, MCContext &Ctx,
+ std::unique_ptr<MCAsmBackend> TAB,
+ std::unique_ptr<MCObjectWriter> OW,
+ std::unique_ptr<MCCodeEmitter> Emitter,
+ const MCSubtargetInfo &STI) const;
MCStreamer *createMCObjectStreamer(const Triple &T, MCContext &Ctx,
std::unique_ptr<MCAsmBackend> &&TAB,
std::unique_ptr<MCObjectWriter> &&OW,
std::unique_ptr<MCCodeEmitter> &&Emitter,
const MCSubtargetInfo &STI, bool, bool,
- bool) const {
- MCStreamer *S = nullptr;
- switch (T.getObjectFormat()) {
- case Triple::UnknownObjectFormat:
- llvm_unreachable("Unknown object format");
- case Triple::COFF:
- assert((T.isOSWindows() || T.isUEFI()) &&
- "only Windows and UEFI COFF are supported");
- S = COFFStreamerCtorFn(Ctx, std::move(TAB), std::move(OW),
- std::move(Emitter));
- break;
- case Triple::MachO:
- if (MachOStreamerCtorFn)
- S = MachOStreamerCtorFn(Ctx, std::move(TAB), std::move(OW),
- std::move(Emitter));
- else
- S = createMachOStreamer(Ctx, std::move(TAB), std::move(OW),
- std::move(Emitter), false);
- break;
- case Triple::ELF:
- if (ELFStreamerCtorFn)
- S = ELFStreamerCtorFn(T, Ctx, std::move(TAB), std::move(OW),
- std::move(Emitter));
- else
- S = createELFStreamer(Ctx, std::move(TAB), std::move(OW),
- std::move(Emitter));
- break;
- case Triple::Wasm:
- S = createWasmStreamer(Ctx, std::move(TAB), std::move(OW),
- std::move(Emitter));
- break;
- case Triple::GOFF:
- S = createGOFFStreamer(Ctx, std::move(TAB), std::move(OW),
- std::move(Emitter));
- break;
- case Triple::XCOFF:
- S = XCOFFStreamerCtorFn(T, Ctx, std::move(TAB), std::move(OW),
- std::move(Emitter));
- break;
- case Triple::SPIRV:
- S = createSPIRVStreamer(Ctx, std::move(TAB), std::move(OW),
- std::move(Emitter));
- break;
- case Triple::DXContainer:
- S = createDXContainerStreamer(Ctx, std::move(TAB), std::move(OW),
- std::move(Emitter));
- break;
- }
- if (ObjectTargetStreamerCtorFn)
- ObjectTargetStreamerCtorFn(*S, STI);
- return S;
- }
+ bool) const;
MCStreamer *createAsmStreamer(MCContext &Ctx,
std::unique_ptr<formatted_raw_ostream> OS,
@@ -589,14 +543,7 @@ class Target {
MCInstPrinter *InstPrint,
std::unique_ptr<MCCodeEmitter> &&CE,
std::unique_ptr<MCAsmBackend> &&TAB,
- bool ShowInst) const {
- formatted_raw_ostream &OSRef = *OS;
- MCStreamer *S = llvm::createAsmStreamer(
- Ctx, std::move(OS), IsVerboseAsm, UseDwarfDirectory, InstPrint,
- std::move(CE), std::move(TAB), ShowInst);
- createAsmTargetStreamer(*S, OSRef, InstPrint, IsVerboseAsm);
- return S;
- }
+ bool ShowInst) const;
MCTargetStreamer *createAsmTargetStreamer(MCStreamer &S,
formatted_raw_ostream &OS,
diff --git a/llvm/lib/MC/TargetRegistry.cpp b/llvm/lib/MC/TargetRegistry.cpp
index 0aa48916c7d25..75272b445db65 100644
--- a/llvm/lib/MC/TargetRegistry.cpp
+++ b/llvm/lib/MC/TargetRegistry.cpp
@@ -9,6 +9,10 @@
#include "llvm/MC/TargetRegistry.h"
#include "llvm/ADT/STLExtras.h"
#include "llvm/ADT/StringRef.h"
+#include "llvm/MC/MCAsmBackend.h"
+#include "llvm/MC/MCCodeEmitter.h"
+#include "llvm/MC/MCObjectStreamer.h"
+#include "llvm/MC/MCObjectWriter.h"
#include "llvm/Support/raw_ostream.h"
#include <cassert>
#include <vector>
@@ -17,6 +21,86 @@ using namespace llvm;
// Clients are responsible for avoid race conditions in registration.
static Target *FirstTarget = nullptr;
+MCStreamer *Target::createMCObjectStreamer(
+ const Triple &T, MCContext &Ctx, std::unique_ptr<MCAsmBackend> TAB,
+ std::unique_ptr<MCObjectWriter> OW, std::unique_ptr<MCCodeEmitter> Emitter,
+ const MCSubtargetInfo &STI) const {
+ MCStreamer *S = nullptr;
+ switch (T.getObjectFormat()) {
+ case Triple::UnknownObjectFormat:
+ llvm_unreachable("Unknown object format");
+ case Triple::COFF:
+ assert((T.isOSWindows() || T.isUEFI()) &&
+ "only Windows and UEFI COFF are supported");
+ S = COFFStreamerCtorFn(Ctx, std::move(TAB), std::move(OW),
+ std::move(Emitter));
+ break;
+ case Triple::MachO:
+ if (MachOStreamerCtorFn)
+ S = MachOStreamerCtorFn(Ctx, std::move(TAB), std::move(OW),
+ std::move(Emitter));
+ else
+ S = createMachOStreamer(Ctx, std::move(TAB), std::move(OW),
+ std::move(Emitter), false);
+ break;
+ case Triple::ELF:
+ if (ELFStreamerCtorFn)
+ S = ELFStreamerCtorFn(T, Ctx, std::move(TAB), std::move(OW),
+ std::move(Emitter));
+ else
+ S = createELFStreamer(Ctx, std::move(TAB), std::move(OW),
+ std::move(Emitter));
+ break;
+ case Triple::Wasm:
+ S = createWasmStreamer(Ctx, std::move(TAB), std::move(OW),
+ std::move(Emitter));
+ break;
+ case Triple::GOFF:
+ S = createGOFFStreamer(Ctx, std::move(TAB), std::move(OW),
+ std::move(Emitter));
+ break;
+ case Triple::XCOFF:
+ S = XCOFFStreamerCtorFn(T, Ctx, std::move(TAB), std::move(OW),
+ std::move(Emitter));
+ break;
+ case Triple::SPIRV:
+ S = createSPIRVStreamer(Ctx, std::move(TAB), std::move(OW),
+ std::move(Emitter));
+ break;
+ case Triple::DXContainer:
+ S = createDXContainerStreamer(Ctx, std::move(TAB), std::move(OW),
+ std::move(Emitter));
+ break;
+ }
+ if (ObjectTargetStreamerCtorFn)
+ ObjectTargetStreamerCtorFn(*S, STI);
+ return S;
+}
+
+MCStreamer *Target::createMCObjectStreamer(
+ const Triple &T, MCContext &Ctx, std::unique_ptr<MCAsmBackend> &&TAB,
+ std::unique_ptr<MCObjectWriter> &&OW,
+ std::unique_ptr<MCCodeEmitter> &&Emitter, const MCSubtargetInfo &STI, bool,
+ bool, bool) const {
+ return createMCObjectStreamer(T, Ctx, std::move(TAB), std::move(OW),
+ std::move(Emitter), STI);
+}
+
+MCStreamer *Target::createAsmStreamer(MCContext &Ctx,
+ std::unique_ptr<formatted_raw_ostream> OS,
+ bool IsVerboseAsm, bool UseDwarfDirectory,
+ MCInstPrinter *InstPrint,
+ std::unique_ptr<MCCodeEmitter> &&CE,
+ std::unique_ptr<MCAsmBackend> &&TAB,
+ bool ShowInst) const {
+ formatted_raw_ostream &OSRef = *OS;
+ MCStreamer *S = llvm::createAsmStreamer(
+ Ctx, std::move(OS), IsVerboseAsm, UseDwarfDirectory, InstPrint,
+ std::move(CE), std::move(TAB), ShowInst);
+ createAsmTargetStreamer(*S, OSRef, InstPrint, IsVerboseAsm);
+ return S;
+}
+
iterator_range<TargetRegistry::iterator> TargetRegistry::targets() {
return make_range(iterator(FirstTarget), iterator());
}
More information about the llvm-commits
mailing list