[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.
|