Print this page
libdtrace: attempt to resolve FORWARD types to concrete types
*** 39,48 ****
--- 39,49 ----
#include <assert.h>
#include <errno.h>
#include <dt_impl.h>
#include <dt_grammar.h>
+ #include <dt_module.h>
#include <dt_parser.h>
#include <dt_provider.h>
static void dt_cg_node(dt_node_t *, dt_irlist_t *, dt_regset_t *);
*** 68,89 ****
* the actual definition and then call ctf_member_info on the result.
*/
static ctf_file_t *
dt_cg_membinfo(ctf_file_t *fp, ctf_id_t type, const char *s, ctf_membinfo_t *mp)
{
! while (ctf_type_kind(fp, type) == CTF_K_FORWARD) {
! char n[DT_TYPE_NAMELEN];
! dtrace_typeinfo_t dtt;
!
! if (ctf_type_name(fp, type, n, sizeof (n)) == NULL ||
! dt_type_lookup(n, &dtt) == -1 || (
! dtt.dtt_ctfp == fp && dtt.dtt_type == type))
! break; /* unable to improve our position */
!
! fp = dtt.dtt_ctfp;
! type = ctf_type_resolve(fp, dtt.dtt_type);
! }
if (ctf_member_info(fp, type, s, mp) == CTF_ERR)
return (NULL); /* ctf_errno is set for us */
return (fp);
--- 69,79 ----
* the actual definition and then call ctf_member_info on the result.
*/
static ctf_file_t *
dt_cg_membinfo(ctf_file_t *fp, ctf_id_t type, const char *s, ctf_membinfo_t *mp)
{
! dt_resolve_forward_decl(&fp, &type);
if (ctf_member_info(fp, type, s, mp) == CTF_ERR)
return (NULL); /* ctf_errno is set for us */
return (fp);