mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
Move main outputs to FrontendInputsAndOutputs and InputFile
This commit is contained in:
@@ -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());
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user