@ -115,7 +115,7 @@ static const Dwfl_Callbacks offline_callbacks = {
} ;
/* Get a Dwarf from offline image */
static int debuginfo__init_offline_dwarf ( struct debuginfo * self ,
static int debuginfo__init_offline_dwarf ( struct debuginfo * dbg ,
const char * path )
{
int fd ;
@ -124,25 +124,25 @@ static int debuginfo__init_offline_dwarf(struct debuginfo *self,
if ( fd < 0 )
return fd ;
self - > dwfl = dwfl_begin ( & offline_callbacks ) ;
if ( ! self - > dwfl )
dbg - > dwfl = dwfl_begin ( & offline_callbacks ) ;
if ( ! dbg - > dwfl )
goto error ;
self - > mod = dwfl_report_offline ( self - > dwfl , " " , " " , fd ) ;
if ( ! self - > mod )
dbg - > mod = dwfl_report_offline ( dbg - > dwfl , " " , " " , fd ) ;
if ( ! dbg - > mod )
goto error ;
self - > dbg = dwfl_module_getdwarf ( self - > mod , & self - > bias ) ;
if ( ! self - > dbg )
dbg - > dbg = dwfl_module_getdwarf ( dbg - > mod , & dbg - > bias ) ;
if ( ! dbg - > dbg )
goto error ;
return 0 ;
error :
if ( self - > dwfl )
dwfl_end ( self - > dwfl ) ;
if ( dbg - > dwfl )
dwfl_end ( dbg - > dwfl ) ;
else
close ( fd ) ;
memset ( self , 0 , sizeof ( * self ) ) ;
memset ( dbg , 0 , sizeof ( * dbg ) ) ;
return - ENOENT ;
}
@ -180,24 +180,24 @@ static const Dwfl_Callbacks kernel_callbacks = {
} ;
/* Get a Dwarf from live kernel image */
static int debuginfo__init_online_kernel_dwarf ( struct debuginfo * self ,
static int debuginfo__init_online_kernel_dwarf ( struct debuginfo * dbg ,
Dwarf_Addr addr )
{
self - > dwfl = dwfl_begin ( & kernel_callbacks ) ;
if ( ! self - > dwfl )
dbg - > dwfl = dwfl_begin ( & kernel_callbacks ) ;
if ( ! dbg - > dwfl )
return - EINVAL ;
/* Load the kernel dwarves: Don't care the result here */
dwfl_linux_kernel_report_kernel ( self - > dwfl ) ;
dwfl_linux_kernel_report_modules ( self - > dwfl ) ;
dwfl_linux_kernel_report_kernel ( dbg - > dwfl ) ;
dwfl_linux_kernel_report_modules ( dbg - > dwfl ) ;
self - > dbg = dwfl_addrdwarf ( self - > dwfl , addr , & self - > bias ) ;
dbg - > dbg = dwfl_addrdwarf ( dbg - > dwfl , addr , & dbg - > bias ) ;
/* Here, check whether we could get a real dwarf */
if ( ! self - > dbg ) {
if ( ! dbg - > dbg ) {
pr_debug ( " Failed to find kernel dwarf at %lx \n " ,
( unsigned long ) addr ) ;
dwfl_end ( self - > dwfl ) ;
memset ( self , 0 , sizeof ( * self ) ) ;
dwfl_end ( dbg - > dwfl ) ;
memset ( dbg , 0 , sizeof ( * dbg ) ) ;
return - ENOENT ;
}
@ -205,7 +205,7 @@ static int debuginfo__init_online_kernel_dwarf(struct debuginfo *self,
}
# else
/* With older elfutils, this just support kernel module... */
static int debuginfo__init_online_kernel_dwarf ( struct debuginfo * self ,
static int debuginfo__init_online_kernel_dwarf ( struct debuginfo * dbg ,
Dwarf_Addr addr __maybe_unused )
{
const char * path = kernel_get_module_path ( " kernel " ) ;
@ -216,44 +216,45 @@ static int debuginfo__init_online_kernel_dwarf(struct debuginfo *self,
}
pr_debug2 ( " Use file %s for debuginfo \n " , path ) ;
return debuginfo__init_offline_dwarf ( self , path ) ;
return debuginfo__init_offline_dwarf ( dbg , path ) ;
}
# endif
struct debuginfo * debuginfo__new ( const char * path )
{
struct debuginfo * self = zalloc ( sizeof ( struct debuginfo ) ) ;
if ( ! self )
struct debuginfo * dbg = zalloc ( sizeof ( * dbg ) ) ;
if ( ! dbg )
return NULL ;
if ( debuginfo__init_offline_dwarf ( self , path ) < 0 ) {
free ( self ) ;
self = NULL ;
if ( debuginfo__init_offline_dwarf ( dbg , path ) < 0 ) {
free ( dbg ) ;
dbg = NULL ;
}
return self ;
return dbg ;
}
struct debuginfo * debuginfo__new_online_kernel ( unsigned long addr )
{
struct debuginfo * self = zalloc ( sizeof ( struct debuginfo ) ) ;
if ( ! self )
struct debuginfo * dbg = zalloc ( sizeof ( * dbg ) ) ;
if ( ! dbg )
return NULL ;
if ( debuginfo__init_online_kernel_dwarf ( self , ( Dwarf_Addr ) addr ) < 0 ) {
free ( self ) ;
self = NULL ;
if ( debuginfo__init_online_kernel_dwarf ( dbg , ( Dwarf_Addr ) addr ) < 0 ) {
free ( dbg ) ;
dbg = NULL ;
}
return self ;
return dbg ;
}
void debuginfo__delete ( struct debuginfo * self )
void debuginfo__delete ( struct debuginfo * dbg )
{
if ( self ) {
if ( self - > dwfl )
dwfl_end ( self - > dwfl ) ;
free ( self ) ;
if ( dbg ) {
if ( dbg - > dwfl )
dwfl_end ( dbg - > dwfl ) ;
free ( dbg ) ;
}
}
@ -1083,7 +1084,7 @@ static int pubname_search_cb(Dwarf *dbg, Dwarf_Global *gl, void *data)
}
/* Find probe points from debuginfo */
static int debuginfo__find_probes ( struct debuginfo * self ,
static int debuginfo__find_probes ( struct debuginfo * dbg ,
struct probe_finder * pf )
{
struct perf_probe_point * pp = & pf - > pev - > point ;
@ -1094,7 +1095,7 @@ static int debuginfo__find_probes(struct debuginfo *self,
# if _ELFUTILS_PREREQ(0, 142)
/* Get the call frame information from this dwarf */
pf - > cfi = dwarf_getcfi ( self - > dbg ) ;
pf - > cfi = dwarf_getcfi ( dbg - > dbg ) ;
# endif
off = 0 ;
@ -1113,7 +1114,7 @@ static int debuginfo__find_probes(struct debuginfo *self,
. data = pf ,
} ;
dwarf_getpubnames ( self - > dbg , pubname_search_cb ,
dwarf_getpubnames ( dbg - > dbg , pubname_search_cb ,
& pubname_param , 0 ) ;
if ( pubname_param . found ) {
ret = probe_point_search_cb ( & pf - > sp_die , & probe_param ) ;
@ -1123,9 +1124,9 @@ static int debuginfo__find_probes(struct debuginfo *self,
}
/* Loop on CUs (Compilation Unit) */
while ( ! dwarf_nextcu ( self - > dbg , off , & noff , & cuhl , NULL , NULL , NULL ) ) {
while ( ! dwarf_nextcu ( dbg - > dbg , off , & noff , & cuhl , NULL , NULL , NULL ) ) {
/* Get the DIE(Debugging Information Entry) of this CU */
diep = dwarf_offdie ( self - > dbg , off + cuhl , & pf - > cu_die ) ;
diep = dwarf_offdie ( dbg - > dbg , off + cuhl , & pf - > cu_die ) ;
if ( ! diep )
continue ;
@ -1281,13 +1282,13 @@ end:
}
/* Find probe_trace_events specified by perf_probe_event from debuginfo */
int debuginfo__find_trace_events ( struct debuginfo * self ,
int debuginfo__find_trace_events ( struct debuginfo * dbg ,
struct perf_probe_event * pev ,
struct probe_trace_event * * tevs , int max_tevs )
{
struct trace_event_finder tf = {
. pf = { . pev = pev , . callback = add_probe_trace_event } ,
. mod = self - > mod , . max_tevs = max_tevs } ;
. mod = dbg - > mod , . max_tevs = max_tevs } ;
int ret ;
/* Allocate result tevs array */
@ -1298,7 +1299,7 @@ int debuginfo__find_trace_events(struct debuginfo *self,
tf . tevs = * tevs ;
tf . ntevs = 0 ;
ret = debuginfo__find_probes ( self , & tf . pf ) ;
ret = debuginfo__find_probes ( dbg , & tf . pf ) ;
if ( ret < 0 ) {
free ( * tevs ) ;
* tevs = NULL ;
@ -1389,14 +1390,14 @@ out:
}
/* Find available variables at given probe point */
int debuginfo__find_available_vars_at ( struct debuginfo * self ,
int debuginfo__find_available_vars_at ( struct debuginfo * dbg ,
struct perf_probe_event * pev ,
struct variable_list * * vls ,
int max_vls , bool externs )
{
struct available_var_finder af = {
. pf = { . pev = pev , . callback = add_available_vars } ,
. mod = self - > mod ,
. mod = dbg - > mod ,
. max_vls = max_vls , . externs = externs } ;
int ret ;
@ -1408,7 +1409,7 @@ int debuginfo__find_available_vars_at(struct debuginfo *self,
af . vls = * vls ;
af . nvls = 0 ;
ret = debuginfo__find_probes ( self , & af . pf ) ;
ret = debuginfo__find_probes ( dbg , & af . pf ) ;
if ( ret < 0 ) {
/* Free vlist for error */
while ( af . nvls - - ) {
@ -1426,7 +1427,7 @@ int debuginfo__find_available_vars_at(struct debuginfo *self,
}
/* Reverse search */
int debuginfo__find_probe_point ( struct debuginfo * self , unsigned long addr ,
int debuginfo__find_probe_point ( struct debuginfo * dbg , unsigned long addr ,
struct perf_probe_point * ppt )
{
Dwarf_Die cudie , spdie , indie ;
@ -1435,10 +1436,10 @@ int debuginfo__find_probe_point(struct debuginfo *self, unsigned long addr,
int baseline = 0 , lineno = 0 , ret = 0 ;
/* Adjust address with bias */
addr + = self - > bias ;
addr + = dbg - > bias ;
/* Find cu die */
if ( ! dwarf_addrdie ( self - > dbg , ( Dwarf_Addr ) addr - self - > bias , & cudie ) ) {
if ( ! dwarf_addrdie ( dbg - > dbg , ( Dwarf_Addr ) addr - dbg - > bias , & cudie ) ) {
pr_warning ( " Failed to find debug information for address %lx \n " ,
addr ) ;
ret = - EINVAL ;
@ -1639,7 +1640,7 @@ static int find_line_range_by_func(struct line_finder *lf)
return param . retval ;
}
int debuginfo__find_line_range ( struct debuginfo * self , struct line_range * lr )
int debuginfo__find_line_range ( struct debuginfo * dbg , struct line_range * lr )
{
struct line_finder lf = { . lr = lr , . found = 0 } ;
int ret = 0 ;
@ -1656,7 +1657,7 @@ int debuginfo__find_line_range(struct debuginfo *self, struct line_range *lr)
struct dwarf_callback_param line_range_param = {
. data = ( void * ) & lf , . retval = 0 } ;
dwarf_getpubnames ( self - > dbg , pubname_search_cb ,
dwarf_getpubnames ( dbg - > dbg , pubname_search_cb ,
& pubname_param , 0 ) ;
if ( pubname_param . found ) {
line_range_search_cb ( & lf . sp_die , & line_range_param ) ;
@ -1667,12 +1668,12 @@ int debuginfo__find_line_range(struct debuginfo *self, struct line_range *lr)
/* Loop on CUs (Compilation Unit) */
while ( ! lf . found & & ret > = 0 ) {
if ( dwarf_nextcu ( self - > dbg , off , & noff , & cuhl ,
if ( dwarf_nextcu ( dbg - > dbg , off , & noff , & cuhl ,
NULL , NULL , NULL ) ! = 0 )
break ;
/* Get the DIE(Debugging Information Entry) of this CU */
diep = dwarf_offdie ( self - > dbg , off + cuhl , & lf . cu_die ) ;
diep = dwarf_offdie ( dbg - > dbg , off + cuhl , & lf . cu_die ) ;
if ( ! diep )
continue ;