blob: c5f0baa08e8e430a8142166889bfd647083711f7 [file] [log] [blame]
//===-- ReadStdin.cpp -----------------------------------------------------===//
//
// Copyright 2018 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
//
//===----------------------------------------------------------------------===//
//
// Gollvm driver helper class "ReadStdin" methods.
//
//===----------------------------------------------------------------------===//
#include "ReadStdin.h"
#include "Compilation.h"
#include "Driver.h"
#include "llvm/Support/MemoryBuffer.h"
#include "llvm/Support/raw_ostream.h"
#include "llvm/Support/FileSystem.h"
namespace gollvm {
namespace driver {
ReadStdin::ReadStdin(ToolChain &tc, bool mustBeEmpty)
: InternalTool("stdinreader", tc, ""),
mustBeEmpty_(mustBeEmpty)
{
}
ReadStdin::~ReadStdin()
{
}
bool ReadStdin::performAction(Compilation &compilation,
const Action &jobAction,
const ArtifactList &inputArtifacts,
const Artifact &output)
{
assert(inputArtifacts.empty());
// Read in standard input, the LLVM way...
llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> stdinBufferOrErr =
llvm::MemoryBuffer::getSTDIN();
if (std::error_code errc = stdinBufferOrErr.getError()) {
llvm::errs() << compilation.driver().progname()
<< ": error reading stdin: " << errc.message();
return false;
}
std::unique_ptr<llvm::MemoryBuffer> stdinBuf =
std::move(stdinBufferOrErr.get());
// Enforce the "must be empty" requirement if appropriate.
if (mustBeEmpty_ && stdinBuf->getBufferSize() != 0) {
llvm::errs() << compilation.driver().progname()
<< ": unsupported language for -x, "
<< "stdin be empty\n";
return false;
}
// Emit to the output artifact.
std::error_code errc;
llvm::raw_fd_ostream ostr(output.file(), errc,
llvm::sys::fs::OpenFlags::OF_None);
if (errc) {
llvm::errs() << compilation.driver().progname()
<< ": cannot open " << output.file() << " for writing: "
<< errc.message();
return false;
}
ostr.write(stdinBuf->getBufferStart(), stdinBuf->getBufferSize());
return true;
}
} // end namespace driver
} // end namespace gollvm