Merge pull request #12920 from davidungar/Move-input-conversion

Move input conversion
This commit is contained in:
David Ungar
2017-11-27 17:13:48 -08:00
committed by GitHub
13 changed files with 283 additions and 130 deletions

View File

@@ -68,6 +68,8 @@ enum class InputFileKind {
/// Information about all the inputs to the frontend.
class FrontendInputs {
friend class ArgsToFrontendInputsConverter;
private:
/// The names of input files to the frontend.
std::vector<std::string> InputFilenames;
@@ -75,26 +77,28 @@ private:
/// Input buffers which may override the file contents of input files.
std::vector<llvm::MemoryBuffer *> InputBuffers;
/// The input for which output should be generated. If not set, output will
/// be generated for the whole module.
Optional<SelectedInput> PrimaryInput;
/// The inputs for which output should be generated. If empty, output will
/// be generated for the whole module, in other words, whole-module mode.
/// Even if every input file is mentioned here, it is not the same as
/// whole-module mode.
std::vector<SelectedInput> PrimaryInputs;
public:
// Readers:
// Input filename readers
ArrayRef<std::string> getInputFilenames() const { return InputFilenames; }
bool hasInputFilenames() const { return !getInputFilenames().empty(); }
bool haveInputFilenames() const { return !getInputFilenames().empty(); }
unsigned inputFilenameCount() const { return getInputFilenames().size(); }
bool hasUniqueInputFilename() const { return inputFilenameCount() == 1; }
bool haveUniqueInputFilename() const { return inputFilenameCount() == 1; }
const std::string &getFilenameOfFirstInput() const {
assert(hasInputFilenames());
assert(haveInputFilenames());
return getInputFilenames()[0];
}
bool isReadingFromStdin() {
return hasUniqueInputFilename() && getFilenameOfFirstInput() == "-";
bool isReadingFromStdin() const {
return haveUniqueInputFilename() && getFilenameOfFirstInput() == "-";
}
// If we have exactly one input filename, and its extension is "bc" or "ll",
@@ -110,21 +114,64 @@ public:
// Primary input readers
Optional<SelectedInput> getPrimaryInput() const { return PrimaryInput; }
bool hasPrimaryInput() const { return getPrimaryInput().hasValue(); }
bool isWholeModule() { return !hasPrimaryInput(); }
bool isPrimaryInputAFileAt(unsigned i) {
return hasPrimaryInput() && getPrimaryInput()->isFilename() &&
getPrimaryInput()->Index == i;
private:
void assertMustNotBeMoreThanOnePrimaryInput() const {
assert(PrimaryInputs.size() < 2 &&
"have not implemented >1 primary input yet");
}
public:
ArrayRef<SelectedInput> getPrimaryInputs() const { return PrimaryInputs; }
unsigned primaryInputCount() const { return getPrimaryInputs().size(); }
// Primary count readers:
bool haveUniquePrimaryInput() const { return primaryInputCount() == 1; }
bool havePrimaryInputs() const { return primaryInputCount() > 0; }
bool isWholeModule() const { return !havePrimaryInputs(); }
// Count-dependend readers:
Optional<SelectedInput> getOptionalPrimaryInput() const {
return havePrimaryInputs() ? Optional<SelectedInput>(getPrimaryInputs()[0])
: Optional<SelectedInput>();
}
SelectedInput getRequiredUniquePrimaryInput() const {
assert(haveUniquePrimaryInput());
return getPrimaryInputs()[0];
}
Optional<SelectedInput> getOptionalUniquePrimaryInput() const {
return haveUniquePrimaryInput()
? Optional<SelectedInput>(getPrimaryInputs()[0])
: Optional<SelectedInput>();
}
bool haveAPrimaryInputFile() const {
return hasPrimaryInput() && getPrimaryInput()->isFilename();
return havePrimaryInputs() && getOptionalPrimaryInput()->isFilename();
}
Optional<StringRef> getOptionalUniquePrimaryInputFilename() const {
Optional<SelectedInput> primaryInput = getOptionalUniquePrimaryInput();
return (primaryInput && primaryInput->isFilename())
? Optional<StringRef>(getInputFilenames()[primaryInput->Index])
: Optional<StringRef>();
}
bool isPrimaryInputAFileAt(unsigned i) const {
assertMustNotBeMoreThanOnePrimaryInput();
if (Optional<SelectedInput> primaryInput = getOptionalPrimaryInput())
return primaryInput->isFilename() && primaryInput->Index == i;
return false;
}
Optional<unsigned> primaryInputFileIndex() const {
return haveAPrimaryInputFile()
? Optional<unsigned>(getPrimaryInput()->Index)
? Optional<unsigned>(getOptionalPrimaryInput()->Index)
: None;
}
@@ -135,9 +182,11 @@ public:
return StringRef();
}
public:
// Multi-facet readers
StringRef baseNameOfOutput(const llvm::opt::ArgList &Args,
StringRef ModuleName) const;
bool shouldTreatAsSIL() const;
/// Return true for error
@@ -158,8 +207,31 @@ public:
// Primary input writers
void setPrimaryInput(SelectedInput si) { PrimaryInput = si; }
void clearPrimaryInput() { PrimaryInput = 0; }
private:
std::vector<SelectedInput> &getMutablePrimaryInputs() {
assertMustNotBeMoreThanOnePrimaryInput();
return PrimaryInputs;
}
public:
void clearPrimaryInputs() { getMutablePrimaryInputs().clear(); }
void setPrimaryInputToFirstFile() {
clearPrimaryInputs();
addPrimaryInput(SelectedInput(0, SelectedInput::InputKind::Filename));
}
void addPrimaryInput(SelectedInput si) { PrimaryInputs.push_back(si); }
void setPrimaryInput(SelectedInput si) {
clearPrimaryInputs();
getMutablePrimaryInputs().push_back(si);
}
void addPrimaryInputFilename(unsigned index) {
addPrimaryInput(SelectedInput(index, SelectedInput::InputKind::Filename));
}
void setPrimaryInputForInputFilename(const std::string &inputFilename) {
setPrimaryInput(!inputFilename.empty() && inputFilename != "-"
? SelectedInput(inputFilenameCount(),
@@ -174,12 +246,6 @@ public:
InputFilenames.clear();
InputBuffers.clear();
}
void setInputFilenamesAndPrimaryInput(DiagnosticEngine &Diags,
llvm::opt::ArgList &Args);
void readInputFileList(DiagnosticEngine &diags, llvm::opt::ArgList &Args,
const llvm::opt::Arg *filelistPath);
};
/// Options for controlling the behavior of the frontend.
@@ -214,7 +280,7 @@ public:
}
bool isOutputFileDirectory() const;
bool isOutputFilePlainFile() const;
bool hasNamedOutputFile() const {
bool haveNamedOutputFile() const {
return !OutputFilenames.empty() && !isOutputFilenameStdout();
}
void setOutputFileList(DiagnosticEngine &Diags,
@@ -474,7 +540,7 @@ public:
bool isCompilingExactlyOneSwiftFile() const {
return InputKind == InputFileKind::IFK_Swift &&
Inputs.hasUniqueInputFilename();
Inputs.haveUniqueInputFilename();
}
void setModuleName(DiagnosticEngine &Diags, const llvm::opt::ArgList &Args);