* dwarf2dbg.c (dwarf2_gen_line_info): Mirror the section symbol

creation logic from obj_elf_create_section.
        * config/obj-elf.c (elf_pseudo_tab): Add pushsection/popsection.
        (section_stack): New.
        (special_sections): Make const.
        (obj_elf_section): Gut and rewrite parsing.
        (obj_elf_change_section): New function broken out of obj_elf_section.
        (obj_elf_parse_section_letters): Likewise.
        (obj_elf_section_word): Likewise.
        (obj_elf_section_type): Likewise.
        (obj_elf_previous): Treat as a toggle.
        (obj_elf_popsection): New.
        * config/tc-ppc.c (ppc_section_word): Take str+len not ptr_str.
        (ppc_section_type): Likewise.
        * config/tc-ppc.h: Likewise.
        * expr.h (struct expressionS): Don't make X_op a bitfield.
        * config/tc-alpha.c: Update for symbol handling changes.
        (md_apply_fix) [case GPREL]: Use now_seg instead of absolute_section.
        (load_expression, emit_ir_load, emit_loadstore, emit_jsrjmp): Likewise.
This commit is contained in:
Richard Henderson 1999-06-05 23:15:34 +00:00
parent 9894490542
commit 9de8d8f184
7 changed files with 338 additions and 250 deletions

View File

@ -1,3 +1,27 @@
1999-06-05 Richard Henderson <rth@cygnus.com>
* dwarf2dbg.c (dwarf2_gen_line_info): Mirror the section symbol
creation logic from obj_elf_create_section.
* config/obj-elf.c (elf_pseudo_tab): Add pushsection/popsection.
(section_stack): New.
(special_sections): Make const.
(obj_elf_section): Gut and rewrite parsing.
(obj_elf_change_section): New function broken out of obj_elf_section.
(obj_elf_parse_section_letters): Likewise.
(obj_elf_section_word): Likewise.
(obj_elf_section_type): Likewise.
(obj_elf_previous): Treat as a toggle.
(obj_elf_popsection): New.
* config/tc-ppc.c (ppc_section_word): Take str+len not ptr_str.
(ppc_section_type): Likewise.
* config/tc-ppc.h: Likewise.
* expr.h (struct expressionS): Don't make X_op a bitfield.
* config/tc-alpha.c: Update for symbol handling changes.
(md_apply_fix) [case GPREL]: Use now_seg instead of absolute_section.
(load_expression, emit_ir_load, emit_loadstore, emit_jsrjmp): Likewise.
1999-06-05 Richard Henderson <rth@cygnus.com>
* dwarf2dbg.c (*): Convert to K&R + prototypes.

View File

@ -1,6 +1,5 @@
/* ELF object file format
Copyright (C) 1992, 93, 94, 95, 96, 97, 98, 1999
Free Software Foundation, Inc.
Copyright (C) 1992, 93-98, 1999 Free Software Foundation, Inc.
This file is part of GAS, the GNU Assembler.
@ -73,6 +72,7 @@ static void obj_elf_vtable_entry PARAMS ((int));
static void obj_elf_data PARAMS ((int));
static void obj_elf_text PARAMS ((int));
static void obj_elf_subsection PARAMS ((int));
static void obj_elf_popsection PARAMS ((int));
static const pseudo_typeS elf_pseudo_table[] =
{
@ -85,6 +85,8 @@ static const pseudo_typeS elf_pseudo_table[] =
{"section.s", obj_elf_section, 0},
{"sect", obj_elf_section, 0},
{"sect.s", obj_elf_section, 0},
{"pushsection", obj_elf_section, 1},
{"popsection", obj_elf_popsection, 0},
{"size", obj_elf_size, 0},
{"type", obj_elf_type, 0},
{"version", obj_elf_version, 0},
@ -472,6 +474,16 @@ obj_elf_weak (ignore)
static segT previous_section;
static int previous_subsection;
struct section_stack
{
struct section_stack *next;
segT seg, prev_seg;
int subseg, prev_subseg;
};
static struct section_stack *section_stack;
/* Handle the .section pseudo-op. This code supports two different
syntaxes.
@ -499,7 +511,7 @@ struct special_section
int attributes;
};
static struct special_section special_sections[] =
static struct special_section const special_sections[] =
{
{ ".bss", SHT_NOBITS, SHF_ALLOC + SHF_WRITE },
{ ".comment", SHT_PROGBITS, 0 },
@ -538,25 +550,197 @@ static struct special_section special_sections[] =
};
void
obj_elf_section (xxx)
int xxx;
obj_elf_change_section (name, type, attr, push)
char *name;
int type, attr, push;
{
char *string;
int new_sec;
segT sec;
int type, attr;
int i;
flagword flags;
symbolS *secsym;
#ifdef md_flush_pending_output
md_flush_pending_output ();
#endif
/* Switch to the section, creating it if necessary. */
if (push)
{
struct section_stack *elt;
elt = xmalloc (sizeof (struct section_stack));
elt->next = section_stack;
elt->seg = now_seg;
elt->prev_seg = previous_section;
elt->subseg = now_subseg;
elt->prev_subseg = previous_subsection;
section_stack = elt;
}
previous_section = now_seg;
previous_subsection = now_subseg;
new_sec = bfd_get_section_by_name (stdoutput, name) == NULL;
sec = subseg_new (name, 0);
if (new_sec)
{
flagword flags;
symbolS *secsym;
int i;
/* See if this is one of the special sections. */
for (i = 0; special_sections[i].name != NULL; i++)
if (strcmp (name, special_sections[i].name) == 0)
{
if (type == SHT_NULL)
type = special_sections[i].type;
else if (type != special_sections[i].type)
as_warn (_("Setting incorrect section type for %s"), name);
if ((attr &~ special_sections[i].attributes) != 0)
{
/* As a GNU extension, we permit a .note section to be
allocatable. If the linker sees an allocateable .note
section, it will create a PT_NOTE segment in the output
file. */
if (strcmp (name, ".note") != 0
|| attr != SHF_ALLOC)
as_warn (_("Setting incorrect section attributes for %s"),
name);
}
attr |= special_sections[i].attributes;
break;
}
/* Convert ELF type and flags to BFD flags. */
flags = (SEC_RELOC
| ((attr & SHF_WRITE) ? 0 : SEC_READONLY)
| ((attr & SHF_ALLOC) ? SEC_ALLOC : 0)
| (((attr & SHF_ALLOC) && type != SHT_NOBITS) ? SEC_LOAD : 0)
| ((attr & SHF_EXECINSTR) ? SEC_CODE : 0));
#ifdef md_elf_section_flags
flags = md_elf_section_flags (flags, attr, type);
#endif
/* Prevent SEC_HAS_CONTENTS from being inadvertently set. */
if (type == SHT_NOBITS)
seg_info (sec)->bss = 1;
bfd_set_section_flags (stdoutput, sec, flags);
/* Add a symbol for this section to the symbol table. */
secsym = symbol_find (name);
if (secsym != NULL)
symbol_set_bfdsym (secsym, sec->symbol);
else
symbol_table_insert (section_symbol (sec));
}
#ifdef md_elf_section_change_hook
md_elf_section_change_hook ();
#endif
}
int
obj_elf_parse_section_letters (str, len)
char *str;
size_t len;
{
int attr = 0;
while (len > 0)
{
switch (*str)
{
case 'a':
attr |= SHF_ALLOC;
break;
case 'w':
attr |= SHF_WRITE;
break;
case 'x':
attr |= SHF_EXECINSTR;
break;
default:
{
char *bad_msg = _("Unrecognized .section attribute: want a,w,x");
#ifdef md_elf_section_letter
int md_attr = md_elf_section_letter (*str, &bad_msg);
if (md_attr >= 0)
attr |= md_attr;
else
#endif
{
as_warn (bad_msg);
attr = -1;
}
}
break;
}
str++, len--;
}
return attr;
}
int
obj_elf_section_word (str, len)
char *str;
size_t len;
{
if (len == 5 && strncmp (str, "write", 5) == 0)
return SHF_WRITE;
if (len == 5 && strncmp (str, "alloc", 5) == 0)
return SHF_ALLOC;
if (len == 9 && strncmp (str, "execinstr", 9) == 0)
return SHF_EXECINSTR;
#ifdef md_elf_section_word
{
int md_attr = md_elf_section_word (str, len);
if (md_attr >= 0)
return md_attr;
}
#endif
as_warn (_("Unrecognized section attribute"));
return 0;
}
int
obj_elf_section_type (str, len)
char *str;
size_t len;
{
if (len == 8 && strncmp (str, "progbits", 8) == 0)
return SHT_PROGBITS;
if (len == 6 && strncmp (str, "nobits", 6) == 0)
return SHT_NOBITS;
#ifdef md_elf_section_type
{
int md_type = md_elf_section_type (str, len);
if (md_type >= 0)
return md_type;
}
#endif
as_warn (_("Unrecognized section type"));
return 0;
}
void
obj_elf_section (push)
int push;
{
char *name, *beg, *end;
int type, attr, dummy;
if (flag_mri)
{
char mri_type;
#ifdef md_flush_pending_output
md_flush_pending_output ();
#endif
previous_section = now_seg;
previous_subsection = now_subseg;
@ -573,8 +757,8 @@ obj_elf_section (xxx)
SKIP_WHITESPACE ();
if (*input_line_pointer == '"')
{
string = demand_copy_C_string (&xxx);
if (string == NULL)
name = demand_copy_C_string (&dummy);
if (name == NULL)
{
ignore_rest_of_line ();
return;
@ -582,46 +766,21 @@ obj_elf_section (xxx)
}
else
{
char *p = input_line_pointer;
char c;
while (0 == strchr ("\n\t,; ", *p))
p++;
if (p == input_line_pointer)
end = input_line_pointer;
while (0 == strchr ("\n\t,; ", *end))
end++;
if (end == input_line_pointer)
{
as_warn (_("Missing section name"));
ignore_rest_of_line ();
return;
}
c = *p;
*p = 0;
string = xmalloc ((unsigned long) (p - input_line_pointer + 1));
strcpy (string, input_line_pointer);
*p = c;
input_line_pointer = p;
name = xmalloc (end - input_line_pointer + 1);
memcpy (name, input_line_pointer, end - input_line_pointer);
name[end - input_line_pointer] = '\0';
input_line_pointer = end;
}
/* Switch to the section, creating it if necessary. */
previous_section = now_seg;
previous_subsection = now_subseg;
new_sec = bfd_get_section_by_name (stdoutput, string) == NULL;
sec = subseg_new (string, 0);
/* If this section already existed, we don't bother to change the
flag values. */
if (! new_sec)
{
while (! is_end_of_line[(unsigned char) *input_line_pointer])
++input_line_pointer;
++input_line_pointer;
#ifdef md_elf_section_change_hook
md_elf_section_change_hook ();
#endif
return;
}
SKIP_WHITESPACE ();
type = SHT_NULL;
@ -631,81 +790,43 @@ obj_elf_section (xxx)
{
/* Skip the comma. */
++input_line_pointer;
SKIP_WHITESPACE ();
if (*input_line_pointer == '"')
{
/* Pick up a string with a combination of a, w, x. */
++input_line_pointer;
while (*input_line_pointer != '"')
beg = demand_copy_C_string (&dummy);
if (beg == NULL)
{
switch (*input_line_pointer)
{
case 'a':
attr |= SHF_ALLOC;
break;
case 'w':
attr |= SHF_WRITE;
break;
case 'x':
attr |= SHF_EXECINSTR;
break;
default:
{
char *bad_msg = _("Bad .section directive: want a,w,x in string");
#ifdef md_elf_section_letter
int md_attr = md_elf_section_letter (*input_line_pointer, &bad_msg);
if (md_attr)
attr |= md_attr;
else
#endif
{
as_warn (bad_msg);
ignore_rest_of_line ();
return;
}
}
}
++input_line_pointer;
ignore_rest_of_line ();
return;
}
/* Skip the closing quote. */
++input_line_pointer;
attr |= obj_elf_parse_section_letters (beg, strlen (beg));
free (beg);
SKIP_WHITESPACE ();
if (*input_line_pointer == ',')
{
char c;
++input_line_pointer;
SKIP_WHITESPACE ();
if (*input_line_pointer == '@' || *input_line_pointer == '%')
c = *input_line_pointer;
if (c == '"')
{
++input_line_pointer;
if (strncmp (input_line_pointer, "progbits",
sizeof "progbits" - 1) == 0)
beg = demand_copy_C_string (&dummy);
if (beg == NULL)
{
type = SHT_PROGBITS;
input_line_pointer += sizeof "progbits" - 1;
}
else if (strncmp (input_line_pointer, "nobits",
sizeof "nobits" - 1) == 0)
{
type = SHT_NOBITS;
input_line_pointer += sizeof "nobits" - 1;
}
else
{
#ifdef md_elf_section_type
int md_type = md_elf_section_type (&input_line_pointer);
if (md_type)
type = md_type;
else
#endif
{
as_warn (_("Unrecognized section type"));
ignore_rest_of_line ();
}
ignore_rest_of_line ();
return;
}
type = obj_elf_section_type (beg, strlen (beg));
free (beg);
}
else if (c == '@' || c == '%')
{
beg = ++input_line_pointer;
c = get_symbol_end ();
*input_line_pointer = c;
type = obj_elf_section_type (beg, input_line_pointer - beg);
}
}
}
@ -713,6 +834,8 @@ obj_elf_section (xxx)
{
do
{
char c;
SKIP_WHITESPACE ();
if (*input_line_pointer != '#')
{
@ -720,39 +843,12 @@ obj_elf_section (xxx)
ignore_rest_of_line ();
return;
}
++input_line_pointer;
if (strncmp (input_line_pointer, "write",
sizeof "write" - 1) == 0)
{
attr |= SHF_WRITE;
input_line_pointer += sizeof "write" - 1;
}
else if (strncmp (input_line_pointer, "alloc",
sizeof "alloc" - 1) == 0)
{
attr |= SHF_ALLOC;
input_line_pointer += sizeof "alloc" - 1;
}
else if (strncmp (input_line_pointer, "execinstr",
sizeof "execinstr" - 1) == 0)
{
attr |= SHF_EXECINSTR;
input_line_pointer += sizeof "execinstr" - 1;
}
else
{
#ifdef md_elf_section_word
int md_attr = md_elf_section_word (&input_line_pointer);
if (md_attr)
attr |= md_attr;
else
#endif
{
as_warn (_("Unrecognized section attribute"));
ignore_rest_of_line ();
return;
}
}
beg = ++input_line_pointer;
c = get_symbol_end ();
*input_line_pointer = c;
attr |= obj_elf_section_word (beg, input_line_pointer - beg);
SKIP_WHITESPACE ();
}
while (*input_line_pointer++ == ',');
@ -760,72 +856,9 @@ obj_elf_section (xxx)
}
}
/* See if this is one of the special sections. */
for (i = 0; special_sections[i].name != NULL; i++)
{
if (string[1] == special_sections[i].name[1]
&& strcmp (string, special_sections[i].name) == 0)
{
if (type == SHT_NULL)
type = special_sections[i].type;
else if (type != special_sections[i].type)
as_warn (_("Setting incorrect section type for %s"), string);
if ((attr &~ special_sections[i].attributes) != 0)
{
/* As a GNU extension, we permit a .note section to be
allocatable. If the linker sees an allocateable
.note section, it will create a PT_NOTE segment in
the output file. */
if (strcmp (string, ".note") != 0
|| attr != SHF_ALLOC)
as_warn (_("Setting incorrect section attributes for %s"),
string);
}
attr |= special_sections[i].attributes;
break;
}
}
flags = (SEC_RELOC
| ((attr & SHF_WRITE) ? 0 : SEC_READONLY)
| ((attr & SHF_ALLOC) ? SEC_ALLOC : 0)
| (((attr & SHF_ALLOC) && type != SHT_NOBITS) ? SEC_LOAD : 0)
| ((attr & SHF_EXECINSTR) ? SEC_CODE : 0));
if (special_sections[i].name == NULL)
{
if (type == SHT_PROGBITS)
flags |= SEC_ALLOC | SEC_LOAD;
else if (type == SHT_NOBITS)
{
flags |= SEC_ALLOC;
flags &=~ SEC_LOAD;
}
#ifdef md_elf_section_flags
flags = md_elf_section_flags (flags, attr, type);
#endif
}
/* Prevent SEC_HAS_CONTENTS from being inadvertently set. */
if (type == SHT_NOBITS)
seg_info (sec)->bss = 1;
bfd_set_section_flags (stdoutput, sec, flags);
/* Add a symbol for this section to the symbol table. */
secsym = symbol_find (string);
if (secsym != NULL)
symbol_set_bfdsym (secsym, sec->symbol);
else
symbol_table_insert (section_symbol (sec));
#ifdef md_elf_section_change_hook
md_elf_section_change_hook ();
#endif
demand_empty_rest_of_line ();
obj_elf_change_section (name, type, attr, push);
}
/* Change to the .data section. */
@ -902,6 +935,9 @@ void
obj_elf_previous (ignore)
int ignore;
{
segT new_section;
int new_subsection;
if (previous_section == 0)
{
as_bad (_(".previous without corresponding .section; ignored"));
@ -912,8 +948,38 @@ obj_elf_previous (ignore)
md_flush_pending_output ();
#endif
subseg_set (previous_section, previous_subsection);
previous_section = 0;
new_section = previous_section;
new_subsection = previous_subsection;
previous_section = now_seg;
previous_subsection = now_subseg;
subseg_set (new_section, new_subsection);
#ifdef md_elf_section_change_hook
md_elf_section_change_hook ();
#endif
}
static void
obj_elf_popsection (xxx)
int xxx;
{
struct section_stack *top = section_stack;
if (top == NULL)
{
as_bad (_(".popsection without corresponding .pushsection; ignored"));
return;
}
#ifdef md_flush_pending_output
md_flush_pending_output ();
#endif
section_stack = top->next;
previous_section = top->prev_seg;
previous_subsection = top->prev_subseg;
subseg_set (top->seg, top->subseg);
free (top);
#ifdef md_elf_section_change_hook
md_elf_section_change_hook ();

View File

@ -4,7 +4,7 @@
Written by Alessandro Forin, based on earlier gas-1.38 target CPU files.
Modified by Ken Raeburn for gas-2.x and ECOFF support.
Modified by Richard Henderson for ELF support.
Modified by Klaus K"ampf for EVAX (openVMS/Alpha) support.
Modified by Klaus K"ampf for EVAX (OpenVMS/Alpha) support.
This file is part of GAS, the GNU Assembler.
@ -1081,7 +1081,7 @@ md_apply_fix (fixP, valueP)
#endif
do_reloc_gp:
fixP->fx_addsy = section_symbol (absolute_section);
fixP->fx_addsy = section_symbol (now_seg);
md_number_to_chars (fixpos, value, 2);
break;
@ -2110,9 +2110,6 @@ FIXME
expressionS newtok[3];
expressionS addend;
/* We're going to need this symbol in md_apply_fix(). */
(void) section_symbol (absolute_section);
#ifdef OBJ_ECOFF
if (regno (tok[2].X_add_number) == AXP_REG_PV)
ecoff_set_gp_prolog_size (0);
@ -2499,7 +2496,8 @@ load_expression (targreg, exp, pbasereg, poffset)
}
insn.nfixups++;
insn.fixups[0].reloc = BFD_RELOC_ALPHA_LITUSE;
insn.fixups[0].exp.X_op = O_constant;
insn.fixups[0].exp.X_op = O_symbol;
insn.fixups[0].exp.X_add_symbol = section_symbol (now_seg);
insn.fixups[0].exp.X_add_number = 1;
emit_lituse = 0;
@ -2650,7 +2648,8 @@ emit_ir_load (tok, ntok, opname)
}
insn.nfixups++;
insn.fixups[0].reloc = BFD_RELOC_ALPHA_LITUSE;
insn.fixups[0].exp.X_op = O_constant;
insn.fixups[0].exp.X_op = O_symbol;
insn.fixups[0].exp.X_add_symbol = section_symbol (now_seg);
insn.fixups[0].exp.X_add_number = 1;
}
@ -2703,7 +2702,8 @@ emit_loadstore (tok, ntok, opname)
}
insn.nfixups++;
insn.fixups[0].reloc = BFD_RELOC_ALPHA_LITUSE;
insn.fixups[0].exp.X_op = O_constant;
insn.fixups[0].exp.X_op = O_symbol;
insn.fixups[0].exp.X_add_symbol = section_symbol (now_seg);
insn.fixups[0].exp.X_add_number = 1;
}
@ -3288,7 +3288,8 @@ emit_jsrjmp (tok, ntok, vopname)
}
insn.nfixups++;
insn.fixups[0].reloc = BFD_RELOC_ALPHA_LITUSE;
insn.fixups[0].exp.X_op = O_constant;
insn.fixups[0].exp.X_op = O_symbol;
insn.fixups[0].exp.X_add_symbol = section_symbol (now_seg);
insn.fixups[0].exp.X_add_number = 3;
}
@ -3458,7 +3459,7 @@ s_alpha_comm (ignore)
p = frag_more (temp);
new_seg->flags |= SEC_IS_COMMON;
if (! S_IS_DEFINED (symbolP))
symbolP->bsym->section = new_seg;
S_SET_SEGMENT (symbolP, new_seg);
#else
S_SET_VALUE (symbolP, (valueT) temp);
#endif
@ -3767,7 +3768,7 @@ s_alpha_ent (ignore)
}
symbol = make_expr_symbol (&symexpr);
symbol->bsym->flags |= BSF_FUNCTION;
symbol_get_bfdsym (symbol)->flags |= BSF_FUNCTION;
alpha_evax_proc.symbol = symbol;
demand_empty_rest_of_line ();
@ -3851,7 +3852,8 @@ s_alpha_pdesc (ignore)
entry_sym = make_expr_symbol (&exp);
/* Save bfd symbol of proc desc in function symbol. */
alpha_evax_proc.symbol->bsym->udata.p = (PTR)entry_sym->bsym;
symbol_get_bfdsym (alpha_evax_proc.symbol)->udata.p
= symbol_get_bfdsym (entry_sym);
SKIP_WHITESPACE ();
if (*input_line_pointer++ != ',')
@ -4142,14 +4144,14 @@ s_alpha_file (ignore)
extern char *demand_copy_string PARAMS ((int *lenP));
sprintf (case_hack, "<CASE:%01d%01d>",
alpha_flag_hash_long_names, alpha_flag_show_after_trunc);
alpha_flag_hash_long_names, alpha_flag_show_after_trunc);
s = symbol_find_or_make (case_hack);
s->bsym->flags |= BSF_FILE;
symbol_get_bfdsym (s)->flags |= BSF_FILE;
get_absolute_expression ();
s = symbol_find_or_make (demand_copy_string (&length));
s->bsym->flags |= BSF_FILE;
symbol_get_bfdsym (s)->flags |= BSF_FILE;
demand_empty_rest_of_line ();
return;

View File

@ -2126,29 +2126,25 @@ ppc_section_letter (letter, ptr_msg)
}
int
ppc_section_word (ptr_str)
char **ptr_str;
ppc_section_word (str, len)
char *str;
size_t len;
{
if (strncmp (*ptr_str, "exclude", sizeof ("exclude")-1) == 0)
{
*ptr_str += sizeof ("exclude")-1;
return SHF_EXCLUDE;
}
if (len == 7 && strncmp (str, "exclude", 7) == 0)
return SHF_EXCLUDE;
return 0;
return -1;
}
int
ppc_section_type (ptr_str)
char **ptr_str;
ppc_section_type (str, len)
char *str;
size_t len;
{
if (strncmp (*ptr_str, "ordered", sizeof ("ordered")-1) == 0)
{
*ptr_str += sizeof ("ordered")-1;
return SHT_ORDERED;
}
if (len == 7 && strncmp (str, "ordered", 7) == 0)
return SHT_ORDERED;
return 0;
return -1;
}
int

View File

@ -208,13 +208,13 @@ extern void ppc_adjust_symtab PARAMS ((void));
/* Support for SHF_EXCLUDE and SHT_ORDERED */
extern int ppc_section_letter PARAMS ((int, char **));
extern int ppc_section_type PARAMS ((char **));
extern int ppc_section_word PARAMS ((char **));
extern int ppc_section_type PARAMS ((char *, size_t));
extern int ppc_section_word PARAMS ((char *, size_t));
extern int ppc_section_flags PARAMS ((int, int, int));
#define md_elf_section_letter(LETTER, PTR_MSG) ppc_section_letter (LETTER, PTR_MSG)
#define md_elf_section_type(PTR_STR) ppc_section_type (PTR_STR)
#define md_elf_section_word(PTR_STR) ppc_section_word (PTR_STR)
#define md_elf_section_type(STR, LEN) ppc_section_type (STR, LEN)
#define md_elf_section_word(STR, LEN) ppc_section_word (STR, LEN)
#define md_elf_section_flags(FLAGS, ATTR, TYPE) ppc_section_flags (FLAGS, ATTR, TYPE)
/* Add extra PPC sections -- Note, for now, make .sbss2 and .PPC.EMB.sbss0 a

View File

@ -393,11 +393,17 @@ dwarf2_gen_line_info (addr, l)
if (!ls.line_seg)
{
symbolS *secsym;
ls.line_seg = subseg_new (".debug_line", 0);
bfd_set_section_flags (stdoutput, ls.line_seg, SEC_READONLY);
/* We're going to need this symbol. */
(void) section_symbol (ls.line_seg);
secsym = symbol_find (".debug_line");
if (secsym != NULL)
symbol_set_bfdsym (secsym, ls.line_seg->symbol);
else
symbol_table_insert (section_symbol (ls.line_seg));
}
saved_seg = now_seg;

View File

@ -116,14 +116,8 @@ typedef struct expressionS
symbolS *X_op_symbol;
/* A number to add. */
offsetT X_add_number;
/* The type of the expression. We can't assume that an arbitrary
compiler can handle a bitfield of enum type. FIXME: We could
check this using autoconf. */
#ifdef __GNUC__
operatorT X_op : 5;
#else
unsigned X_op : 5;
#endif
/* The type of the expression. */
operatorT X_op;
/* Non-zero if X_add_number should be regarded as unsigned. This is
only valid for O_constant expressions. It is only used when an
O_constant must be extended into a bignum (i.e., it is not used