std::pair<std::unique_ptr<llvm::MemoryBuffer>, std::unique_ptr<llvm::MemoryBuffer>> CompilerInstance::getInputBufferAndModuleDocBufferIfPresent( const InputFile &input) { if (auto b = input.buffer()) { return std::make_pair(llvm::MemoryBuffer::getMemBufferCopy( b->getBuffer(), b->getBufferIdentifier()), nullptr); } // FIXME: Working with filenames is fragile, maybe use the real path // or have some kind of FileManager. using FileOrError = llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>>; FileOrError inputFileOrErr = llvm::MemoryBuffer::getFileOrSTDIN(input.file()); if (!inputFileOrErr) { Diagnostics.diagnose(SourceLoc(), diag::error_open_input_file, input.file(), inputFileOrErr.getError().message()); return std::make_pair(nullptr, nullptr); } if (!serialization::isSerializedAST((*inputFileOrErr)->getBuffer())) return std::make_pair(std::move(*inputFileOrErr), nullptr); if (Optional<std::unique_ptr<llvm::MemoryBuffer>> moduleDocBuffer = openModuleDoc(input)) { return std::make_pair(std::move(*inputFileOrErr), std::move(*moduleDocBuffer)); } return std::make_pair(nullptr, nullptr); }
StringRef SupplementaryOutputPathsComputer:: deriveDefaultSupplementaryOutputPathExcludingExtension( StringRef outputFilename, const InputFile &input) const { // Put the supplementary output file next to the output file if possible. if (!outputFilename.empty() && outputFilename != "-") return outputFilename; if (input.isPrimary() && input.file() != "-") return llvm::sys::path::filename(input.file()); return ModuleName; }
Optional<unsigned> CompilerInstance::getRecordedBufferID(const InputFile &input, bool &failed) { if (!input.buffer()) { if (Optional<unsigned> existingBufferID = SourceMgr.getIDForBufferIdentifier(input.file())) { return existingBufferID; } } std::pair<std::unique_ptr<llvm::MemoryBuffer>, std::unique_ptr<llvm::MemoryBuffer>> buffers = getInputBufferAndModuleDocBufferIfPresent(input); if (!buffers.first) { failed = true; return None; } // FIXME: The fact that this test happens twice, for some cases, // suggests that setupInputs could use another round of refactoring. if (serialization::isSerializedAST(buffers.first->getBuffer())) { PartialModules.push_back( {std::move(buffers.first), std::move(buffers.second)}); return None; } assert(buffers.second.get() == nullptr); // Transfer ownership of the MemoryBuffer to the SourceMgr. unsigned bufferID = SourceMgr.addNewSourceBuffer(std::move(buffers.first)); InputSourceCodeBufferIDs.push_back(bufferID); return bufferID; }
std::string OutputFilesComputer::determineBaseNameOfOutput(const InputFile &input) const { std::string nameToStem = input.isPrimary() ? input.file() : ModuleNameArg ? ModuleNameArg->getValue() : FirstInput; return llvm::sys::path::stem(nameToStem).str(); }
Optional<std::string> OutputFilesComputer::deriveOutputFileFromInput(const InputFile &input) const { if (input.file() == "-" || HasTextualOutput) return std::string("-"); std::string baseName = determineBaseNameOfOutput(input); if (baseName.empty()) { // Assuming FrontendOptions::doesActionProduceOutput(RequestedAction) Diags.diagnose(SourceLoc(), diag::error_no_output_filename_specified); return None; } return deriveOutputFileFromParts("", baseName); }
Optional<std::unique_ptr<llvm::MemoryBuffer>> CompilerInstance::openModuleDoc(const InputFile &input) { llvm::SmallString<128> moduleDocFilePath(input.file()); llvm::sys::path::replace_extension(moduleDocFilePath, SERIALIZED_MODULE_DOC_EXTENSION); using FileOrError = llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>>; FileOrError moduleDocFileOrErr = llvm::MemoryBuffer::getFileOrSTDIN(moduleDocFilePath); if (moduleDocFileOrErr) return std::move(*moduleDocFileOrErr); if (moduleDocFileOrErr.getError() == std::errc::no_such_file_or_directory) return std::unique_ptr<llvm::MemoryBuffer>(); Diagnostics.diagnose(SourceLoc(), diag::error_open_input_file, moduleDocFilePath, moduleDocFileOrErr.getError().message()); return None; }
bool CompilerInstance::setUpForInput(const InputFile &input) { bool failed = false; Optional<unsigned> bufferID = getRecordedBufferID(input, failed); if (failed) return true; if (!bufferID) return false; if (isInSILMode() || (isInputSwift() && llvm::sys::path::filename(input.file()) == "main.swift")) { assert(MainBufferID == NO_SUCH_BUFFER && "re-setting MainBufferID"); MainBufferID = *bufferID; } if (input.isPrimary()) { recordPrimaryInputBuffer(*bufferID); } return false; }