static void SA_SET_SYM_TAGNDX (symbolS *sym, symbolS *val) { combined_entry_type *entry, *p; entry = &coffsymbol (symbol_get_bfdsym (sym))->native[1]; p = coffsymbol (symbol_get_bfdsym (val))->native; entry->u.auxent.x_sym.x_tagndx.p = p; entry->fix_tag = 1; }
void SA_SET_SYM_ENDNDX (symbolS *sym, symbolS *val) { combined_entry_type *entry, *p; entry = &coffsymbol (symbol_get_bfdsym (sym))->native[1]; p = coffsymbol (symbol_get_bfdsym (val))->native; entry->u.auxent.x_sym.x_fcnary.x_fcn.x_endndx.p = p; entry->fix_end = 1; }
void coff_obj_symbol_clone_hook (symbolS *newsymP, symbolS *orgsymP) { long sz = (OBJ_COFF_MAX_AUXENTRIES + 1) * sizeof (combined_entry_type); combined_entry_type * s = xmalloc (sz); memcpy (s, coffsymbol (symbol_get_bfdsym (orgsymP))->native, sz); coffsymbol (symbol_get_bfdsym (newsymP))->native = s; SF_SET (newsymP, SF_GET (orgsymP)); }
void c_dot_file_symbol (const char *filename, int appfile ATTRIBUTE_UNUSED) { symbolS *symbolP; /* BFD converts filename to a .file symbol with an aux entry. It also handles chaining. */ symbolP = symbol_new (filename, bfd_abs_section_ptr, 0, &zero_address_frag); S_SET_STORAGE_CLASS (symbolP, C_FILE); S_SET_NUMBER_AUXILIARY (symbolP, 1); symbol_get_bfdsym (symbolP)->flags = BSF_DEBUGGING; #ifndef NO_LISTING { extern int listing; if (listing) listing_source_file (filename); } #endif /* Make sure that the symbol is first on the symbol chain. */ if (symbol_rootP != symbolP) { symbol_remove (symbolP, &symbol_rootP, &symbol_lastP); symbol_insert (symbolP, symbol_rootP, &symbol_rootP, &symbol_lastP); } }
void coff_add_linesym (symbolS *sym) { if (line_nos) { coffsymbol (symbol_get_bfdsym (current_lineno_sym))->lineno = (alent *) line_nos; coff_n_line_nos++; line_nos = 0; } current_lineno_sym = sym; }
static symbolS * obj_coff_common_parse (int ignore ATTRIBUTE_UNUSED, symbolS *symbolP, addressT size) { addressT align = 0; if (*input_line_pointer == ',') { align = parse_align (0); if (align == (addressT) -1) return NULL; } S_SET_VALUE (symbolP, size); S_SET_EXTERNAL (symbolP); S_SET_SEGMENT (symbolP, bfd_com_section_ptr); symbol_get_bfdsym (symbolP)->flags |= BSF_OBJECT; /* There is no S_SET_ALIGN (symbolP, align) in COFF/PE. Instead we must add a note to the .drectve section. */ if (align) { segT current_seg = now_seg; subsegT current_subseg = now_subseg; flagword oldflags; asection *sec; size_t pfxlen, numlen; char *frag; char numbuff[20]; sec = subseg_new (".drectve", 0); oldflags = bfd_get_section_flags (stdoutput, sec); if (oldflags == SEC_NO_FLAGS) { if (!bfd_set_section_flags (stdoutput, sec, TC_COFF_SECTION_DEFAULT_ATTRIBUTES)) as_warn (_("error setting flags for \"%s\": %s"), bfd_section_name (stdoutput, sec), bfd_errmsg (bfd_get_error ())); } /* Emit a string. Note no NUL-termination. */ pfxlen = strlen (" -aligncomm:") + 2 + strlen (S_GET_NAME (symbolP)) + 1; numlen = snprintf (numbuff, sizeof (numbuff), "%d", (int) align); frag = frag_more (pfxlen + numlen); (void) sprintf (frag, " -aligncomm:\"%s\",", S_GET_NAME (symbolP)); memcpy (frag + pfxlen, numbuff, numlen); /* Restore original subseg. */ subseg_set (current_seg, current_subseg); } return symbolP; }
symbolS * section_symbol (segT sec) { segment_info_type *seginfo = seg_info (sec); symbolS *s; if (seginfo == 0) abort (); if (seginfo->sym) return seginfo->sym; #ifndef EMIT_SECTION_SYMBOLS #define EMIT_SECTION_SYMBOLS 1 #endif if (! EMIT_SECTION_SYMBOLS || symbol_table_frozen) { /* Here we know it won't be going into the symbol table. */ s = symbol_create (sec->symbol->name, sec, 0, &zero_address_frag); } else { segT seg; s = symbol_find (sec->symbol->name); /* We have to make sure it is the right symbol when we have multiple sections with the same section name. */ if (s == NULL || ((seg = S_GET_SEGMENT (s)) != sec && seg != undefined_section)) s = symbol_new (sec->symbol->name, sec, 0, &zero_address_frag); else if (seg == undefined_section) { S_SET_SEGMENT (s, sec); symbol_set_frag (s, &zero_address_frag); } } S_CLEAR_EXTERNAL (s); /* Use the BFD section symbol, if possible. */ if (obj_sec_sym_ok_for_reloc (sec)) symbol_set_bfdsym (s, sec->symbol); else symbol_get_bfdsym (s)->flags |= BSF_SECTION_SYM; seginfo->sym = s; return s; }
void coff_obj_symbol_new_hook (symbolS *symbolP) { long sz = (OBJ_COFF_MAX_AUXENTRIES + 1) * sizeof (combined_entry_type); char * s = xmalloc (sz); memset (s, 0, sz); coffsymbol (symbol_get_bfdsym (symbolP))->native = (combined_entry_type *) s; S_SET_DATA_TYPE (symbolP, T_NULL); S_SET_STORAGE_CLASS (symbolP, 0); S_SET_NUMBER_AUXILIARY (symbolP, 0); if (S_IS_STRING (symbolP)) SF_SET_STRING (symbolP); if (S_IS_LOCAL (symbolP)) SF_SET_LOCAL (symbolP); }
#define OBJ_HEADER "obj-aout.h" #include "as.h" #undef NO_RELOC #include "aout/aout64.h" #include "obstack.h" void obj_aout_frob_symbol (symbolS *sym, int *punt ATTRIBUTE_UNUSED) { flagword flags; asection *sec; int desc, type, other; flags = symbol_get_bfdsym (sym)->flags; desc = aout_symbol (symbol_get_bfdsym (sym))->desc; type = aout_symbol (symbol_get_bfdsym (sym))->type; other = aout_symbol (symbol_get_bfdsym (sym))->other; sec = S_GET_SEGMENT (sym); /* Only frob simple symbols this way right now. */ if (! (type & ~ (N_TYPE | N_EXT))) { if (type == (N_UNDF | N_EXT) && sec == &bfd_abs_section) { sec = bfd_und_section_ptr; S_SET_SEGMENT (sym, sec); }
02110-1301, USA. */ #define OBJ_HEADER "obj-aout.h" #include "as.h" #undef NO_RELOC #include "aout/aout64.h" void obj_aout_frob_symbol (symbolS *sym, int *punt ATTRIBUTE_UNUSED) { flagword flags; asection *sec; int type; flags = symbol_get_bfdsym (sym)->flags; type = aout_symbol (symbol_get_bfdsym (sym))->type; sec = S_GET_SEGMENT (sym); /* Only frob simple symbols this way right now. */ if (! (type & ~ (N_TYPE | N_EXT))) { if (type == (N_UNDF | N_EXT) && sec == bfd_abs_section_ptr) { sec = bfd_und_section_ptr; S_SET_SEGMENT (sym, sec); } if ((type & N_TYPE) != N_INDR && (type & N_TYPE) != N_SETA
int S_SET_STORAGE_CLASS (symbolS *sym, int val) { coffsymbol (symbol_get_bfdsym (sym))->native->u.syment.n_sclass = val; return val; }
int S_GET_STORAGE_CLASS (symbolS *sym) { return coffsymbol (symbol_get_bfdsym (sym))->native->u.syment.n_sclass; }
int S_SET_DATA_TYPE (symbolS *sym, int val) { coffsymbol (symbol_get_bfdsym (sym))->native->u.syment.n_type = val; return val; }
static int S_GET_DATA_TYPE (symbolS *sym) { return coffsymbol (symbol_get_bfdsym (sym))->native->u.syment.n_type; }
void coff_frob_symbol (symbolS *symp, int *punt) { static symbolS *last_tagP; static stack *block_stack; static symbolS *set_end; symbolS *next_set_end = NULL; if (symp == &abs_symbol) { *punt = 1; return; } if (current_lineno_sym) coff_add_linesym (NULL); if (!block_stack) block_stack = stack_init (512, sizeof (symbolS*)); #ifdef TE_PE if (S_GET_STORAGE_CLASS (symp) == C_NT_WEAK && ! S_IS_WEAK (symp) && weak_is_altname (S_GET_NAME (symp))) { /* This is a weak alternate symbol. All processing of PECOFFweak symbols is done here, through the alternate. */ symbolS *weakp = symbol_find_noref (weak_altname2name (S_GET_NAME (symp)), 1); assert (weakp); assert (S_GET_NUMBER_AUXILIARY (weakp) == 1); if (! S_IS_WEAK (weakp)) { /* The symbol was turned from weak to strong. Discard altname. */ *punt = 1; return; } else if (symbol_equated_p (weakp)) { /* The weak symbol has an alternate specified; symp is unneeded. */ S_SET_STORAGE_CLASS (weakp, C_NT_WEAK); SA_SET_SYM_TAGNDX (weakp, symbol_get_value_expression (weakp)->X_add_symbol); S_CLEAR_EXTERNAL (symp); *punt = 1; return; } else { /* The weak symbol has been assigned an alternate value. Copy this value to symp, and set symp as weakp's alternate. */ if (S_GET_STORAGE_CLASS (weakp) != C_NT_WEAK) { S_SET_STORAGE_CLASS (symp, S_GET_STORAGE_CLASS (weakp)); S_SET_STORAGE_CLASS (weakp, C_NT_WEAK); } if (S_IS_DEFINED (weakp)) { /* This is a defined weak symbol. Copy value information from the weak symbol itself to the alternate symbol. */ symbol_set_value_expression (symp, symbol_get_value_expression (weakp)); symbol_set_frag (symp, symbol_get_frag (weakp)); S_SET_SEGMENT (symp, S_GET_SEGMENT (weakp)); } else { /* This is an undefined weak symbol. Define the alternate symbol to zero. */ S_SET_VALUE (symp, 0); S_SET_SEGMENT (symp, absolute_section); } S_SET_NAME (symp, weak_uniquify (S_GET_NAME (symp))); S_SET_STORAGE_CLASS (symp, C_EXT); S_SET_VALUE (weakp, 0); S_SET_SEGMENT (weakp, undefined_section); } } #else /* TE_PE */ if (S_IS_WEAK (symp)) S_SET_STORAGE_CLASS (symp, C_WEAKEXT); #endif /* TE_PE */ if (!S_IS_DEFINED (symp) && !S_IS_WEAK (symp) && S_GET_STORAGE_CLASS (symp) != C_STAT) S_SET_STORAGE_CLASS (symp, C_EXT); if (!SF_GET_DEBUG (symp)) { symbolS * real; if (!SF_GET_LOCAL (symp) && !SF_GET_STATICS (symp) && S_GET_STORAGE_CLASS (symp) != C_LABEL && symbol_constant_p (symp) && (real = symbol_find_noref (S_GET_NAME (symp), 1)) && S_GET_STORAGE_CLASS (real) == C_NULL && real != symp) { c_symbol_merge (symp, real); *punt = 1; return; } if (!S_IS_DEFINED (symp) && !SF_GET_LOCAL (symp)) { assert (S_GET_VALUE (symp) == 0); if (S_IS_WEAKREFD (symp)) *punt = 1; else S_SET_EXTERNAL (symp); } else if (S_GET_STORAGE_CLASS (symp) == C_NULL) { if (S_GET_SEGMENT (symp) == text_section && symp != seg_info (text_section)->sym) S_SET_STORAGE_CLASS (symp, C_LABEL); else S_SET_STORAGE_CLASS (symp, C_STAT); } if (SF_GET_PROCESS (symp)) { if (S_GET_STORAGE_CLASS (symp) == C_BLOCK) { if (streq (S_GET_NAME (symp), ".bb")) stack_push (block_stack, (char *) &symp); else { symbolS *begin; begin = *(symbolS **) stack_pop (block_stack); if (begin == 0) as_warn (_("mismatched .eb")); else next_set_end = begin; } } if (coff_last_function == 0 && SF_GET_FUNCTION (symp)) { union internal_auxent *auxp; coff_last_function = symp; if (S_GET_NUMBER_AUXILIARY (symp) < 1) S_SET_NUMBER_AUXILIARY (symp, 1); auxp = SYM_AUXENT (symp); memset (auxp->x_sym.x_fcnary.x_ary.x_dimen, 0, sizeof (auxp->x_sym.x_fcnary.x_ary.x_dimen)); } if (S_GET_STORAGE_CLASS (symp) == C_EFCN) { if (coff_last_function == 0) as_fatal (_("C_EFCN symbol for %s out of scope"), S_GET_NAME (symp)); SA_SET_SYM_FSIZE (coff_last_function, (long) (S_GET_VALUE (symp) - S_GET_VALUE (coff_last_function))); next_set_end = coff_last_function; coff_last_function = 0; } } if (S_IS_EXTERNAL (symp)) S_SET_STORAGE_CLASS (symp, C_EXT); else if (SF_GET_LOCAL (symp)) *punt = 1; if (SF_GET_FUNCTION (symp)) symbol_get_bfdsym (symp)->flags |= BSF_FUNCTION; } /* Double check weak symbols. */ if (S_IS_WEAK (symp) && S_IS_COMMON (symp)) as_bad (_("Symbol `%s' can not be both weak and common"), S_GET_NAME (symp)); if (SF_GET_TAG (symp)) last_tagP = symp; else if (S_GET_STORAGE_CLASS (symp) == C_EOS) next_set_end = last_tagP; #ifdef OBJ_XCOFF /* This is pretty horrible, but we have to set *punt correctly in order to call SA_SET_SYM_ENDNDX correctly. */ if (! symbol_used_in_reloc_p (symp) && ((symbol_get_bfdsym (symp)->flags & BSF_SECTION_SYM) != 0 || (! (S_IS_EXTERNAL (symp) || S_IS_WEAK (symp)) && ! symbol_get_tc (symp)->output && S_GET_STORAGE_CLASS (symp) != C_FILE))) *punt = 1; #endif if (set_end != (symbolS *) NULL && ! *punt && ((symbol_get_bfdsym (symp)->flags & BSF_NOT_AT_END) != 0 || (S_IS_DEFINED (symp) && ! S_IS_COMMON (symp) && (! S_IS_EXTERNAL (symp) || SF_GET_FUNCTION (symp))))) { SA_SET_SYM_ENDNDX (set_end, symp); set_end = NULL; } if (next_set_end != NULL) { if (set_end != NULL) as_warn ("Warning: internal error: forgetting to set endndx of %s", S_GET_NAME (set_end)); set_end = next_set_end; } #ifndef OBJ_XCOFF if (! *punt && S_GET_STORAGE_CLASS (symp) == C_FCN && streq (S_GET_NAME (symp), ".bf")) { if (coff_last_bf != NULL) SA_SET_SYM_ENDNDX (coff_last_bf, symp); coff_last_bf = symp; } #endif if (coffsymbol (symbol_get_bfdsym (symp))->lineno) { int i; struct line_no *lptr; alent *l; lptr = (struct line_no *) coffsymbol (symbol_get_bfdsym (symp))->lineno; for (i = 0; lptr; lptr = lptr->next) i++; lptr = (struct line_no *) coffsymbol (symbol_get_bfdsym (symp))->lineno; /* We need i entries for line numbers, plus 1 for the first entry which BFD will override, plus 1 for the last zero entry (a marker for BFD). */ l = xmalloc ((i + 2) * sizeof (* l)); coffsymbol (symbol_get_bfdsym (symp))->lineno = l; l[i + 1].line_number = 0; l[i + 1].u.sym = NULL; for (; i > 0; i--) { if (lptr->frag) lptr->l.u.offset += lptr->frag->fr_address / OCTETS_PER_BYTE; l[i] = lptr->l; lptr = lptr->next; } } }