diff options
Diffstat (limited to 'llvm/lib/Target/ARM')
4 files changed, 39 insertions, 30 deletions
| diff --git a/llvm/lib/Target/ARM/MCTargetDesc/ARMELFStreamer.cpp b/llvm/lib/Target/ARM/MCTargetDesc/ARMELFStreamer.cpp index 4acf9fb1848..12005a15e3b 100644 --- a/llvm/lib/Target/ARM/MCTargetDesc/ARMELFStreamer.cpp +++ b/llvm/lib/Target/ARM/MCTargetDesc/ARMELFStreamer.cpp @@ -1374,11 +1374,18 @@ MCTargetStreamer *createARMNullTargetStreamer(MCStreamer &S) {    return new ARMTargetStreamer(S);  } +MCTargetStreamer *createARMObjectTargetStreamer(MCStreamer &S, +                                                const MCSubtargetInfo &STI) { +  Triple TT(STI.getTargetTriple()); +  if (TT.getObjectFormat() == Triple::ELF) +    return new ARMTargetELFStreamer(S); +  return new ARMTargetStreamer(S); +} +  MCELFStreamer *createARMELFStreamer(MCContext &Context, MCAsmBackend &TAB,                                      raw_ostream &OS, MCCodeEmitter *Emitter,                                      bool RelaxAll, bool IsThumb) {      ARMELFStreamer *S = new ARMELFStreamer(Context, TAB, OS, Emitter, IsThumb); -    new ARMTargetELFStreamer(*S);      // FIXME: This should eventually end up somewhere else where more      // intelligent flag decisions can be made. For now we are just maintaining      // the status quo for ARM and setting EF_ARM_EABI_VER5 as the default. diff --git a/llvm/lib/Target/ARM/MCTargetDesc/ARMMCTargetDesc.cpp b/llvm/lib/Target/ARM/MCTargetDesc/ARMMCTargetDesc.cpp index 334f49eb0ad..9f75491911c 100644 --- a/llvm/lib/Target/ARM/MCTargetDesc/ARMMCTargetDesc.cpp +++ b/llvm/lib/Target/ARM/MCTargetDesc/ARMMCTargetDesc.cpp @@ -298,25 +298,18 @@ static MCCodeGenInfo *createARMMCCodeGenInfo(StringRef TT, Reloc::Model RM,    return X;  } -// This is duplicated code. Refactor this. -static MCStreamer *createMCStreamer(const Triple &T, MCContext &Ctx, -                                    MCAsmBackend &MAB, raw_ostream &OS, -                                    MCCodeEmitter *Emitter, -                                    const MCSubtargetInfo &STI, bool RelaxAll) { -  switch (T.getObjectFormat()) { -  default: llvm_unreachable("unsupported object format"); -  case Triple::MachO: { -    MCStreamer *S = createMachOStreamer(Ctx, MAB, OS, Emitter, false); -    new ARMTargetStreamer(*S); -    return S; -  } -  case Triple::COFF: -    assert(T.isOSWindows() && "non-Windows ARM COFF is not supported"); -    return createARMWinCOFFStreamer(Ctx, MAB, *Emitter, OS); -  case Triple::ELF: -    return createARMELFStreamer(Ctx, MAB, OS, Emitter, false, -                                T.getArch() == Triple::thumb); -  } +static MCStreamer *createELFStreamer(const Triple &T, MCContext &Ctx, +                                     MCAsmBackend &MAB, raw_ostream &OS, +                                     MCCodeEmitter *Emitter, bool RelaxAll) { +  return createARMELFStreamer(Ctx, MAB, OS, Emitter, false, +                              T.getArch() == Triple::thumb); +} + +static MCStreamer *createARMMachOStreamer(MCContext &Ctx, MCAsmBackend &MAB, +                                          raw_ostream &OS, +                                          MCCodeEmitter *Emitter, +                                          bool RelaxAll) { +  return createMachOStreamer(Ctx, MAB, OS, Emitter, false);  }  static MCInstPrinter *createARMMCInstPrinter(const Target &T, @@ -401,8 +394,13 @@ extern "C" void LLVMInitializeARMTargetMC() {      // Register the MC instruction analyzer.      TargetRegistry::RegisterMCInstrAnalysis(*T, createARMMCInstrAnalysis); -    // Register the object streamer. -    TargetRegistry::RegisterMCObjectStreamer(*T, createMCStreamer); +    TargetRegistry::RegisterELFStreamer(*T, createELFStreamer); +    TargetRegistry::RegisterCOFFStreamer(*T, createARMWinCOFFStreamer); +    TargetRegistry::RegisterMachOStreamer(*T, createARMMachOStreamer); + +    // Register the obj target streamer. +    TargetRegistry::RegisterObjectTargetStreamer(*T, +                                                 createARMObjectTargetStreamer);      // Register the asm streamer.      TargetRegistry::RegisterAsmTargetStreamer(*T, createARMTargetAsmStreamer); diff --git a/llvm/lib/Target/ARM/MCTargetDesc/ARMMCTargetDesc.h b/llvm/lib/Target/ARM/MCTargetDesc/ARMMCTargetDesc.h index e31f7c6b3e9..7e9ba669cf0 100644 --- a/llvm/lib/Target/ARM/MCTargetDesc/ARMMCTargetDesc.h +++ b/llvm/lib/Target/ARM/MCTargetDesc/ARMMCTargetDesc.h @@ -32,6 +32,7 @@ class MCRelocationInfo;  class MCTargetStreamer;  class StringRef;  class Target; +class Triple;  class raw_ostream;  extern Target TheARMLETarget, TheThumbLETarget; @@ -52,6 +53,8 @@ MCTargetStreamer *createARMTargetAsmStreamer(MCStreamer &S,                                               formatted_raw_ostream &OS,                                               MCInstPrinter *InstPrint,                                               bool isVerboseAsm); +MCTargetStreamer *createARMObjectTargetStreamer(MCStreamer &S, +                                                const MCSubtargetInfo &STI);  MCCodeEmitter *createARMLEMCCodeEmitter(const MCInstrInfo &MCII,                                          const MCRegisterInfo &MRI, @@ -77,10 +80,11 @@ MCAsmBackend *createThumbLEAsmBackend(const Target &T, const MCRegisterInfo &MRI  MCAsmBackend *createThumbBEAsmBackend(const Target &T, const MCRegisterInfo &MRI,                                        StringRef TT, StringRef CPU); -/// createARMWinCOFFStreamer - Construct a PE/COFF machine code streamer which -/// will generate a PE/COFF object file. +// Construct a PE/COFF machine code streamer which will generate a PE/COFF +// object file.  MCStreamer *createARMWinCOFFStreamer(MCContext &Context, MCAsmBackend &MAB, -                                     MCCodeEmitter &Emitter, raw_ostream &OS); +                                     raw_ostream &OS, MCCodeEmitter *Emitter, +                                     bool RelaxAll);  /// createARMELFObjectWriter - Construct an ELF Mach-O object writer.  MCObjectWriter *createARMELFObjectWriter(raw_ostream &OS, diff --git a/llvm/lib/Target/ARM/MCTargetDesc/ARMWinCOFFStreamer.cpp b/llvm/lib/Target/ARM/MCTargetDesc/ARMWinCOFFStreamer.cpp index b344ced2f67..dc707dc6bdc 100644 --- a/llvm/lib/Target/ARM/MCTargetDesc/ARMWinCOFFStreamer.cpp +++ b/llvm/lib/Target/ARM/MCTargetDesc/ARMWinCOFFStreamer.cpp @@ -37,10 +37,10 @@ void ARMWinCOFFStreamer::EmitThumbFunc(MCSymbol *Symbol) {  }  } -namespace llvm { -MCStreamer *createARMWinCOFFStreamer(MCContext &Context, MCAsmBackend &MAB, -                                     MCCodeEmitter &Emitter, raw_ostream &OS) { -  return new ARMWinCOFFStreamer(Context, MAB, Emitter, OS); -} +MCStreamer *llvm::createARMWinCOFFStreamer(MCContext &Context, +                                           MCAsmBackend &MAB, raw_ostream &OS, +                                           MCCodeEmitter *Emitter, +                                           bool RelaxAll) { +  return new ARMWinCOFFStreamer(Context, MAB, *Emitter, OS);  } | 

