forked from Imagelibrary/binutils-gdb
CTF: handle forward reference type
The problems can be illustrated, with any program, below:
(gdb) print main
$1 = {main} 0x0
The return type was incorrectly set in read_func_kind_type, with
the name of the function, which leads c_type_print_base_1 to print
it. In addition, the address of a new function needs to be set with
that info in its minimal symtab entry, when the new function is added.
After the fix:
(gdb) print main
$1 = {int ()} 0x4004b7 <main>
A new test, gdb.ctf/funcreturn.exp, is added to the testsuite.
gdb/ChangeLog:
* ctfread.c (new_symbol): Set function address.
(read_func_kind_type): Remove incorrect type name setting.
Don't copy name returned from ctf_type_ame_raw throughout file.
gdb/testsuite/ChangeLog:
* gdb.ctf/funcreturn.exp: New file.
* gdb.ctf/whatis.c: Copy from gdb.base.
This commit is contained in:
@@ -462,14 +462,14 @@ new_symbol (struct ctf_context *ccp, struct type *type, ctf_id_t tid)
|
||||
ctf_dict_t *fp = ccp->fp;
|
||||
struct symbol *sym = nullptr;
|
||||
|
||||
gdb::unique_xmalloc_ptr<char> name (ctf_type_aname_raw (fp, tid));
|
||||
const char *name = ctf_type_name_raw (fp, tid);
|
||||
if (name != nullptr)
|
||||
{
|
||||
sym = new (&objfile->objfile_obstack) symbol;
|
||||
OBJSTAT (objfile, n_syms++);
|
||||
|
||||
sym->set_language (language_c, &objfile->objfile_obstack);
|
||||
sym->compute_and_set_names (name.get (), true, objfile->per_bfd);
|
||||
sym->compute_and_set_names (name, false, objfile->per_bfd);
|
||||
SYMBOL_DOMAIN (sym) = VAR_DOMAIN;
|
||||
SYMBOL_ACLASS_INDEX (sym) = LOC_OPTIMIZED_OUT;
|
||||
|
||||
@@ -487,6 +487,7 @@ new_symbol (struct ctf_context *ccp, struct type *type, ctf_id_t tid)
|
||||
break;
|
||||
case CTF_K_FUNCTION:
|
||||
SYMBOL_ACLASS_INDEX (sym) = LOC_STATIC;
|
||||
set_symbol_address (objfile, sym, sym->linkage_name ());
|
||||
break;
|
||||
case CTF_K_CONST:
|
||||
if (SYMBOL_TYPE (sym)->code () == TYPE_CODE_VOID)
|
||||
@@ -525,7 +526,7 @@ read_base_type (struct ctf_context *ccp, ctf_id_t tid)
|
||||
ctf_dict_t *fp = ccp->fp;
|
||||
ctf_encoding_t cet;
|
||||
struct type *type = nullptr;
|
||||
char *name;
|
||||
const char *name;
|
||||
uint32_t kind;
|
||||
|
||||
if (ctf_type_encoding (fp, tid, &cet))
|
||||
@@ -535,16 +536,14 @@ read_base_type (struct ctf_context *ccp, ctf_id_t tid)
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
gdb::unique_xmalloc_ptr<char> copied_name (ctf_type_aname_raw (fp, tid));
|
||||
if (copied_name == nullptr || strlen (copied_name.get ()) == 0)
|
||||
name = ctf_type_name_raw (fp, tid);
|
||||
if (name == nullptr || strlen (name) == 0)
|
||||
{
|
||||
name = ctf_type_aname (fp, tid);
|
||||
if (name == nullptr)
|
||||
complaint (_("ctf_type_aname read_base_type failed - %s"),
|
||||
ctf_errmsg (ctf_errno (fp)));
|
||||
}
|
||||
else
|
||||
name = obstack_strdup (&of->objfile_obstack, copied_name.get ());
|
||||
|
||||
kind = ctf_type_kind (fp, tid);
|
||||
if (kind == CTF_K_INTEGER)
|
||||
@@ -623,9 +622,9 @@ read_structure_type (struct ctf_context *ccp, ctf_id_t tid)
|
||||
|
||||
type = alloc_type (of);
|
||||
|
||||
gdb::unique_xmalloc_ptr<char> name (ctf_type_aname_raw (fp, tid));
|
||||
if (name != nullptr && strlen (name.get ()) != 0)
|
||||
type->set_name (obstack_strdup (&of->objfile_obstack, name.get ()));
|
||||
const char *name = ctf_type_name_raw (fp, tid);
|
||||
if (name != nullptr && strlen (name) != 0)
|
||||
type->set_name (name);
|
||||
|
||||
kind = ctf_type_kind (fp, tid);
|
||||
if (kind == CTF_K_UNION)
|
||||
@@ -682,10 +681,6 @@ read_func_kind_type (struct ctf_context *ccp, ctf_id_t tid)
|
||||
|
||||
type = alloc_type (of);
|
||||
|
||||
gdb::unique_xmalloc_ptr<char> name (ctf_type_aname_raw (fp, tid));
|
||||
if (name != nullptr && strlen (name.get ()) != 0)
|
||||
type->set_name (obstack_strdup (&of->objfile_obstack, name.get ()));
|
||||
|
||||
type->set_code (TYPE_CODE_FUNC);
|
||||
ctf_func_type_info (fp, tid, &cfi);
|
||||
rettype = fetch_tid_type (ccp, cfi.ctc_return);
|
||||
@@ -734,9 +729,9 @@ read_enum_type (struct ctf_context *ccp, ctf_id_t tid)
|
||||
|
||||
type = alloc_type (of);
|
||||
|
||||
gdb::unique_xmalloc_ptr<char> name (ctf_type_aname_raw (fp, tid));
|
||||
if (name != nullptr && strlen (name.get ()) != 0)
|
||||
type->set_name (obstack_strdup (&of->objfile_obstack, name.get ()));
|
||||
const char *name = ctf_type_name_raw (fp, tid);
|
||||
if (name != nullptr && strlen (name) != 0)
|
||||
type->set_name (name);
|
||||
|
||||
type->set_code (TYPE_CODE_ENUM);
|
||||
TYPE_LENGTH (type) = ctf_type_size (fp, tid);
|
||||
@@ -972,9 +967,9 @@ read_forward_type (struct ctf_context *ccp, ctf_id_t tid)
|
||||
|
||||
type = alloc_type (of);
|
||||
|
||||
gdb::unique_xmalloc_ptr<char> name (ctf_type_aname_raw (fp, tid));
|
||||
if (name != NULL && strlen (name.get()) != 0)
|
||||
type->set_name (obstack_strdup (&of->objfile_obstack, name.get ()));
|
||||
const char *name = ctf_type_name_raw (fp, tid);
|
||||
if (name != nullptr && strlen (name) != 0)
|
||||
type->set_name (name);
|
||||
|
||||
kind = ctf_type_kind_forwarded (fp, tid);
|
||||
if (kind == CTF_K_UNION)
|
||||
@@ -1017,9 +1012,9 @@ read_type_record (struct ctf_context *ccp, ctf_id_t tid)
|
||||
break;
|
||||
case CTF_K_TYPEDEF:
|
||||
{
|
||||
gdb::unique_xmalloc_ptr<char> name (ctf_type_aname_raw (fp, tid));
|
||||
const char *name = ctf_type_name_raw (fp, tid);
|
||||
btid = ctf_type_reference (fp, tid);
|
||||
type = read_typedef_type (ccp, tid, btid, name.get ());
|
||||
type = read_typedef_type (ccp, tid, btid, name);
|
||||
}
|
||||
break;
|
||||
case CTF_K_VOLATILE:
|
||||
@@ -1444,7 +1439,6 @@ ctf_psymtab_type_cb (ctf_id_t tid, void *arg)
|
||||
short section = -1;
|
||||
|
||||
ccp = (struct ctf_context *) arg;
|
||||
gdb::unique_xmalloc_ptr<char> name (ctf_type_aname_raw (ccp->fp, tid));
|
||||
|
||||
domain_enum domain = UNDEF_DOMAIN;
|
||||
enum address_class aclass = LOC_UNDEF;
|
||||
@@ -1486,10 +1480,11 @@ ctf_psymtab_type_cb (ctf_id_t tid, void *arg)
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (name == nullptr || strlen (name.get ()) == 0)
|
||||
const char *name = ctf_type_name_raw (ccp->fp, tid);
|
||||
if (name == nullptr || strlen (name) == 0)
|
||||
return 0;
|
||||
|
||||
ccp->pst->add_psymbol (name.get (), true,
|
||||
ccp->pst->add_psymbol (name, false,
|
||||
domain, aclass, section,
|
||||
psymbol_placement::GLOBAL,
|
||||
0, language_c, ccp->partial_symtabs, ccp->of);
|
||||
@@ -1545,7 +1540,7 @@ scan_partial_symbols (ctf_dict_t *cfp, psymtab_storage *partial_symtabs,
|
||||
else
|
||||
continue;
|
||||
}
|
||||
gdb::unique_xmalloc_ptr<char> tname (ctf_type_aname_raw (cfp, tid));
|
||||
const char *tname = ctf_type_name_raw (cfp, tid);
|
||||
uint32_t kind = ctf_type_kind (cfp, tid);
|
||||
address_class aclass;
|
||||
domain_enum tdomain;
|
||||
@@ -1568,7 +1563,7 @@ scan_partial_symbols (ctf_dict_t *cfp, psymtab_storage *partial_symtabs,
|
||||
else
|
||||
aclass = LOC_TYPEDEF;
|
||||
|
||||
pst->add_psymbol (tname.get (), true,
|
||||
pst->add_psymbol (tname, false,
|
||||
tdomain, aclass, -1,
|
||||
psymbol_placement::STATIC,
|
||||
0, language_c, partial_symtabs, of);
|
||||
|
||||
Reference in New Issue
Block a user