declnode.cpp 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280
  1. #include "std.h"
  2. #include "nodes.h"
  3. //////////////////////////////
  4. // Sequence of declarations //
  5. //////////////////////////////
  6. void DeclSeqNode::proto( DeclSeq *d,Environ *e ){
  7. for( int k=0;k<decls.size();++k ){
  8. try{ decls[k]->proto( d,e ); }
  9. catch( Ex &x ){
  10. if( x.pos<0 ) x.pos=decls[k]->pos;
  11. if(!x.file.size() ) x.file=decls[k]->file;
  12. throw;
  13. }
  14. }
  15. }
  16. void DeclSeqNode::semant( Environ *e ){
  17. for( int k=0;k<decls.size();++k ){
  18. try{ decls[k]->semant( e ); }
  19. catch( Ex &x ){
  20. if( x.pos<0 ) x.pos=decls[k]->pos;
  21. if(!x.file.size() ) x.file=decls[k]->file;
  22. throw;
  23. }
  24. }
  25. }
  26. void DeclSeqNode::translate( Codegen *g ){
  27. for( int k=0;k<decls.size();++k ){
  28. try{ decls[k]->translate( g ); }
  29. catch( Ex &x ){
  30. if( x.pos<0 ) x.pos=decls[k]->pos;
  31. if(!x.file.size() ) x.file=decls[k]->file;
  32. throw;
  33. }
  34. }
  35. }
  36. void DeclSeqNode::transdata( Codegen *g ){
  37. for( int k=0;k<decls.size();++k ){
  38. try{ decls[k]->transdata( g ); }
  39. catch( Ex &x ){
  40. if( x.pos<0 ) x.pos=decls[k]->pos;
  41. if(!x.file.size() ) x.file=decls[k]->file;
  42. throw;
  43. }
  44. }
  45. }
  46. ////////////////////////////
  47. // Simple var declaration //
  48. ////////////////////////////
  49. void VarDeclNode::proto( DeclSeq *d,Environ *e ){
  50. Type *ty=tagType( tag,e );
  51. if( !ty ) ty=Type::int_type;
  52. ConstType *defType=0;
  53. if( expr ){
  54. expr=expr->semant( e );
  55. expr=expr->castTo( ty,e );
  56. if( constant || (kind&DECL_PARAM) ){
  57. ConstNode *c=expr->constNode();
  58. if( !c ) ex( "Expression must be constant" );
  59. if( ty==Type::int_type ) ty=d_new ConstType( c->intValue() );
  60. else if( ty==Type::float_type ) ty=d_new ConstType( c->floatValue() );
  61. else ty=d_new ConstType( c->stringValue() );
  62. e->types.push_back( ty );
  63. delete expr;expr=0;
  64. }
  65. if( kind&DECL_PARAM ){
  66. defType=ty->constType();ty=defType->valueType;
  67. }
  68. }else if( constant ) ex( "Constants must be initialized" );
  69. Decl *decl=d->insertDecl( ident,ty,kind,defType );
  70. if( !decl ) ex( "Duplicate variable name" );
  71. if( expr ) sem_var=d_new DeclVarNode( decl );
  72. }
  73. void VarDeclNode::semant( Environ *e ){
  74. }
  75. void VarDeclNode::translate( Codegen *g ){
  76. if( kind & DECL_GLOBAL ){
  77. g->align_data( 4 );
  78. g->i_data( 0,"_v"+ident );
  79. }
  80. if( expr ) g->code( sem_var->store( g,expr->translate( g ) ) );
  81. }
  82. //////////////////////////
  83. // Function Declaration //
  84. //////////////////////////
  85. void FuncDeclNode::proto( DeclSeq *d,Environ *e ){
  86. Type *t=tagType( tag,e );if( !t ) t=Type::int_type;
  87. a_ptr<DeclSeq> decls( d_new DeclSeq() );
  88. params->proto( decls,e );
  89. sem_type=d_new FuncType( t,decls.release(),false,false );
  90. if( !d->insertDecl( ident,sem_type,DECL_FUNC ) ){
  91. delete sem_type;ex( "duplicate identifier" );
  92. }
  93. e->types.push_back( sem_type );
  94. }
  95. void FuncDeclNode::semant( Environ *e ){
  96. sem_env=d_new Environ( genLabel(),sem_type->returnType,1,e );
  97. DeclSeq *decls=sem_env->decls;
  98. int k;
  99. for( k=0;k<sem_type->params->size();++k ){
  100. Decl *d=sem_type->params->decls[k];
  101. if( !decls->insertDecl( d->name,d->type,d->kind ) ) ex( "duplicate identifier" );
  102. }
  103. stmts->semant( sem_env );
  104. }
  105. void FuncDeclNode::translate( Codegen *g ){
  106. //var offsets
  107. int size=enumVars( sem_env );
  108. //enter function
  109. g->enter( "_f"+ident,size );
  110. //initialize locals
  111. TNode *t=createVars( sem_env );
  112. if( t ) g->code( t );
  113. if( g->debug ){
  114. string t=genLabel();
  115. g->s_data( ident,t );
  116. g->code( call( "__bbDebugEnter",local(0),iconst((int)sem_env),global(t) ) );
  117. }
  118. //translate statements
  119. stmts->translate( g );
  120. for( int k=0;k<sem_env->labels.size();++k ){
  121. if( sem_env->labels[k]->def<0 ) ex( "Undefined label",sem_env->labels[k]->ref );
  122. }
  123. //leave the function
  124. g->label( sem_env->funcLabel+"_leave" );
  125. t=deleteVars( sem_env );
  126. if( g->debug ) t=d_new TNode( IR_SEQ,call( "__bbDebugLeave" ),t );
  127. g->leave( t,sem_type->params->size()*4 );
  128. }
  129. //////////////////////
  130. // Type Declaration //
  131. //////////////////////
  132. void StructDeclNode::proto( DeclSeq *d,Environ *e ){
  133. sem_type=d_new StructType( ident,d_new DeclSeq() );
  134. if( !d->insertDecl( ident,sem_type,DECL_STRUCT ) ){
  135. delete sem_type;ex( "Duplicate identifier" );
  136. }
  137. e->types.push_back( sem_type );
  138. }
  139. void StructDeclNode::semant( Environ *e ){
  140. fields->proto( sem_type->fields,e );
  141. for( int k=0;k<sem_type->fields->size();++k ) sem_type->fields->decls[k]->offset=k*4;
  142. }
  143. void StructDeclNode::translate( Codegen *g ){
  144. //translate fields
  145. fields->translate( g );
  146. //type ID
  147. g->align_data( 4 );
  148. g->i_data( 5,"_t"+ident );
  149. //used and free lists for type
  150. int k;
  151. for( k=0;k<2;++k ){
  152. string lab=genLabel();
  153. g->i_data( 0,lab ); //fields
  154. g->p_data( lab ); //next
  155. g->p_data( lab ); //prev
  156. g->i_data( 0 ); //type
  157. g->i_data( -1 ); //ref_cnt
  158. }
  159. //number of fields
  160. g->i_data( sem_type->fields->size() );
  161. //type of each field
  162. for( k=0;k<sem_type->fields->size();++k ){
  163. Decl *field=sem_type->fields->decls[k];
  164. Type *type=field->type;
  165. string t;
  166. if( type==Type::int_type ) t="__bbIntType";
  167. else if( type==Type::float_type ) t="__bbFltType";
  168. else if( type==Type::string_type ) t="__bbStrType";
  169. else if( StructType *s=type->structType() ) t="_t"+s->ident;
  170. else if( VectorType *v=type->vectorType() ) t=v->label;
  171. g->p_data( t );
  172. }
  173. }
  174. //////////////////////
  175. // Data declaration //
  176. //////////////////////
  177. void DataDeclNode::proto( DeclSeq *d,Environ *e ){
  178. expr=expr->semant( e );
  179. ConstNode *c=expr->constNode();
  180. if( !c ) ex( "Data expression must be constant" );
  181. if( expr->sem_type==Type::string_type ) str_label=genLabel();
  182. }
  183. void DataDeclNode::semant( Environ *e ){
  184. }
  185. void DataDeclNode::translate( Codegen *g ){
  186. if( expr->sem_type!=Type::string_type ) return;
  187. ConstNode *c=expr->constNode();
  188. g->s_data( c->stringValue(),str_label );
  189. }
  190. void DataDeclNode::transdata( Codegen *g ){
  191. ConstNode *c=expr->constNode();
  192. if( expr->sem_type==Type::int_type ){
  193. g->i_data( 1 );g->i_data( c->intValue() );
  194. }else if( expr->sem_type==Type::float_type ){
  195. float n=c->floatValue();
  196. g->i_data( 2 );g->i_data( *(int*)&n );
  197. }else{
  198. g->i_data( 4 );g->p_data( str_label );
  199. }
  200. }
  201. ////////////////////////
  202. // Vector declaration //
  203. ////////////////////////
  204. void VectorDeclNode::proto( DeclSeq *d,Environ *env ){
  205. Type *ty=tagType( tag,env );if( !ty ) ty=Type::int_type;
  206. vector<int> sizes;
  207. for( int k=0;k<exprs->size();++k ){
  208. ExprNode *e=exprs->exprs[k]=exprs->exprs[k]->semant( env );
  209. ConstNode *c=e->constNode();
  210. if( !c ) ex( "Blitz array sizes must be constant" );
  211. int n=c->intValue();
  212. if( n<0 ) ex( "Blitz array sizes must not be negative" );
  213. sizes.push_back( n+1 );
  214. }
  215. string label=genLabel();
  216. sem_type=d_new VectorType( label,ty,sizes );
  217. if( !d->insertDecl( ident,sem_type,kind ) ){
  218. delete sem_type;ex( "Duplicate identifier" );
  219. }
  220. env->types.push_back( sem_type );
  221. }
  222. void VectorDeclNode::translate( Codegen *g ){
  223. //type tag!
  224. g->align_data( 4 );
  225. VectorType *v=sem_type->vectorType();
  226. g->i_data( 6,v->label );
  227. int sz=1;
  228. for( int k=0;k<v->sizes.size();++k ) sz*=v->sizes[k];
  229. g->i_data( sz );
  230. string t;
  231. Type *type=v->elementType;
  232. if( type==Type::int_type ) t="__bbIntType";
  233. else if( type==Type::float_type ) t="__bbFltType";
  234. else if( type==Type::string_type ) t="__bbStrType";
  235. else if( StructType *s=type->structType() ) t="_t"+s->ident;
  236. else if( VectorType *v=type->vectorType() ) t=v->label;
  237. g->p_data( t );
  238. if( kind==DECL_GLOBAL ) g->i_data( 0,"_v"+ident );
  239. }