[pygccxml-commit] SF.net SVN: pygccxml:[1549] pygccxml_dev
Brought to you by:
mbaas,
roman_yakovenko
From: <rom...@us...> - 2009-01-07 22:23:15
|
Revision: 1549 http://pygccxml.svn.sourceforge.net/pygccxml/?rev=1549&view=rev Author: roman_yakovenko Date: 2009-01-07 22:23:11 +0000 (Wed, 07 Jan 2009) Log Message: ----------- adding .so file parser Modified Paths: -------------- pygccxml_dev/pygccxml/binary_parsers/parsers.py pygccxml_dev/unittests/autoconfig.py pygccxml_dev/unittests/data/binary_parsers/mydll.cpp pygccxml_dev/unittests/data/binary_parsers/mydll.h pygccxml_dev/unittests/data/binary_parsers/sconstruct pygccxml_dev/unittests/undname_creator_tester.py Modified: pygccxml_dev/pygccxml/binary_parsers/parsers.py =================================================================== --- pygccxml_dev/pygccxml/binary_parsers/parsers.py 2009-01-07 22:21:28 UTC (rev 1548) +++ pygccxml_dev/pygccxml/binary_parsers/parsers.py 2009-01-07 22:23:11 UTC (rev 1549) @@ -18,6 +18,7 @@ import undname import warnings import exceptions +import subprocess from .. import declarations class LicenseWarning( exceptions.UserWarning ): @@ -204,6 +205,52 @@ decl.calling_convention = CCTS.extract( blob_undecorated, CCTS.CDECL ) return blob, decl + +class so_file_parser_t( libparser_t ): + def __init__( self, global_ns, binary_file ): + libparser_t.__init__( self, global_ns, binary_file ) + self.__mangled2decls = {} + + for f in self.global_ns.calldefs( allow_empty=True, recursive=True ): + self.__mangled2decls[ f.mangled ] = f + + for v in self.global_ns.variables( allow_empty=True, recursive=True ): + self.__mangled2decls[ v.mangled ] = v + + def load_symbols( self ): + cmd = 'nm --extern-only --dynamic --defined-only %s' % self.binary_file + process = subprocess.Popen( args=cmd + , shell=True + , stdin=subprocess.PIPE + , stdout=subprocess.PIPE + , stderr=subprocess.STDOUT + , cwd=os.path.dirname( self.binary_file ) ) + process.stdin.close() + + output = [] + while process.poll() is None: + output.append( process.stdout.readline() ) + #the process already finished, read th rest of the output + for line in process.stdout.readlines(): + output.append( line ) + if process.returncode: + msg = ["Unable to extract public\\exported symbols from '%s' file." % self.binary_file ] + msg.append( 'The command line, which was used to extract symbols, is "%s"' % cmd ) + raise RuntimeError( os.linesep.join(msg) ) + + result = [] + for line in output: + line = line.strip() + if line: + result.append( line.split( ' ' )[-1] ) + return result + + def merge( self, smbl ): + if smbl in self.__mangled2decls: + return smbl, self.__mangled2decls[smbl] + else: + return (None, None) + def merge_information( global_ns, fname, runs_under_unittest=False ): """high level function - select the appropriate binary file parser and integrates the information from the file to the declarations tree. """ @@ -213,6 +260,8 @@ parser = dll_file_parser_t( global_ns, fname ) elif '.map' == ext: parser = map_file_parser_t( global_ns, fname ) + elif '.so' == ext: + parser = so_file_parser_t( global_ns, fname ) else: raise RuntimeError( "Don't know how to read exported symbols from file '%s'" % fname ) Modified: pygccxml_dev/unittests/autoconfig.py =================================================================== --- pygccxml_dev/unittests/autoconfig.py 2009-01-07 22:21:28 UTC (rev 1548) +++ pygccxml_dev/unittests/autoconfig.py 2009-01-07 22:23:11 UTC (rev 1549) @@ -28,7 +28,6 @@ print 'unittests will run on DEVELOPMENT version' compiler = pygccxml.utils.native_compiler.get_gccxml_compiler() -compiler = "msvc71" print 'GCCXML configured to simulate compiler ', compiler pygccxml.declarations.class_t.USE_DEMANGLED_AS_NAME = True Modified: pygccxml_dev/unittests/data/binary_parsers/mydll.cpp =================================================================== --- pygccxml_dev/unittests/data/binary_parsers/mydll.cpp 2009-01-07 22:21:28 UTC (rev 1548) +++ pygccxml_dev/unittests/data/binary_parsers/mydll.cpp 2009-01-07 22:23:11 UTC (rev 1549) @@ -1,5 +1,4 @@ #include "mydll.h" -#include "windows.h" #include <iostream> number_t::number_t() @@ -80,23 +79,6 @@ short Fv_s(void){ return 0;} void Fv_v(void){ return;} - -BOOL APIENTRY DllMain( HMODULE hModule, - DWORD ul_reason_for_call, - LPVOID lpReserved - ) -{ - switch (ul_reason_for_call) - { - case DLL_PROCESS_ATTACH: - case DLL_THREAD_ATTACH: - case DLL_THREAD_DETACH: - case DLL_PROCESS_DETACH: - break; - } - return TRUE; -} - int identity( int i){ return i; } Modified: pygccxml_dev/unittests/data/binary_parsers/mydll.h =================================================================== --- pygccxml_dev/unittests/data/binary_parsers/mydll.h 2009-01-07 22:21:28 UTC (rev 1548) +++ pygccxml_dev/unittests/data/binary_parsers/mydll.h 2009-01-07 22:23:11 UTC (rev 1549) @@ -1,10 +1,12 @@ #pragma once +#include "libconfig.h" + #include <memory> #include <string> #include <vector> -class __declspec(dllexport) number_t{ +class EXPORT_SYMBOL number_t{ public: number_t(); explicit number_t(int value); @@ -20,27 +22,27 @@ int m_value; }; -template class __declspec(dllexport) std::auto_ptr< number_t >; +template class EXPORT_SYMBOL std::auto_ptr< number_t >; typedef std::auto_ptr< number_t > number_aptr_t; enum{ auto_ptr_size = sizeof( number_aptr_t ) }; -__declspec(dllexport) void do_smth( number_aptr_t& ); +EXPORT_SYMBOL void do_smth( number_aptr_t& ); -__declspec(dllexport) extern int my_global_int; +EXPORT_SYMBOL extern int my_global_int; typedef void(*do_smth_type)( number_aptr_t& ); -__declspec(dllexport) extern volatile int my_volatile_global_variable; +EXPORT_SYMBOL extern volatile int my_volatile_global_variable; -__declspec(dllexport) extern int my_global_array[10]; +EXPORT_SYMBOL extern int my_global_array[10]; -__declspec(dllexport) void* get_pvoid(void*); -__declspec(dllexport) void** get_ppvoid(void); +EXPORT_SYMBOL void* get_pvoid(void*); +EXPORT_SYMBOL void** get_ppvoid(void); -class __declspec(dllexport) myclass_t{ +class EXPORT_SYMBOL myclass_t{ public: myclass_t(int x){} myclass_t(void){} @@ -75,36 +77,36 @@ }; -struct __declspec(dllexport) X{}; +struct EXPORT_SYMBOL X{}; -__declspec(dllexport) int FA10_i_i(int a[10]); -__declspec(dllexport) int FPi_i(int *a); -__declspec(dllexport) int Fc_i(char bar); -__declspec(dllexport) int Ff_i(float bar); -__declspec(dllexport) int Fg_i(double bar); -__declspec(dllexport) int Fi_i(int bar); -__declspec(dllexport) int Fie_i(int bar, ...); -__declspec(dllexport) int Fii_i(int bar, int goo); -__declspec(dllexport) int Fiii_i(int bar, int goo, int hoo); -__declspec(dllexport) void Fmxmx_v(myclass_t arg1, X arg2, myclass_t arg3, X arg4); -__declspec(dllexport) void Fmyclass_v(myclass_t m); -__declspec(dllexport) const int Fv_Ci(void); -__declspec(dllexport) long double Fv_Lg(void); -__declspec(dllexport) int& Fv_Ri(void); -__declspec(dllexport) signed char Fv_Sc(void); -__declspec(dllexport) unsigned char Fv_Uc(void); -__declspec(dllexport) unsigned int Fv_Ui(void); -__declspec(dllexport) unsigned long Fv_Ul(void); -__declspec(dllexport) unsigned short Fv_Us(void); -__declspec(dllexport) volatile int Fv_Vi(void); -__declspec(dllexport) char Fv_c(void); -__declspec(dllexport) float Fv_f(void); -__declspec(dllexport) double Fv_g(void); -__declspec(dllexport) int Fv_i(void); -__declspec(dllexport) long Fv_l(void); -__declspec(dllexport) short Fv_s(void); -__declspec(dllexport) void Fv_v(void); +EXPORT_SYMBOL int FA10_i_i(int a[10]); +EXPORT_SYMBOL int FPi_i(int *a); +EXPORT_SYMBOL int Fc_i(char bar); +EXPORT_SYMBOL int Ff_i(float bar); +EXPORT_SYMBOL int Fg_i(double bar); +EXPORT_SYMBOL int Fi_i(int bar); +EXPORT_SYMBOL int Fie_i(int bar, ...); +EXPORT_SYMBOL int Fii_i(int bar, int goo); +EXPORT_SYMBOL int Fiii_i(int bar, int goo, int hoo); +EXPORT_SYMBOL void Fmxmx_v(myclass_t arg1, X arg2, myclass_t arg3, X arg4); +EXPORT_SYMBOL void Fmyclass_v(myclass_t m); +EXPORT_SYMBOL const int Fv_Ci(void); +EXPORT_SYMBOL long double Fv_Lg(void); +EXPORT_SYMBOL int& Fv_Ri(void); +EXPORT_SYMBOL signed char Fv_Sc(void); +EXPORT_SYMBOL unsigned char Fv_Uc(void); +EXPORT_SYMBOL unsigned int Fv_Ui(void); +EXPORT_SYMBOL unsigned long Fv_Ul(void); +EXPORT_SYMBOL unsigned short Fv_Us(void); +EXPORT_SYMBOL volatile int Fv_Vi(void); +EXPORT_SYMBOL char Fv_c(void); +EXPORT_SYMBOL float Fv_f(void); +EXPORT_SYMBOL double Fv_g(void); +EXPORT_SYMBOL int Fv_i(void); +EXPORT_SYMBOL long Fv_l(void); +EXPORT_SYMBOL short Fv_s(void); +EXPORT_SYMBOL void Fv_v(void); extern "C"{ - int __declspec(dllexport) identity( int ); -} \ No newline at end of file + int EXPORT_SYMBOL identity( int ); +} Modified: pygccxml_dev/unittests/data/binary_parsers/sconstruct =================================================================== --- pygccxml_dev/unittests/data/binary_parsers/sconstruct 2009-01-07 22:21:28 UTC (rev 1548) +++ pygccxml_dev/unittests/data/binary_parsers/sconstruct 2009-01-07 22:23:11 UTC (rev 1549) @@ -29,7 +29,8 @@ env.Append( CPPPATH=[r"E:\Program Files\Microsoft SDKs\Windows\v6.0A\Include" , r"E:\Program Files\Microsoft Visual Studio 9.0\VC\include"]) -env.AppendUnique( CCFLAGS=[ r"/MD",r"/EHsc",r"/GR",r"/Zc:wchar_t",r"/Zc:forScope" ] ) -env.AppendUnique( LINKFLAGS=[r"/MAP:${TARGET.base}.map", r"/MAPINFO:EXPORTS"] ) +if 'win32' in sys.platform: + env.AppendUnique( CCFLAGS=[ r"/MD",r"/EHsc",r"/GR",r"/Zc:wchar_t",r"/Zc:forScope" ] ) + env.AppendUnique( LINKFLAGS=[r"/MAP:${TARGET.base}.map", r"/MAPINFO:EXPORTS"] ) SConscript( 'sconscript', variant_dir='#binaries', duplicate=0, exports=["env"] ) Modified: pygccxml_dev/unittests/undname_creator_tester.py =================================================================== --- pygccxml_dev/unittests/undname_creator_tester.py 2009-01-07 22:21:28 UTC (rev 1548) +++ pygccxml_dev/unittests/undname_creator_tester.py 2009-01-07 22:23:11 UTC (rev 1549) @@ -37,6 +37,7 @@ self.header = os.path.join( self.binary_parsers_dir, r'mydll.h' ) self.map_file = os.path.join( self.binary_parsers_dir, 'binaries', 'mydll.map' ) self.dll_file = os.path.join( self.binary_parsers_dir, 'binaries', 'mydll.dll' ) + self.so_file = os.path.join( self.binary_parsers_dir, 'binaries', 'libmydll.so' ) def setUp(self): if not tester_t.global_ns: @@ -44,7 +45,8 @@ tester_t.global_ns = declarations.get_global_namespace( decls ) tester_t.global_ns.init_optimizer() - + declarations.print_declarations( tester_t.global_ns ) + process = subprocess.Popen( args='scons msvc_compiler=%s' % autoconfig.compiler , shell=True , stdin=subprocess.PIPE @@ -78,9 +80,11 @@ for blob in parser.loaded_symbols: if isinstance( blob, tuple ): blob = blob[0] - undname = binary_parsers.undecorate_blob( blob ) - if "`" in undname: - continue + if 'win32' in sys.platform: + #TODO: find out where undecorate function is exposed on linux + undname = binary_parsers.undecorate_blob( blob ) + if "`" in undname: + continue blob_names.add( blob ) decl_blob_names = set( symbols.keys() ) @@ -104,12 +108,16 @@ self.fail( os.linesep.join(msg) ) def test_map_file( self ): - self.__tester_impl( self.map_file ) + if 'win32' in sys.platform: + self.__tester_impl( self.map_file ) def test_dll_file( self ): - self.__tester_impl( self.dll_file ) + if 'win32' in sys.platform: + self.__tester_impl( self.dll_file ) - def test_compare_parsers( self ): + def test_z_compare_parsers( self ): + if 'win32' not in sys.platform: + return dsymbols, dparser = binary_parsers.merge_information( self.global_ns, self.dll_file, runs_under_unittest=True ) msymbols, mparser = binary_parsers.merge_information( self.global_ns, self.map_file, runs_under_unittest=True ) @@ -126,10 +134,13 @@ self.failUnless( mdecl is decl ) self.failUnless( was_error == False ) + def test_so_file( self ): + if 'linux2' in sys.platform: + self.__tester_impl( self.so_file ) + def create_suite(): suite = unittest.TestSuite() - if 'win' in sys.platform: - suite.addTest( unittest.makeSuite(tester_t)) + suite.addTest( unittest.makeSuite(tester_t)) return suite def run_suite(): This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |