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 55c9fe6..6feffa8 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 != "-") |