From 0516d4b0a206c00ca3586de8b42da6f4414c026d Mon Sep 17 00:00:00 2001 From: triton Date: Wed, 8 May 2013 23:56:22 +0100 Subject: [PATCH] Added support for shared library parsing. --- src/Parser/Parser.cpp | 97 +++++++++++++++++++++++++++++++------------ src/Parser/Parser.h | 4 ++ 2 files changed, 75 insertions(+), 26 deletions(-) diff --git a/src/Parser/Parser.cpp b/src/Parser/Parser.cpp index 56adf708..cae0678e 100644 --- a/src/Parser/Parser.cpp +++ b/src/Parser/Parser.cpp @@ -10,6 +10,7 @@ #include #include +#include #include #include #include @@ -1865,10 +1866,72 @@ ParserResult^ Parser::ParseHeader(const std::string& File) return res; } - ParserResult^ Parser::ParseLibrary(const std::string& File) +ParserResultKind Parser::ParseArchive(llvm::StringRef File, + llvm::MemoryBuffer *Buffer) { - using namespace clix; + llvm::error_code Code; + llvm::object::Archive Archive(Buffer, Code); + + if (Code) + return ParserResultKind::Error; + + auto LibName = clix::marshalString(File); + auto NativeLib = Lib->FindOrCreateLibrary(LibName); + + for(auto it = Archive.begin_symbols(); it != Archive.end_symbols(); ++it) + { + llvm::StringRef SymRef; + + if (it->getName(SymRef)) + continue; + + System::String^ SymName = clix::marshalString(SymRef); + NativeLib->Symbols->Add(SymName); + } + + return ParserResultKind::Success; +} + +ParserResultKind Parser::ParseSharedLib(llvm::StringRef File, + llvm::MemoryBuffer *Buffer) +{ + auto Object = llvm::object::ObjectFile::createObjectFile(Buffer); + + if (!Object) + return ParserResultKind::Error; + + auto LibName = clix::marshalString(File); + auto NativeLib = Lib->FindOrCreateLibrary(LibName); + + llvm::error_code ec; + for(auto it = Object->begin_symbols(); it != Object->end_symbols(); it.increment(ec)) + { + llvm::StringRef SymRef; + + if (it->getName(SymRef)) + continue; + + System::String^ SymName = clix::marshalString(SymRef); + NativeLib->Symbols->Add(SymName); + } + for(auto it = Object->begin_dynamic_symbols(); it != Object->end_dynamic_symbols(); + it.increment(ec)) + { + llvm::StringRef SymRef; + + if (it->getName(SymRef)) + continue; + + System::String^ SymName = clix::marshalString(SymRef); + NativeLib->Symbols->Add(SymName); + } + + return ParserResultKind::Success; +} + + ParserResult^ Parser::ParseLibrary(const std::string& File) +{ auto res = gcnew ParserResult(); res->Library = Lib; @@ -1886,7 +1949,7 @@ ParserResult^ Parser::ParseHeader(const std::string& File) for each(System::String^ LibDir in Opts->LibraryDirs) { - auto DirName = marshalString(LibDir); + auto DirName = clix::marshalString(LibDir); llvm::sys::Path Path(DirName); Path.appendComponent(File); @@ -1900,31 +1963,13 @@ ParserResult^ Parser::ParseHeader(const std::string& File) return res; } - auto Buffer = FM.getBufferForFile(FileEntry); - - llvm::error_code Code; - llvm::object::Archive Archive(Buffer, Code); - - if (Code) - { - res->Kind = ParserResultKind::Error; + res->Kind = ParseArchive(File, FM.getBufferForFile(FileEntry)); + if (res->Kind == ParserResultKind::Success) return res; - } - auto LibName = marshalString(File); - auto NativeLib = Lib->FindOrCreateLibrary(LibName); - - for(auto it = Archive.begin_symbols(); it != Archive.end_symbols(); ++it) - { - llvm::StringRef SymRef; - - if (it->getName(SymRef)) - continue; - - System::String^ SymName = marshalString(SymRef); - NativeLib->Symbols->Add(SymName); - } + res->Kind = ParseSharedLib(File, FM.getBufferForFile(FileEntry)); + if (res->Kind == ParserResultKind::Success) + return res; - res->Kind = ParserResultKind::Success; return res; } \ No newline at end of file diff --git a/src/Parser/Parser.h b/src/Parser/Parser.h index 2114be9f..9ed3fdaf 100644 --- a/src/Parser/Parser.h +++ b/src/Parser/Parser.h @@ -112,6 +112,10 @@ struct Parser void SetupHeader(); ParserResult^ ParseHeader(const std::string& File); ParserResult^ ParseLibrary(const std::string& File); + ParserResultKind ParseArchive(llvm::StringRef File, + llvm::MemoryBuffer *Buffer); + ParserResultKind ParseSharedLib(llvm::StringRef File, + llvm::MemoryBuffer *Buffer); protected: