static void do_alignment(taddr align,expr *offset,size_t pad,expr *fill) { atom *a = new_space_atom(offset,pad,fill); a->align = align; add_atom(0,a); }
static void do_alignment(taddr align,expr *offset) { atom *a = new_space_atom(offset,1,0); a->align = align; add_atom(0,a); }
static void handle_align(char *s) { taddr align=parse_constexpr(&s); atom *a=new_space_atom(number_expr(0),1,0); a->align=1<<align; add_atom(0,a); eol(s); }
static void stab_entry(char *name,int type,int othr,int desc,char *s) { section *stabs; if (!(stabs = find_section(stabname,stabattr))) { section *str; dblock *db; stabs = new_section(stabname,stabattr,4); if (!(str = find_section(stabstrname,stabstrattr))) { str = new_section(stabstrname,stabstrattr,1); } else { if (str->pc != 0) ierror(0); } /* first byte of .stabstr is 0 */ add_atom(str,new_space_atom(number_expr(1),1,0)); /* compilation unit header has to be patched by output module */ new_stabstr(getfilename()); db = new_dblock(); db->size = 12; db->data = mymalloc(12); add_atom(stabs,new_data_atom(db,1)); } add_const_datadef(stabs,name?new_stabstr(name):0,32,1); add_const_datadef(stabs,type,8,1); add_const_datadef(stabs,othr,8,1); add_const_datadef(stabs,desc,16,1); if (s) { operand *op = new_operand(); int len = oplen(skip_operand(s),s); if (parse_operand(s,len,op,DATA_OPERAND(32))) { atom *a = new_datadef_atom(32,op); a->align = 1; add_atom(stabs,a); } else syntax_error(8); } else add_atom(stabs,new_space_atom(number_expr(4),1,0)); /* no value */ }
static void do_align(taddr align,expr *fill,taddr max) /* @@@ 'max' alignment is not really supported at the moment */ { atom *a = new_space_atom(number_expr(0),1,fill); a->align = align; add_atom(0,a); }
static void handle_space(char *s) { expr *space,*fill=0; space=parse_expr_tmplab(&s); s=skip(s); if(*s==','){ s=skip(s+1); fill=parse_expr_tmplab(&s); } add_atom(0,new_space_atom(space,1,fill)); eol(s); }
static void handle_org(char *s) { if (*s == current_pc_char) { /* "* = * + <expr>" reserves bytes */ s = skip(s+1); if (*s == '+') { add_atom(0,new_space_atom(parse_expr_tmplab(&s),1,0)); } else { syntax_error(18); /* syntax error */ return; } } else { new_org(parse_constexpr(&s)); } eol(s); }
static void new_bss(char *s,int global) { char *name; symbol *sym; atom *a; taddr size; section *bss; if(!(name=parse_identifier(&s))){ syntax_error(10); /* identifier expected */ return; } size=comma_constexpr(&s); if(size<=sdlimit){ if(!(bss=find_section(sbssname,sbssattr))) bss=new_section(sbssname,sbssattr,1); } else{ if(!(bss=find_section(bssname,bssattr))) bss=new_section(bssname,bssattr,1); } sym=new_labsym(bss,name); sym->flags|=TYPE_OBJECT; if(global) sym->flags|=EXPORT; sym->size=number_expr(size); myfree(name); s=skip(s); if(*s==','){ s=skip(s+1); sym->align=parse_constexpr(&s); } else sym->align=(size>=8)?8:4; a=new_label_atom(sym); if(sym->align) a->align=sym->align; add_atom(bss,a); a=new_space_atom(number_expr(size),1,0); if(sym->align) a->align=sym->align; add_atom(bss,a); eol(s); }
static void handle_string(char *s) { handle_data(s,8,0); add_atom(0,new_space_atom(number_expr(1),1,0)); /* terminating zero */ }