Browse Source

Added reading of symbols from DLL-s.

Signed-off-by: Dimitar Dobrev <dpldobrev@yahoo.com>
pull/297/head
Dimitar Dobrev 11 years ago
parent
commit
768b443038
  1. 66
      src/CppParser/Parser.cpp
  2. 5
      src/CppParser/Parser.h

66
src/CppParser/Parser.cpp

@ -11,6 +11,7 @@ @@ -11,6 +11,7 @@
#include <llvm/Support/Path.h>
#include <llvm/Support/raw_ostream.h>
#include <llvm/Object/Archive.h>
#include <llvm/Object/COFF.h>
#include <llvm/Object/ObjectFile.h>
#include <llvm/Object/ELFObjectFile.h>
#include <llvm/IR/LLVMContext.h>
@ -3013,22 +3014,59 @@ ParserResultKind Parser::ParseArchive(llvm::StringRef File, @@ -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<llvm::object::COFFObjectFile>(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, @@ -3099,12 +3137,6 @@ ParserResultKind Parser::ReadSymbols(llvm::StringRef File,
if (res->Kind == ParserResultKind::Success)
return res;
}
if (auto SymbolicFile = llvm::dyn_cast<llvm::object::SymbolicFile>(Bin.get()))
{
res->Kind = ParseSharedLib(File, SymbolicFile, res->Library);
if (res->Kind == ParserResultKind::Success)
return res;
}
if (auto ObjectFile = llvm::dyn_cast<llvm::object::ObjectFile>(Bin.get()))
{
res->Kind = ParseObjectFile(File, ObjectFile, res->Library);

5
src/CppParser/Parser.h

@ -55,11 +55,8 @@ public: @@ -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:

Loading…
Cancel
Save