mirror of
https://github.com/RPCS3/llvm.git
synced 2024-12-27 14:45:50 +00:00
dd04df0ec3
Get rid of the difference between file paths and directory paths. The Path class now simply stores a path that can refer to either a file or a directory. This required various changes in the implementation and interface of the class with the corresponding impact to its users. Doxygen comments were also updated to reflect these changes. Interface changes are: appendDirectory -> appendComponent appendFile -> appendComponent elideDirectory -> eraseComponent elideFile -> eraseComponent elideSuffix -> eraseSuffix renameFile -> rename setDirectory -> set setFile -> set Changes pass Dejagnu and llvm-test/SingleSource tests. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@22349 91177308-0d34-0410-b5e6-96231b3b80d8
110 lines
2.6 KiB
C++
110 lines
2.6 KiB
C++
//===-- Path.cpp - Implement OS Path Concept --------------------*- C++ -*-===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file was developed by Reid Spencer and is distributed under the
|
|
// University of Illinois Open Source License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// This header file implements the operating system Path concept.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "llvm/System/Path.h"
|
|
#include "llvm/Config/config.h"
|
|
#include <cassert>
|
|
|
|
namespace llvm {
|
|
using namespace sys;
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
//=== WARNING: Implementation here must contain only TRULY operating system
|
|
//=== independent code.
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
Path
|
|
Path::GetLLVMConfigDir() {
|
|
Path result;
|
|
#ifdef LLVM_ETCDIR
|
|
if (result.set(LLVM_ETCDIR))
|
|
return result;
|
|
#endif
|
|
return GetLLVMDefaultConfigDir();
|
|
}
|
|
|
|
LLVMFileType
|
|
sys::IdentifyFileType(const char*magic, unsigned length) {
|
|
assert(magic && "Invalid magic number string");
|
|
assert(length >=4 && "Invalid magic number length");
|
|
switch (magic[0]) {
|
|
case 'l':
|
|
if (magic[1] == 'l' && magic[2] == 'v') {
|
|
if (magic[3] == 'c')
|
|
return CompressedBytecodeFileType;
|
|
else if (magic[3] == 'm')
|
|
return BytecodeFileType;
|
|
}
|
|
break;
|
|
|
|
case '!':
|
|
if (length >= 8) {
|
|
if (memcmp(magic,"!<arch>\n",8) == 0)
|
|
return ArchiveFileType;
|
|
}
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
return UnknownFileType;
|
|
}
|
|
|
|
bool
|
|
Path::isArchive() const {
|
|
if (canRead())
|
|
return hasMagicNumber("!<arch>\012");
|
|
return false;
|
|
}
|
|
|
|
bool
|
|
Path::isDynamicLibrary() const {
|
|
if (canRead())
|
|
return hasMagicNumber("\177ELF");
|
|
return false;
|
|
}
|
|
|
|
Path
|
|
Path::FindLibrary(std::string& name) {
|
|
std::vector<sys::Path> LibPaths;
|
|
GetSystemLibraryPaths(LibPaths);
|
|
for (unsigned i = 0; i < LibPaths.size(); ++i) {
|
|
sys::Path FullPath(LibPaths[i]);
|
|
FullPath.appendComponent("lib" + name + LTDL_SHLIB_EXT);
|
|
if (FullPath.isDynamicLibrary())
|
|
return FullPath;
|
|
FullPath.eraseSuffix();
|
|
FullPath.appendSuffix("a");
|
|
if (FullPath.isArchive())
|
|
return FullPath;
|
|
}
|
|
return sys::Path();
|
|
}
|
|
|
|
std::string
|
|
Path::GetDLLSuffix() {
|
|
return LTDL_SHLIB_EXT;
|
|
}
|
|
|
|
}
|
|
|
|
// Include the truly platform-specific parts of this class.
|
|
|
|
#if defined(LLVM_ON_UNIX)
|
|
#include "Unix/Path.inc"
|
|
#endif
|
|
#if defined(LLVM_ON_WIN32)
|
|
#include "Win32/Path.inc"
|
|
#endif
|
|
|