X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=lib%2FArchive%2FArchive.cpp;h=1eab27d3eba3a59d36e527f27ce6d361992bcf8c;hb=e4bc80a14be77c232e1c4e1f30308a72d5cec05a;hp=125b22e9d949c3f1e446e8de5308a1d40d569765;hpb=0838923afb7eadd433694a9d2f0330040e5b36b5;p=oota-llvm.git diff --git a/lib/Archive/Archive.cpp b/lib/Archive/Archive.cpp index 125b22e9d94..1eab27d3eba 100644 --- a/lib/Archive/Archive.cpp +++ b/lib/Archive/Archive.cpp @@ -14,11 +14,11 @@ #include "ArchiveInternals.h" #include "llvm/Bitcode/ReaderWriter.h" -#include "llvm/ModuleProvider.h" #include "llvm/Module.h" +#include "llvm/Support/FileSystem.h" #include "llvm/Support/MemoryBuffer.h" -#include "llvm/System/MappedFile.h" -#include "llvm/System/Process.h" +#include "llvm/Support/Process.h" +#include "llvm/Support/system_error.h" #include #include using namespace llvm; @@ -32,7 +32,7 @@ ArchiveMember::getMemberSize() const { // If it has a long filename, include the name length if (hasLongFilename()) - result += path.toString().length() + 1; + result += path.str().length() + 1; // If its now odd lengthed, include the padding byte if (result % 2 != 0 ) @@ -44,7 +44,7 @@ ArchiveMember::getMemberSize() const { // This default constructor is only use by the ilist when it creates its // sentry node. We give it specific static values to make it stand out a bit. ArchiveMember::ArchiveMember() - : next(0), prev(0), parent(0), path("--invalid--"), flags(0), data(0) + : parent(0), path("--invalid--"), flags(0), data(0) { info.user = sys::Process::GetCurrentUserId(); info.group = sys::Process::GetCurrentGroupId(); @@ -59,7 +59,7 @@ ArchiveMember::ArchiveMember() // This is required because correctly setting the data may depend on other // things in the Archive. ArchiveMember::ArchiveMember(Archive* PAR) - : next(0), prev(0), parent(PAR), path(), flags(0), data(0) + : parent(PAR), path(), flags(0), data(0) { } @@ -67,8 +67,9 @@ ArchiveMember::ArchiveMember(Archive* PAR) // different file, presumably as an update to the member. It also makes sure // the flags are reset correctly. bool ArchiveMember::replaceWith(const sys::Path& newFile, std::string* ErrMsg) { - if (!newFile.exists()) { - if (ErrMsg) + bool Exists; + if (sys::fs::exists(newFile.str(), Exists) || !Exists) { + if (ErrMsg) *ErrMsg = "Can not replace an archive member with a non-existent file"; return true; } @@ -77,49 +78,48 @@ bool ArchiveMember::replaceWith(const sys::Path& newFile, std::string* ErrMsg) { path = newFile; // SVR4 symbol tables have an empty name - if (path.toString() == ARFILE_SVR4_SYMTAB_NAME) + if (path.str() == ARFILE_SVR4_SYMTAB_NAME) flags |= SVR4SymbolTableFlag; else flags &= ~SVR4SymbolTableFlag; // BSD4.4 symbol tables have a special name - if (path.toString() == ARFILE_BSD4_SYMTAB_NAME) + if (path.str() == ARFILE_BSD4_SYMTAB_NAME) flags |= BSD4SymbolTableFlag; else flags &= ~BSD4SymbolTableFlag; // LLVM symbol tables have a very specific name - if (path.toString() == ARFILE_LLVM_SYMTAB_NAME) + if (path.str() == ARFILE_LLVM_SYMTAB_NAME) flags |= LLVMSymbolTableFlag; else flags &= ~LLVMSymbolTableFlag; // String table name - if (path.toString() == ARFILE_STRTAB_NAME) + if (path.str() == ARFILE_STRTAB_NAME) flags |= StringTableFlag; else flags &= ~StringTableFlag; // If it has a slash then it has a path - bool hasSlash = path.toString().find('/') != std::string::npos; + bool hasSlash = path.str().find('/') != std::string::npos; if (hasSlash) flags |= HasPathFlag; else flags &= ~HasPathFlag; // If it has a slash or its over 15 chars then its a long filename format - if (hasSlash || path.toString().length() > 15) + if (hasSlash || path.str().length() > 15) flags |= HasLongFilenameFlag; else flags &= ~HasLongFilenameFlag; // 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; @@ -127,8 +127,11 @@ bool ArchiveMember::replaceWith(const sys::Path& newFile, std::string* ErrMsg) { return true; } - // Determine what kind of file it is + // Determine what kind of file it is. switch (sys::IdentifyFileType(signature,4)) { + case sys::Bitcode_FileType: + flags |= BitcodeFlag; + break; default: flags &= ~BitcodeFlag; break; @@ -139,46 +142,44 @@ bool ArchiveMember::replaceWith(const sys::Path& newFile, std::string* ErrMsg) { // Archive constructor - this is the only constructor that gets used for the // Archive class. Everything else (default,copy) is deprecated. This just // initializes and maps the file into memory, if requested. -Archive::Archive(const sys::Path& filename) +Archive::Archive(const sys::Path& filename, LLVMContext& C) : archPath(filename), members(), mapfile(0), base(0), symTab(), strtab(), - symTabSize(0), firstFileOffset(0), modules(), foreignST(0) { + symTabSize(0), firstFileOffset(0), modules(), foreignST(0), Context(C) { } bool -Archive::mapToMemory(std::string* ErrMsg) -{ - mapfile = new sys::MappedFile(); - if (mapfile->open(archPath, sys::MappedFile::READ_ACCESS, ErrMsg)) - return true; - if (!(base = (char*) mapfile->map(ErrMsg))) +Archive::mapToMemory(std::string* ErrMsg) { + OwningPtr File; + if (error_code ec = MemoryBuffer::getFile(archPath.c_str(), File)) { + if (ErrMsg) + *ErrMsg = ec.message(); return true; + } + mapfile = File.take(); + base = mapfile->getBufferStart(); return false; } void Archive::cleanUpMemory() { // Shutdown the file mapping - if (mapfile) { - mapfile->close(); - delete mapfile; - - mapfile = 0; - base = 0; - } - + delete mapfile; + mapfile = 0; + base = 0; + // Forget the entire symbol table symTab.clear(); symTabSize = 0; - + firstFileOffset = 0; - + // Free the foreign symbol table member if (foreignST) { delete foreignST; foreignST = 0; } - - // Delete any ModuleProviders and ArchiveMember's we've allocated as a result - // of symbol table searches. + + // Delete any Modules and ArchiveMember's we've allocated as a result of + // symbol table searches. for (ModuleMap::iterator I=modules.begin(), E=modules.end(); I != E; ++I ) { delete I->second.first; delete I->second.second; @@ -195,13 +196,13 @@ Archive::~Archive() { static void getSymbols(Module*M, std::vector& symbols) { // Loop over global variables for (Module::global_iterator GI = M->global_begin(), GE=M->global_end(); GI != GE; ++GI) - if (!GI->isDeclaration() && !GI->hasInternalLinkage()) + if (!GI->isDeclaration() && !GI->hasLocalLinkage()) if (!GI->getName().empty()) symbols.push_back(GI->getName()); - + // Loop over functions for (Module::iterator FI = M->begin(), FE = M->end(); FI != FE; ++FI) - if (!FI->isDeclaration() && !FI->hasInternalLinkage()) + if (!FI->isDeclaration() && !FI->hasLocalLinkage()) if (!FI->getName().empty()) symbols.push_back(FI->getName()); @@ -215,60 +216,46 @@ static void getSymbols(Module*M, std::vector& symbols) { // Get just the externally visible defined symbols from the bitcode bool llvm::GetBitcodeSymbols(const sys::Path& fName, + LLVMContext& Context, std::vector& symbols, std::string* ErrMsg) { - std::auto_ptr Buffer( - MemoryBuffer::getFileOrSTDIN(&fName.toString()[0], - fName.toString().size())); - if (!Buffer.get()) { - if (ErrMsg) *ErrMsg = "Could not open file '" + fName.toString() + "'"; + OwningPtr Buffer; + if (error_code ec = MemoryBuffer::getFileOrSTDIN(fName.c_str(), Buffer)) { + if (ErrMsg) *ErrMsg = "Could not open file '" + fName.str() + "'" + ": " + + ec.message(); return true; } - - ModuleProvider *MP = getBitcodeModuleProvider(Buffer.get(), ErrMsg); - if (!MP) - return true; - - // Get the module from the provider - Module* M = MP->materializeModule(); - if (M == 0) { - delete MP; + + Module *M = ParseBitcodeFile(Buffer.get(), Context, ErrMsg); + if (!M) return true; - } - + // Get the symbols getSymbols(M, symbols); - + // Done with the module. - delete MP; + delete M; return true; } -ModuleProvider* -llvm::GetBitcodeSymbols(const unsigned char *BufPtr, unsigned Length, +Module* +llvm::GetBitcodeSymbols(const char *BufPtr, unsigned Length, const std::string& ModuleID, + LLVMContext& Context, std::vector& symbols, std::string* ErrMsg) { - // Get the module provider - MemoryBuffer *Buffer =MemoryBuffer::getNewMemBuffer(Length, ModuleID.c_str()); - memcpy((char*)Buffer->getBufferStart(), BufPtr, Length); - - ModuleProvider *MP = getBitcodeModuleProvider(Buffer, ErrMsg); - if (!MP) - return 0; - - // Get the module from the provider - Module* M = MP->materializeModule(); - if (M == 0) { - delete MP; + // Get the module. + OwningPtr Buffer( + MemoryBuffer::getMemBufferCopy(StringRef(BufPtr, Length),ModuleID.c_str())); + + Module *M = ParseBitcodeFile(Buffer.get(), Context, ErrMsg); + if (!M) return 0; - } - + // Get the symbols getSymbols(M, symbols); - - // Done with the module. Note that ModuleProvider will delete the - // Module when it is deleted. Also note that its the caller's responsibility - // to delete the ModuleProvider. - return MP; + + // Done with the module. Note that it's the caller's responsibility to delete + // the Module. + return M; }