forked from OSchip/llvm-project
FileOutputBuffer: Handle "-" as stdout.
I was honestly a bit surprised that we didn't do this before. This patch is to handle "-" as the stdout so that if you pass `-o -` to lld, for example, it writes an output to stdout instead of file `-`. I thought that we might want to handle this at a higher level than FileOutputBuffer, because if we land this patch, we can no longer create a file whose name is `-` (there's a workaround though; you can pass `./-` instead of `-`). However, because raw_fd_ostream already handles `-` as a special file name, I think it's okay and actually consistent to handle `-` as a special name in FileOutputBuffer. Differential Revision: https://reviews.llvm.org/D56940 llvm-svn: 351852
This commit is contained in:
parent
a5840c3c39
commit
4063cfc745
|
@ -0,0 +1,12 @@
|
|||
# REQUIRES: x86
|
||||
|
||||
# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t.o
|
||||
# RUN: ld.lld %t.o -o - > %t
|
||||
# RUN: llvm-objdump -d %t | FileCheck %s
|
||||
|
||||
# CHECK: 0000000000201000 _start:
|
||||
# CHECK: 201000: 90 nop
|
||||
|
||||
.globl _start
|
||||
_start:
|
||||
nop
|
|
@ -87,6 +87,12 @@ public:
|
|||
size_t getBufferSize() const override { return Buffer.size(); }
|
||||
|
||||
Error commit() override {
|
||||
if (FinalPath == "-") {
|
||||
llvm::outs() << StringRef((const char *)Buffer.base(), Buffer.size());
|
||||
llvm::outs().flush();
|
||||
return Error::success();
|
||||
}
|
||||
|
||||
using namespace sys::fs;
|
||||
int FD;
|
||||
std::error_code EC;
|
||||
|
@ -149,6 +155,10 @@ createOnDiskBuffer(StringRef Path, size_t Size, unsigned Mode) {
|
|||
// Create an instance of FileOutputBuffer.
|
||||
Expected<std::unique_ptr<FileOutputBuffer>>
|
||||
FileOutputBuffer::create(StringRef Path, size_t Size, unsigned Flags) {
|
||||
// Handle "-" as stdout just like llvm::raw_ostream does.
|
||||
if (Path == "-")
|
||||
return createInMemoryBuffer("-", Size, /*Mode=*/0);
|
||||
|
||||
unsigned Mode = fs::all_read | fs::all_write;
|
||||
if (Flags & F_executable)
|
||||
Mode |= fs::all_exe;
|
||||
|
|
Loading…
Reference in New Issue