[GCC-XML]FYI/CrossPost : Fwd: Example SQL and XML of DOTGNU/CSCC/csnodes.c

James Michael DuPont mdupont777 at yahoo.com
Thu Apr 18 18:50:15 EDT 2002


Dear Sirs,
Please excuse the follwing cross posting. 
I know that it is frowned apon, but I hope that you
find the following mail interesting. 
Originally it was meant for the dotGNU mailing list,
but I think that it is of relevance to this list.
Please come and join the


introspector-developers at sourceforge.net mailing list
for a open discussion about creating an
GPLD/Free-Software reverse engineering and program
understanding toolchain.

Mike
--- James Michael DuPont <mdupont777 at yahoo.com>
wrote:
> Date: Thu, 18 Apr 2002 15:24:34 -0700 (PDT)
> From: James Michael DuPont <mdupont777 at yahoo.com>
> Subject: Example SQL and XML of
> DOTGNU/CSCC/csnodes.c
> To: developers at dotgnu.org
> CC: introspector-developers at sourceforge.net,
> gvonroth at vonroth.com
> 
> Dear Fellow DotGNUers,
> 
> I have done the first step in actually *Doing*
> something for DotGNU and towards a bridge between
> the
> gcc and pnet and not just thinking and talking 
> about
> what I want to do all the time.
> 
> Taking the csnodes.c and running it through the
> introspector for one. Tweaking and *SIMPLIFING*
the
> database model so that you can probably run in on
> *ANY* sql database server. Putting it all on a
> server
> that you can download and play with.
> Sorry that the last release from me did not have
any
> documentation or tips on how to use it. One has
to
> be
> carefull, the asts are very BIG and hard to use.
But
> we will get there :=)
> 
> I have reduced the database mode down to 3 tables
> 
> *node_base
>    contains the ID and the type of the node
> 
> *node_attr
>    contains the ID of the node, type and value of
> the
> attribute.
> 
> *node_usage
>    contains the fromid, toid , types of nodes and
> type
> of relationship
> 
> With these three tables you have a full graph of
the
> parse tree of the c# compilers node structure.
> 
> The SQL for the tables is located on 
>
http://introspector.sourceforge.net/dotgnu/simple.sql
> 
> The data for inserting into the database you will
> find
> in a gz sql file here :
>
http://introspector.sourceforge.net/dotgnu/____global.xml.sql.gz
> 
> The XML that was dumped you will find here :
>
http://introspector.sourceforge.net/dotgnu/____global.xml.gz
> (If you are interested in parsing the XML yourself
)
> The XML has the following structure: 
> 
> <xmlroot> # the root of the document
> 
> # tells you what file that was compiled to get
these
> nodes
> <xml_cfile name= NAME OF SOURCE FILE/>
> 
>     # each tree node in the parse tree produces
such
> a
> xml entry
>     <node  idx=NUMBER OF NODE     
>            node_name=TYPE OF NODE >
> 
> 	   # RELATIONSHIPS - each relation to a
different
> node is contained inside of the NODE element
>           <   # EACH RELATION is an entity of one
of
> the following types
> 	      name | type | unql | size | min | max |
args
> |
> prms | scpe | flds | body | chan | valu |
> 	      op_0 | op_2 | val  | purp | next
> 
> 	      
> 	      idx="THE ID OF THE OTHER NODE"  
> 	      ref_node_name="THE TYPE OF OTHER NODE
TYPE"
> 	   />
> 
> 	   # ATTRIBUTES SOME of the following attributes
> might be set : 
> 	  <strg>THE VALUE OF A STRING</strg>
> 	  <srcl>SOURCE LINE</srcl>
>           <srcp>SOURCE FILE</srcp>
> 	  <prec>PRECISION</prec>
> 	  <algn>ALIGNMENT</algn>
> 	  <built_in>ALIGNMENT</built_in>
> 	  <low>LOW BYTE of a Constant</low>
> 	  <high>LOW BYTE of a Constant</high>	  
> 	  <lngth>Length of a string</lngth>
> 	  <qualconst>is const</qualconst>
> 	  <qualrest>?forgot for now :(</qualrest>
> 	  <qualvol>is volitile</qualcol>	  
> 	  <str>SOME TYPE OF PARAMETER FOR THE NODE
(extern
> for functions, struct for records)</str>
> 
>      </node> 
>      # MANY OTHER NODEs may follow
> </xmlroot>
> 
> I am also testing a simple query language for 
> accessing the nodes. more about that next time.
> 
> The files are located here :
> http://introspector.sourceforge.net/dotgnu/
> 
> I hope that you can use these files and find them
> helpfull. Next step is to create a cross
reference
> table between the GCC and the CSCC cores.
> 
> Following are two example queries that show you
the
> power of the database.
> 
> Mike
> 
> First is a list of all the identifiers of
> record_types
> who name begin with IL
> introspector_simple=# 
> 
> select distinct 
> value 
> from 
> node_usage u,  
> node_attr a , 
> node_base b 
> where 
> a.attr_type = 'strg' and 
> a.value like '"IL%' 
> and a.id=b.id  
> and u.to_id = b.id 
> and u.usage = 'name' 
> and u.from_type = 'record_type';
> 
> value                  
> ----------------------------------------
>  "ILNode_AddressOf__"
>  "ILNode_AddressOf_vtable__"
>  "ILNode_ArrayAccess__"
>  "ILNode_ArrayAccess_vtable__"
>  "ILNode_ArrayInit__"
>  "ILNode_ArrayInit_vtable__"
>  "ILNode_AsIs__"
>  "ILNode_AsIs_vtable__"
>  "ILNode_Assign__"
>  "ILNode_Assign_vtable__"
>  "ILNode_AttrArgs__"
>  "ILNode_BaseAccess__"
>  "ILNode_BaseAccess_vtable__"
>  "ILNode_BaseElement__"
>  "ILNode_BaseElement_vtable__"
>  "ILNode_BinaryArith__"
>  "ILNode_BinaryArith_vtable__"
>  "ILNode_BinaryBitwise__"
>  "ILNode_BinaryBitwise_vtable__"
>  "ILNode_BinaryExpression_vtable__"
>  "ILNode_BinaryShift__"
>  "ILNode_BinaryShift_vtable__"
>  "ILNode_CastSimple__"
>  "ILNode_CastSimple_vtable__"
>  "ILNode_CastType__"
>  "ILNode_CastType_vtable__"
>  "ILNode_Concat__"
>  "ILNode_Concat_vtable__"
>  "ILNode_Constant__"
>  "ILNode_Constant_vtable__"
>  "ILNode_DecimalType__"
>  "ILNode_DerefField__"
>  "ILNode_DerefField_vtable__"
>  "ILNode_Deref__"
>  "ILNode_Deref_vtable__"
>  "ILNode_DocComment__"
>  "ILNode_DocComment_vtable__"
>  "ILNode_DummyBinaryExpr__"
>  "ILNode_DummyBinaryExpr_vtable__"
>  "ILNode_DummySem_vtable__"
>  "ILNode_DummyUnaryExpr__"
>  "ILNode_DummyUnaryExpr_vtable__"
>  "ILNode_Dummy_vtable__"
>  "ILNode_Expression_vtable__"
>  "ILNode_FixAddress__"
>  "ILNode_FixAddress_vtable__"
>  "ILNode_FixExpr__"
>  "ILNode_FixExpr_vtable__"
>  "ILNode_FixedDeclList_vtable__"
>  "ILNode_Identifier__"
>  "ILNode_Identifier_vtable__"
>  "ILNode_IndexerAccess__"
>  "ILNode_IndexerAccess_vtable__"
>  "ILNode_IsNonNull__"
>  "ILNode_IsNonNull_vtable__"
>  "ILNode_IsNull__"
>  "ILNode_IsNull_vtable__"
>  "ILNode_LValueBinaryExpr_vtable__"
>  "ILNode_LValueNoRefUnaryExpr__"
>  "ILNode_LValueNoRefUnaryExpr_vtable__"
>  "ILNode_LValueNoRef_vtable__"
>  "ILNode_LValueUnaryExpr_vtable__"
>  "ILNode_LValue__"
>  "ILNode_LValue_vtable__"
>  "ILNode_List_vtable__"
>  "ILNode_LocalVariableType__"
>  "ILNode_LocalVariableType_vtable__"
>  "ILNode_LogicalAnd__"
>  "ILNode_LogicalAnd_vtable__"
>  "ILNode_LogicalNot__"
>  "ILNode_LogicalNot_vtable__"
>  "ILNode_LogicalOr__"
>  "ILNode_LogicalOr_vtable__"
>  "ILNode_MemberAccess__"
>  "ILNode_MemberAccess_vtable__"
>  "ILNode_MemberField__"
>  "ILNode_MemberField_vtable__"
>  "ILNode_MemberProperty__"
>  "ILNode_MemberProperty_vtable__"
>  "ILNode_NamedArg__"
>  "ILNode_NamedArg_vtable__"
>  "ILNode_Namespace__"
>  "ILNode_Namespace_vtable__"
>  "ILNode_Neg__"
>  "ILNode_Neg_vtable__"
>  "ILNode_NoOverflow__"
>  "ILNode_NoOverflow_vtable__"
>  "ILNode_NoPedantic__"
>  "ILNode_NoPedantic_vtable__"
>  "ILNode_Overflow__"
>  "ILNode_Overflow_vtable__"
>  "ILNode_Pedantic__"
>  "ILNode_Pedantic_vtable__"
>  "ILNode_PostDec__"
>  "ILNode_PostDec_vtable__"
>  "ILNode_PostInc__"
>  "ILNode_PostInc_vtable__"
>  "ILNode_PreDec__"
>  "ILNode_PreDec_vtable__"
>  "ILNode_PreInc__"
>  "ILNode_PreInc_vtable__"
>  "ILNode_QualIdent__"
>  "ILNode_QualIdent_vtable__"
>  "ILNode_Relational__"
>  "ILNode_Relational_vtable__"
>  "ILNode_Statement__"
>  "ILNode_Statement_vtable__"
>  "ILNode_StaticField__"
>  "ILNode_StaticProperty__"
>  "ILNode_StaticProperty_vtable__"
>  "ILNode_ToBool__"
>  "ILNode_ToBool_vtable__"
>  "ILNode_ToConst__"
>  "ILNode_ToConst_vtable__"
>  "ILNode_TypeSuffix__"
>  "ILNode_TypeSuffix_vtable__"
>  "ILNode_UnaryExpression_vtable__"
>  "ILNode_Unsafe__"
>  "ILNode_Unsafe_vtable__"
>  "ILNode_UserBinaryOp__"
>  "ILNode_UserBinaryOp_vtable__"
>  "ILNode_UserConversion__"
>  "ILNode_UserConversion_vtable__"
>  "ILNode_UserIncOrDec__"
>  "ILNode_UserIncOrDec_vtable__"
>  "ILNode_UserLogical__"
>  "ILNode_UserLogical_vtable__"
>  "ILNode_UserPostDec__"
>  "ILNode_UserPostDec_vtable__"
>  "ILNode_UserPostInc__"
>  "ILNode_UserPostInc_vtable__"
>  "ILNode_UserPreDec__"
>  "ILNode_UserPreDec_vtable__"
>  "ILNode_UserPreInc__"
>  "ILNode_UserPreInc_vtable__"
>  "ILNode_UserUnaryOp__"
>  "ILNode_UsingAlias__"
>  "ILNode_UsingAlias_vtable__"
>  "ILNode_UsingNamespace__"
>  "ILNode_UsingNamespace_vtable__"
>  "ILNode__"
>  "ILNode_vtable__"
> 
> 
> Following is an example query that shows you what
> type
> of nodes point to what other types of nodes in
the
> current data set (It is loading right now, so not
> finished yet). As you can see there is a lot of
> information about the tree nodes as records and
> fields. 1020 fields in the database, not bad!
> 
> introspector_simple# select
> from_type,to_type,usage,count(*) from node_usage
> group
> by from_type,to_type,usage order by count(*)
desc;
>    from_type   |     to_type     | usage | count 
> ---------------+-----------------+-------+-------
>  field_decl    | identifier_node | name  |  1020
>  field_decl    | integer_cst     | size  |  1020
>  field_decl    | record_type     | scpe  |  1007
>  field_decl    | field_decl      | chan  |   917
>  field_decl    | pointer_type    | type  |   754
>  tree_list     | tree_list       | chan  |   737
>  function_decl | function_type   | type  |   512
>  function_decl | identifier_node | name  |   512
>  tree_list     | pointer_type    | valu  |   495
>  function_decl | function_decl   | chan  |   485
>  type_decl     | type_decl       | chan  |   345
>  function_type | integer_cst     | size  |   322
>  function_type | tree_list       | prms  |   319
>  record_type   | field_decl      | flds  |   265
>  record_type   | integer_cst     | size  |   265
>  tree_list     | void_type       | valu  |   260
>  type_decl     | identifier_node | name  |   258
>  field_decl    | integer_type    | type  |   229
>  type_decl     | record_type     | type  |   207
>  integer_cst   | integer_type    | type  |   193
>  record_type   | identifier_node | name  |   182
>  pointer_type  | integer_cst     | size  |   165
>  record_type   | record_type     | unql  |   152
>  tree_list     | integer_type    | valu  |   152
>  integer_type  | integer_cst     | max   |   140
>  integer_type  | integer_cst     | min   |   140
>  integer_type  | integer_cst     | size  |   140
>  function_type | integer_type    | retn  |   133
>  type_decl     | integer_type    | type  |   129
>  integer_type  | type_decl       | name  |   121
>  integer_type  | integer_type    | unql  |   106
>  pointer_type  | record_type     | ptd   |   105
>  record_type   | type_decl       | name  |   103
>  function_type | pointer_type    | retn  |    91
>  var_decl      | identifier_node | name  |    78
>  function_type | void_type       | retn  |    71
>  var_decl      | integer_cst     | size  |    71
>  var_decl      | var_decl        | chan  |    69
>  const_decl    | enumeral_type   | type  |    65
>  const_decl    | identifier_node | name  |    65
>  tree_list     | identifier_node | purp  |    64
>  tree_list     | integer_cst     | valu  |    64
>  const_decl    | const_decl      | chan  |    60
>  var_decl      | integer_type    | type  |    44
>  pointer_type  | integer_type    | ptd   |    26
>  type_decl     | function_decl   | chan  |    24
>  var_decl      | pointer_type    | type  |    24
>  function_decl | type_decl       | chan  |    19
>  tree_list     | enumeral_type   | valu  |    19
>  pointer_type  | pointer_type    | unql  |    18
>  pointer_type  | function_type   | ptd   |    17
>  field_decl    | union_type      | scpe  |    13
>  tree_list     | real_type       | valu  |    13
>  field_decl    | enumeral_type   | type  |    12
>  function_type | real_type       | retn  |    12
>  enumeral_type | integer_cst     | max   |    11
>  enumeral_type | integer_cst     | min   |    11
>  enumeral_type | integer_cst     | size  |    11
>  enumeral_type | tree_list       | csts  |    11
>  field_decl    | record_type     | type  |    11
>  parm_decl     | function_decl   | scpe  |    11
>  parm_decl     | identifier_node | name  |    11
>  parm_decl     | integer_cst     | size  |    11
>  type_decl     | enumeral_type   | type  |    11
>  array_type    | integer_cst     | size  |     9
>  array_type    | integer_type    | domn  |     9
>  field_decl    | array_type      | type  |     9
>  pointer_type  | type_decl       | name  |     9
>  type_decl     | pointer_type    | type  |     9
>  array_type    | integer_type    | elts  |     8
>  complex_type  | integer_cst     | size  |     8
>  complex_type  | type_decl       | name  |     8
>  function_decl | parm_decl       | args  |     8
>  function_decl | var_decl        | chan  |     8
>  function_type | record_type     | retn  |     8
>  pointer_type  | void_type       | ptd   |     8
>  type_decl     | complex_type    | type  |     8
>  parm_decl     | pointer_type    | argt  |     7
>  parm_decl     | pointer_type    | type  |     7
>  pointer_type  | pointer_type    | ptd   |     7
>  type_decl     | real_type       | type  |     7
>  var_decl      | function_decl   | chan  |     7
>  enumeral_type | enumeral_type   | unql  |     6
>  enumeral_type | type_decl       | name  |     6
>  real_type     | integer_cst     | size  |     6
>  real_type     | type_decl       | name  |     6
>  tree_list     | complex_type    | valu  |     6
>  type_decl     | const_decl      | chan  |     6
>  var_decl      | array_type      | type  |     6
>  const_decl    | type_decl       | chan  |     5
>  function_type | enumeral_type   | retn  |     4
>  function_type | function_type   | unql  |     4
>  function_type | type_decl       | name  |     4
>  parm_decl     | integer_type    | argt  |     4
>  parm_decl     | integer_type    | type  |     4
>  tree_list     | record_type     | valu  |     4
>  type_decl     | function_type   | type  |     4
>  var_decl      | record_type     | type  |     4
>  void_type     | type_decl       | name  |     4
>  array_type    | pointer_type    | elts  |     3
>  function_type | complex_type    | retn  |     3
>  parm_decl     | parm_decl       | chan  |     3
>  real_type     | real_type       | unql  |     3
>  type_decl     | var_decl        | chan  |     3
>  type_decl     | void_type       | type  |     3
>  void_type     | void_type       | unql  |     3
>  array_type    | record_type     | elts  |     2
>  field_decl    | real_type       | type  |     2
>  field_decl    | union_type      | type  |     2
>  integer_type  | identifier_node | name  |     2
>  pointer_type  | real_type       | ptd   |     2
>  string_cst    | array_type      | type  |     2
>  union_type    | field_decl      | flds  |     2
>  union_type    | integer_cst     | size  |     2
>  var_decl      | string_cst      | init  |     2
>  var_decl      | type_decl       | chan  |     2
>  boolean_type  | integer_cst     | size  |     1
>  boolean_type  | type_decl       | name  |     1
>  type_decl     | boolean_type    | type  |     1
>  type_decl     | union_type      | type  |     1

=====
James Michael DuPont

__________________________________________________
Do You Yahoo!?
Yahoo! Tax Center - online filing with TurboTax
http://taxes.yahoo.com/



More information about the gccxml mailing list