* dbxread.c (record_minimal_symbol): Record the section
associated with the symbol to make dynmaic relocation work. * (dbx_symfile_read, process_one_symbol): Fixes to work around Solaris brain-damage which don't apply to relocatable object files. * (stabsect_build_psymtabs): New routine to read stabs out of an arbitrarily named section. * nlmread.c (nlm_symtab_read): Read ALL syms from the NLM, not just globals. * (nlm_symfile_read): Call stabsect_build_psymtabs to read the stabs out of the nlm. * partial-stabs.h (cases 'f' & 'F'): Fixes to work around Solaris brain-damage which don't apply to relocatable object files. * remote.c (putpkt): Improve error reporting and error handling. * stabsread.c (define_symbol, scan_file_globals): Record section info in sym.
This commit is contained in:
parent
cde7350107
commit
a66e8382de
5 changed files with 205 additions and 28 deletions
|
@ -1,3 +1,22 @@
|
||||||
|
Tue Apr 26 09:50:45 1994 Stu Grossman (grossman at cygnus.com)
|
||||||
|
|
||||||
|
* dbxread.c (record_minimal_symbol): Record the section
|
||||||
|
associated with the symbol to make dynmaic relocation work.
|
||||||
|
* (dbx_symfile_read, process_one_symbol): Fixes to work around
|
||||||
|
Solaris brain-damage which don't apply to relocatable object
|
||||||
|
files.
|
||||||
|
* (stabsect_build_psymtabs): New routine to read stabs out of an
|
||||||
|
arbitrarily named section.
|
||||||
|
* nlmread.c (nlm_symtab_read): Read ALL syms from the NLM, not just
|
||||||
|
globals.
|
||||||
|
* (nlm_symfile_read): Call stabsect_build_psymtabs to read the
|
||||||
|
stabs out of the nlm.
|
||||||
|
* partial-stabs.h (cases 'f' & 'F'): Fixes to work around Solaris
|
||||||
|
brain-damage which don't apply to relocatable object files.
|
||||||
|
* remote.c (putpkt): Improve error reporting and error handling.
|
||||||
|
* stabsread.c (define_symbol, scan_file_globals): Record section
|
||||||
|
info in sym.
|
||||||
|
|
||||||
Sat Apr 23 19:05:52 1994 Jim Kingdon (kingdon@lioth.cygnus.com)
|
Sat Apr 23 19:05:52 1994 Jim Kingdon (kingdon@lioth.cygnus.com)
|
||||||
|
|
||||||
* breakpoint.c (breakpoint_1): Annotate each field of output. Add
|
* breakpoint.c (breakpoint_1): Annotate each field of output. Add
|
||||||
|
|
183
gdb/dbxread.c
183
gdb/dbxread.c
|
@ -138,6 +138,12 @@ static unsigned string_table_offset;
|
||||||
offset for the current and next .o files. */
|
offset for the current and next .o files. */
|
||||||
static unsigned int file_string_table_offset;
|
static unsigned int file_string_table_offset;
|
||||||
static unsigned int next_file_string_table_offset;
|
static unsigned int next_file_string_table_offset;
|
||||||
|
|
||||||
|
/* .o and NLM files contain unrelocated addresses which are based at 0. When
|
||||||
|
non-zero, this flag disables some of the special cases for Solaris elf+stab
|
||||||
|
text addresses at location 0. */
|
||||||
|
|
||||||
|
static int symfile_relocatable = 0;
|
||||||
|
|
||||||
/* This is the lowest text address we have yet encountered. */
|
/* This is the lowest text address we have yet encountered. */
|
||||||
static CORE_ADDR lowest_text_address;
|
static CORE_ADDR lowest_text_address;
|
||||||
|
@ -407,20 +413,37 @@ record_minimal_symbol (name, address, type, objfile)
|
||||||
struct objfile *objfile;
|
struct objfile *objfile;
|
||||||
{
|
{
|
||||||
enum minimal_symbol_type ms_type;
|
enum minimal_symbol_type ms_type;
|
||||||
|
int section;
|
||||||
|
|
||||||
switch (type)
|
switch (type)
|
||||||
{
|
{
|
||||||
case N_TEXT | N_EXT: ms_type = mst_text; break;
|
case N_TEXT | N_EXT:
|
||||||
case N_DATA | N_EXT: ms_type = mst_data; break;
|
ms_type = mst_text;
|
||||||
case N_BSS | N_EXT: ms_type = mst_bss; break;
|
section = SECT_OFF_TEXT;
|
||||||
case N_ABS | N_EXT: ms_type = mst_abs; break;
|
break;
|
||||||
|
case N_DATA | N_EXT:
|
||||||
|
ms_type = mst_data;
|
||||||
|
section = SECT_OFF_DATA;
|
||||||
|
break;
|
||||||
|
case N_BSS | N_EXT:
|
||||||
|
ms_type = mst_bss;
|
||||||
|
section = SECT_OFF_BSS;
|
||||||
|
break;
|
||||||
|
case N_ABS | N_EXT:
|
||||||
|
ms_type = mst_abs;
|
||||||
|
section = -1;
|
||||||
|
break;
|
||||||
#ifdef N_SETV
|
#ifdef N_SETV
|
||||||
case N_SETV | N_EXT: ms_type = mst_data; break;
|
case N_SETV | N_EXT:
|
||||||
|
ms_type = mst_data;
|
||||||
|
section = SECT_OFF_DATA;
|
||||||
|
break;
|
||||||
case N_SETV:
|
case N_SETV:
|
||||||
/* I don't think this type actually exists; since a N_SETV is the result
|
/* I don't think this type actually exists; since a N_SETV is the result
|
||||||
of going over many .o files, it doesn't make sense to have one
|
of going over many .o files, it doesn't make sense to have one
|
||||||
file local. */
|
file local. */
|
||||||
ms_type = mst_file_data;
|
ms_type = mst_file_data;
|
||||||
|
section = SECT_OFF_DATA;
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
case N_TEXT:
|
case N_TEXT:
|
||||||
|
@ -428,8 +451,8 @@ record_minimal_symbol (name, address, type, objfile)
|
||||||
case N_FN:
|
case N_FN:
|
||||||
case N_FN_SEQ:
|
case N_FN_SEQ:
|
||||||
ms_type = mst_file_text;
|
ms_type = mst_file_text;
|
||||||
|
section = SECT_OFF_TEXT;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case N_DATA:
|
case N_DATA:
|
||||||
ms_type = mst_file_data;
|
ms_type = mst_file_data;
|
||||||
|
|
||||||
|
@ -448,23 +471,28 @@ record_minimal_symbol (name, address, type, objfile)
|
||||||
if (VTBL_PREFIX_P ((tempstring)))
|
if (VTBL_PREFIX_P ((tempstring)))
|
||||||
ms_type = mst_data;
|
ms_type = mst_data;
|
||||||
}
|
}
|
||||||
|
section = SECT_OFF_DATA;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case N_BSS:
|
case N_BSS:
|
||||||
ms_type = mst_file_bss;
|
ms_type = mst_file_bss;
|
||||||
|
section = SECT_OFF_BSS;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
ms_type = mst_unknown;
|
||||||
|
section = -1;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default: ms_type = mst_unknown; break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ms_type == mst_file_text || ms_type == mst_text
|
if (ms_type == mst_file_text || ms_type == mst_text
|
||||||
&& address < lowest_text_address)
|
&& address < lowest_text_address)
|
||||||
lowest_text_address = address;
|
lowest_text_address = address;
|
||||||
|
|
||||||
prim_record_minimal_symbol
|
prim_record_minimal_symbol_and_info
|
||||||
(obsavestring (name, strlen (name), &objfile -> symbol_obstack),
|
(obsavestring (name, strlen (name), &objfile -> symbol_obstack),
|
||||||
address,
|
address,
|
||||||
ms_type,
|
ms_type,
|
||||||
|
NULL,
|
||||||
|
section,
|
||||||
objfile);
|
objfile);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -488,6 +516,18 @@ dbx_symfile_read (objfile, section_offsets, mainline)
|
||||||
int val;
|
int val;
|
||||||
struct cleanup *back_to;
|
struct cleanup *back_to;
|
||||||
|
|
||||||
|
val = strlen (objfile->name);
|
||||||
|
|
||||||
|
/* .o and .nlm files are relocatables with text, data and bss segs based at
|
||||||
|
0. This flag disables special (Solaris stabs-in-elf only) fixups for
|
||||||
|
symbols with a value of 0. XXX - This is a Krock. Solaris stabs-in-elf
|
||||||
|
should be fixed to determine pst->textlow without using this text seg of
|
||||||
|
0 fixup crap. */
|
||||||
|
|
||||||
|
if (strcmp (&objfile->name[val-2], ".o") == 0
|
||||||
|
|| strcmp (&objfile->name[val-4], ".nlm") == 0)
|
||||||
|
symfile_relocatable = 1;
|
||||||
|
|
||||||
sym_bfd = objfile->obfd;
|
sym_bfd = objfile->obfd;
|
||||||
val = bfd_seek (objfile->obfd, DBX_SYMTAB_OFFSET (objfile), SEEK_SET);
|
val = bfd_seek (objfile->obfd, DBX_SYMTAB_OFFSET (objfile), SEEK_SET);
|
||||||
if (val < 0)
|
if (val < 0)
|
||||||
|
@ -1691,7 +1731,8 @@ process_one_symbol (type, desc, valu, name, section_offsets, objfile)
|
||||||
block_address_function_relative =
|
block_address_function_relative =
|
||||||
((0 == strncmp (bfd_get_target (objfile->obfd), "elf", 3))
|
((0 == strncmp (bfd_get_target (objfile->obfd), "elf", 3))
|
||||||
|| (0 == strncmp (bfd_get_target (objfile->obfd), "som", 3))
|
|| (0 == strncmp (bfd_get_target (objfile->obfd), "som", 3))
|
||||||
|| (0 == strncmp (bfd_get_target (objfile->obfd), "coff", 4)));
|
|| (0 == strncmp (bfd_get_target (objfile->obfd), "coff", 4))
|
||||||
|
|| (0 == strncmp (bfd_get_target (objfile->obfd), "nlm", 3)));
|
||||||
|
|
||||||
if (!block_address_function_relative)
|
if (!block_address_function_relative)
|
||||||
/* N_LBRAC, N_RBRAC and N_SLINE entries are not relative to the
|
/* N_LBRAC, N_RBRAC and N_SLINE entries are not relative to the
|
||||||
|
@ -1926,21 +1967,30 @@ process_one_symbol (type, desc, valu, name, section_offsets, objfile)
|
||||||
call level, which we really don't want to do). */
|
call level, which we really don't want to do). */
|
||||||
{
|
{
|
||||||
char *p;
|
char *p;
|
||||||
p = strchr (name, ':');
|
|
||||||
if (p != 0 && p[1] == 'S')
|
/* .o files and NLMs have non-zero text seg offsets, but don't need
|
||||||
|
their static syms offset in this fashion. XXX - This is really a
|
||||||
|
crock that should be fixed in the solib handling code so that I
|
||||||
|
don't have to work around it here. */
|
||||||
|
|
||||||
|
if (!symfile_relocatable)
|
||||||
{
|
{
|
||||||
/* The linker relocated it. We don't want to add an
|
p = strchr (name, ':');
|
||||||
elfstab_offset_sections-type offset, but we *do* want
|
if (p != 0 && p[1] == 'S')
|
||||||
to add whatever solib.c passed to symbol_file_add as
|
{
|
||||||
addr (this is known to affect SunOS4, and I suspect ELF
|
/* The linker relocated it. We don't want to add an
|
||||||
too). Since elfstab_offset_sections currently does not
|
elfstab_offset_sections-type offset, but we *do* want
|
||||||
muck with the text offset (there is no Ttext.text
|
to add whatever solib.c passed to symbol_file_add as
|
||||||
symbol), we can get addr from the text offset. If
|
addr (this is known to affect SunOS4, and I suspect ELF
|
||||||
elfstab_offset_sections ever starts dealing with the
|
too). Since elfstab_offset_sections currently does not
|
||||||
text offset, and we still need to do this, we need to
|
muck with the text offset (there is no Ttext.text
|
||||||
invent a SECT_OFF_ADDR_KLUDGE or something. */
|
symbol), we can get addr from the text offset. If
|
||||||
valu += ANOFFSET (section_offsets, SECT_OFF_TEXT);
|
elfstab_offset_sections ever starts dealing with the
|
||||||
goto define_a_symbol;
|
text offset, and we still need to do this, we need to
|
||||||
|
invent a SECT_OFF_ADDR_KLUDGE or something. */
|
||||||
|
valu += ANOFFSET (section_offsets, SECT_OFF_TEXT);
|
||||||
|
goto define_a_symbol;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
/* Since it's not the kludge case, re-dispatch to the right handler. */
|
/* Since it's not the kludge case, re-dispatch to the right handler. */
|
||||||
switch (type) {
|
switch (type) {
|
||||||
|
@ -2287,6 +2337,89 @@ elfstab_build_psymtabs (objfile, section_offsets, mainline,
|
||||||
dbx_symfile_read (objfile, section_offsets, 0);
|
dbx_symfile_read (objfile, section_offsets, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Scan and build partial symbols for a file with special sections for stabs
|
||||||
|
and stabstrings. The file has already been processed to get its minimal
|
||||||
|
symbols, and any other symbols that might be necessary to resolve GSYMs.
|
||||||
|
|
||||||
|
This routine is the equivalent of dbx_symfile_init and dbx_symfile_read
|
||||||
|
rolled into one.
|
||||||
|
|
||||||
|
OBJFILE is the object file we are reading symbols from.
|
||||||
|
ADDR is the address relative to which the symbols are (e.g. the base address
|
||||||
|
of the text segment).
|
||||||
|
MAINLINE is true if we are reading the main symbol table (as opposed to a
|
||||||
|
shared lib or dynamically loaded file).
|
||||||
|
STAB_NAME is the name of the section that contains the stabs.
|
||||||
|
STABSTR_NAME is the name of the section that contains the stab strings.
|
||||||
|
|
||||||
|
This routine is mostly copied from dbx_symfile_init and dbx_symfile_read. */
|
||||||
|
|
||||||
|
void
|
||||||
|
stabsect_build_psymtabs (objfile, section_offsets, mainline, stab_name,
|
||||||
|
stabstr_name)
|
||||||
|
struct objfile *objfile;
|
||||||
|
struct section_offsets *section_offsets;
|
||||||
|
int mainline;
|
||||||
|
char *stab_name;
|
||||||
|
char *stabstr_name;
|
||||||
|
{
|
||||||
|
int val;
|
||||||
|
bfd *sym_bfd = objfile->obfd;
|
||||||
|
char *name = bfd_get_filename (sym_bfd);
|
||||||
|
asection *stabsect;
|
||||||
|
asection *stabstrsect;
|
||||||
|
|
||||||
|
stabsect = bfd_get_section_by_name (sym_bfd, stab_name);
|
||||||
|
stabstrsect = bfd_get_section_by_name (sym_bfd, stabstr_name);
|
||||||
|
|
||||||
|
if (!stabsect)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (!stabstrsect)
|
||||||
|
error ("stabsect_build_psymtabs: Found stabs (%s), but not string section (%s)",
|
||||||
|
stab_name, stabstr_name);
|
||||||
|
|
||||||
|
DBX_SYMFILE_INFO (objfile) = (PTR) xmalloc (sizeof (struct dbx_symfile_info));
|
||||||
|
memset (DBX_SYMFILE_INFO (objfile), 0, sizeof (struct dbx_symfile_info));
|
||||||
|
|
||||||
|
DBX_TEXT_SECT (objfile) = bfd_get_section_by_name (sym_bfd, ".text");
|
||||||
|
if (!DBX_TEXT_SECT (objfile))
|
||||||
|
error ("Can't find .text section in symbol file");
|
||||||
|
|
||||||
|
DBX_SYMBOL_SIZE (objfile) = sizeof (struct external_nlist);
|
||||||
|
DBX_SYMCOUNT (objfile) = bfd_section_size (sym_bfd, stabsect)
|
||||||
|
/ DBX_SYMBOL_SIZE (objfile);
|
||||||
|
DBX_STRINGTAB_SIZE (objfile) = bfd_section_size (sym_bfd, stabstrsect);
|
||||||
|
DBX_SYMTAB_OFFSET (objfile) = stabsect->filepos; /* XXX - FIXME: POKING INSIDE BFD DATA STRUCTURES */
|
||||||
|
|
||||||
|
if (DBX_STRINGTAB_SIZE (objfile) > bfd_get_size (sym_bfd))
|
||||||
|
error ("ridiculous string table size: %d bytes", DBX_STRINGTAB_SIZE (objfile));
|
||||||
|
DBX_STRINGTAB (objfile) = (char *)
|
||||||
|
obstack_alloc (&objfile->psymbol_obstack, DBX_STRINGTAB_SIZE (objfile) + 1);
|
||||||
|
|
||||||
|
/* Now read in the string table in one big gulp. */
|
||||||
|
|
||||||
|
val = bfd_get_section_contents (sym_bfd, /* bfd */
|
||||||
|
stabstrsect, /* bfd section */
|
||||||
|
DBX_STRINGTAB (objfile), /* input buffer */
|
||||||
|
0, /* offset into section */
|
||||||
|
DBX_STRINGTAB_SIZE (objfile)); /* amount to read */
|
||||||
|
|
||||||
|
if (!val)
|
||||||
|
perror_with_name (name);
|
||||||
|
|
||||||
|
stabsread_new_init ();
|
||||||
|
buildsym_new_init ();
|
||||||
|
free_header_files ();
|
||||||
|
init_header_files ();
|
||||||
|
install_minimal_symbols (objfile);
|
||||||
|
|
||||||
|
/* Now, do an incremental load */
|
||||||
|
|
||||||
|
processing_acc_compilation = 1;
|
||||||
|
dbx_symfile_read (objfile, section_offsets, 0);
|
||||||
|
}
|
||||||
|
|
||||||
/* Scan and build partial symbols for a PA symbol file.
|
/* Scan and build partial symbols for a PA symbol file.
|
||||||
This PA file has already been processed to get its minimal symbols.
|
This PA file has already been processed to get its minimal symbols.
|
||||||
|
|
||||||
|
|
|
@ -144,7 +144,7 @@ nlm_symtab_read (abfd, addr, objfile)
|
||||||
for (i = 0; i < number_of_symbols; i++)
|
for (i = 0; i < number_of_symbols; i++)
|
||||||
{
|
{
|
||||||
sym = symbol_table[i];
|
sym = symbol_table[i];
|
||||||
if (sym -> flags & BSF_GLOBAL)
|
if (/*sym -> flags & BSF_GLOBAL*/ 1)
|
||||||
{
|
{
|
||||||
/* Bfd symbols are section relative. */
|
/* Bfd symbols are section relative. */
|
||||||
symaddr = sym -> value + sym -> section -> vma;
|
symaddr = sym -> value + sym -> section -> vma;
|
||||||
|
@ -227,6 +227,9 @@ nlm_symfile_read (objfile, section_offsets, mainline)
|
||||||
|
|
||||||
nlm_symtab_read (abfd, offset, objfile);
|
nlm_symtab_read (abfd, offset, objfile);
|
||||||
|
|
||||||
|
stabsect_build_psymtabs (objfile, section_offsets, mainline, ".stab",
|
||||||
|
".stabstr");
|
||||||
|
|
||||||
/* FIXME: We could locate and read the optional native debugging format
|
/* FIXME: We could locate and read the optional native debugging format
|
||||||
here and add the symbols to the minimal symbol table. */
|
here and add the symbols to the minimal symbol table. */
|
||||||
|
|
||||||
|
|
|
@ -500,7 +500,9 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
||||||
#ifdef DBXREAD_ONLY
|
#ifdef DBXREAD_ONLY
|
||||||
/* Kludges for ELF/STABS with Sun ACC */
|
/* Kludges for ELF/STABS with Sun ACC */
|
||||||
last_function_name = namestring;
|
last_function_name = namestring;
|
||||||
if (pst && pst->textlow == 0)
|
/* Do not fix textlow==0 for .o or NLM files, as 0 is a legit
|
||||||
|
value for the bottom of the text seg in those cases. */
|
||||||
|
if (pst && pst->textlow == 0 && !symfile_relocatable)
|
||||||
pst->textlow = CUR_SYMBOL_VALUE;
|
pst->textlow = CUR_SYMBOL_VALUE;
|
||||||
#if 0
|
#if 0
|
||||||
if (startup_file_end == 0)
|
if (startup_file_end == 0)
|
||||||
|
@ -522,7 +524,9 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
||||||
#ifdef DBXREAD_ONLY
|
#ifdef DBXREAD_ONLY
|
||||||
/* Kludges for ELF/STABS with Sun ACC */
|
/* Kludges for ELF/STABS with Sun ACC */
|
||||||
last_function_name = namestring;
|
last_function_name = namestring;
|
||||||
if (pst && pst->textlow == 0)
|
/* Do not fix textlow==0 for .o or NLM files, as 0 is a legit
|
||||||
|
value for the bottom of the text seg in those cases. */
|
||||||
|
if (pst && pst->textlow == 0 && !symfile_relocatable)
|
||||||
pst->textlow = CUR_SYMBOL_VALUE;
|
pst->textlow = CUR_SYMBOL_VALUE;
|
||||||
#if 0
|
#if 0
|
||||||
if (startup_file_end == 0)
|
if (startup_file_end == 0)
|
||||||
|
|
|
@ -33,6 +33,9 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
||||||
#include "symfile.h"
|
#include "symfile.h"
|
||||||
#include "objfiles.h"
|
#include "objfiles.h"
|
||||||
#include "aout/stab_gnu.h" /* We always use GNU stabs, not native */
|
#include "aout/stab_gnu.h" /* We always use GNU stabs, not native */
|
||||||
|
#include "libaout.h"
|
||||||
|
#include "aout/aout64.h"
|
||||||
|
#include "gdb-stabs.h"
|
||||||
#include "buildsym.h"
|
#include "buildsym.h"
|
||||||
#include "complaints.h"
|
#include "complaints.h"
|
||||||
#include "demangle.h"
|
#include "demangle.h"
|
||||||
|
@ -540,6 +543,19 @@ define_symbol (valu, string, desc, type, objfile)
|
||||||
obstack_alloc (&objfile -> symbol_obstack, sizeof (struct symbol));
|
obstack_alloc (&objfile -> symbol_obstack, sizeof (struct symbol));
|
||||||
memset (sym, 0, sizeof (struct symbol));
|
memset (sym, 0, sizeof (struct symbol));
|
||||||
|
|
||||||
|
switch (type & N_TYPE)
|
||||||
|
{
|
||||||
|
case N_TEXT:
|
||||||
|
SYMBOL_SECTION(sym) = SECT_OFF_TEXT;
|
||||||
|
break;
|
||||||
|
case N_DATA:
|
||||||
|
SYMBOL_SECTION(sym) = SECT_OFF_DATA;
|
||||||
|
break;
|
||||||
|
case N_BSS:
|
||||||
|
SYMBOL_SECTION(sym) = SECT_OFF_BSS;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
if (processing_gcc_compilation)
|
if (processing_gcc_compilation)
|
||||||
{
|
{
|
||||||
/* GCC 2.x puts the line number in desc. SunOS apparently puts in the
|
/* GCC 2.x puts the line number in desc. SunOS apparently puts in the
|
||||||
|
@ -3827,6 +3843,8 @@ scan_file_globals (objfile)
|
||||||
SYMBOL_VALUE_ADDRESS (sym) = SYMBOL_VALUE_ADDRESS (msymbol);
|
SYMBOL_VALUE_ADDRESS (sym) = SYMBOL_VALUE_ADDRESS (msymbol);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SYMBOL_SECTION (sym) = SYMBOL_SECTION (msymbol);
|
||||||
|
|
||||||
if (prev)
|
if (prev)
|
||||||
{
|
{
|
||||||
sym = SYMBOL_VALUE_CHAIN (prev);
|
sym = SYMBOL_VALUE_CHAIN (prev);
|
||||||
|
|
Loading…
Add table
Reference in a new issue