X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=lib%2FArchive%2FArchive.cpp;h=1eab27d3eba3a59d36e527f27ce6d361992bcf8c;hb=e4bc80a14be77c232e1c4e1f30308a72d5cec05a;hp=4f100f7b11ea39c8ae25dd7c669d38fc59efb9c2;hpb=dfd4bbfdfba518f194f4795dfc963dfa456d0246;p=oota-llvm.git diff --git a/lib/Archive/Archive.cpp b/lib/Archive/Archive.cpp index 4f100f7b11e..1eab27d3eba 100644 --- a/lib/Archive/Archive.cpp +++ b/lib/Archive/Archive.cpp @@ -15,8 +15,10 @@ #include "ArchiveInternals.h" #include "llvm/Bitcode/ReaderWriter.h" #include "llvm/Module.h" +#include "llvm/Support/FileSystem.h" #include "llvm/Support/MemoryBuffer.h" -#include "llvm/System/Process.h" +#include "llvm/Support/Process.h" +#include "llvm/Support/system_error.h" #include #include using namespace llvm; @@ -65,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; } @@ -113,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; @@ -147,9 +149,13 @@ Archive::Archive(const sys::Path& filename, LLVMContext& C) bool Archive::mapToMemory(std::string* ErrMsg) { - mapfile = MemoryBuffer::getFile(archPath.c_str(), ErrMsg); - if (mapfile == 0) + 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; } @@ -159,19 +165,19 @@ void Archive::cleanUpMemory() { 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 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 ) { @@ -193,7 +199,7 @@ static void getSymbols(Module*M, std::vector& symbols) { 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->hasLocalLinkage()) @@ -213,43 +219,42 @@ bool llvm::GetBitcodeSymbols(const sys::Path& fName, LLVMContext& Context, std::vector& symbols, std::string* ErrMsg) { - std::auto_ptr Buffer( - MemoryBuffer::getFileOrSTDIN(fName.c_str())); - if (!Buffer.get()) { - if (ErrMsg) *ErrMsg = "Could not open file '" + fName.str() + "'"; + 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; } - + Module *M = ParseBitcodeFile(Buffer.get(), Context, ErrMsg); if (!M) return true; - + // Get the symbols getSymbols(M, symbols); - + // Done with the module. delete M; return true; } Module* -llvm::GetBitcodeSymbols(const unsigned char *BufPtr, unsigned Length, +llvm::GetBitcodeSymbols(const char *BufPtr, unsigned Length, const std::string& ModuleID, LLVMContext& Context, std::vector& symbols, std::string* ErrMsg) { // Get the module. - std::auto_ptr Buffer( - MemoryBuffer::getNewMemBuffer(Length, ModuleID.c_str())); - memcpy(const_cast(Buffer->getBufferStart()), BufPtr, Length); - + 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 it's the caller's responsibility to delete // the Module. return M;