Home | History | Annotate | Download | only in libdw
      1 /* Return line number information of CU.
      2    Copyright (C) 2004-2010, 2013, 2014, 2015 Red Hat, Inc.
      3    This file is part of elfutils.
      4    Written by Ulrich Drepper <drepper (at) redhat.com>, 2004.
      5 
      6    This file is free software; you can redistribute it and/or modify
      7    it under the terms of either
      8 
      9      * the GNU Lesser General Public License as published by the Free
     10        Software Foundation; either version 3 of the License, or (at
     11        your option) any later version
     12 
     13    or
     14 
     15      * the GNU General Public License as published by the Free
     16        Software Foundation; either version 2 of the License, or (at
     17        your option) any later version
     18 
     19    or both in parallel, as here.
     20 
     21    elfutils is distributed in the hope that it will be useful, but
     22    WITHOUT ANY WARRANTY; without even the implied warranty of
     23    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     24    General Public License for more details.
     25 
     26    You should have received copies of the GNU General Public License and
     27    the GNU Lesser General Public License along with this program.  If
     28    not, see <http://www.gnu.org/licenses/>.  */
     29 
     30 #ifdef HAVE_CONFIG_H
     31 # include <config.h>
     32 #endif
     33 
     34 #include <assert.h>
     35 #include <stdlib.h>
     36 #include <string.h>
     37 #include <search.h>
     38 
     39 #include "dwarf.h"
     40 #include "libdwP.h"
     41 
     42 
     43 struct filelist
     44 {
     45   Dwarf_Fileinfo info;
     46   struct filelist *next;
     47 };
     48 
     49 struct linelist
     50 {
     51   Dwarf_Line line;
     52   struct linelist *next;
     53   size_t sequence;
     54 };
     55 
     56 
     57 /* Compare by Dwarf_Line.addr, given pointers into an array of pointers.  */
     58 static int
     59 compare_lines (const void *a, const void *b)
     60 {
     61   struct linelist *const *p1 = a;
     62   struct linelist *const *p2 = b;
     63   struct linelist *list1 = *p1;
     64   struct linelist *list2 = *p2;
     65   Dwarf_Line *line1 = &list1->line;
     66   Dwarf_Line *line2 = &list2->line;
     67 
     68   if (line1->addr != line2->addr)
     69     return (line1->addr < line2->addr) ? -1 : 1;
     70 
     71   /* An end_sequence marker precedes a normal record at the same address.  */
     72   if (line1->end_sequence != line2->end_sequence)
     73     return line2->end_sequence - line1->end_sequence;
     74 
     75   /* Otherwise, the linelist sequence maintains a stable sort.  */
     76   return (list1->sequence < list2->sequence) ? -1
     77     : (list1->sequence > list2->sequence) ? 1
     78     : 0;
     79 }
     80 
     81 struct line_state
     82 {
     83   Dwarf_Word addr;
     84   unsigned int op_index;
     85   unsigned int file;
     86   int64_t line;
     87   unsigned int column;
     88   uint_fast8_t is_stmt;
     89   bool basic_block;
     90   bool prologue_end;
     91   bool epilogue_begin;
     92   unsigned int isa;
     93   unsigned int discriminator;
     94   struct linelist *linelist;
     95   size_t nlinelist;
     96   unsigned int end_sequence;
     97 };
     98 
     99 static inline void
    100 run_advance_pc (struct line_state *state, unsigned int op_advance,
    101                 uint_fast8_t minimum_instr_len, uint_fast8_t max_ops_per_instr)
    102 {
    103   state->addr += minimum_instr_len * ((state->op_index + op_advance)
    104 				      / max_ops_per_instr);
    105   state->op_index = (state->op_index + op_advance) % max_ops_per_instr;
    106 }
    107 
    108 static inline bool
    109 add_new_line (struct line_state *state, struct linelist *new_line)
    110 {
    111   /* Set the line information.  For some fields we use bitfields,
    112      so we would lose information if the encoded values are too large.
    113      Check just for paranoia, and call the data "invalid" if it
    114      violates our assumptions on reasonable limits for the values.  */
    115   new_line->next = state->linelist;
    116   new_line->sequence = state->nlinelist;
    117   state->linelist = new_line;
    118   ++(state->nlinelist);
    119 
    120   /* Set the line information.  For some fields we use bitfields,
    121      so we would lose information if the encoded values are too large.
    122      Check just for paranoia, and call the data "invalid" if it
    123      violates our assumptions on reasonable limits for the values.  */
    124 #define SET(field)						      \
    125   do {								      \
    126      new_line->line.field = state->field;			      \
    127      if (unlikely (new_line->line.field != state->field))	      \
    128        return true;						      \
    129    } while (0)
    130 
    131   SET (addr);
    132   SET (op_index);
    133   SET (file);
    134   SET (line);
    135   SET (column);
    136   SET (is_stmt);
    137   SET (basic_block);
    138   SET (end_sequence);
    139   SET (prologue_end);
    140   SET (epilogue_begin);
    141   SET (isa);
    142   SET (discriminator);
    143 
    144 #undef SET
    145 
    146   return false;
    147 }
    148 
    149 static int
    150 read_srclines (Dwarf *dbg,
    151 	       const unsigned char *linep, const unsigned char *lineendp,
    152 	       const char *comp_dir, unsigned address_size,
    153 	       Dwarf_Lines **linesp, Dwarf_Files **filesp)
    154 {
    155   int res = -1;
    156 
    157   size_t nfilelist = 0;
    158   unsigned int ndirlist = 0;
    159 
    160   struct filelist null_file =
    161     {
    162       .info =
    163       {
    164 	.name = "???",
    165 	.mtime = 0,
    166 	.length = 0
    167       },
    168       .next = NULL
    169     };
    170   struct filelist *filelist = &null_file;
    171 
    172   /* If there are a large number of lines, files or dirs don't blow up
    173      the stack.  Stack allocate some entries, only dynamically malloc
    174      when more than MAX.  */
    175 #define MAX_STACK_ALLOC 4096
    176 #define MAX_STACK_LINES MAX_STACK_ALLOC
    177 #define MAX_STACK_FILES (MAX_STACK_ALLOC / 4)
    178 #define MAX_STACK_DIRS  (MAX_STACK_ALLOC / 16)
    179 
    180   struct dirlist
    181   {
    182     const char *dir;
    183     size_t len;
    184   };
    185   struct dirlist dirstack[MAX_STACK_DIRS];
    186   struct dirlist *dirarray = dirstack;
    187 
    188   /* We are about to process the statement program.  Initialize the
    189      state machine registers (see 6.2.2 in the v2.1 specification).  */
    190   struct line_state state =
    191     {
    192       .linelist = NULL,
    193       .nlinelist = 0,
    194       .addr = 0,
    195       .op_index = 0,
    196       .file = 1,
    197       /* We only store int but want to check for overflow (see SET above).  */
    198       .line = 1,
    199       .column = 0,
    200       .basic_block = false,
    201       .prologue_end = false,
    202       .epilogue_begin = false,
    203       .isa = 0,
    204       .discriminator = 0
    205     };
    206 
    207   if (unlikely (linep + 4 > lineendp))
    208     {
    209     invalid_data:
    210       __libdw_seterrno (DWARF_E_INVALID_DEBUG_LINE);
    211       goto out;
    212     }
    213 
    214   Dwarf_Word unit_length = read_4ubyte_unaligned_inc (dbg, linep);
    215   unsigned int length = 4;
    216   if (unlikely (unit_length == DWARF3_LENGTH_64_BIT))
    217     {
    218       if (unlikely (linep + 8 > lineendp))
    219 	goto invalid_data;
    220       unit_length = read_8ubyte_unaligned_inc (dbg, linep);
    221       length = 8;
    222     }
    223 
    224   /* Check whether we have enough room in the section.  */
    225   if (unlikely (unit_length > (size_t) (lineendp - linep)
    226       || unit_length < 2 + length + 5 * 1))
    227     goto invalid_data;
    228   lineendp = linep + unit_length;
    229 
    230   /* The next element of the header is the version identifier.  */
    231   uint_fast16_t version = read_2ubyte_unaligned_inc (dbg, linep);
    232   if (unlikely (version < 2) || unlikely (version > 4))
    233     {
    234       __libdw_seterrno (DWARF_E_VERSION);
    235       goto out;
    236     }
    237 
    238   /* Next comes the header length.  */
    239   Dwarf_Word header_length;
    240   if (length == 4)
    241     header_length = read_4ubyte_unaligned_inc (dbg, linep);
    242   else
    243     header_length = read_8ubyte_unaligned_inc (dbg, linep);
    244   const unsigned char *header_start = linep;
    245 
    246   /* Next the minimum instruction length.  */
    247   uint_fast8_t minimum_instr_len = *linep++;
    248 
    249   /* Next the maximum operations per instruction, in version 4 format.  */
    250   uint_fast8_t max_ops_per_instr = 1;
    251   if (version >= 4)
    252     {
    253       if (unlikely (lineendp - linep < 5))
    254 	goto invalid_data;
    255       max_ops_per_instr = *linep++;
    256       if (unlikely (max_ops_per_instr == 0))
    257 	goto invalid_data;
    258     }
    259 
    260   /* Then the flag determining the default value of the is_stmt
    261      register.  */
    262   uint_fast8_t default_is_stmt = *linep++;
    263 
    264   /* Now the line base.  */
    265   int_fast8_t line_base = (int8_t) *linep++;
    266 
    267   /* And the line range.  */
    268   uint_fast8_t line_range = *linep++;
    269 
    270   /* The opcode base.  */
    271   uint_fast8_t opcode_base = *linep++;
    272 
    273   /* Remember array with the standard opcode length (-1 to account for
    274      the opcode with value zero not being mentioned).  */
    275   const uint8_t *standard_opcode_lengths = linep - 1;
    276   if (unlikely (lineendp - linep < opcode_base - 1))
    277     goto invalid_data;
    278   linep += opcode_base - 1;
    279 
    280   /* First comes the list of directories.  Add the compilation
    281      directory first since the index zero is used for it.  */
    282   struct dirlist comp_dir_elem =
    283     {
    284       .dir = comp_dir,
    285       .len = comp_dir ? strlen (comp_dir) : 0,
    286     };
    287   ndirlist = 1;
    288 
    289   /* First count the entries.  */
    290   const unsigned char *dirp = linep;
    291   while (*dirp != 0)
    292     {
    293       uint8_t *endp = memchr (dirp, '\0', lineendp - dirp);
    294       if (endp == NULL)
    295 	goto invalid_data;
    296       ++ndirlist;
    297       dirp = endp + 1;
    298     }
    299 
    300   /* Arrange the list in array form.  */
    301   if (ndirlist >= MAX_STACK_DIRS)
    302     {
    303       dirarray = (struct dirlist *) malloc (ndirlist * sizeof (*dirarray));
    304       if (unlikely (dirarray == NULL))
    305 	{
    306 	no_mem:
    307 	  __libdw_seterrno (DWARF_E_NOMEM);
    308 	  goto out;
    309 	}
    310     }
    311   dirarray[0] = comp_dir_elem;
    312   for (unsigned int n = 1; n < ndirlist; n++)
    313     {
    314       dirarray[n].dir = (char *) linep;
    315       uint8_t *endp = memchr (linep, '\0', lineendp - linep);
    316       assert (endp != NULL);
    317       dirarray[n].len = endp - linep;
    318       linep = endp + 1;
    319     }
    320   /* Skip the final NUL byte.  */
    321   ++linep;
    322 
    323   /* Allocate memory for a new file.  For the first MAX_STACK_FILES
    324      entries just return a slot in the preallocated stack array.  */
    325   struct filelist flstack[MAX_STACK_FILES];
    326 #define NEW_FILE() ({							\
    327   struct filelist *fl = (nfilelist < MAX_STACK_FILES			\
    328 			   ? &flstack[nfilelist]			\
    329 			   : malloc (sizeof (struct filelist)));	\
    330   if (unlikely (fl == NULL))						\
    331     goto no_mem;							\
    332   ++nfilelist;								\
    333   fl->next = filelist;							\
    334   filelist = fl;							\
    335   fl; })
    336 
    337   /* Now read the files.  */
    338   nfilelist = 1;
    339 
    340   if (unlikely (linep >= lineendp))
    341     goto invalid_data;
    342   while (*linep != 0)
    343     {
    344       struct filelist *new_file = NEW_FILE ();
    345 
    346       /* First comes the file name.  */
    347       char *fname = (char *) linep;
    348       uint8_t *endp = memchr (fname, '\0', lineendp - linep);
    349       if (endp == NULL)
    350 	goto invalid_data;
    351       size_t fnamelen = endp - (uint8_t *) fname;
    352       linep = endp + 1;
    353 
    354       /* Then the index.  */
    355       Dwarf_Word diridx;
    356       if (unlikely (linep >= lineendp))
    357 	goto invalid_data;
    358       get_uleb128 (diridx, linep, lineendp);
    359       if (unlikely (diridx >= ndirlist))
    360 	{
    361 	  __libdw_seterrno (DWARF_E_INVALID_DIR_IDX);
    362 	  goto out;
    363 	}
    364 
    365       if (*fname == '/')
    366 	/* It's an absolute path.  */
    367 	new_file->info.name = fname;
    368       else
    369 	{
    370 	  new_file->info.name = libdw_alloc (dbg, char, 1,
    371 					     dirarray[diridx].len + 1
    372 					     + fnamelen + 1);
    373 	  char *cp = new_file->info.name;
    374 
    375 	  if (dirarray[diridx].dir != NULL)
    376 	    {
    377 	      /* This value could be NULL in case the DW_AT_comp_dir
    378 		 was not present.  We cannot do much in this case.
    379 		 The easiest thing is to convert the path in an
    380 		 absolute path.  */
    381 	      cp = stpcpy (cp, dirarray[diridx].dir);
    382 	    }
    383 	  *cp++ = '/';
    384 	  strcpy (cp, fname);
    385 	  assert (strlen (new_file->info.name)
    386 		  < dirarray[diridx].len + 1 + fnamelen + 1);
    387 	}
    388 
    389       /* Next comes the modification time.  */
    390       if (unlikely (linep >= lineendp))
    391 	goto invalid_data;
    392       get_uleb128 (new_file->info.mtime, linep, lineendp);
    393 
    394       /* Finally the length of the file.  */
    395       if (unlikely (linep >= lineendp))
    396 	goto invalid_data;
    397       get_uleb128 (new_file->info.length, linep, lineendp);
    398     }
    399   /* Skip the final NUL byte.  */
    400   ++linep;
    401 
    402   /* Consistency check.  */
    403   if (unlikely (linep != header_start + header_length))
    404     {
    405       __libdw_seterrno (DWARF_E_INVALID_DWARF);
    406       goto out;
    407     }
    408 
    409   state.is_stmt = default_is_stmt;
    410 
    411   /* Apply the "operation advance" from a special opcode or
    412      DW_LNS_advance_pc (as per DWARF4 6.2.5.1).  */
    413 #define advance_pc(op_advance) \
    414   run_advance_pc (&state, op_advance, minimum_instr_len, max_ops_per_instr)
    415 
    416   /* Process the instructions.  */
    417 
    418   /* Adds a new line to the matrix.  For the first MAX_STACK_LINES
    419      entries just return a slot in the preallocated stack array.  */
    420   struct linelist llstack[MAX_STACK_LINES];
    421 #define NEW_LINE(end_seq)						\
    422   do {								\
    423     struct linelist *ll = (state.nlinelist < MAX_STACK_LINES	\
    424 			   ? &llstack[state.nlinelist]		\
    425 			   : malloc (sizeof (struct linelist)));	\
    426     if (unlikely (ll == NULL))					\
    427       goto no_mem;						\
    428     state.end_sequence = end_seq;				\
    429     if (unlikely (add_new_line (&state, ll)))			\
    430       goto invalid_data;						\
    431   } while (0)
    432 
    433   while (linep < lineendp)
    434     {
    435       unsigned int opcode;
    436       unsigned int u128;
    437       int s128;
    438 
    439       /* Read the opcode.  */
    440       opcode = *linep++;
    441 
    442       /* Is this a special opcode?  */
    443       if (likely (opcode >= opcode_base))
    444 	{
    445 	  if (unlikely (line_range == 0))
    446 	    goto invalid_data;
    447 
    448 	  /* Yes.  Handling this is quite easy since the opcode value
    449 	     is computed with
    450 
    451 	     opcode = (desired line increment - line_base)
    452 		       + (line_range * address advance) + opcode_base
    453 	  */
    454 	  int line_increment = (line_base
    455 				+ (opcode - opcode_base) % line_range);
    456 
    457 	  /* Perform the increments.  */
    458 	  state.line += line_increment;
    459 	  advance_pc ((opcode - opcode_base) / line_range);
    460 
    461 	  /* Add a new line with the current state machine values.  */
    462 	  NEW_LINE (0);
    463 
    464 	  /* Reset the flags.  */
    465 	  state.basic_block = false;
    466 	  state.prologue_end = false;
    467 	  state.epilogue_begin = false;
    468 	  state.discriminator = 0;
    469 	}
    470       else if (opcode == 0)
    471 	{
    472 	  /* This an extended opcode.  */
    473 	  if (unlikely (lineendp - linep < 2))
    474 	    goto invalid_data;
    475 
    476 	  /* The length.  */
    477 	  uint_fast8_t len = *linep++;
    478 
    479 	  if (unlikely ((size_t) (lineendp - linep) < len))
    480 	    goto invalid_data;
    481 
    482 	  /* The sub-opcode.  */
    483 	  opcode = *linep++;
    484 
    485 	  switch (opcode)
    486 	    {
    487 	    case DW_LNE_end_sequence:
    488 	      /* Add a new line with the current state machine values.
    489 		 The is the end of the sequence.  */
    490 	      NEW_LINE (1);
    491 
    492 	      /* Reset the registers.  */
    493 	      state.addr = 0;
    494 	      state.op_index = 0;
    495 	      state.file = 1;
    496 	      state.line = 1;
    497 	      state.column = 0;
    498 	      state.is_stmt = default_is_stmt;
    499 	      state.basic_block = false;
    500 	      state.prologue_end = false;
    501 	      state.epilogue_begin = false;
    502 	      state.isa = 0;
    503 	      state.discriminator = 0;
    504 	      break;
    505 
    506 	    case DW_LNE_set_address:
    507 	      /* The value is an address.  The size is defined as
    508 		 apporiate for the target machine.  We use the
    509 		 address size field from the CU header.  */
    510 	      state.op_index = 0;
    511 	      if (unlikely (lineendp - linep < (uint8_t) address_size))
    512 		goto invalid_data;
    513 	      if (__libdw_read_address_inc (dbg, IDX_debug_line, &linep,
    514 					    address_size, &state.addr))
    515 		goto out;
    516 	      break;
    517 
    518 	    case DW_LNE_define_file:
    519 	      {
    520 		char *fname = (char *) linep;
    521 		uint8_t *endp = memchr (linep, '\0', lineendp - linep);
    522 		if (endp == NULL)
    523 		  goto invalid_data;
    524 		size_t fnamelen = endp - linep;
    525 		linep = endp + 1;
    526 
    527 		unsigned int diridx;
    528 		if (unlikely (linep >= lineendp))
    529 		  goto invalid_data;
    530 		get_uleb128 (diridx, linep, lineendp);
    531 		if (unlikely (diridx >= ndirlist))
    532 		  {
    533 		    __libdw_seterrno (DWARF_E_INVALID_DIR_IDX);
    534 		    goto invalid_data;
    535 		  }
    536 		Dwarf_Word mtime;
    537 		if (unlikely (linep >= lineendp))
    538 		  goto invalid_data;
    539 		get_uleb128 (mtime, linep, lineendp);
    540 		Dwarf_Word filelength;
    541 		if (unlikely (linep >= lineendp))
    542 		  goto invalid_data;
    543 		get_uleb128 (filelength, linep, lineendp);
    544 
    545 		struct filelist *new_file = NEW_FILE ();
    546 		if (fname[0] == '/')
    547 		  new_file->info.name = fname;
    548 		else
    549 		  {
    550 		    new_file->info.name =
    551 		      libdw_alloc (dbg, char, 1, (dirarray[diridx].len + 1
    552 						  + fnamelen + 1));
    553 		    char *cp = new_file->info.name;
    554 
    555 		    if (dirarray[diridx].dir != NULL)
    556 		      /* This value could be NULL in case the
    557 			 DW_AT_comp_dir was not present.  We
    558 			 cannot do much in this case.  The easiest
    559 			 thing is to convert the path in an
    560 			 absolute path.  */
    561 		      cp = stpcpy (cp, dirarray[diridx].dir);
    562 		    *cp++ = '/';
    563 		    strcpy (cp, fname);
    564 		  }
    565 
    566 		new_file->info.mtime = mtime;
    567 		new_file->info.length = filelength;
    568 	      }
    569 	      break;
    570 
    571 	    case DW_LNE_set_discriminator:
    572 	      /* Takes one ULEB128 parameter, the discriminator.  */
    573 	      if (unlikely (standard_opcode_lengths[opcode] != 1))
    574 		goto invalid_data;
    575 
    576 	      if (unlikely (linep >= lineendp))
    577 		goto invalid_data;
    578 	      get_uleb128 (state.discriminator, linep, lineendp);
    579 	      break;
    580 
    581 	    default:
    582 	      /* Unknown, ignore it.  */
    583 	      if (unlikely ((size_t) (lineendp - (linep - 1)) < len))
    584 		goto invalid_data;
    585 	      linep += len - 1;
    586 	      break;
    587 	    }
    588 	}
    589       else if (opcode <= DW_LNS_set_isa)
    590 	{
    591 	  /* This is a known standard opcode.  */
    592 	  switch (opcode)
    593 	    {
    594 	    case DW_LNS_copy:
    595 	      /* Takes no argument.  */
    596 	      if (unlikely (standard_opcode_lengths[opcode] != 0))
    597 		goto invalid_data;
    598 
    599 	      /* Add a new line with the current state machine values.  */
    600 	      NEW_LINE (0);
    601 
    602 	      /* Reset the flags.  */
    603 	      state.basic_block = false;
    604 	      state.prologue_end = false;
    605 	      state.epilogue_begin = false;
    606 	      state.discriminator = 0;
    607 	      break;
    608 
    609 	    case DW_LNS_advance_pc:
    610 	      /* Takes one uleb128 parameter which is added to the
    611 		 address.  */
    612 	      if (unlikely (standard_opcode_lengths[opcode] != 1))
    613 		goto invalid_data;
    614 
    615 	      if (unlikely (linep >= lineendp))
    616 		goto invalid_data;
    617 	      get_uleb128 (u128, linep, lineendp);
    618 	      advance_pc (u128);
    619 	      break;
    620 
    621 	    case DW_LNS_advance_line:
    622 	      /* Takes one sleb128 parameter which is added to the
    623 		 line.  */
    624 	      if (unlikely (standard_opcode_lengths[opcode] != 1))
    625 		goto invalid_data;
    626 
    627 	      if (unlikely (linep >= lineendp))
    628 		goto invalid_data;
    629 	      get_sleb128 (s128, linep, lineendp);
    630 	      state.line += s128;
    631 	      break;
    632 
    633 	    case DW_LNS_set_file:
    634 	      /* Takes one uleb128 parameter which is stored in file.  */
    635 	      if (unlikely (standard_opcode_lengths[opcode] != 1))
    636 		goto invalid_data;
    637 
    638 	      if (unlikely (linep >= lineendp))
    639 		goto invalid_data;
    640 	      get_uleb128 (u128, linep, lineendp);
    641 	      state.file = u128;
    642 	      break;
    643 
    644 	    case DW_LNS_set_column:
    645 	      /* Takes one uleb128 parameter which is stored in column.  */
    646 	      if (unlikely (standard_opcode_lengths[opcode] != 1))
    647 		goto invalid_data;
    648 
    649 	      if (unlikely (linep >= lineendp))
    650 		goto invalid_data;
    651 	      get_uleb128 (u128, linep, lineendp);
    652 	      state.column = u128;
    653 	      break;
    654 
    655 	    case DW_LNS_negate_stmt:
    656 	      /* Takes no argument.  */
    657 	      if (unlikely (standard_opcode_lengths[opcode] != 0))
    658 		goto invalid_data;
    659 
    660 	      state.is_stmt = 1 - state.is_stmt;
    661 	      break;
    662 
    663 	    case DW_LNS_set_basic_block:
    664 	      /* Takes no argument.  */
    665 	      if (unlikely (standard_opcode_lengths[opcode] != 0))
    666 		goto invalid_data;
    667 
    668 	      state.basic_block = true;
    669 	      break;
    670 
    671 	    case DW_LNS_const_add_pc:
    672 	      /* Takes no argument.  */
    673 	      if (unlikely (standard_opcode_lengths[opcode] != 0))
    674 		goto invalid_data;
    675 
    676 	      if (unlikely (line_range == 0))
    677 		goto invalid_data;
    678 
    679 	      advance_pc ((255 - opcode_base) / line_range);
    680 	      break;
    681 
    682 	    case DW_LNS_fixed_advance_pc:
    683 	      /* Takes one 16 bit parameter which is added to the
    684 		 address.  */
    685 	      if (unlikely (standard_opcode_lengths[opcode] != 1)
    686 		  || unlikely (lineendp - linep < 2))
    687 		goto invalid_data;
    688 
    689 	      state.addr += read_2ubyte_unaligned_inc (dbg, linep);
    690 	      state.op_index = 0;
    691 	      break;
    692 
    693 	    case DW_LNS_set_prologue_end:
    694 	      /* Takes no argument.  */
    695 	      if (unlikely (standard_opcode_lengths[opcode] != 0))
    696 		goto invalid_data;
    697 
    698 	      state.prologue_end = true;
    699 	      break;
    700 
    701 	    case DW_LNS_set_epilogue_begin:
    702 	      /* Takes no argument.  */
    703 	      if (unlikely (standard_opcode_lengths[opcode] != 0))
    704 		goto invalid_data;
    705 
    706 	      state.epilogue_begin = true;
    707 	      break;
    708 
    709 	    case DW_LNS_set_isa:
    710 	      /* Takes one uleb128 parameter which is stored in isa.  */
    711 	      if (unlikely (standard_opcode_lengths[opcode] != 1))
    712 		goto invalid_data;
    713 
    714 	      if (unlikely (linep >= lineendp))
    715 		goto invalid_data;
    716 	      get_uleb128 (state.isa, linep, lineendp);
    717 	      break;
    718 	    }
    719 	}
    720       else
    721 	{
    722 	  /* This is a new opcode the generator but not we know about.
    723 	     Read the parameters associated with it but then discard
    724 	     everything.  Read all the parameters for this opcode.  */
    725 	  for (int n = standard_opcode_lengths[opcode]; n > 0; --n)
    726 	    {
    727 	      if (unlikely (linep >= lineendp))
    728 		goto invalid_data;
    729 	      get_uleb128 (u128, linep, lineendp);
    730 	    }
    731 
    732 	  /* Next round, ignore this opcode.  */
    733 	  continue;
    734 	}
    735     }
    736 
    737   /* Put all the files in an array.  */
    738   Dwarf_Files *files = libdw_alloc (dbg, Dwarf_Files,
    739 				    sizeof (Dwarf_Files)
    740 				    + nfilelist * sizeof (Dwarf_Fileinfo)
    741 				    + (ndirlist + 1) * sizeof (char *),
    742 				    1);
    743   const char **dirs = (void *) &files->info[nfilelist];
    744 
    745   struct filelist *fileslist = filelist;
    746   files->nfiles = nfilelist;
    747   for (size_t n = nfilelist; n > 0; n--)
    748     {
    749       files->info[n - 1] = fileslist->info;
    750       fileslist = fileslist->next;
    751     }
    752   assert (fileslist == NULL);
    753 
    754   /* Put all the directory strings in an array.  */
    755   files->ndirs = ndirlist;
    756   for (unsigned int i = 0; i < ndirlist; ++i)
    757     dirs[i] = dirarray[i].dir;
    758   dirs[ndirlist] = NULL;
    759 
    760   /* Pass the file data structure to the caller.  */
    761   if (filesp != NULL)
    762     *filesp = files;
    763 
    764   size_t buf_size = (sizeof (Dwarf_Lines)
    765 		     + (sizeof (Dwarf_Line) * state.nlinelist));
    766   void *buf = libdw_alloc (dbg, Dwarf_Lines, buf_size, 1);
    767 
    768   /* First use the buffer for the pointers, and sort the entries.
    769      We'll write the pointers in the end of the buffer, and then
    770      copy into the buffer from the beginning so the overlap works.  */
    771   assert (sizeof (Dwarf_Line) >= sizeof (struct linelist *));
    772   struct linelist **sortlines = (buf + buf_size
    773 				 - sizeof (struct linelist **) * state.nlinelist);
    774 
    775   /* The list is in LIFO order and usually they come in clumps with
    776      ascending addresses.  So fill from the back to probably start with
    777      runs already in order before we sort.  */
    778   struct linelist *lineslist = state.linelist;
    779   for (size_t i = state.nlinelist; i-- > 0; )
    780     {
    781       sortlines[i] = lineslist;
    782       lineslist = lineslist->next;
    783     }
    784   assert (lineslist == NULL);
    785 
    786   /* Sort by ascending address.  */
    787   qsort (sortlines, state.nlinelist, sizeof sortlines[0], &compare_lines);
    788 
    789   /* Now that they are sorted, put them in the final array.
    790      The buffers overlap, so we've clobbered the early elements
    791      of SORTLINES by the time we're reading the later ones.  */
    792   Dwarf_Lines *lines = buf;
    793   lines->nlines = state.nlinelist;
    794   for (size_t i = 0; i < state.nlinelist; ++i)
    795     {
    796       lines->info[i] = sortlines[i]->line;
    797       lines->info[i].files = files;
    798     }
    799 
    800   /* Make sure the highest address for the CU is marked as end_sequence.
    801      This is required by the DWARF spec, but some compilers forget and
    802      dwfl_module_getsrc depends on it.  */
    803   if (state.nlinelist > 0)
    804     lines->info[state.nlinelist - 1].end_sequence = 1;
    805 
    806   /* Pass the line structure back to the caller.  */
    807   if (linesp != NULL)
    808     *linesp = lines;
    809 
    810   /* Success.  */
    811   res = 0;
    812 
    813  out:
    814   /* Free malloced line records, if any.  */
    815   for (size_t i = MAX_STACK_LINES; i < state.nlinelist; i++)
    816     {
    817       struct linelist *ll = state.linelist->next;
    818       free (state.linelist);
    819       state.linelist = ll;
    820     }
    821   if (ndirlist >= MAX_STACK_DIRS)
    822     free (dirarray);
    823   for (size_t i = MAX_STACK_FILES; i < nfilelist; i++)
    824     {
    825       struct filelist *fl = filelist->next;
    826       free (filelist);
    827       filelist = fl;
    828     }
    829 
    830   return res;
    831 }
    832 
    833 static int
    834 files_lines_compare (const void *p1, const void *p2)
    835 {
    836   const struct files_lines_s *t1 = p1;
    837   const struct files_lines_s *t2 = p2;
    838 
    839   if (t1->debug_line_offset < t2->debug_line_offset)
    840     return -1;
    841   if (t1->debug_line_offset > t2->debug_line_offset)
    842     return 1;
    843 
    844   return 0;
    845 }
    846 
    847 int
    848 internal_function
    849 __libdw_getsrclines (Dwarf *dbg, Dwarf_Off debug_line_offset,
    850 		     const char *comp_dir, unsigned address_size,
    851 		     Dwarf_Lines **linesp, Dwarf_Files **filesp)
    852 {
    853   struct files_lines_s fake = { .debug_line_offset = debug_line_offset };
    854   struct files_lines_s **found = tfind (&fake, &dbg->files_lines,
    855 					files_lines_compare);
    856   if (found == NULL)
    857     {
    858       Elf_Data *data = __libdw_checked_get_data (dbg, IDX_debug_line);
    859       if (data == NULL
    860 	  || __libdw_offset_in_section (dbg, IDX_debug_line,
    861 					debug_line_offset, 1) != 0)
    862 	return -1;
    863 
    864       const unsigned char *linep = data->d_buf + debug_line_offset;
    865       const unsigned char *lineendp = data->d_buf + data->d_size;
    866 
    867       struct files_lines_s *node = libdw_alloc (dbg, struct files_lines_s,
    868 						sizeof *node, 1);
    869 
    870       if (read_srclines (dbg, linep, lineendp, comp_dir, address_size,
    871 			 &node->lines, &node->files) != 0)
    872 	return -1;
    873 
    874       node->debug_line_offset = debug_line_offset;
    875 
    876       found = tsearch (node, &dbg->files_lines, files_lines_compare);
    877       if (found == NULL)
    878 	{
    879 	  __libdw_seterrno (DWARF_E_NOMEM);
    880 	  return -1;
    881 	}
    882     }
    883 
    884   if (linesp != NULL)
    885     *linesp = (*found)->lines;
    886 
    887   if (filesp != NULL)
    888     *filesp = (*found)->files;
    889 
    890   return 0;
    891 }
    892 
    893 /* Get the compilation directory, if any is set.  */
    894 const char *
    895 __libdw_getcompdir (Dwarf_Die *cudie)
    896 {
    897   Dwarf_Attribute compdir_attr_mem;
    898   Dwarf_Attribute *compdir_attr = INTUSE(dwarf_attr) (cudie,
    899 						      DW_AT_comp_dir,
    900 						      &compdir_attr_mem);
    901   return INTUSE(dwarf_formstring) (compdir_attr);
    902 }
    903 
    904 int
    905 dwarf_getsrclines (Dwarf_Die *cudie, Dwarf_Lines **lines, size_t *nlines)
    906 {
    907   if (cudie == NULL)
    908     return -1;
    909   if (! is_cudie (cudie))
    910     {
    911       __libdw_seterrno (DWARF_E_NOT_CUDIE);
    912       return -1;
    913     }
    914 
    915   /* Get the information if it is not already known.  */
    916   struct Dwarf_CU *const cu = cudie->cu;
    917   if (cu->lines == NULL)
    918     {
    919       /* Failsafe mode: no data found.  */
    920       cu->lines = (void *) -1l;
    921       cu->files = (void *) -1l;
    922 
    923       /* The die must have a statement list associated.  */
    924       Dwarf_Attribute stmt_list_mem;
    925       Dwarf_Attribute *stmt_list = INTUSE(dwarf_attr) (cudie, DW_AT_stmt_list,
    926 						       &stmt_list_mem);
    927 
    928       /* Get the offset into the .debug_line section.  NB: this call
    929 	 also checks whether the previous dwarf_attr call failed.  */
    930       Dwarf_Off debug_line_offset;
    931       if (__libdw_formptr (stmt_list, IDX_debug_line, DWARF_E_NO_DEBUG_LINE,
    932 			   NULL, &debug_line_offset) == NULL)
    933 	return -1;
    934 
    935       if (__libdw_getsrclines (cu->dbg, debug_line_offset,
    936 			       __libdw_getcompdir (cudie),
    937 			       cu->address_size, &cu->lines, &cu->files) < 0)
    938 	return -1;
    939     }
    940   else if (cu->lines == (void *) -1l)
    941     return -1;
    942 
    943   *lines = cu->lines;
    944   *nlines = cu->lines->nlines;
    945 
    946   // XXX Eventually: unlocking here.
    947 
    948   return 0;
    949 }
    950 INTDEF(dwarf_getsrclines)
    951