@@ -2276,8 +2276,8 @@ AlreadyDeclared(AST *pendinglist, AST *newIdentifier)
22762276 return NULL ;
22772277}
22782278
2279- AST *
2280- MaybeDeclareMemberVar (Module * P , AST * identifier , AST * typ , int is_private , unsigned flags , BitFieldState * bitfield )
2279+ static AST *
2280+ doMaybeDeclareMemberVar (Module * P , AST * identifier , AST * typ , int is_private , unsigned flags , BitFieldState * bitfield )
22812281{
22822282 AST * ret = 0 ;
22832283 AST * sub ;
@@ -2319,6 +2319,67 @@ MaybeDeclareMemberVar(Module *P, AST *identifier, AST *typ, int is_private, unsi
23192319 return ret ;
23202320}
23212321
2322+ AST *
2323+ MaybeDeclareMemberVar (Module * P , AST * ident , AST * typ , int is_private , unsigned flags , BitFieldState * bitfield )
2324+ {
2325+ AST * ret = NULL ;
2326+ if (typ && typ -> kind == AST_BITFIELD ) {
2327+ AST * bfield_ast = typ -> right ;
2328+ AST * bfield_typ = typ -> left ;
2329+ AST * bfield_access ;
2330+ AST * bfield_list = 0 ;
2331+ int tsize ;
2332+ int bsize = EvalConstExpr (bfield_ast );
2333+ Symbol * sym = FindSymbol (& P -> objsyms , GetIdentifierName (ident ));
2334+
2335+ if (!bitfield ) {
2336+ ERROR (ident , "Unexpected bitfield declaration" );
2337+ return ret ;
2338+ }
2339+ if (sym && sym -> kind == SYM_ALIAS ) {
2340+ goto skip_decl ;
2341+ }
2342+ tsize = TypeSize (bfield_typ ) * 8 ;
2343+ if (bitfield -> max_size == 0 || bitfield -> max_size != tsize || bitfield -> offset + bsize > bitfield -> max_size ) {
2344+ // start a new bitfield
2345+ bitfield -> max_size = tsize ;
2346+ bitfield -> offset = 0 ;
2347+ bitfield -> ident = AstTempIdentifier ("^_bitfield_" );
2348+ ret = doMaybeDeclareMemberVar (P , bitfield -> ident , bfield_typ , is_private , HIDDEN_VAR , NULL );
2349+ bitfield -> last_bfield_pos = ret ;
2350+ }
2351+ if (bsize > bitfield -> max_size ) {
2352+ ERROR (bfield_ast , "bitfield size %d is greater than type size %d" ,
2353+ bsize , bitfield -> max_size );
2354+ bsize = bitfield -> max_size ;
2355+ }
2356+ if (bsize < 0 ) {
2357+ bsize = 1 ;
2358+ }
2359+ bfield_access = NewAST (AST_RANGE , AstInteger (bitfield -> offset + bsize - 1 ), AstInteger (bitfield -> offset ));
2360+ if (!IsUnsignedType (bfield_typ )) {
2361+ bfield_access -> d .ival = 1 ;
2362+ }
2363+ bfield_access = NewAST (AST_RANGEREF , bitfield -> ident , bfield_access );
2364+ bfield_access = NewAST (AST_CAST , bfield_typ , bfield_access );
2365+ DeclareMemberAlias (P , ident , bfield_access );
2366+ bfield_list = NewAST (AST_DECLARE_BITFIELD , bfield_access , ident );
2367+ bfield_list = NewAST (AST_LISTHOLDER , bfield_list , NULL );
2368+ P -> pendingvarblock = ListInsertBefore (P -> pendingvarblock ,
2369+ bitfield -> last_bfield_pos , bfield_list );
2370+ bitfield -> offset += bsize ;
2371+ skip_decl :
2372+ ;
2373+ } else {
2374+ // not in a bitfield
2375+ if (bitfield ) {
2376+ bitfield -> max_size = bitfield -> offset = 0 ;
2377+ }
2378+ ret = doMaybeDeclareMemberVar (P , ident , typ , is_private , flags , bitfield );
2379+ }
2380+ return ret ;
2381+ }
2382+
23222383void
23232384DeclareInterfaceFunctionPointers (Module * P )
23242385{
0 commit comments