1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2025-01-31 20:51:52 +01:00

Support/PathV2: Add identify_magic.

llvm-svn: 123548
This commit is contained in:
Michael J. Spencer 2011-01-15 20:39:36 +00:00
parent b48a048de6
commit e1defa51ae
5 changed files with 49 additions and 40 deletions

View File

@ -30,6 +30,7 @@
#include "llvm/ADT/SmallString.h"
#include "llvm/ADT/Twine.h"
#include "llvm/Support/DataTypes.h"
#include "llvm/Support/PathV1.h"
#include "llvm/Support/system_error.h"
#include <ctime>
#include <iterator>
@ -463,6 +464,14 @@ error_code has_magic(const Twine &path, const Twine &magic, bool &result);
error_code get_magic(const Twine &path, uint32_t len,
SmallVectorImpl<char> &result);
/// @brief Get and identify \a path's type based on its content.
///
/// @param path Input path.
/// @param result Set to the type of file, or LLVMFileType::Unknown_FileType.
/// @results errc::success if result has been successfully set, otherwise a
/// platform specific error_code.
error_code identify_magic(const Twine &path, LLVMFileType &result);
/// @brief Is file bitcode?
///
/// @param path Input path.

View File

@ -116,11 +116,10 @@ bool ArchiveMember::replaceWith(const sys::Path& newFile, std::string* ErrMsg) {
// Get the signature and status info
const char* signature = (const char*) data;
std::string magic;
SmallString<4> magic;
if (!signature) {
path.getMagicNumber(magic,4);
sys::fs::get_magic(path.str(), magic.capacity(), magic);
signature = magic.c_str();
std::string err;
const sys::FileStatus *FSinfo = path.getFileStatus(false, ErrMsg);
if (FSinfo)
info = *FSinfo;

View File

@ -181,9 +181,11 @@ Archive::addFileBefore(const sys::Path& filePath, iterator where,
flags |= ArchiveMember::HasPathFlag;
if (hasSlash || filePath.str().length() > 15)
flags |= ArchiveMember::HasLongFilenameFlag;
std::string magic;
mbr->path.getMagicNumber(magic,4);
switch (sys::IdentifyFileType(magic.c_str(),4)) {
sys::LLVMFileType type;
if (sys::fs::identify_magic(mbr->path.str(), type))
type = sys::Unknown_FileType;
switch (type) {
case sys::Bitcode_FileType:
flags |= ArchiveMember::BitcodeFlag;
break;

View File

@ -12,6 +12,7 @@
//===----------------------------------------------------------------------===//
#include "llvm/Support/Path.h"
#include "llvm/Support/FileSystem.h"
#include "llvm/Config/config.h"
#include "llvm/Support/FileSystem.h"
#include <cassert>
@ -141,42 +142,33 @@ sys::IdentifyFileType(const char *magic, unsigned length) {
bool
Path::isArchive() const {
std::string Magic;
if (getMagicNumber(Magic, 8))
if (IdentifyFileType(Magic.c_str(), Magic.length()) == Archive_FileType)
return true;
return false;
LLVMFileType type;
if (fs::identify_magic(str(), type))
return false;
return type == Archive_FileType;
}
bool
Path::isDynamicLibrary() const {
std::string Magic;
if (getMagicNumber(Magic, 64))
switch (IdentifyFileType(Magic.c_str(),
static_cast<unsigned>(Magic.length()))) {
default: return false;
case Mach_O_FixedVirtualMemorySharedLib_FileType:
case Mach_O_DynamicallyLinkedSharedLib_FileType:
case Mach_O_DynamicallyLinkedSharedLibStub_FileType:
case ELF_SharedObject_FileType:
case COFF_FileType: return true;
}
return false;
LLVMFileType type;
if (fs::identify_magic(str(), type))
return false;
switch (type) {
default: return false;
case Mach_O_FixedVirtualMemorySharedLib_FileType:
case Mach_O_DynamicallyLinkedSharedLib_FileType:
case Mach_O_DynamicallyLinkedSharedLibStub_FileType:
case ELF_SharedObject_FileType:
case COFF_FileType: return true;
}
}
bool
Path::isObjectFile() const {
std::string Magic;
if (getMagicNumber(Magic, 64))
if (IdentifyFileType(Magic.c_str(),
static_cast<unsigned>(Magic.length()))
!= Unknown_FileType) {
// Everything in LLVMFileType is currently an object file.
return true;
}
return false;
LLVMFileType type;
if (fs::identify_magic(str(), type) || type == Unknown_FileType)
return false;
return true;
}
Path
@ -210,13 +202,10 @@ Path::appendSuffix(StringRef suffix) {
bool
Path::isBitcodeFile() const {
std::string actualMagic;
if (!getMagicNumber(actualMagic, 4))
LLVMFileType type;
if (fs::identify_magic(str(), type))
return false;
LLVMFileType FT =
IdentifyFileType(actualMagic.c_str(),
static_cast<unsigned>(actualMagic.length()));
return FT == Bitcode_FileType;
return type == Bitcode_FileType;
}
bool Path::hasMagicNumber(StringRef Magic) const {

View File

@ -703,6 +703,16 @@ error_code has_magic(const Twine &path, const Twine &magic, bool &result) {
return success;
}
error_code identify_magic(const Twine &path, LLVMFileType &result) {
SmallString<32> Magic;
error_code ec = get_magic(path, Magic.capacity(), Magic);
if (ec && ec != errc::value_too_large)
return ec;
result = IdentifyFileType(Magic.data(), Magic.size());
return success;
}
namespace {
error_code remove_all_r(StringRef path, file_type ft, uint32_t &count) {
if (ft == file_type::directory_file) {