diff options
Diffstat (limited to 'tools/driver/cc1as_main.cpp')
| -rw-r--r-- | tools/driver/cc1as_main.cpp | 51 | 
1 files changed, 30 insertions, 21 deletions
| diff --git a/tools/driver/cc1as_main.cpp b/tools/driver/cc1as_main.cpp index 55c9fe602fa3..6feffa8a63d5 100644 --- a/tools/driver/cc1as_main.cpp +++ b/tools/driver/cc1as_main.cpp @@ -19,6 +19,7 @@  #include "clang/Frontend/FrontendDiagnostic.h"  #include "clang/Frontend/TextDiagnosticPrinter.h"  #include "clang/Frontend/Utils.h" +#include "llvm/ADT/STLExtras.h"  #include "llvm/ADT/StringSwitch.h"  #include "llvm/ADT/Triple.h"  #include "llvm/IR/DataLayout.h" @@ -254,9 +255,9 @@ bool AssemblerInvocation::CreateFromArgs(AssemblerInvocation &Opts,    return Success;  } -static formatted_raw_ostream *GetOutputStream(AssemblerInvocation &Opts, -                                              DiagnosticsEngine &Diags, -                                              bool Binary) { +static std::unique_ptr<raw_fd_ostream> +getOutputStream(AssemblerInvocation &Opts, DiagnosticsEngine &Diags, +                bool Binary) {    if (Opts.OutputPath.empty())      Opts.OutputPath = "-"; @@ -266,16 +267,15 @@ static formatted_raw_ostream *GetOutputStream(AssemblerInvocation &Opts,      sys::RemoveFileOnSignal(Opts.OutputPath);    std::error_code EC; -  raw_fd_ostream *Out = new raw_fd_ostream( +  auto Out = llvm::make_unique<raw_fd_ostream>(        Opts.OutputPath, EC, (Binary ? sys::fs::F_None : sys::fs::F_Text));    if (EC) {      Diags.Report(diag::err_fe_unable_to_open_output) << Opts.OutputPath                                                       << EC.message(); -    delete Out;      return nullptr;    } -  return new formatted_raw_ostream(*Out, formatted_raw_ostream::DELETE_STREAM); +  return Out;  }  static bool ExecuteAssembler(AssemblerInvocation &Opts, @@ -315,9 +315,8 @@ static bool ExecuteAssembler(AssemblerInvocation &Opts,      MAI->setCompressDebugSections(true);    bool IsBinary = Opts.OutputType == AssemblerInvocation::FT_Obj; -  std::unique_ptr<formatted_raw_ostream> Out( -      GetOutputStream(Opts, Diags, IsBinary)); -  if (!Out) +  std::unique_ptr<raw_fd_ostream> FDOS = getOutputStream(Opts, Diags, IsBinary); +  if (!FDOS)      return true;    // FIXME: This is not pretty. MCContext has a ptr to MCObjectFileInfo and @@ -356,31 +355,40 @@ static bool ExecuteAssembler(AssemblerInvocation &Opts,    std::unique_ptr<MCSubtargetInfo> STI(        TheTarget->createMCSubtargetInfo(Opts.Triple, Opts.CPU, FS)); +  raw_pwrite_stream *Out = FDOS.get(); +  std::unique_ptr<buffer_ostream> BOS; +    // FIXME: There is a bit of code duplication with addPassesToEmitFile.    if (Opts.OutputType == AssemblerInvocation::FT_Asm) { -    MCInstPrinter *IP = -      TheTarget->createMCInstPrinter(Opts.OutputAsmVariant, *MAI, *MCII, *MRI, -                                     *STI); +    MCInstPrinter *IP = TheTarget->createMCInstPrinter( +        llvm::Triple(Opts.Triple), Opts.OutputAsmVariant, *MAI, *MCII, *MRI);      MCCodeEmitter *CE = nullptr;      MCAsmBackend *MAB = nullptr;      if (Opts.ShowEncoding) { -      CE = TheTarget->createMCCodeEmitter(*MCII, *MRI, *STI, Ctx); +      CE = TheTarget->createMCCodeEmitter(*MCII, *MRI, Ctx);        MAB = TheTarget->createMCAsmBackend(*MRI, Opts.Triple, Opts.CPU);      } -    Str.reset(TheTarget->createAsmStreamer(Ctx, *Out, /*asmverbose*/true, -                                           /*useDwarfDirectory*/ true, -                                           IP, CE, MAB, -                                           Opts.ShowInst)); +    auto FOut = llvm::make_unique<formatted_raw_ostream>(*Out); +    Str.reset(TheTarget->createAsmStreamer( +        Ctx, std::move(FOut), /*asmverbose*/ true, +        /*useDwarfDirectory*/ true, IP, CE, MAB, Opts.ShowInst));    } else if (Opts.OutputType == AssemblerInvocation::FT_Null) {      Str.reset(createNullStreamer(Ctx));    } else {      assert(Opts.OutputType == AssemblerInvocation::FT_Obj &&             "Invalid file type!"); -    MCCodeEmitter *CE = TheTarget->createMCCodeEmitter(*MCII, *MRI, *STI, Ctx); +    if (!FDOS->supportsSeeking()) { +      BOS = make_unique<buffer_ostream>(*FDOS); +      Out = BOS.get(); +    } + +    MCCodeEmitter *CE = TheTarget->createMCCodeEmitter(*MCII, *MRI, Ctx);      MCAsmBackend *MAB = TheTarget->createMCAsmBackend(*MRI, Opts.Triple,                                                        Opts.CPU); -    Str.reset(TheTarget->createMCObjectStreamer(Opts.Triple, Ctx, *MAB, *Out, -                                                CE, *STI, Opts.RelaxAll)); +    Triple T(Opts.Triple); +    Str.reset(TheTarget->createMCObjectStreamer(T, Ctx, *MAB, *Out, CE, *STI, +                                                Opts.RelaxAll, +                                                /*DWARFMustBeAtTheEnd*/ true));      Str.get()->InitSections(Opts.NoExecStack);    } @@ -402,7 +410,8 @@ static bool ExecuteAssembler(AssemblerInvocation &Opts,    }    // Close the output stream early. -  Out.reset(); +  BOS.reset(); +  FDOS.reset();    // Delete output file if there were errors.    if (Failed && Opts.OutputPath != "-") | 
