forked from OSchip/llvm-project
Open native file handles to avoid converting from FDs, NFC
Follow up to r365588. llvm-svn: 365820
This commit is contained in:
parent
f4af9a9d80
commit
f002fcb2ad
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue