diff --git a/src/AST/SymbolContext.cs b/src/AST/SymbolContext.cs index b865322d..c6beff8d 100644 --- a/src/AST/SymbolContext.cs +++ b/src/AST/SymbolContext.cs @@ -2,6 +2,14 @@ namespace CppSharp.AST { + public enum ArchType + { + UnknownArch, + + x86, // X86: i[3-9]86 + x86_64 // X86-64: amd64, x86_64 + } + /// /// Represents a shared library or a static library archive. /// @@ -24,6 +32,8 @@ namespace CppSharp.AST /// public string FileName; + public ArchType ArchType { get; set; } + /// /// Symbols gathered from the library. /// diff --git a/src/Core/Parser/Parser.cs b/src/Core/Parser/Parser.cs index cdb0cdd4..a3455101 100644 --- a/src/Core/Parser/Parser.cs +++ b/src/Core/Parser/Parser.cs @@ -1,4 +1,5 @@ using System; +using CppSharp.AST; using CppSharp.Parser; using ASTContext = CppSharp.Parser.AST.ASTContext; using NativeLibrary = CppSharp.Parser.AST.NativeLibrary; @@ -95,7 +96,11 @@ namespace CppSharp public static AST.NativeLibrary ConvertLibrary(NativeLibrary library) { - var newLibrary = new AST.NativeLibrary { FileName = library.FileName }; + var newLibrary = new AST.NativeLibrary + { + FileName = library.FileName, + ArchType = (ArchType) library.ArchType + }; for (uint i = 0; i < library.SymbolsCount; ++i) { diff --git a/src/CppParser/AST.cpp b/src/CppParser/AST.cpp index 964bbb28..3f0afa09 100644 --- a/src/CppParser/AST.cpp +++ b/src/CppParser/AST.cpp @@ -578,6 +578,11 @@ TranslationUnit::TranslationUnit() { Kind = DeclarationKind::TranslationUnit; } DEF_STRING(TranslationUnit, FileName) DEF_VECTOR(TranslationUnit, MacroDefinition*, Macros) +NativeLibrary::NativeLibrary() + : ArchType(ArchType::UnknownArch) +{ +} + // NativeLibrary DEF_STRING(NativeLibrary, FileName) DEF_VECTOR_STRING(NativeLibrary, Symbols) diff --git a/src/CppParser/AST.h b/src/CppParser/AST.h index fed306ea..744b1705 100644 --- a/src/CppParser/AST.h +++ b/src/CppParser/AST.h @@ -796,9 +796,19 @@ public: VECTOR(MacroDefinition*, Macros) }; -struct CS_API NativeLibrary +enum class ArchType { + UnknownArch, + x86, + x86_64 +}; + +class CS_API NativeLibrary +{ +public: + NativeLibrary(); STRING(FileName) + ArchType ArchType; VECTOR_STRING(Symbols) VECTOR_STRING(Dependencies) }; diff --git a/src/CppParser/Bindings/CLI/AST.cpp b/src/CppParser/Bindings/CLI/AST.cpp index 2fc066b5..8ed42504 100644 --- a/src/CppParser/Bindings/CLI/AST.cpp +++ b/src/CppParser/Bindings/CLI/AST.cpp @@ -2940,6 +2940,11 @@ CppSharp::Parser::AST::NativeLibrary::NativeLibrary(System::IntPtr native) NativePtr = __native; } +CppSharp::Parser::AST::NativeLibrary::NativeLibrary() +{ + NativePtr = new ::CppSharp::CppParser::AST::NativeLibrary(); +} + System::String^ CppSharp::Parser::AST::NativeLibrary::getSymbols(unsigned int i) { auto __ret = ((::CppSharp::CppParser::AST::NativeLibrary*)NativePtr)->getSymbols(i); @@ -2978,11 +2983,6 @@ void CppSharp::Parser::AST::NativeLibrary::clearDependencies() ((::CppSharp::CppParser::AST::NativeLibrary*)NativePtr)->clearDependencies(); } -CppSharp::Parser::AST::NativeLibrary::NativeLibrary() -{ - NativePtr = new ::CppSharp::CppParser::AST::NativeLibrary(); -} - System::IntPtr CppSharp::Parser::AST::NativeLibrary::__Instance::get() { return System::IntPtr(NativePtr); @@ -3019,6 +3019,16 @@ unsigned int CppSharp::Parser::AST::NativeLibrary::DependenciesCount::get() return __ret; } +CppSharp::Parser::AST::ArchType CppSharp::Parser::AST::NativeLibrary::ArchType::get() +{ + return (CppSharp::Parser::AST::ArchType)((::CppSharp::CppParser::AST::NativeLibrary*)NativePtr)->ArchType; +} + +void CppSharp::Parser::AST::NativeLibrary::ArchType::set(CppSharp::Parser::AST::ArchType value) +{ + ((::CppSharp::CppParser::AST::NativeLibrary*)NativePtr)->ArchType = (::CppSharp::CppParser::AST::ArchType)value; +} + CppSharp::Parser::AST::ASTContext::ASTContext(::CppSharp::CppParser::AST::ASTContext* native) { NativePtr = native; diff --git a/src/CppParser/Bindings/CLI/AST.h b/src/CppParser/Bindings/CLI/AST.h index 47e2c2ef..3e4f6149 100644 --- a/src/CppParser/Bindings/CLI/AST.h +++ b/src/CppParser/Bindings/CLI/AST.h @@ -11,6 +11,7 @@ namespace CppSharp namespace AST { enum struct AccessSpecifier; + enum struct ArchType; enum struct CXXMethodKind; enum struct CXXOperatorKind; enum struct CallingConvention; @@ -292,6 +293,13 @@ namespace CppSharp FunctionBody = 5 }; + public enum struct ArchType + { + UnknownArch = 0, + x86 = 1, + x86_64 = 2 + }; + public ref class Type : ICppInstance { public: @@ -1963,6 +1971,12 @@ namespace CppSharp unsigned int get(); } + property CppSharp::Parser::AST::ArchType ArchType + { + CppSharp::Parser::AST::ArchType get(); + void set(CppSharp::Parser::AST::ArchType); + } + System::String^ getSymbols(unsigned int i); void addSymbols(System::String^ s); diff --git a/src/CppParser/Bindings/CSharp/i686-apple-darwin12.4.0/AST.cs b/src/CppParser/Bindings/CSharp/i686-apple-darwin12.4.0/AST.cs index 441b81f3..ab7be822 100644 --- a/src/CppParser/Bindings/CSharp/i686-apple-darwin12.4.0/AST.cs +++ b/src/CppParser/Bindings/CSharp/i686-apple-darwin12.4.0/AST.cs @@ -216,6 +216,13 @@ namespace CppSharp FunctionBody = 5 } + public enum ArchType + { + UnknownArch = 0, + x86 = 1, + x86_64 = 2 + } + public unsafe partial class Type : IDisposable { [StructLayout(LayoutKind.Explicit, Size = 8)] @@ -7562,13 +7569,16 @@ namespace CppSharp public unsafe partial class NativeLibrary : IDisposable { - [StructLayout(LayoutKind.Explicit, Size = 36)] + [StructLayout(LayoutKind.Explicit, Size = 40)] public partial struct Internal { + [FieldOffset(12)] + public CppSharp.Parser.AST.ArchType ArchType; + [SuppressUnmanagedCodeSecurity] [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl, EntryPoint="_ZN8CppSharp9CppParser3AST13NativeLibraryC2Ev")] - internal static extern void ctor_1(global::System.IntPtr instance); + internal static extern void ctor_0(global::System.IntPtr instance); [SuppressUnmanagedCodeSecurity] [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl, @@ -7640,7 +7650,7 @@ namespace CppSharp private static global::System.IntPtr __CopyValue(NativeLibrary.Internal native) { - var ret = Marshal.AllocHGlobal(36); + var ret = Marshal.AllocHGlobal(40); CppSharp.Parser.AST.NativeLibrary.Internal.cctor_2(ret, new global::System.IntPtr(&native)); return ret; } @@ -7657,8 +7667,8 @@ namespace CppSharp public NativeLibrary() { - __Instance = Marshal.AllocHGlobal(36); - Internal.ctor_1(__Instance); + __Instance = Marshal.AllocHGlobal(40); + Internal.ctor_0(__Instance); } public void Dispose() @@ -7745,6 +7755,21 @@ namespace CppSharp return __ret; } } + + public CppSharp.Parser.AST.ArchType ArchType + { + get + { + var __ptr = (Internal*)__Instance.ToPointer(); + return __ptr->ArchType; + } + + set + { + var __ptr = (Internal*)__Instance.ToPointer(); + __ptr->ArchType = value; + } + } } public unsafe partial class ASTContext : IDisposable diff --git a/src/CppParser/Bindings/CSharp/i686-pc-win32-msvc/AST.cs b/src/CppParser/Bindings/CSharp/i686-pc-win32-msvc/AST.cs index b82a6fe0..19eecda6 100644 --- a/src/CppParser/Bindings/CSharp/i686-pc-win32-msvc/AST.cs +++ b/src/CppParser/Bindings/CSharp/i686-pc-win32-msvc/AST.cs @@ -216,6 +216,13 @@ namespace CppSharp FunctionBody = 5 } + public enum ArchType + { + UnknownArch = 0, + x86 = 1, + x86_64 = 2 + } + public unsafe partial class Type : IDisposable { [StructLayout(LayoutKind.Explicit, Size = 8)] @@ -7562,17 +7569,20 @@ namespace CppSharp public unsafe partial class NativeLibrary : IDisposable { - [StructLayout(LayoutKind.Explicit, Size = 48)] + [StructLayout(LayoutKind.Explicit, Size = 52)] public partial struct Internal { + [FieldOffset(24)] + public CppSharp.Parser.AST.ArchType ArchType; + [SuppressUnmanagedCodeSecurity] [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.ThisCall, EntryPoint="??0NativeLibrary@AST@CppParser@CppSharp@@QAE@XZ")] - internal static extern global::System.IntPtr ctor_1(global::System.IntPtr instance); + internal static extern global::System.IntPtr ctor_0(global::System.IntPtr instance); [SuppressUnmanagedCodeSecurity] [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.ThisCall, - EntryPoint="??0NativeLibrary@AST@CppParser@CppSharp@@QAE@ABU0123@@Z")] + EntryPoint="??0NativeLibrary@AST@CppParser@CppSharp@@QAE@ABV0123@@Z")] internal static extern global::System.IntPtr cctor_2(global::System.IntPtr instance, global::System.IntPtr _0); [SuppressUnmanagedCodeSecurity] @@ -7640,7 +7650,7 @@ namespace CppSharp private static global::System.IntPtr __CopyValue(NativeLibrary.Internal native) { - var ret = Marshal.AllocHGlobal(48); + var ret = Marshal.AllocHGlobal(52); CppSharp.Parser.AST.NativeLibrary.Internal.cctor_2(ret, new global::System.IntPtr(&native)); return ret; } @@ -7657,8 +7667,8 @@ namespace CppSharp public NativeLibrary() { - __Instance = Marshal.AllocHGlobal(48); - Internal.ctor_1(__Instance); + __Instance = Marshal.AllocHGlobal(52); + Internal.ctor_0(__Instance); } public void Dispose() @@ -7745,6 +7755,21 @@ namespace CppSharp return __ret; } } + + public CppSharp.Parser.AST.ArchType ArchType + { + get + { + var __ptr = (Internal*)__Instance.ToPointer(); + return __ptr->ArchType; + } + + set + { + var __ptr = (Internal*)__Instance.ToPointer(); + __ptr->ArchType = value; + } + } } public unsafe partial class ASTContext : IDisposable diff --git a/src/CppParser/Bindings/CSharp/x86_64-linux-gnu/AST.cs b/src/CppParser/Bindings/CSharp/x86_64-linux-gnu/AST.cs index e104a0d3..3a92c6c0 100644 --- a/src/CppParser/Bindings/CSharp/x86_64-linux-gnu/AST.cs +++ b/src/CppParser/Bindings/CSharp/x86_64-linux-gnu/AST.cs @@ -216,6 +216,13 @@ namespace CppSharp FunctionBody = 5 } + public enum ArchType + { + UnknownArch = 0, + x86 = 1, + x86_64 = 2 + } + public unsafe partial class Type : IDisposable { [StructLayout(LayoutKind.Explicit, Size = 8)] @@ -7561,18 +7568,21 @@ namespace CppSharp public unsafe partial class NativeLibrary : IDisposable { - [StructLayout(LayoutKind.Explicit, Size = 56)] + [StructLayout(LayoutKind.Explicit, Size = 64)] public partial struct Internal { + [FieldOffset(8)] + public CppSharp.Parser.AST.ArchType ArchType; + [SuppressUnmanagedCodeSecurity] [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl, - EntryPoint="_ZN8CppSharp9CppParser3AST13NativeLibraryC2ERKS2_")] - internal static extern void cctor_0(global::System.IntPtr instance, global::System.IntPtr _0); + EntryPoint="_ZN8CppSharp9CppParser3AST13NativeLibraryC2Ev")] + internal static extern void ctor_0(global::System.IntPtr instance); [SuppressUnmanagedCodeSecurity] [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl, - EntryPoint="_ZN8CppSharp9CppParser3AST13NativeLibraryC2Ev")] - internal static extern void ctor_2(global::System.IntPtr instance); + EntryPoint="_ZN8CppSharp9CppParser3AST13NativeLibraryC2ERKS2_")] + internal static extern void cctor_1(global::System.IntPtr instance, global::System.IntPtr _0); [SuppressUnmanagedCodeSecurity] [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl, @@ -7639,8 +7649,8 @@ namespace CppSharp private static global::System.IntPtr __CopyValue(NativeLibrary.Internal native) { - var ret = Marshal.AllocHGlobal(56); - CppSharp.Parser.AST.NativeLibrary.Internal.cctor_0(ret, new global::System.IntPtr(&native)); + var ret = Marshal.AllocHGlobal(64); + CppSharp.Parser.AST.NativeLibrary.Internal.cctor_1(ret, new global::System.IntPtr(&native)); return ret; } @@ -7656,8 +7666,8 @@ namespace CppSharp public NativeLibrary() { - __Instance = Marshal.AllocHGlobal(56); - Internal.ctor_2(__Instance); + __Instance = Marshal.AllocHGlobal(64); + Internal.ctor_0(__Instance); } public void Dispose() @@ -7744,6 +7754,21 @@ namespace CppSharp return __ret; } } + + public CppSharp.Parser.AST.ArchType ArchType + { + get + { + var __ptr = (Internal*)__Instance.ToPointer(); + return __ptr->ArchType; + } + + set + { + var __ptr = (Internal*)__Instance.ToPointer(); + __ptr->ArchType = value; + } + } } public unsafe partial class ASTContext : IDisposable diff --git a/src/CppParser/Parser.cpp b/src/CppParser/Parser.cpp index 5459628b..b25e0db9 100644 --- a/src/CppParser/Parser.cpp +++ b/src/CppParser/Parser.cpp @@ -3043,8 +3043,20 @@ ParserResultKind Parser::ParseArchive(llvm::StringRef File, return ParserResultKind::Success; } +static ArchType ConvertArchType(unsigned int archType) +{ + switch (archType) + { + case llvm::Triple::ArchType::x86: + return ArchType::x86; + case llvm::Triple::ArchType::x86_64: + return ArchType::x86_64; + } + return ArchType::UnknownArch; +} + template -void ReadELFDependencies(const llvm::object::ELFFile* ELFFile, CppSharp::CppParser::NativeLibrary*& NativeLib) +static void ReadELFDependencies(const llvm::object::ELFFile* ELFFile, CppSharp::CppParser::NativeLibrary*& NativeLib) { for (const auto &Entry : ELFFile->dynamic_table()) if (Entry.d_tag == llvm::ELF::DT_NEEDED) @@ -3058,6 +3070,7 @@ ParserResultKind Parser::ParseSharedLib(llvm::StringRef File, auto LibName = File; NativeLib = new NativeLibrary(); NativeLib->FileName = LibName; + NativeLib->ArchType = ConvertArchType(ObjectFile->getArch()); if (ObjectFile->isELF()) { @@ -3142,7 +3155,7 @@ ParserResultKind Parser::ReadSymbols(llvm::StringRef File, return ParserResultKind::Success; } - ParserResult* Parser::ParseLibrary(const std::string& File, ParserResult* res) +ParserResult* Parser::ParseLibrary(const std::string& File, ParserResult* res) { if (File.empty()) {