void ObjEmitLabel( sym_handle sym ) { //*********************************** // Stacks up the label in the list for ObjEmitData to emit owl_sym_type type; owl_sym_linkage linkage; sym_linkage symbol_linkage; owl_section_type section_type; if( ObjLabelDefined( sym ) ) { Error( SYM_ALREADY_DEFINED, SymName( sym ) ); return; } section_type = OWLTellSectionType( CurrentSection ); if( section_type & OWL_SEC_ATTR_CODE ) { type = OWL_TYPE_FUNCTION; } else { type = OWL_TYPE_OBJECT; } symbol_linkage = SymGetLinkage( sym ); if( symbol_linkage == SL_UNKNOWN ) { SymSetLinkage( sym, SL_STATIC ); // from now on it's static } linkage = linkage_table[symbol_linkage]; doStackLabel( sym, type, linkage ); }
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 ); }
extern void ObjEmitLabel( sym_handle sym ) { //****************************************** // Stacks up the label in the list for ObjEmitData to emit if( ObjLabelDefined( sym ) ) { Error( SYM_ALREADY_DEFINED, SymName( sym ) ); return; } doStackLabel( sym ); }