Move main outputs to FrontendInputsAndOutputs and InputFile

This commit is contained in:
David Ungar
2018-01-29 16:43:19 -08:00
parent e006825d88
commit 614006bc4f
19 changed files with 656 additions and 251 deletions

View File

@@ -34,6 +34,7 @@ FrontendInputsAndOutputs::FrontendInputsAndOutputs(
const FrontendInputsAndOutputs &other) {
for (InputFile input : other.AllInputs)
addInput(input);
IsSingleThreadedWMO = other.IsSingleThreadedWMO;
}
FrontendInputsAndOutputs &FrontendInputsAndOutputs::
@@ -41,6 +42,7 @@ operator=(const FrontendInputsAndOutputs &other) {
clearInputs();
for (InputFile input : other.AllInputs)
addInput(input);
IsSingleThreadedWMO = other.IsSingleThreadedWMO;
return *this;
}
@@ -102,6 +104,13 @@ void FrontendInputsAndOutputs::assertMustNotBeMoreThanOnePrimaryInput() const {
"have not implemented >1 primary input yet");
}
void FrontendInputsAndOutputs::
assertMustNotBeMoreThanOnePrimaryInputUnlessBatchModeChecksHaveBeenBypassed()
const {
if (!areBatchModeChecksBypassed())
assertMustNotBeMoreThanOnePrimaryInput();
}
const InputFile *FrontendInputsAndOutputs::getUniquePrimaryInput() const {
assertMustNotBeMoreThanOnePrimaryInput();
const auto b = PrimaryInputs.begin();
@@ -120,6 +129,15 @@ StringRef FrontendInputsAndOutputs::getNameOfUniquePrimaryInputFile() const {
return input == nullptr ? StringRef() : input->file();
}
std::string FrontendInputsAndOutputs::getStatsFileMangledInputName() const {
// FIXME: "batch" should probably be some concatenation of all the primary
// input names, in order to keep the stats file names unique. (Or perhaps just
// the first primary?)
return isWholeModule()
? "all"
: primaryInputCount() == 1 ? firstPrimaryInput().file() : "batch";
}
bool FrontendInputsAndOutputs::isInputPrimary(StringRef file) const {
StringRef correctedFile =
InputFile::convertBufferNameFromLLVM_getFileOrSTDIN_toSwiftConventions(
@@ -238,3 +256,91 @@ void FrontendInputsAndOutputs::addPrimaryInputFile(StringRef file,
llvm::MemoryBuffer *buffer) {
addInput(InputFile(file, true, buffer));
}
// Outputs
unsigned FrontendInputsAndOutputs::countOfInputsProducingMainOutputs() const {
return isSingleThreadedWMO()
? 1
: hasPrimaryInputs() ? primaryInputCount() : inputCount();
}
const InputFile &FrontendInputsAndOutputs::firstInputProducingOutput() const {
return isSingleThreadedWMO()
? firstInput()
: hasPrimaryInputs() ? firstPrimaryInput() : firstInput();
}
const InputFile &FrontendInputsAndOutputs::lastInputProducingOutput() const {
return isSingleThreadedWMO()
? firstInput()
: hasPrimaryInputs() ? lastPrimaryInput() : lastInput();
}
void FrontendInputsAndOutputs::forEachInputProducingAMainOutputFile(
llvm::function_ref<void(const InputFile &)> fn) const {
isSingleThreadedWMO()
? fn(firstInput())
: hasPrimaryInputs() ? forEachPrimaryInput(fn) : forEachInput(fn);
}
void FrontendInputsAndOutputs::setMainOutputs(
ArrayRef<std::string> outputFiles) {
assert(countOfInputsProducingMainOutputs() == outputFiles.size());
if (hasPrimaryInputs()) {
unsigned i = 0;
for (auto index : indices(AllInputs)) {
InputFile &f = AllInputs[index];
if (f.isPrimary())
f.setOutputFilename(outputFiles[i++]);
}
} else if (isSingleThreadedWMO()) {
AllInputs[0].setOutputFilename(outputFiles[0]);
} else {
for (auto i : indices(AllInputs))
AllInputs[i].setOutputFilename(outputFiles[i]);
}
}
std::vector<std::string> FrontendInputsAndOutputs::copyOutputFilenames() const {
std::vector<std::string> outputs;
forEachInputProducingAMainOutputFile([&](const InputFile &input) -> void {
outputs.push_back(input.outputFilename());
});
return outputs;
}
void FrontendInputsAndOutputs::forEachOutputFilename(
llvm::function_ref<void(const std::string &)> fn) const {
forEachInputProducingAMainOutputFile(
[&](const InputFile &input) -> void { fn(input.outputFilename()); });
}
StringRef FrontendInputsAndOutputs::getSingleOutputFilename() const {
assertMustNotBeMoreThanOnePrimaryInputUnlessBatchModeChecksHaveBeenBypassed();
return hasInputs() ? StringRef(lastInputProducingOutput().outputFilename())
: StringRef();
}
bool FrontendInputsAndOutputs::isOutputFilenameStdout() const {
return getSingleOutputFilename() == "-";
}
bool FrontendInputsAndOutputs::isOutputFileDirectory() const {
return hasNamedOutputFile() &&
llvm::sys::fs::is_directory(getSingleOutputFilename());
}
bool FrontendInputsAndOutputs::hasNamedOutputFile() const {
return hasInputs() && !isOutputFilenameStdout();
}
// Supplementary outputs
void FrontendInputsAndOutputs::forEachInputProducingSupplementaryOutput(
llvm::function_ref<void(const InputFile &)> fn) const {
if (hasPrimaryInputs())
forEachPrimaryInput(fn);
else
fn(firstInput());
}