projects
/
deliverable
/
binutils-gdb.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
S/390: Fix 16 bit pc relative relocs.
[deliverable/binutils-gdb.git]
/
gas
/
config
/
tc-alpha.c
diff --git
a/gas/config/tc-alpha.c
b/gas/config/tc-alpha.c
index 013647d13effee38356c9794af69ae913343def8..f7656ec7ee253bb5ee71eb323b43cac0065b0f9c 100644
(file)
--- a/
gas/config/tc-alpha.c
+++ b/
gas/config/tc-alpha.c
@@
-1,7
+1,5
@@
/* tc-alpha.c - Processor-specific code for the DEC Alpha AXP CPU.
/* tc-alpha.c - Processor-specific code for the DEC Alpha AXP CPU.
- Copyright 1989, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
- 2001, 2002, 2003, 2004, 2005, 2007, 2008, 2009, 2010
- Free Software Foundation, Inc.
+ Copyright (C) 1989-2016 Free Software Foundation, Inc.
Contributed by Carnegie Mellon University, 1993.
Written by Alessandro Forin, based on earlier gas-1.38 target CPU files.
Modified by Ken Raeburn for gas-2.x and ECOFF support.
Contributed by Carnegie Mellon University, 1993.
Written by Alessandro Forin, based on earlier gas-1.38 target CPU files.
Modified by Ken Raeburn for gas-2.x and ECOFF support.
@@
-243,7
+241,7
@@
const char EXP_CHARS[] = "eE";
/* Characters which mean that a number is a floating point constant,
as in 0d1.0. */
/* XXX: Do all of these really get used on the alpha?? */
/* Characters which mean that a number is a floating point constant,
as in 0d1.0. */
/* XXX: Do all of these really get used on the alpha?? */
-char FLT_CHARS[] = "rRsSfFdDxXpP";
+c
onst c
har FLT_CHARS[] = "rRsSfFdDxXpP";
#ifdef OBJ_EVAX
const char *md_shortopts = "Fm:g+1h:HG:";
#ifdef OBJ_EVAX
const char *md_shortopts = "Fm:g+1h:HG:";
@@
-267,7
+265,7
@@
struct option md_longopts[] =
#define OPTION_REPLACE (OPTION_RELAX + 1)
#define OPTION_NOREPLACE (OPTION_REPLACE+1)
{ "replace", no_argument, NULL, OPTION_REPLACE },
#define OPTION_REPLACE (OPTION_RELAX + 1)
#define OPTION_NOREPLACE (OPTION_REPLACE+1)
{ "replace", no_argument, NULL, OPTION_REPLACE },
- { "noreplace", no_argument, NULL, OPTION_NOREPLACE },
+ { "noreplace", no_argument, NULL, OPTION_NOREPLACE },
#endif
{ NULL, no_argument, NULL, 0 }
};
#endif
{ NULL, no_argument, NULL, 0 }
};
@@
-580,7
+578,7
@@
static void assemble_insn (const struct alpha_opcode *, const expressionS *, int
static void emit_insn (struct alpha_insn *);
static void assemble_tokens (const char *, const expressionS *, int, int);
#ifdef OBJ_EVAX
static void emit_insn (struct alpha_insn *);
static void assemble_tokens (const char *, const expressionS *, int, int);
#ifdef OBJ_EVAX
-static char *s_alpha_section_name (void);
+static c
onst c
har *s_alpha_section_name (void);
static symbolS *add_to_link_pool (symbolS *, offsetT);
#endif
\f
static symbolS *add_to_link_pool (symbolS *, offsetT);
#endif
\f
@@
-923,8
+921,7
@@
tokenize_arguments (char *str,
++input_line_pointer;
SKIP_WHITESPACE ();
++input_line_pointer;
SKIP_WHITESPACE ();
- p = input_line_pointer;
- c = get_symbol_end ();
+ c = get_symbol_name (&p);
/* Parse !relocation_type. */
len = input_line_pointer - p;
/* Parse !relocation_type. */
len = input_line_pointer - p;
@@
-945,7
+942,7
@@
tokenize_arguments (char *str,
}
*input_line_pointer = c;
}
*input_line_pointer = c;
- SKIP_WHITESPACE ();
+ SKIP_WHITESPACE
_AFTER_NAME
();
if (*input_line_pointer != '!')
{
if (r->require_seq)
if (*input_line_pointer != '!')
{
if (r->require_seq)
@@
-1008,6
+1005,7
@@
tokenize_arguments (char *str,
/* ... then fall through to plain expression. */
input_line_pointer = hold;
}
/* ... then fall through to plain expression. */
input_line_pointer = hold;
}
+ /* Fall through. */
default:
if (saw_arg && !saw_comma)
default:
if (saw_arg && !saw_comma)
@@
-1387,14
+1385,15
@@
load_expression (int targreg,
ptr1 = strstr (symname, "..") + 2;
if (ptr1 > ptr2)
ptr1 = symname;
ptr1 = strstr (symname, "..") + 2;
if (ptr1 > ptr2)
ptr1 = symname;
- ensymname =
(char *) alloca (
ptr2 - ptr1 + 5);
+ ensymname =
XNEWVEC (char,
ptr2 - ptr1 + 5);
memcpy (ensymname, ptr1, ptr2 - ptr1);
memcpy (ensymname + (ptr2 - ptr1), "..en", 5);
gas_assert (insn.nfixups + 1 <= MAX_INSN_FIXUPS);
insn.fixups[insn.nfixups].reloc = BFD_RELOC_ALPHA_NOP;
ensym = symbol_find_or_make (ensymname);
memcpy (ensymname, ptr1, ptr2 - ptr1);
memcpy (ensymname + (ptr2 - ptr1), "..en", 5);
gas_assert (insn.nfixups + 1 <= MAX_INSN_FIXUPS);
insn.fixups[insn.nfixups].reloc = BFD_RELOC_ALPHA_NOP;
ensym = symbol_find_or_make (ensymname);
- ensym->sy_used = 1;
+ free (ensymname);
+ symbol_mark_used (ensym);
/* The fixup must be the same as the BFD_RELOC_ALPHA_BOH
case in emit_jsrjmp. See B.4.5.2 of the OpenVMS Linker
Utility Manual. */
/* The fixup must be the same as the BFD_RELOC_ALPHA_BOH
case in emit_jsrjmp. See B.4.5.2 of the OpenVMS Linker
Utility Manual. */
@@
-1419,14
+1418,13
@@
load_expression (int targreg,
ptr1 = strstr (symname, "..") + 2;
if (ptr1 > ptr2)
ptr1 = symname;
ptr1 = strstr (symname, "..") + 2;
if (ptr1 > ptr2)
ptr1 = symname;
- psymname = (char *) alloca (ptr2 - ptr1 + 1);
- memcpy (psymname, ptr1, ptr2 - ptr1);
- psymname [ptr2 - ptr1] = 0;
+ psymname = xmemdup0 (ptr1, ptr2 - ptr1);
gas_assert (insn.nfixups + 1 <= MAX_INSN_FIXUPS);
insn.fixups[insn.nfixups].reloc = BFD_RELOC_ALPHA_LDA;
psym = symbol_find_or_make (psymname);
gas_assert (insn.nfixups + 1 <= MAX_INSN_FIXUPS);
insn.fixups[insn.nfixups].reloc = BFD_RELOC_ALPHA_LDA;
psym = symbol_find_or_make (psymname);
- psym->sy_used = 1;
+ free (psymname);
+ symbol_mark_used (psym);
insn.fixups[insn.nfixups].exp.X_op = O_subtract;
insn.fixups[insn.nfixups].exp.X_add_symbol = psym;
insn.fixups[insn.nfixups].exp.X_op_symbol = alpha_evax_proc->symbol;
insn.fixups[insn.nfixups].exp.X_op = O_subtract;
insn.fixups[insn.nfixups].exp.X_add_symbol = psym;
insn.fixups[insn.nfixups].exp.X_op_symbol = alpha_evax_proc->symbol;
@@
-1800,7
+1798,7
@@
emit_insn (struct alpha_insn *insn)
default:
gas_assert (size >= 1 && size <= 4);
}
default:
gas_assert (size >= 1 && size <= 4);
}
-
+
pcrel = reloc_howto->pc_relative;
}
pcrel = reloc_howto->pc_relative;
}
@@
-1976,7
+1974,7
@@
static unsigned
insert_operand (unsigned insn,
const struct alpha_operand *operand,
offsetT val,
insert_operand (unsigned insn,
const struct alpha_operand *operand,
offsetT val,
- char *file,
+ c
onst c
har *file,
unsigned line)
{
if (operand->bits != 32 && !(operand->flags & AXP_OPERAND_NOOVERFLOW))
unsigned line)
{
if (operand->bits != 32 && !(operand->flags & AXP_OPERAND_NOOVERFLOW))
@@
-1995,7
+1993,7
@@
insert_operand (unsigned insn,
}
if (val < min || val > max)
}
if (val < min || val > max)
- as_
warn
_value_out_of_range (_("operand"), val, min, max, file, line);
+ as_
bad
_value_out_of_range (_("operand"), val, min, max, file, line);
}
if (operand->insert)
}
if (operand->insert)
@@
-2139,7
+2137,7
@@
assemble_insn (const struct alpha_opcode *opcode,
/* If this is a real relocation (as opposed to a lituse hint), then
the relocation width should match the operand width.
/* If this is a real relocation (as opposed to a lituse hint), then
the relocation width should match the operand width.
- Take care of -MDISP in operand table. */
+ Take care of -MDISP in operand table. */
else if (reloc < BFD_RELOC_UNUSED && reloc > 0)
{
reloc_howto_type *reloc_howto
else if (reloc < BFD_RELOC_UNUSED && reloc > 0)
{
reloc_howto_type *reloc_howto
@@
-2192,7
+2190,7
@@
emit_ir_load (const expressionS *tok,
if (basereg == alpha_gp_register &&
(symlen > 4 && strcmp (&symname [symlen - 4], "..lk") == 0))
return;
if (basereg == alpha_gp_register &&
(symlen > 4 && strcmp (&symname [symlen - 4], "..lk") == 0))
return;
-
+
newtok[0] = tok[0];
set_tok_preg (newtok[2], basereg);
newtok[0] = tok[0];
set_tok_preg (newtok[2], basereg);
@@
-2233,7
+2231,7
@@
emit_loadstore (const expressionS *tok,
if (alpha_noat_on)
as_bad (_("macro requires $at register while noat in effect"));
if (alpha_noat_on)
as_bad (_("macro requires $at register while noat in effect"));
- lituse = load_expression (AXP_REG_AT, &tok[1],
+ lituse = load_expression (AXP_REG_AT, &tok[1],
&basereg, &newtok[1], (const char *) opname);
}
else
&basereg, &newtok[1], (const char *) opname);
}
else
@@
-2884,7
+2882,7
@@
emit_jsrjmp (const expressionS *tok,
char *ensymname;
/* Build the entry name as 'NAME..en'. */
char *ensymname;
/* Build the entry name as 'NAME..en'. */
- ensymname =
(char *) alloca (
symlen + 5);
+ ensymname =
XNEWVEC (char,
symlen + 5);
memcpy (ensymname, symname, symlen);
memcpy (ensymname + symlen, "..en", 5);
memcpy (ensymname, symname, symlen);
memcpy (ensymname + symlen, "..en", 5);
@@
-2906,6
+2904,7
@@
emit_jsrjmp (const expressionS *tok,
insn.fixups[0].procsym = alpha_evax_proc->symbol;
insn.nfixups++;
alpha_linkage_symbol = 0;
insn.fixups[0].procsym = alpha_evax_proc->symbol;
insn.nfixups++;
alpha_linkage_symbol = 0;
+ free (ensymname);
}
#endif
}
#endif
@@
-3385,7
+3384,7
@@
add_to_link_pool (symbolS *sym, offsetT addend)
fixS *fixp;
symbolS *linksym, *expsym;
expressionS e;
fixS *fixp;
symbolS *linksym, *expsym;
expressionS e;
-
+
basesym = alpha_evax_proc->symbol;
/* @@ This assumes all entries in a given section will be of the same
basesym = alpha_evax_proc->symbol;
/* @@ This assumes all entries in a given section will be of the same
@@
-3412,19
+3411,22
@@
add_to_link_pool (symbolS *sym, offsetT addend)
p = frag_more (8);
memset (p, 0, 8);
p = frag_more (8);
memset (p, 0, 8);
- /* Create
the basesym - linksym expression
(offset of the added entry). */
+ /* Create
a symbol for 'basesym - linksym'
(offset of the added entry). */
e.X_op = O_subtract;
e.X_add_symbol = linksym;
e.X_op_symbol = basesym;
e.X_add_number = 0;
expsym = make_expr_symbol (&e);
e.X_op = O_subtract;
e.X_add_symbol = linksym;
e.X_op_symbol = basesym;
e.X_add_number = 0;
expsym = make_expr_symbol (&e);
+ /* Create a fixup for the entry. */
fixp = fix_new
(frag_now, p - frag_now->fr_literal, 8, sym, addend, 0, BFD_RELOC_64);
fixp->tc_fix_data.info = get_alpha_reloc_tag (next_sequence_num--);
fixp->tc_fix_data.info->sym = expsym;
subseg_set (current_section, current_subsec);
fixp = fix_new
(frag_now, p - frag_now->fr_literal, 8, sym, addend, 0, BFD_RELOC_64);
fixp->tc_fix_data.info = get_alpha_reloc_tag (next_sequence_num--);
fixp->tc_fix_data.info->sym = expsym;
subseg_set (current_section, current_subsec);
+
+ /* Return the symbol. */
return expsym;
}
#endif /* OBJ_EVAX */
return expsym;
}
#endif /* OBJ_EVAX */
@@
-3493,14
+3495,13
@@
s_alpha_comm (int ignore ATTRIBUTE_UNUSED)
int log_align = 0;
#endif
int log_align = 0;
#endif
- name = input_line_pointer;
- c = get_symbol_end ();
+ c = get_symbol_name (&name);
/* Just after name is now '\0'. */
p = input_line_pointer;
*p = c;
/* Just after name is now '\0'. */
p = input_line_pointer;
*p = c;
- SKIP_WHITESPACE ();
+ SKIP_WHITESPACE
_AFTER_NAME
();
/* Alpha OSF/1 compiler doesn't provide the comma, gcc does. */
if (*input_line_pointer == ',')
/* Alpha OSF/1 compiler doesn't provide the comma, gcc does. */
if (*input_line_pointer == ',')
@@
-3550,12
+3551,12
@@
s_alpha_comm (int ignore ATTRIBUTE_UNUSED)
The symbol is effectively an alias for the section name. */
segT sec;
The symbol is effectively an alias for the section name. */
segT sec;
- char *sec_name;
+ c
onst c
har *sec_name;
symbolS *sec_symbol;
segT current_seg = now_seg;
subsegT current_subseg = now_subseg;
int cur_size;
symbolS *sec_symbol;
segT current_seg = now_seg;
subsegT current_subseg = now_subseg;
int cur_size;
-
+
input_line_pointer++;
SKIP_WHITESPACE ();
sec_name = s_alpha_section_name ();
input_line_pointer++;
SKIP_WHITESPACE ();
sec_name = s_alpha_section_name ();
@@
-3599,7
+3600,7
@@
s_alpha_comm (int ignore ATTRIBUTE_UNUSED)
frag_align (log_align, 0, 0);
record_alignment (bss_section, log_align);
frag_align (log_align, 0, 0);
record_alignment (bss_section, log_align);
- symbol
P->sy_frag = frag_now
;
+ symbol
_set_frag (symbolP, frag_now)
;
pfrag = frag_var (rs_org, 1, 1, (relax_substateT)0, symbolP,
size, NULL);
*pfrag = 0;
pfrag = frag_var (rs_org, 1, 1, (relax_substateT)0, symbolP,
size, NULL);
*pfrag = 0;
@@
-3609,7
+3610,7
@@
s_alpha_comm (int ignore ATTRIBUTE_UNUSED)
subseg_set (current_seg, current_subseg);
}
#endif
subseg_set (current_seg, current_subseg);
}
#endif
-
+
if (S_GET_VALUE (symbolP))
{
if (S_GET_VALUE (symbolP) != (valueT) size)
if (S_GET_VALUE (symbolP))
{
if (S_GET_VALUE (symbolP) != (valueT) size)
@@
-3625,7
+3626,7
@@
s_alpha_comm (int ignore ATTRIBUTE_UNUSED)
#endif
S_SET_EXTERNAL (symbolP);
}
#endif
S_SET_EXTERNAL (symbolP);
}
-
+
#ifndef OBJ_EVAX
know (symbolP->sy_frag == &zero_address_frag);
#endif
#ifndef OBJ_EVAX
know (symbolP->sy_frag == &zero_address_frag);
#endif
@@
-3690,6
+3691,8
@@
static struct alpha_elf_frame_data *all_frame_data;
static struct alpha_elf_frame_data **plast_frame_data = &all_frame_data;
static struct alpha_elf_frame_data *cur_frame_data;
static struct alpha_elf_frame_data **plast_frame_data = &all_frame_data;
static struct alpha_elf_frame_data *cur_frame_data;
+extern int all_cfi_sections;
+
/* Handle the .section pseudo-op. This is like the usual one, but it
clears alpha_insn_label and restores auto alignment. */
/* Handle the .section pseudo-op. This is like the usual one, but it
clears alpha_insn_label and restores auto alignment. */
@@
-3711,13
+3714,15
@@
s_alpha_ent (int dummy ATTRIBUTE_UNUSED)
else
{
char *name, name_end;
else
{
char *name, name_end;
- name = input_line_pointer;
- name_end = get_symbol_end ();
+
+ name_end = get_symbol_name (&name);
+ /* CFI_EMIT_eh_frame is the default. */
+ all_cfi_sections = CFI_EMIT_eh_frame;
if (! is_name_beginner (*name))
{
as_warn (_(".ent directive has no name"));
if (! is_name_beginner (*name))
{
as_warn (_(".ent directive has no name"));
-
*input_line_pointer = name_end
;
+
(void) restore_line_pointer (name_end)
;
}
else
{
}
else
{
@@
-3729,8
+3734,7
@@
s_alpha_ent (int dummy ATTRIBUTE_UNUSED)
sym = symbol_find_or_make (name);
symbol_get_bfdsym (sym)->flags |= BSF_FUNCTION;
sym = symbol_find_or_make (name);
symbol_get_bfdsym (sym)->flags |= BSF_FUNCTION;
- cur_frame_data = (struct alpha_elf_frame_data *)
- calloc (1, sizeof (*cur_frame_data));
+ cur_frame_data = XCNEW (struct alpha_elf_frame_data);
cur_frame_data->func_sym = sym;
/* Provide sensible defaults. */
cur_frame_data->func_sym = sym;
/* Provide sensible defaults. */
@@
-3743,7
+3747,7
@@
s_alpha_ent (int dummy ATTRIBUTE_UNUSED)
/* The .ent directive is sometimes followed by a number. Not sure
what it really means, but ignore it. */
*input_line_pointer = name_end;
/* The .ent directive is sometimes followed by a number. Not sure
what it really means, but ignore it. */
*input_line_pointer = name_end;
- SKIP_WHITESPACE ();
+ SKIP_WHITESPACE
_AFTER_NAME
();
if (*input_line_pointer == ',')
{
input_line_pointer++;
if (*input_line_pointer == ',')
{
input_line_pointer++;
@@
-3764,13
+3768,12
@@
s_alpha_end (int dummy ATTRIBUTE_UNUSED)
else
{
char *name, name_end;
else
{
char *name, name_end;
- name = input_line_pointer;
- name_end = get_symbol_
end (
);
+
+ name_end = get_symbol_
name (&name
);
if (! is_name_beginner (*name))
{
as_warn (_(".end directive has no name"));
if (! is_name_beginner (*name))
{
as_warn (_(".end directive has no name"));
- *input_line_pointer = name_end;
}
else
{
}
else
{
@@
-3786,7
+3789,7
@@
s_alpha_end (int dummy ATTRIBUTE_UNUSED)
if (sym && cur_frame_data)
{
OBJ_SYMFIELD_TYPE *obj = symbol_get_obj (sym);
if (sym && cur_frame_data)
{
OBJ_SYMFIELD_TYPE *obj = symbol_get_obj (sym);
- expressionS *exp =
(expressionS *) xmalloc (sizeof (expressionS)
);
+ expressionS *exp =
XNEW (expressionS
);
obj->size = exp;
exp->X_op = O_subtract;
obj->size = exp;
exp->X_op = O_subtract;
@@
-3798,9
+3801,9
@@
s_alpha_end (int dummy ATTRIBUTE_UNUSED)
}
cur_frame_data = NULL;
}
cur_frame_data = NULL;
-
- *input_line_pointer = name_end;
}
}
+
+ (void) restore_line_pointer (name_end);
demand_empty_rest_of_line ();
}
}
demand_empty_rest_of_line ();
}
}
@@
-3954,9
+3957,7
@@
s_alpha_file (int ignore ATTRIBUTE_UNUSED)
discard_rest_of_line ();
len = input_line_pointer - start;
discard_rest_of_line ();
len = input_line_pointer - start;
- first_file_directive = (char *) xmalloc (len + 1);
- memcpy (first_file_directive, start, len);
- first_file_directive[len] = '\0';
+ first_file_directive = xmemdup0 (start, len);
input_line_pointer = start;
}
input_line_pointer = start;
}
@@
-4042,6
+4043,14
@@
alpha_elf_md_end (void)
if (bfd_get_section_by_name (stdoutput, ".eh_frame") != NULL)
return;
if (bfd_get_section_by_name (stdoutput, ".eh_frame") != NULL)
return;
+ /* ??? In theory we could look for functions for which we have
+ generated unwind info via CFI directives, and those we have not.
+ Those we have not could still get their unwind info from here.
+ For now, do nothing if we've seen any CFI directives. Note that
+ the above test will not trigger, as we've not emitted data yet. */
+ if (all_fde_data != NULL)
+ return;
+
/* Generate .eh_frame data for the unwind directives specified. */
for (p = all_frame_data; p ; p = p->next)
if (p->prologue_sym)
/* Generate .eh_frame data for the unwind directives specified. */
for (p = all_frame_data; p ; p = p->next)
if (p->prologue_sym)
@@
-4052,6
+4061,7
@@
alpha_elf_md_end (void)
S_GET_VALUE (p->func_sym),
symbol_get_frag (p->func_sym)));
S_GET_VALUE (p->func_sym),
symbol_get_frag (p->func_sym)));
+ cfi_set_sections ();
cfi_set_return_column (p->ra_regno);
cfi_add_CFA_def_cfa_register (30);
if (p->fp_regno != 30 || p->mask || p->fmask || p->frame_size)
cfi_set_return_column (p->ra_regno);
cfi_add_CFA_def_cfa_register (30);
if (p->fp_regno != 30 || p->mask || p->fmask || p->frame_size)
@@
-4116,19
+4126,20
@@
s_alpha_usepv (int unused ATTRIBUTE_UNUSED)
symbolS *sym;
int other;
symbolS *sym;
int other;
- name = input_line_pointer;
- name_end = get_symbol_end ();
+ name_end = get_symbol_name (&name);
if (! is_name_beginner (*name))
{
as_bad (_(".usepv directive has no name"));
if (! is_name_beginner (*name))
{
as_bad (_(".usepv directive has no name"));
-
*input_line_pointer = name_end
;
+
(void) restore_line_pointer (name_end)
;
ignore_rest_of_line ();
return;
}
sym = symbol_find_or_make (name);
ignore_rest_of_line ();
return;
}
sym = symbol_find_or_make (name);
- *input_line_pointer++ = name_end;
+ name_end = restore_line_pointer (name_end);
+ if (! is_end_of_line[(unsigned char) name_end])
+ input_line_pointer++;
if (name_end != ',')
{
if (name_end != ',')
{
@@
-4138,8
+4149,8
@@
s_alpha_usepv (int unused ATTRIBUTE_UNUSED)
}
SKIP_WHITESPACE ();
}
SKIP_WHITESPACE ();
- which = input_line_pointer;
- which_end = get_symbol_
end (
);
+
+ which_end = get_symbol_
name (&which
);
if (strcmp (which, "no") == 0)
other = STO_ALPHA_NOPV;
if (strcmp (which, "no") == 0)
other = STO_ALPHA_NOPV;
@@
-4151,7
+4162,7
@@
s_alpha_usepv (int unused ATTRIBUTE_UNUSED)
other = 0;
}
other = 0;
}
-
*input_line_pointer = which_end
;
+
(void) restore_line_pointer (which_end)
;
demand_empty_rest_of_line ();
S_SET_OTHER (sym, other | (S_GET_OTHER (sym) & ~STO_ALPHA_STD_GPLOAD));
demand_empty_rest_of_line ();
S_SET_OTHER (sym, other | (S_GET_OTHER (sym) & ~STO_ALPHA_STD_GPLOAD));
@@
-4169,7
+4180,7
@@
alpha_cfi_frame_initial_instructions (void)
#ifdef OBJ_EVAX
/* Get name of section. */
#ifdef OBJ_EVAX
/* Get name of section. */
-static char *
+static c
onst c
har *
s_alpha_section_name (void)
{
char *name;
s_alpha_section_name (void)
{
char *name;
@@
-4199,9
+4210,7
@@
s_alpha_section_name (void)
return NULL;
}
return NULL;
}
- name = xmalloc (end - input_line_pointer + 1);
- memcpy (name, input_line_pointer, end - input_line_pointer);
- name[end - input_line_pointer] = '\0';
+ name = xmemdup0 (input_line_pointer, end - input_line_pointer);
input_line_pointer = end;
}
SKIP_WHITESPACE ();
input_line_pointer = end;
}
SKIP_WHITESPACE ();
@@
-4226,7
+4235,7
@@
s_alpha_section_word (char *str, size_t len)
{
no = 1;
str += 2;
{
no = 1;
str += 2;
- len -= 2;
+ len -= 2;
}
if (len == 3)
}
if (len == 3)
@@
-4277,13
+4286,14
@@
s_alpha_section_word (char *str, size_t len)
#define EVAX_SECTION_COUNT 5
#define EVAX_SECTION_COUNT 5
-static char *section_name[EVAX_SECTION_COUNT + 1] =
+static c
onst c
har *section_name[EVAX_SECTION_COUNT + 1] =
{ "NULL", ".rdata", ".comm", ".link", ".ctors", ".dtors" };
static void
s_alpha_section (int secid)
{
{ "NULL", ".rdata", ".comm", ".link", ".ctors", ".dtors" };
static void
s_alpha_section (int secid)
{
- char *name, *beg;
+ const char *name;
+ char *beg;
segT sec;
flagword vms_flags = 0;
symbolS *symbol;
segT sec;
flagword vms_flags = 0;
symbolS *symbol;
@@
-4305,15
+4315,15
@@
s_alpha_section (int secid)
char c;
SKIP_WHITESPACE ();
char c;
SKIP_WHITESPACE ();
- beg = input_line_pointer;
- c = get_symbol_end ();
+ c = get_symbol_name (&beg);
*input_line_pointer = c;
vms_flags |= s_alpha_section_word (beg, input_line_pointer - beg);
*input_line_pointer = c;
vms_flags |= s_alpha_section_word (beg, input_line_pointer - beg);
- SKIP_WHITESPACE ();
+ SKIP_WHITESPACE
_AFTER_NAME
();
}
while (*input_line_pointer++ == ',');
}
while (*input_line_pointer++ == ',');
+
--input_line_pointer;
}
--input_line_pointer;
}
@@
-4397,13
+4407,12
@@
s_alpha_handler (int is_data)
else
{
char *name, name_end;
else
{
char *name, name_end;
- name = input_line_pointer;
- name_end = get_symbol_
end (
);
+
+ name_end = get_symbol_
name (&name
);
if (! is_name_beginner (*name))
{
as_warn (_(".handler directive has no name"));
if (! is_name_beginner (*name))
{
as_warn (_(".handler directive has no name"));
- *input_line_pointer = name_end;
}
else
{
}
else
{
@@
-4412,9
+4421,11
@@
s_alpha_handler (int is_data)
sym = symbol_find_or_make (name);
symbol_get_bfdsym (sym)->flags |= BSF_FUNCTION;
alpha_evax_proc->handler = sym;
sym = symbol_find_or_make (name);
symbol_get_bfdsym (sym)->flags |= BSF_FUNCTION;
alpha_evax_proc->handler = sym;
- *input_line_pointer = name_end;
}
}
- }
+
+ (void) restore_line_pointer (name_end);
+ }
+
demand_empty_rest_of_line ();
}
demand_empty_rest_of_line ();
}
@@
-4424,6
+4435,7
@@
static void
s_alpha_frame (int ignore ATTRIBUTE_UNUSED)
{
long val;
s_alpha_frame (int ignore ATTRIBUTE_UNUSED)
{
long val;
+ int ra;
alpha_evax_proc->framereg = tc_get_register (1);
alpha_evax_proc->framereg = tc_get_register (1);
@@
-4439,7
+4451,10
@@
s_alpha_frame (int ignore ATTRIBUTE_UNUSED)
alpha_evax_proc->framesize = val;
alpha_evax_proc->framesize = val;
- (void) tc_get_register (1);
+ ra = tc_get_register (1);
+ if (ra != AXP_REG_RA)
+ as_warn (_("Bad RA (%d) register for .frame"), ra);
+
SKIP_WHITESPACE ();
if (*input_line_pointer++ != ',')
{
SKIP_WHITESPACE ();
if (*input_line_pointer++ != ',')
{
@@
-4456,13
+4471,12
@@
s_alpha_frame (int ignore ATTRIBUTE_UNUSED)
static void
s_alpha_prologue (int ignore ATTRIBUTE_UNUSED)
{
static void
s_alpha_prologue (int ignore ATTRIBUTE_UNUSED)
{
- get_absolute_expression ();
demand_empty_rest_of_line ();
alpha_prologue_label = symbol_new
(FAKE_LABEL_NAME, now_seg, (valueT) frag_now_fix (), frag_now);
}
demand_empty_rest_of_line ();
alpha_prologue_label = symbol_new
(FAKE_LABEL_NAME, now_seg, (valueT) frag_now_fix (), frag_now);
}
-/* Parse .pdesc <entry_name>
.
+/* Parse .pdesc <entry_name>
,{null|stack|reg}
Insert a procedure descriptor. */
static void
Insert a procedure descriptor. */
static void
@@
-4470,7
+4484,7
@@
s_alpha_pdesc (int ignore ATTRIBUTE_UNUSED)
{
char *name;
char name_end;
{
char *name;
char name_end;
-
register
char *p;
+ char *p;
expressionS exp;
symbolS *entry_sym;
const char *entry_sym_name;
expressionS exp;
symbolS *entry_sym;
const char *entry_sym_name;
@@
-4490,10
+4504,10
@@
s_alpha_pdesc (int ignore ATTRIBUTE_UNUSED)
as_bad (_(".pdesc directive has no entry symbol"));
return;
}
as_bad (_(".pdesc directive has no entry symbol"));
return;
}
-
+
entry_sym = make_expr_symbol (&exp);
entry_sym_name = S_GET_NAME (entry_sym);
entry_sym = make_expr_symbol (&exp);
entry_sym_name = S_GET_NAME (entry_sym);
-
+
/* Strip "..en". */
len = strlen (entry_sym_name);
if (len < 4 || strcmp (entry_sym_name + len - 4, "..en") != 0)
/* Strip "..en". */
len = strlen (entry_sym_name);
if (len < 4 || strcmp (entry_sym_name + len - 4, "..en") != 0)
@@
-4515,12
+4529,12
@@
s_alpha_pdesc (int ignore ATTRIBUTE_UNUSED)
/* Define pdesc symbol. */
symbol_set_value_now (alpha_evax_proc->symbol);
/* Define pdesc symbol. */
symbol_set_value_now (alpha_evax_proc->symbol);
-
+
/* Save bfd symbol of proc entry in function symbol. */
((struct evax_private_udata_struct *)
symbol_get_bfdsym (alpha_evax_proc->symbol)->udata.p)->enbsym
= symbol_get_bfdsym (entry_sym);
/* Save bfd symbol of proc entry in function symbol. */
((struct evax_private_udata_struct *)
symbol_get_bfdsym (alpha_evax_proc->symbol)->udata.p)->enbsym
= symbol_get_bfdsym (entry_sym);
-
+
SKIP_WHITESPACE ();
if (*input_line_pointer++ != ',')
{
SKIP_WHITESPACE ();
if (*input_line_pointer++ != ',')
{
@@
-4530,8
+4544,7
@@
s_alpha_pdesc (int ignore ATTRIBUTE_UNUSED)
}
SKIP_WHITESPACE ();
}
SKIP_WHITESPACE ();
- name = input_line_pointer;
- name_end = get_symbol_end ();
+ name_end = get_symbol_name (&name);
if (strncmp (name, "stack", 5) == 0)
alpha_evax_proc->pdsckind = PDSC_S_K_KIND_FP_STACK;
if (strncmp (name, "stack", 5) == 0)
alpha_evax_proc->pdsckind = PDSC_S_K_KIND_FP_STACK;
@@
-4544,12
+4557,13
@@
s_alpha_pdesc (int ignore ATTRIBUTE_UNUSED)
else
{
else
{
+ (void) restore_line_pointer (name_end);
as_fatal (_("unknown procedure kind"));
demand_empty_rest_of_line ();
return;
}
as_fatal (_("unknown procedure kind"));
demand_empty_rest_of_line ();
return;
}
-
*input_line_pointer = name_end
;
+
(void) restore_line_pointer (name_end)
;
demand_empty_rest_of_line ();
#ifdef md_flush_pending_output
demand_empty_rest_of_line ();
#ifdef md_flush_pending_output
@@
-4590,19
+4604,15
@@
s_alpha_pdesc (int ignore ATTRIBUTE_UNUSED)
/* Signature offset. */
md_number_to_chars (p + 6, (valueT) 0, 2);
/* Signature offset. */
md_number_to_chars (p + 6, (valueT) 0, 2);
- fix_new_exp (frag_now, p - frag_now->fr_literal+8, 8, &exp, 0, BFD_RELOC_64);
+ fix_new_exp (frag_now, p - frag_now->fr_literal + 8,
+ 8, &exp, 0, BFD_RELOC_64);
if (alpha_evax_proc->pdsckind == PDSC_S_K_KIND_NULL)
return;
if (alpha_evax_proc->pdsckind == PDSC_S_K_KIND_NULL)
return;
- /* Add dummy fix to make add_to_link_pool work. */
- p = frag_more (6);
- fixp = fix_new (frag_now, p - frag_now->fr_literal, 6, 0, 0, 0, 0);
- fixp->fx_done = 1;
-
/* pdesc+16: Size. */
/* pdesc+16: Size. */
+ p = frag_more (6);
md_number_to_chars (p, (valueT) alpha_evax_proc->framesize, 4);
md_number_to_chars (p, (valueT) alpha_evax_proc->framesize, 4);
-
md_number_to_chars (p + 4, (valueT) 0, 2);
/* Entry length. */
md_number_to_chars (p + 4, (valueT) 0, 2);
/* Entry length. */
@@
-4614,13
+4624,8
@@
s_alpha_pdesc (int ignore ATTRIBUTE_UNUSED)
if (alpha_evax_proc->pdsckind == PDSC_S_K_KIND_FP_REGISTER)
return;
if (alpha_evax_proc->pdsckind == PDSC_S_K_KIND_FP_REGISTER)
return;
- /* Add dummy fix to make add_to_link_pool work. */
- p = frag_more (8);
- fixp = fix_new (frag_now, p - frag_now->fr_literal, 8, 0, 0, 0, 0);
- fixp->fx_done = 1;
-
/* pdesc+24: register masks. */
/* pdesc+24: register masks. */
-
+ p = frag_more (8);
md_number_to_chars (p, alpha_evax_proc->imask, 4);
md_number_to_chars (p + 4, alpha_evax_proc->fmask, 4);
md_number_to_chars (p, alpha_evax_proc->imask, 4);
md_number_to_chars (p + 4, alpha_evax_proc->fmask, 4);
@@
-4633,10
+4638,7
@@
s_alpha_pdesc (int ignore ATTRIBUTE_UNUSED)
if (alpha_evax_proc->handler_data)
{
if (alpha_evax_proc->handler_data)
{
- /* Add dummy fix to make add_to_link_pool work. */
p = frag_more (8);
p = frag_more (8);
- fixp = fix_new (frag_now, p - frag_now->fr_literal, 8, 0, 0, 0, 0);
- fixp->fx_done = 1;
md_number_to_chars (p, alpha_evax_proc->handler_data, 8);
}
}
md_number_to_chars (p, alpha_evax_proc->handler_data, 8);
}
}
@@
-4698,35
+4700,29
@@
s_alpha_linkage (int ignore ATTRIBUTE_UNUSED)
else
{
struct alpha_linkage_fixups *linkage_fixup;
else
{
struct alpha_linkage_fixups *linkage_fixup;
-
+
p = frag_more (LKP_S_K_SIZE);
memset (p, 0, LKP_S_K_SIZE);
fixp = fix_new_exp
p = frag_more (LKP_S_K_SIZE);
memset (p, 0, LKP_S_K_SIZE);
fixp = fix_new_exp
- (frag_now, p - frag_now->fr_literal, LKP_S_K_SIZE, &exp, 0,
\
+ (frag_now, p - frag_now->fr_literal, LKP_S_K_SIZE, &exp, 0,
BFD_RELOC_ALPHA_LINKAGE);
BFD_RELOC_ALPHA_LINKAGE);
- linkage_fixup = (struct alpha_linkage_fixups *)
- xmalloc (sizeof (struct alpha_linkage_fixups));
-
- linkage_fixup->fixp = fixp;
- linkage_fixup->next = 0;
-
- if (alpha_insn_label == 0)
+ if (alpha_insn_label == NULL)
alpha_insn_label = symbol_new
(FAKE_LABEL_NAME, now_seg, (valueT) frag_now_fix (), frag_now);
alpha_insn_label = symbol_new
(FAKE_LABEL_NAME, now_seg, (valueT) frag_now_fix (), frag_now);
+
+ /* Create a linkage element. */
+ linkage_fixup = XNEW (struct alpha_linkage_fixups);
+ linkage_fixup->fixp = fixp;
+ linkage_fixup->next = NULL;
linkage_fixup->label = alpha_insn_label;
linkage_fixup->label = alpha_insn_label;
- if (alpha_linkage_fixup_root == 0)
- {
- alpha_linkage_fixup_root = alpha_linkage_fixup_tail = linkage_fixup;
- alpha_linkage_fixup_tail->next = 0;
- }
+ /* Append it to the list. */
+ if (alpha_linkage_fixup_root == NULL)
+ alpha_linkage_fixup_root = linkage_fixup;
else
else
- {
- alpha_linkage_fixup_tail->next = linkage_fixup;
- alpha_linkage_fixup_tail = linkage_fixup;
- alpha_linkage_fixup_tail->next = 0;
- }
+ alpha_linkage_fixup_tail->next = linkage_fixup;
+ alpha_linkage_fixup_tail = linkage_fixup;
}
demand_empty_rest_of_line ();
}
}
demand_empty_rest_of_line ();
}
@@
-4760,7
+4756,6
@@
s_alpha_code_address (int ignore ATTRIBUTE_UNUSED)
static void
s_alpha_fp_save (int ignore ATTRIBUTE_UNUSED)
{
static void
s_alpha_fp_save (int ignore ATTRIBUTE_UNUSED)
{
-
alpha_evax_proc->fp_save = tc_get_register (1);
demand_empty_rest_of_line ();
alpha_evax_proc->fp_save = tc_get_register (1);
demand_empty_rest_of_line ();
@@
-4805,10
+4800,11
@@
s_alpha_fmask (int ignore ATTRIBUTE_UNUSED)
static void
s_alpha_end (int ignore ATTRIBUTE_UNUSED)
{
static void
s_alpha_end (int ignore ATTRIBUTE_UNUSED)
{
+ char *name;
char c;
char c;
- c = get_symbol_
end (
);
-
*input_line_pointer = c
;
+ c = get_symbol_
name (&name
);
+
(void) restore_line_pointer (c)
;
demand_empty_rest_of_line ();
alpha_evax_proc = NULL;
}
demand_empty_rest_of_line ();
alpha_evax_proc = NULL;
}
@@
-4939,12
+4935,11
@@
s_alpha_proc (int is_static ATTRIBUTE_UNUSED)
/* Takes ".proc name,nargs". */
SKIP_WHITESPACE ();
/* Takes ".proc name,nargs". */
SKIP_WHITESPACE ();
- name = input_line_pointer;
- c = get_symbol_end ();
+ c = get_symbol_name (&name);
p = input_line_pointer;
symbolP = symbol_find_or_make (name);
*p = c;
p = input_line_pointer;
symbolP = symbol_find_or_make (name);
*p = c;
- SKIP_WHITESPACE ();
+ SKIP_WHITESPACE
_AFTER_NAME
();
if (*input_line_pointer != ',')
{
*p = 0;
if (*input_line_pointer != ',')
{
*p = 0;
@@
-4974,9
+4969,8
@@
s_alpha_set (int x ATTRIBUTE_UNUSED)
int yesno = 1;
SKIP_WHITESPACE ();
int yesno = 1;
SKIP_WHITESPACE ();
- name = input_line_pointer;
- ch = get_symbol_end ();
+ ch = get_symbol_name (&name);
s = name;
if (s[0] == 'n' && s[1] == 'o')
{
s = name;
if (s[0] == 'n' && s[1] == 'o')
{
@@
-4996,7
+4990,7
@@
s_alpha_set (int x ATTRIBUTE_UNUSED)
else
as_warn (_("Tried to .set unrecognized mode `%s'"), name);
else
as_warn (_("Tried to .set unrecognized mode `%s'"), name);
-
*input_line_pointer = ch
;
+
(void) restore_line_pointer (ch)
;
demand_empty_rest_of_line ();
}
demand_empty_rest_of_line ();
}
@@
-5131,8
+5125,8
@@
s_alpha_arch (int ignored ATTRIBUTE_UNUSED)
const struct cpu_type *p;
SKIP_WHITESPACE ();
const struct cpu_type *p;
SKIP_WHITESPACE ();
- name = input_line_pointer;
- ch = get_symbol_
end (
);
+
+ ch = get_symbol_
name (&name
);
for (p = cpu_types; p->name; ++p)
if (strcmp (name, p->name) == 0)
for (p = cpu_types; p->name; ++p)
if (strcmp (name, p->name) == 0)
@@
-5143,7
+5137,7
@@
s_alpha_arch (int ignored ATTRIBUTE_UNUSED)
as_warn (_("Unknown CPU identifier `%s'"), name);
found:
as_warn (_("Unknown CPU identifier `%s'"), name);
found:
-
*input_line_pointer = ch
;
+
(void) restore_line_pointer (ch)
;
demand_empty_rest_of_line ();
}
\f
demand_empty_rest_of_line ();
}
\f
@@
-5306,7
+5300,7
@@
maybe_set_gp (asection *sec)
if (!sec)
return;
if (!sec)
return;
- vma = bfd_get_section_vma (
foo
, sec);
+ vma = bfd_get_section_vma (
sec->owner
, sec);
if (vma && vma < alpha_gp_value)
alpha_gp_value = vma;
}
if (vma && vma < alpha_gp_value)
alpha_gp_value = vma;
}
@@
-5340,7
+5334,7
@@
select_gp_value (void)
/* Map 's' to SHF_ALPHA_GPREL. */
bfd_vma
/* Map 's' to SHF_ALPHA_GPREL. */
bfd_vma
-alpha_elf_section_letter (int letter, char **ptr_msg)
+alpha_elf_section_letter (int letter, c
onst c
har **ptr_msg)
{
if (letter == 's')
return SHF_ALPHA_GPREL;
{
if (letter == 's')
return SHF_ALPHA_GPREL;
@@
-5366,8
+5360,8
@@
alpha_elf_section_flags (flagword flags, bfd_vma attr, int type ATTRIBUTE_UNUSED
void
alpha_handle_align (fragS *fragp)
{
void
alpha_handle_align (fragS *fragp)
{
- static char const unop[4] = { 0x00, 0x00, 0xfe, 0x2f };
- static char const nopunop[8] =
+ static
unsigned
char const unop[4] = { 0x00, 0x00, 0xfe, 0x2f };
+ static
unsigned
char const nopunop[8] =
{
0x1f, 0x04, 0xff, 0x47,
0x00, 0x00, 0xfe, 0x2f
{
0x1f, 0x04, 0xff, 0x47,
0x00, 0x00, 0xfe, 0x2f
@@
-5444,7
+5438,7
@@
md_begin (void)
if ((slash = strchr (name, '/')) != NULL)
{
if ((slash = strchr (name, '/')) != NULL)
{
- char *p =
(char *) xmalloc (
strlen (name));
+ char *p =
XNEWVEC (char,
strlen (name));
memcpy (p, name, slash - name);
strcpy (p + (slash - name), slash + 1);
memcpy (p, name, slash - name);
strcpy (p + (slash - name), slash + 1);
@@
-5579,10
+5573,10
@@
md_section_align (segT seg, valueT size)
of LITTLENUMS emitted is stored in *SIZEP. An error message is
returned, or NULL on OK. */
of LITTLENUMS emitted is stored in *SIZEP. An error message is
returned, or NULL on OK. */
-char *
+c
onst c
har *
md_atof (int type, char *litP, int *sizeP)
{
md_atof (int type, char *litP, int *sizeP)
{
- extern char *vax_md_atof (int, char *, int *);
+ extern c
onst c
har *vax_md_atof (int, char *, int *);
switch (type)
{
switch (type)
{
@@
-5590,6
+5584,7
@@
md_atof (int type, char *litP, int *sizeP)
case 'G':
/* vax_md_atof() doesn't like "G" for some reason. */
type = 'g';
case 'G':
/* vax_md_atof() doesn't like "G" for some reason. */
type = 'g';
+ /* Fall through. */
case 'F':
case 'D':
return vax_md_atof (type, litP, sizeP);
case 'F':
case 'D':
return vax_md_atof (type, litP, sizeP);
@@
-5602,7
+5597,7
@@
md_atof (int type, char *litP, int *sizeP)
/* Take care of the target-specific command-line options. */
int
/* Take care of the target-specific command-line options. */
int
-md_parse_option (int c, char *arg)
+md_parse_option (int c, c
onst c
har *arg)
{
switch (c)
{
{
switch (c)
{
@@
-6225,8
+6220,8
@@
tc_gen_reloc (asection *sec ATTRIBUTE_UNUSED,
{
arelent *reloc;
{
arelent *reloc;
- reloc =
(arelent *) xmalloc (sizeof (* reloc)
);
- reloc->sym_ptr_ptr =
(asymbol **) xmalloc (sizeof (asymbol *)
);
+ reloc =
XNEW (arelent
);
+ reloc->sym_ptr_ptr =
XNEW (asymbol *
);
*reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
*reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
@@
-6282,11
+6277,9
@@
tc_gen_reloc (asection *sec ATTRIBUTE_UNUSED,
if (pname_len > 4 && strcmp (pname + pname_len - 4, "..en") == 0)
{
symbolS *sym;
if (pname_len > 4 && strcmp (pname + pname_len - 4, "..en") == 0)
{
symbolS *sym;
- char *my_pname = (char *) alloca (pname_len - 4 + 1);
-
- memcpy (my_pname, pname, pname_len - 4);
- my_pname [pname_len - 4] = 0;
+ char *my_pname = xmemdup0 (pname, pname_len - 4);
sym = symbol_find (my_pname);
sym = symbol_find (my_pname);
+ free (my_pname);
if (sym == NULL)
abort ();
if (sym == NULL)
abort ();
@@
-6303,8
+6296,7
@@
tc_gen_reloc (asection *sec ATTRIBUTE_UNUSED,
pname = symbol_get_bfdsym (sym)->name;
}
pname = symbol_get_bfdsym (sym)->name;
}
- udata = (struct evax_private_udata_struct *)
- xmalloc (sizeof (struct evax_private_udata_struct));
+ udata = XNEW (struct evax_private_udata_struct);
udata->enbsym = symbol_get_bfdsym (fixp->fx_addsy);
udata->bsym = symbol_get_bfdsym (fixp->tc_fix_data.info->psym);
udata->origname = (char *)pname;
udata->enbsym = symbol_get_bfdsym (fixp->fx_addsy);
udata->bsym = symbol_get_bfdsym (fixp->tc_fix_data.info->psym);
udata->origname = (char *)pname;
@@
-6335,8
+6327,8
@@
tc_get_register (int frame ATTRIBUTE_UNUSED)
SKIP_WHITESPACE ();
if (*input_line_pointer == '$')
{
SKIP_WHITESPACE ();
if (*input_line_pointer == '$')
{
- char *s
= input_line_pointer
;
- char c = get_symbol_
end (
);
+ char *s;
+ char c = get_symbol_
name (&s
);
symbolS *sym = md_undefined_symbol (s);
*strchr (s, '\0') = c;
symbolS *sym = md_undefined_symbol (s);
*strchr (s, '\0') = c;
This page took
0.035116 seconds
and
4
git commands to generate.