mirror of git://gcc.gnu.org/git/gcc.git
[libbacktrace] Factor out read_string
Factor out new function read_string in dwarf.c. Bootstrapped and reg-tested on x86_64. 2018-11-21 Tom de Vries <tdevries@suse.de> * dwarf.c (read_string): Factor out of ... (read_attribute, read_line_header, read_line_program): ... here. From-SVN: r266339
This commit is contained in:
parent
25baeeb36e
commit
171125708a
|
|
@ -1,3 +1,8 @@
|
||||||
|
2018-11-21 Tom de Vries <tdevries@suse.de>
|
||||||
|
|
||||||
|
* dwarf.c (read_string): Factor out of ...
|
||||||
|
(read_attribute, read_line_header, read_line_program): ... here.
|
||||||
|
|
||||||
2018-10-31 Joseph Myers <joseph@codesourcery.com>
|
2018-10-31 Joseph Myers <joseph@codesourcery.com>
|
||||||
|
|
||||||
PR bootstrap/82856
|
PR bootstrap/82856
|
||||||
|
|
|
||||||
|
|
@ -411,6 +411,25 @@ advance (struct dwarf_buf *buf, size_t count)
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Read one zero-terminated string from BUF and advance past the string. */
|
||||||
|
|
||||||
|
static const char *
|
||||||
|
read_string (struct dwarf_buf *buf)
|
||||||
|
{
|
||||||
|
const char *p = (const char *)buf->buf;
|
||||||
|
size_t len = strnlen (p, buf->left);
|
||||||
|
|
||||||
|
/* - If len == left, we ran out of buffer before finding the zero terminator.
|
||||||
|
Generate an error by advancing len + 1.
|
||||||
|
- If len < left, advance by len + 1 to skip past the zero terminator. */
|
||||||
|
size_t count = len + 1;
|
||||||
|
|
||||||
|
if (!advance (buf, count))
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
return p;
|
||||||
|
}
|
||||||
|
|
||||||
/* Read one byte from BUF and advance 1 byte. */
|
/* Read one byte from BUF and advance 1 byte. */
|
||||||
|
|
||||||
static unsigned char
|
static unsigned char
|
||||||
|
|
@ -694,8 +713,8 @@ read_attribute (enum dwarf_form form, struct dwarf_buf *buf,
|
||||||
return 1;
|
return 1;
|
||||||
case DW_FORM_string:
|
case DW_FORM_string:
|
||||||
val->encoding = ATTR_VAL_STRING;
|
val->encoding = ATTR_VAL_STRING;
|
||||||
val->u.string = (const char *) buf->buf;
|
val->u.string = read_string (buf);
|
||||||
return advance (buf, strnlen ((const char *) buf->buf, buf->left) + 1);
|
return val->u.string == NULL ? 0 : 1;
|
||||||
case DW_FORM_block:
|
case DW_FORM_block:
|
||||||
val->encoding = ATTR_VAL_BLOCK;
|
val->encoding = ATTR_VAL_BLOCK;
|
||||||
return advance (buf, read_uleb128 (buf));
|
return advance (buf, read_uleb128 (buf));
|
||||||
|
|
@ -1649,11 +1668,10 @@ read_line_header (struct backtrace_state *state, struct unit *u,
|
||||||
if (hdr_buf.reported_underflow)
|
if (hdr_buf.reported_underflow)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
hdr->dirs[i] = (const char *) hdr_buf.buf;
|
hdr->dirs[i] = read_string (&hdr_buf);
|
||||||
++i;
|
if (hdr->dirs[i] == NULL)
|
||||||
if (!advance (&hdr_buf,
|
|
||||||
strnlen ((const char *) hdr_buf.buf, hdr_buf.left) + 1))
|
|
||||||
return 0;
|
return 0;
|
||||||
|
++i;
|
||||||
}
|
}
|
||||||
if (!advance (&hdr_buf, 1))
|
if (!advance (&hdr_buf, 1))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
@ -1687,9 +1705,8 @@ read_line_header (struct backtrace_state *state, struct unit *u,
|
||||||
if (hdr_buf.reported_underflow)
|
if (hdr_buf.reported_underflow)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
filename = (const char *) hdr_buf.buf;
|
filename = read_string (&hdr_buf);
|
||||||
if (!advance (&hdr_buf,
|
if (filename == NULL)
|
||||||
strnlen ((const char *) hdr_buf.buf, hdr_buf.left) + 1))
|
|
||||||
return 0;
|
return 0;
|
||||||
dir_index = read_uleb128 (&hdr_buf);
|
dir_index = read_uleb128 (&hdr_buf);
|
||||||
if (IS_ABSOLUTE_PATH (filename)
|
if (IS_ABSOLUTE_PATH (filename)
|
||||||
|
|
@ -1808,8 +1825,8 @@ read_line_program (struct backtrace_state *state, struct dwarf_data *ddata,
|
||||||
const char *f;
|
const char *f;
|
||||||
unsigned int dir_index;
|
unsigned int dir_index;
|
||||||
|
|
||||||
f = (const char *) line_buf->buf;
|
f = read_string (line_buf);
|
||||||
if (!advance (line_buf, strnlen (f, line_buf->left) + 1))
|
if (f == NULL)
|
||||||
return 0;
|
return 0;
|
||||||
dir_index = read_uleb128 (line_buf);
|
dir_index = read_uleb128 (line_buf);
|
||||||
/* Ignore that time and length. */
|
/* Ignore that time and length. */
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue