aboutsummaryrefslogtreecommitdiff
path: root/gas/config
diff options
context:
space:
mode:
authorAlan Modra <amodra@gmail.com>2003-12-13 08:23:05 +0000
committerAlan Modra <amodra@gmail.com>2003-12-13 08:23:05 +0000
commite13bab5a71e5c7274ffbe699673c38744940fe01 (patch)
tree927d3197723e492670657b9c6b496dc7027dc43a /gas/config
parent503ff15d3831702b6020a5e0f37540cbd41c77d2 (diff)
downloadgdb-e13bab5a71e5c7274ffbe699673c38744940fe01.zip
gdb-e13bab5a71e5c7274ffbe699673c38744940fe01.tar.gz
gdb-e13bab5a71e5c7274ffbe699673c38744940fe01.tar.bz2
* read.c: Remove unneeded prototypes.
(s_comm): Split out code to.. (s_comm_internal): ..here. Tidy error returns. Rearrange so that "name" from input line may be used in more places. Merge code testing for valid size from elf_common. Merge code from s_lcomm_internal. Call comm_parse_extra. (bss_alloc): New function, split out of s_lcomm_internal and elf_common. (parse_align): Likewise. (s_lcomm_internal): Rewrite. (s_lcomm, s_lcomm_bytes): Use s_comm_internal. * read.h (bss_alloc, parse_align, s_comm_internal): Declare. * config/obj-elf.c (elf_common): Split out code to.. (elf_common_parse): ..here. Remove code common to s_comm_internal, parse_align and bss_alloc. Rearrange and Tidy. * config/tc-alpha.h (TC_IMPLICIT_LCOMM_ALIGNMENT): Define.
Diffstat (limited to 'gas/config')
-rw-r--r--gas/config/obj-elf.c202
-rw-r--r--gas/config/tc-alpha.h15
2 files changed, 71 insertions, 146 deletions
diff --git a/gas/config/obj-elf.c b/gas/config/obj-elf.c
index 697dd4f..dd33ec4 100644
--- a/gas/config/obj-elf.c
+++ b/gas/config/obj-elf.c
@@ -63,7 +63,6 @@ static void adjust_stab_sections PARAMS ((bfd *, asection *, PTR));
static void build_group_lists PARAMS ((bfd *, asection *, PTR));
static int elf_separate_stab_sections PARAMS ((void));
static void elf_init_stab_section PARAMS ((segT));
-static symbolS *elf_common PARAMS ((int));
#ifdef NEED_ECOFF_DEBUG
static bfd_boolean elf_get_extr PARAMS ((asymbol *, EXTR *));
@@ -287,185 +286,96 @@ elf_file_symbol (s)
#endif
}
+/* Called from read.c:s_comm after we've parsed .comm symbol, size.
+ Parse a possible alignment value. */
+
static symbolS *
-elf_common (is_common)
- int is_common;
+elf_common_parse (int ignore ATTRIBUTE_UNUSED, symbolS *symbolP, addressT size)
{
- char *name;
- char c;
- char *p;
- offsetT temp, size, sign;
- symbolS *symbolP;
- int have_align;
- expressionS exp;
+ addressT align = 0;
+ int is_local = symbol_get_obj (symbolP)->local;
- if (flag_mri && is_common)
+ if (*input_line_pointer == ',')
{
- s_mri_common (0);
- return NULL;
- }
+ char *save = input_line_pointer;
- name = input_line_pointer;
- c = get_symbol_end ();
- /* just after name is now '\0' */
- p = input_line_pointer;
- *p = c;
- SKIP_WHITESPACE ();
- if (*input_line_pointer != ',')
- {
- as_bad (_("expected comma after symbol-name"));
- ignore_rest_of_line ();
- return NULL;
- }
- input_line_pointer++; /* skip ',' */
- temp = get_absolute_expr (&exp);
- sign = (offsetT) 1 << (stdoutput->arch_info->bits_per_address - 1);
- size = temp & ((sign << 1) - 1);
- if (temp != size || !exp.X_unsigned)
- {
- as_bad (_(".COMMon length (%ld) out of range, ignored."), (long) temp);
- ignore_rest_of_line ();
- return NULL;
- }
- *p = 0;
- symbolP = symbol_find_or_make (name);
- *p = c;
- if (S_IS_DEFINED (symbolP) && ! S_IS_COMMON (symbolP))
- {
- as_bad (_("symbol `%s' is already defined"), S_GET_NAME (symbolP));
- ignore_rest_of_line ();
- return NULL;
- }
- if (S_GET_VALUE (symbolP) != 0)
- {
- if (S_GET_VALUE (symbolP) != (valueT) size)
- {
- as_warn (_("length of .comm \"%s\" is already %ld; not changed to %ld"),
- S_GET_NAME (symbolP), (long) S_GET_VALUE (symbolP),
- (long) size);
- }
- }
- know (symbolP->sy_frag == &zero_address_frag);
- if (*input_line_pointer != ',')
- have_align = 0;
- else
- {
- have_align = 1;
input_line_pointer++;
SKIP_WHITESPACE ();
- }
- if (! have_align || *input_line_pointer != '"')
- {
- if (! have_align)
- temp = 0;
- else
- {
- temp = get_absolute_expr (&exp);
- if (!exp.X_unsigned)
- {
- temp = 0;
- as_warn (_("common alignment negative; 0 assumed"));
- }
- }
- if (symbol_get_obj (symbolP)->local)
+
+ if (*input_line_pointer == '"')
{
- segT old_sec;
- int old_subsec;
- char *pfrag;
- int align;
-
- /* allocate_bss: */
- old_sec = now_seg;
- old_subsec = now_subseg;
- if (temp)
+ /* For sparc. Accept .common symbol, length, "bss" */
+ input_line_pointer++;
+ /* Some use the dot, some don't. */
+ if (*input_line_pointer == '.')
+ input_line_pointer++;
+ /* Some say data, some say bss. */
+ if (strncmp (input_line_pointer, "bss\"", 4) == 0)
+ input_line_pointer += 4;
+ else if (strncmp (input_line_pointer, "data\"", 5) == 0)
+ input_line_pointer += 5;
+ else
{
- /* convert to a power of 2 alignment */
- for (align = 0; (temp & 1) == 0; temp >>= 1, ++align);
- if (temp != 1)
- {
- as_bad (_("common alignment not a power of 2"));
- ignore_rest_of_line ();
- return NULL;
- }
+ char *p = input_line_pointer;
+ char c;
+
+ while (*--p != '"')
+ ;
+ while (!is_end_of_line[(unsigned char) *input_line_pointer])
+ if (*input_line_pointer++ == '"')
+ break;
+ c = *input_line_pointer;
+ *input_line_pointer = '\0';
+ as_bad (_("bad .common segment %s"), p);
+ *input_line_pointer = c;
+ ignore_rest_of_line ();
+ return NULL;
}
- else
- align = 0;
- record_alignment (bss_section, align);
- subseg_set (bss_section, 0);
- if (align)
- frag_align (align, 0, 0);
- if (S_GET_SEGMENT (symbolP) == bss_section)
- symbol_get_frag (symbolP)->fr_symbol = 0;
- symbol_set_frag (symbolP, frag_now);
- pfrag = frag_var (rs_org, 1, 1, (relax_substateT) 0, symbolP,
- (offsetT) size, (char *) 0);
- *pfrag = 0;
- S_SET_SIZE (symbolP, size);
- S_SET_SEGMENT (symbolP, bss_section);
- S_CLEAR_EXTERNAL (symbolP);
- subseg_set (old_sec, old_subsec);
+ /* ??? Don't ask me why these are always global. */
+ is_local = 0;
}
else
{
- allocate_common:
- S_SET_VALUE (symbolP, (valueT) size);
- S_SET_ALIGN (symbolP, temp);
- S_SET_EXTERNAL (symbolP);
- S_SET_SEGMENT (symbolP, bfd_com_section_ptr);
+ input_line_pointer = save;
+ align = parse_align (is_local);
+ if (align == (addressT) -1)
+ return NULL;
}
}
+
+ if (is_local)
+ {
+ bss_alloc (symbolP, size, align);
+ S_CLEAR_EXTERNAL (symbolP);
+ }
else
{
- input_line_pointer++;
- /* @@ Some use the dot, some don't. Can we get some consistency?? */
- if (*input_line_pointer == '.')
- input_line_pointer++;
- /* @@ Some say data, some say bss. */
- if (strncmp (input_line_pointer, "bss\"", 4)
- && strncmp (input_line_pointer, "data\"", 5))
- {
- while (*--input_line_pointer != '"')
- ;
- input_line_pointer--;
- goto bad_common_segment;
- }
- while (*input_line_pointer++ != '"')
- ;
- goto allocate_common;
+ S_SET_VALUE (symbolP, size);
+ S_SET_ALIGN (symbolP, align);
+ S_SET_EXTERNAL (symbolP);
+ S_SET_SEGMENT (symbolP, bfd_com_section_ptr);
}
symbol_get_bfdsym (symbolP)->flags |= BSF_OBJECT;
- demand_empty_rest_of_line ();
return symbolP;
-
- {
- bad_common_segment:
- p = input_line_pointer;
- while (*p && *p != '\n')
- p++;
- c = *p;
- *p = '\0';
- as_bad (_("bad .common segment %s"), input_line_pointer + 1);
- *p = c;
- input_line_pointer = p;
- ignore_rest_of_line ();
- return NULL;
- }
}
void
obj_elf_common (is_common)
int is_common;
{
- elf_common (is_common);
+ if (flag_mri && is_common)
+ s_mri_common (0);
+ else
+ s_comm_internal (0, elf_common_parse);
}
static void
obj_elf_tls_common (ignore)
int ignore ATTRIBUTE_UNUSED;
{
- symbolS *symbolP = elf_common (0);
+ symbolS *symbolP = s_comm_internal (0, elf_common_parse);
if (symbolP)
symbol_get_bfdsym (symbolP)->flags |= BSF_THREAD_LOCAL;
diff --git a/gas/config/tc-alpha.h b/gas/config/tc-alpha.h
index 5287686..939a14f 100644
--- a/gas/config/tc-alpha.h
+++ b/gas/config/tc-alpha.h
@@ -80,6 +80,21 @@ extern valueT alpha_gp_value;
: BFD_RELOC_ALPHA_LINKAGE);
#endif
+#ifndef VMS
+#define TC_IMPLICIT_LCOMM_ALIGNMENT(size, align) \
+ do \
+ { \
+ align = 0; \
+ if (size > 1) \
+ { \
+ addressT temp = 1; \
+ while ((size & temp) == 0) \
+ ++align, temp <<= 1; \
+ } \
+ } \
+ while (0)
+#endif
+
#define md_number_to_chars number_to_chars_littleendian
extern int tc_get_register PARAMS ((int frame));