From 768b4430380c3c7853ecec75555ca7df38fc7b95 Mon Sep 17 00:00:00 2001 From: Dimitar Dobrev Date: Tue, 29 Jul 2014 23:26:55 +0300 Subject: [PATCH] Added reading of symbols from DLL-s. Signed-off-by: Dimitar Dobrev --- src/CppParser/Parser.cpp | 66 +++++++++++++++++++++++++++++----------- src/CppParser/Parser.h | 5 +-- 2 files changed, 50 insertions(+), 21 deletions(-) diff --git a/src/CppParser/Parser.cpp b/src/CppParser/Parser.cpp index 85d24c11..db7ed353 100644 --- a/src/CppParser/Parser.cpp +++ b/src/CppParser/Parser.cpp @@ -11,6 +11,7 @@ #include #include #include +#include #include #include #include @@ -3013,22 +3014,59 @@ ParserResultKind Parser::ParseArchive(llvm::StringRef File, } ParserResultKind Parser::ParseSharedLib(llvm::StringRef File, - llvm::object::SymbolicFile* SymbolicFile, + llvm::object::ObjectFile* ObjectFile, CppSharp::CppParser::NativeLibrary*& NativeLib) { - if (!SymbolicFile->isELF()) - return ParserResultKind::Error; + auto LibName = File; + NativeLib = new NativeLibrary(); + NativeLib->FileName = LibName; - auto IDyn = llvm::object::getELFDynamicSymbolIterators(SymbolicFile); + if (ObjectFile->isELF()) + { + auto IDyn = llvm::object::getELFDynamicSymbolIterators(ObjectFile); + for (auto it = IDyn.first; it != IDyn.second; ++it) + { + std::string Sym; + llvm::raw_string_ostream SymStream(Sym); - return ReadSymbols(File, IDyn.first, IDyn.second, NativeLib); -} + if (it->printName(SymStream)) + continue; -ParserResultKind Parser::ParseObjectFile(llvm::StringRef File, - llvm::object::ObjectFile* ObjectFile, - CppSharp::CppParser::NativeLibrary*& NativeLib) -{ - return ReadSymbols(File, ObjectFile->symbol_begin(), ObjectFile->symbol_end(), NativeLib); + SymStream.flush(); + if (!Sym.empty()) + NativeLib->Symbols.push_back(Sym); + } + } + else + { + if (auto COFFObjectFile = llvm::dyn_cast(ObjectFile)) + { + for (auto it = COFFObjectFile->export_directory_begin(); it != COFFObjectFile->export_directory_end(); ++it) + { + llvm::StringRef Symbol; + if (!it->getSymbolName(Symbol)) + NativeLib->Symbols.push_back(Symbol); + } + for (auto dep = COFFObjectFile->import_directory_begin(); dep != COFFObjectFile->import_directory_end(); ++dep) + { + llvm::StringRef Name; + if (!dep->getName(Name)) + NativeLib->Dependencies.push_back(Name); + } + } + else + { + return ParserResultKind::Error; + } + } + /*for (auto dep = ObjectFile->needed_library_begin(); dep != ObjectFile->needed_library_end(); ++dep) + { + llvm::StringRef path; + if (!dep->getPath(path)) + NativeLib->Dependencies.push_back(path); + }*/ + + return ParserResultKind::Success; } ParserResultKind Parser::ReadSymbols(llvm::StringRef File, @@ -3099,12 +3137,6 @@ ParserResultKind Parser::ReadSymbols(llvm::StringRef File, if (res->Kind == ParserResultKind::Success) return res; } - if (auto SymbolicFile = llvm::dyn_cast(Bin.get())) - { - res->Kind = ParseSharedLib(File, SymbolicFile, res->Library); - if (res->Kind == ParserResultKind::Success) - return res; - } if (auto ObjectFile = llvm::dyn_cast(Bin.get())) { res->Kind = ParseObjectFile(File, ObjectFile, res->Library); diff --git a/src/CppParser/Parser.h b/src/CppParser/Parser.h index 3570d20f..78c3495e 100644 --- a/src/CppParser/Parser.h +++ b/src/CppParser/Parser.h @@ -55,11 +55,8 @@ public: llvm::object::Archive* Archive, CppSharp::CppParser::NativeLibrary*& NativeLib); ParserResultKind ParseSharedLib(llvm::StringRef File, - llvm::object::SymbolicFile* SymbolicFile, + llvm::object::ObjectFile* ObjectFile, CppSharp::CppParser::NativeLibrary*& NativeLib); - ParserResultKind ParseObjectFile(llvm::StringRef File, - llvm::object::ObjectFile* ObjectFile, - CppSharp::CppParser::NativeLibrary*& NativeLib); ParserTargetInfo* GetTargetInfo(); protected: