Open native file handles to avoid converting from FDs, NFC

Follow up to r365588.

llvm-svn: 365820
This commit is contained in:
Reid Kleckner 2019-07-11 20:29:32 +00:00
parent f4af9a9d80
commit f002fcb2ad
5 changed files with 37 additions and 36 deletions

View File

@ -38,22 +38,23 @@ Expected<NativeObjectCache> lto::localCache(StringRef CacheDirectoryPath,
SmallString<64> EntryPath;
sys::path::append(EntryPath, CacheDirectoryPath, "llvmcache-" + Key);
// First, see if we have a cache hit.
int FD;
SmallString<64> ResultPath;
std::error_code EC = sys::fs::openFileForRead(
Twine(EntryPath), FD, sys::fs::OF_UpdateAtime, &ResultPath);
if (!EC) {
Expected<sys::fs::file_t> FDOrErr = sys::fs::openNativeFileForRead(
Twine(EntryPath), sys::fs::OF_UpdateAtime, &ResultPath);
std::error_code EC;
if (FDOrErr) {
ErrorOr<std::unique_ptr<MemoryBuffer>> MBOrErr =
MemoryBuffer::getOpenFile(sys::fs::convertFDToNativeFile(FD),
EntryPath,
/*FileSize*/ -1,
/*RequiresNullTerminator*/ false);
close(FD);
MemoryBuffer::getOpenFile(*FDOrErr, EntryPath,
/*FileSize=*/-1,
/*RequiresNullTerminator=*/false);
sys::fs::closeFile(*FDOrErr);
if (MBOrErr) {
AddBuffer(Task, std::move(*MBOrErr));
return AddStreamFn();
}
EC = MBOrErr.getError();
} else {
EC = errorToErrorCode(FDOrErr.takeError());
}
// On Windows we can fail to open a cache file with a permission denied

View File

@ -349,16 +349,14 @@ public:
ErrorOr<std::unique_ptr<MemoryBuffer>> tryLoadingBuffer() {
if (EntryPath.empty())
return std::error_code();
int FD;
SmallString<64> ResultPath;
std::error_code EC = sys::fs::openFileForRead(
Twine(EntryPath), FD, sys::fs::OF_UpdateAtime, &ResultPath);
if (EC)
return EC;
Expected<sys::fs::file_t> FDOrErr = sys::fs::openNativeFileForRead(
Twine(EntryPath), sys::fs::OF_UpdateAtime, &ResultPath);
if (!FDOrErr)
return errorToErrorCode(FDOrErr.takeError());
ErrorOr<std::unique_ptr<MemoryBuffer>> MBOrErr = MemoryBuffer::getOpenFile(
sys::fs::convertFDToNativeFile(FD), EntryPath,
/*FileSize=*/-1, /*RequiresNullTerminator=*/false);
close(FD);
*FDOrErr, EntryPath, /*FileSize=*/-1, /*RequiresNullTerminator=*/false);
sys::fs::closeFile(*FDOrErr);
return MBOrErr;
}

View File

@ -172,14 +172,14 @@ loadObj(StringRef Filename, object::OwningBinary<object::ObjectFile> &ObjFile,
}
static Error
loadYAML(int Fd, size_t FileSize, StringRef Filename,
loadYAML(sys::fs::file_t Fd, size_t FileSize, StringRef Filename,
InstrumentationMap::SledContainer &Sleds,
InstrumentationMap::FunctionAddressMap &FunctionAddresses,
InstrumentationMap::FunctionAddressReverseMap &FunctionIds) {
std::error_code EC;
sys::fs::mapped_file_region MappedFile(
sys::fs::convertFDToNativeFile(Fd),
sys::fs::mapped_file_region::mapmode::readonly, FileSize, 0, EC);
Fd, sys::fs::mapped_file_region::mapmode::readonly, FileSize, 0, EC);
sys::fs::closeFile(Fd);
if (EC)
return make_error<StringError>(
Twine("Failed memory-mapping file '") + Filename + "'.", EC);
@ -215,9 +215,12 @@ llvm::xray::loadInstrumentationMap(StringRef Filename) {
if (!ObjectFileOrError) {
auto E = ObjectFileOrError.takeError();
// We try to load it as YAML if the ELF load didn't work.
int Fd;
if (sys::fs::openFileForRead(Filename, Fd))
Expected<sys::fs::file_t> FdOrErr = sys::fs::openNativeFileForRead(Filename);
if (!FdOrErr) {
// Report the ELF load error if YAML failed.
consumeError(FdOrErr.takeError());
return std::move(E);
}
uint64_t FileSize;
if (sys::fs::file_size(Filename, FileSize))
@ -230,7 +233,7 @@ llvm::xray::loadInstrumentationMap(StringRef Filename) {
// From this point on the errors will be only for the YAML parts, so we
// consume the errors at this point.
consumeError(std::move(E));
if (auto E = loadYAML(Fd, FileSize, Filename, Map.Sleds,
if (auto E = loadYAML(*FdOrErr, FileSize, Filename, Map.Sleds,
Map.FunctionAddresses, Map.FunctionIds))
return std::move(E);
} else if (auto E = loadObj(Filename, *ObjectFileOrError, Map.Sleds,

View File

@ -260,10 +260,9 @@ Profile mergeProfilesByStack(const Profile &L, const Profile &R) {
}
Expected<Profile> loadProfile(StringRef Filename) {
int Fd;
if (auto EC = sys::fs::openFileForRead(Filename, Fd))
return make_error<StringError>(
Twine("Cannot read profile from '") + Filename + "'", EC);
Expected<sys::fs::file_t> FdOrErr = sys::fs::openNativeFileForRead(Filename);
if (!FdOrErr)
return FdOrErr.takeError();
uint64_t FileSize;
if (auto EC = sys::fs::file_size(Filename, FileSize))
@ -272,8 +271,9 @@ Expected<Profile> loadProfile(StringRef Filename) {
std::error_code EC;
sys::fs::mapped_file_region MappedFile(
sys::fs::convertFDToNativeFile(Fd),
sys::fs::mapped_file_region::mapmode::readonly, FileSize, 0, EC);
*FdOrErr, sys::fs::mapped_file_region::mapmode::readonly, FileSize, 0,
EC);
sys::fs::closeFile(*FdOrErr);
if (EC)
return make_error<StringError>(
Twine("Cannot mmap profile '") + Filename + "'", EC);

View File

@ -371,11 +371,9 @@ Error loadYAMLLog(StringRef Data, XRayFileHeader &FileHeader,
} // namespace
Expected<Trace> llvm::xray::loadTraceFile(StringRef Filename, bool Sort) {
int Fd;
if (auto EC = sys::fs::openFileForRead(Filename, Fd)) {
return make_error<StringError>(
Twine("Cannot read log from '") + Filename + "'", EC);
}
Expected<sys::fs::file_t> FdOrErr = sys::fs::openNativeFileForRead(Filename);
if (!FdOrErr)
return FdOrErr.takeError();
uint64_t FileSize;
if (auto EC = sys::fs::file_size(Filename, FileSize)) {
@ -391,8 +389,9 @@ Expected<Trace> llvm::xray::loadTraceFile(StringRef Filename, bool Sort) {
// Map the opened file into memory and use a StringRef to access it later.
std::error_code EC;
sys::fs::mapped_file_region MappedFile(
sys::fs::convertFDToNativeFile(Fd),
sys::fs::mapped_file_region::mapmode::readonly, FileSize, 0, EC);
*FdOrErr, sys::fs::mapped_file_region::mapmode::readonly, FileSize, 0,
EC);
sys::fs::closeFile(*FdOrErr);
if (EC) {
return make_error<StringError>(
Twine("Cannot read log from '") + Filename + "'", EC);