static bool dirFuncSetLinkage( directive_t *dir, dir_table_enum parm ) //******************************************************************** { sym_handle sym; if( !dirNumOperandsVerify( dir->num_operands, 1 ) ) { return( TRUE ); } sym = SYMBOL_HANDLE( dir->operand_list ); assert( sym != NULL ); assert( SymClass( sym ) == SYM_LABEL ); switch( parm ) { case DT_LNK_GLOBAL: if( SymGetLinkage( sym ) == SL_STATIC ) { // Too bad the label is already emitted as static :( Warning( GLOBL_DECL_OUT_OF_ORDER ); } else { SymSetLinkage( sym, SL_GLOBAL ); } break; default: assert( FALSE ); } return( TRUE ); }
static bool dirFuncSpace( directive_t *dir, dir_table_enum parm ) //*************************************************************** { dir_operand *dirop; int_32 count; /* unused parameters */ (void)parm; if( !dirNumOperandsVerify( dir->num_operands, 1 ) ) { return( true ); } dirop = dir->operand_list; assert( dirop->type == DIROP_INTEGER ); count = NUMBER_INTEGER( dirop ); if( count < 0 ) { Error( OP_OUT_OF_RANGE, 0 ); return( true ); } #ifdef _STANDALONE_ ObjNullPad( CurrentSection, (uint_8)count ); #else ObjNullPad( (uint_8)count ); #endif return( true ); }
static bool dirFuncStorageAlloc( directive_t *dir, dir_table_enum parm ) //********************************************************************** // e.g.) .comm name, expr // Emit a label name, then emit expr bytes of data { dir_operand *dirop; sym_handle sym; int_32 expr; char *buffer; owl_section_handle curr_section; reserved_section as_section = 0; if( !dirNumOperandsVerify( dir->num_operands, 2 ) ) { return( TRUE ); } dirop = dir->operand_list; if( dirop->type != DIROP_SYMBOL ) { Error( IMPROPER_DIROP, 0 ); return( TRUE ); } sym = SYMBOL_HANDLE( dirop ); dirop = dirop->next; if( dirop->type != DIROP_INTEGER ) { Error( IMPROPER_DIROP, 1 ); return( TRUE ); } expr = NUMBER_INTEGER( dirop ); if( expr <= 0 ) { Error( OP_OUT_OF_RANGE, 1 ); return( TRUE ); } if( ObjLabelDefined( sym ) ) { // then such label has already been emitted Error( SYM_ALREADY_DEFINED, SymName( sym ) ); return( TRUE ); } curr_section = CurrentSection; switch( parm ) { case DT_SEC_DATA: // .comm => globl as_section = AS_SECTION_DATA; SymSetLinkage( sym, SL_GLOBAL ); break; case DT_SEC_BSS: // .lcomm, .bss as_section = AS_SECTION_BSS; break; default: assert( FALSE ); } ObjSwitchSection( as_section ); // Have to switch to the right ObjEmitLabel( sym ); // section before emitting label. buffer = MemAlloc( expr ); memset( buffer, 0, expr ); ObjEmitData( CurrentSection, buffer, expr, TRUE ); // Align the data also. MemFree( buffer ); CurrentSection = curr_section; // Switch back to where you were. return( TRUE ); }
static bool dirFuncAlign ( directive_t *dir, dir_table_enum parm ) //**************************************************************** { int_32 val; parm = parm; if( !dirNumOperandsVerify( dir->num_operands, 1 ) ) { return( TRUE ); } assert( dir->operand_list->type == DIROP_INTEGER ); val = NUMBER_INTEGER( dir->operand_list ); if( val < 0 || val > MAX_ALIGNMENT ) { Error( OP_OUT_OF_RANGE, 0 ); return( TRUE ); } autoAlignment = FALSE; CurrAlignment = val; return( TRUE ); }