summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--tapset/nfs.stp50
-rw-r--r--tapset/rpc.stp41
-rw-r--r--tapset/scsi.stp4
-rw-r--r--tapset/vfs.stp54
-rw-r--r--tapsets.cxx69
5 files changed, 84 insertions, 134 deletions
diff --git a/tapset/nfs.stp b/tapset/nfs.stp
index fe25eff2..6752747f 100644
--- a/tapset/nfs.stp
+++ b/tapset/nfs.stp
@@ -137,11 +137,10 @@ function __nfs_wpages:long(inode:long) %{ /* pure */
/*Get struct inode from struct page*/
function __p2i :long(page:long)
{
- mapping = page? @cast(page, "page", "kernel")->mapping : 0
+ mapping = page? @cast(page, "page", "kernel:nfs")->mapping : 0
if (mapping == 0)
return 0
- else
- return @cast(mapping, "address_space", "kernel")->host
+ return @cast(mapping, "address_space", "kernel:nfs")->host
}
/*Get i_flags from struct page*/
@@ -150,8 +149,7 @@ function __p2i_flag : long (page:long)
host = __p2i(page)
if (host == 0)
return -1
- else
- return @cast(host, "inode", "kernel")->i_flags
+ return @cast(host, "inode", "kernel:nfs")->i_flags
}
/*Get i_state from struct page*/
@@ -160,8 +158,7 @@ function __p2i_state :long (page:long)
host = __p2i(page)
if (host == 0)
return -1
- else
- return @cast(host, "inode", "kernel")->i_state
+ return @cast(host, "inode", "kernel:nfs")->i_state
}
/*Get i_size from struct page*/
@@ -170,19 +167,17 @@ function __p2i_size :long (page:long)
host = __p2i(page)
if (host == 0)
return -1
- else
- return @cast(host, "inode", "kernel")->i_size
+ return @cast(host, "inode", "kernel:nfs")->i_size
}
/*Get s_flags from struct page*/
function __p2sb_flag:long (page:long)
{
host = __p2i(page)
- i_sb = host? @cast(host, "inode", "kernel")->i_sb : 0
+ i_sb = host? @cast(host, "inode", "kernel:nfs")->i_sb : 0
if (i_sb == 0)
return -1
- else
- return @cast(i_sb, "super_block", "kernel")->s_flags
+ return @cast(i_sb, "super_block", "kernel:nfs")->s_flags
}
function __d_loff_t :long (ppos :long) %{ /* pure */
@@ -198,14 +193,13 @@ function __d_loff_t :long (ppos :long) %{ /* pure */
function __file_inode:long (file:long)
{
%( kernel_v >= "2.6.20" %?
- dentry = file? @cast(file, "file", "kernel")->f_path->dentry : 0
+ dentry = file? @cast(file, "file", "kernel:nfs")->f_path->dentry : 0
%:
- dentry = file? @cast(file, "file", "kernel")->f_dentry : 0
+ dentry = file? @cast(file, "file", "kernel:nfs")->f_dentry : 0
%)
if (dentry == 0)
return 0
- else
- return @cast(dentry, "dentry", "kernel")->d_inode
+ return @cast(dentry, "dentry", "kernel:nfs")->d_inode
}
function __file_id:long (file:long)
@@ -213,10 +207,7 @@ function __file_id:long (file:long)
d_inode = __file_inode(file)
if (d_inode == 0)
return 0
- else {
- i_sb = @cast(d_inode, "inode", "kernel")->i_sb
- return @cast(i_sb, "super_block", "kernel")->s_id
- }
+ return @cast(d_inode, "inode", "kernel:nfs")->i_sb->s_id
}
function __file_mode:long (file:long)
@@ -224,24 +215,21 @@ function __file_mode:long (file:long)
d_inode = __file_inode(file)
if (d_inode == 0)
return 0
- else
- return @cast(d_inode, "inode", "kernel")->i_mode
+ return @cast(d_inode, "inode", "kernel:nfs")->i_mode
}
function __file_parentname:string (file:long)
{
%( kernel_v >= "2.6.20" %?
- dentry = file? @cast(file, "file", "kernel")->f_path->dentry : 0
+ dentry = file? @cast(file, "file", "kernel:nfs")->f_path->dentry : 0
%:
- dentry = file? @cast(file, "file", "kernel")->f_dentry : 0
+ dentry = file? @cast(file, "file", "kernel:nfs")->f_dentry : 0
%)
- d_parent = dentry? @cast(dentry, "dentry", "kernel")->d_parent : 0
+ d_parent = dentry? @cast(dentry, "dentry", "kernel:nfs")->d_parent : 0
if (d_parent == 0)
return "NULL"
- else {
- name = @cast(d_parent, "dentry", "kernel")->d_name->name
- return kernel_string(name)
- }
+ name = @cast(d_parent, "dentry", "kernel:nfs")->d_name->name
+ return kernel_string(name)
}
/*
@@ -336,8 +324,8 @@ probe nfs.fop.llseek = kernel.function ("nfs_file_llseek") !,
{
dev = __file_dev($filp)
ino = __file_ino($filp)
- s_id = __file_id($filp)
- devname = kernel_string(s_id)
+ s_id = __file_id($filp)
+ devname = kernel_string(s_id)
maxbyte = __file_maxbytes($filp)
offset = $offset
diff --git a/tapset/rpc.stp b/tapset/rpc.stp
index e6eaed46..1d47daed 100644
--- a/tapset/rpc.stp
+++ b/tapset/rpc.stp
@@ -880,48 +880,36 @@ function xid_from_clnt:long(clnt:long)
{
if (clnt == 0)
return 0
- else {
- cl_xprt = @cast(clnt, "rpc_clnt", "kernel")->cl_xprt
- return @cast(cl_xprt, "rpc_xprt", "kernel")->xid
- }
+ return @cast(clnt, "rpc_clnt", "kernel:sunrpc")->cl_xprt->xid
}
function prog_from_clnt:long(clnt:long)
{
if (clnt == 0)
return 0
- else {
%(kernel_v >= "2.6.19" %?
- return @cast(clnt, "rpc_clnt", "kernel")->cl_prog
+ return @cast(clnt, "rpc_clnt", "kernel:sunrpc")->cl_prog
%:
- cl_pmap = @cast(clnt, "rpc_clnt", "kernel")->cl_pmap
- return @cast(cl_pmap, "rpc_portmap", "kernel")->pm_prog
+ return @cast(clnt, "rpc_clnt", "kernel:sunrpc")->cl_pmap->pm_prog
%)
- }
}
function vers_from_clnt:long(clnt:long)
{
- if (clnt == 0)
- return 0
- else {
+ if (clnt == 0)
+ return 0
%(kernel_v >= "2.6.19" %?
- return @cast(clnt, "rpc_clnt", "kernel")->cl_vers
+ return @cast(clnt, "rpc_clnt", "kernel:sunrpc")->cl_vers
%:
- cl_pmap = @cast(clnt, "rpc_clnt", "kernel")->cl_pmap
- return @cast(cl_pmap, "rpc_portmap", "kernel")->pm_vers
+ return @cast(clnt, "rpc_clnt", "kernel:sunrpc")->cl_pmap->pm_vers
%)
- }
}
function prot_from_clnt:long(clnt:long)
{
- if (clnt == 0)
- return 0
- else {
- cl_xprt = @cast(clnt, "rpc_clnt", "kernel")->cl_xprt
- return @cast(cl_xprt, "rpc_xprt", "kernel")->prot
- }
+ if (clnt == 0)
+ return 0
+ return @cast(clnt, "rpc_clnt", "kernel:sunrpc")->cl_xprt->prot
}
function port_from_clnt:long(clnt:long)
@@ -934,12 +922,14 @@ function port_from_clnt:long(clnt:long)
struct sockaddr_in *sap = (struct sockaddr_in *) &cl_xprt->addr;
THIS->__retvalue = ntohs(kread(&(sap->sin_port)));
+ }
#else
if (cl_xprt && kread(&(cl_xprt->addr.sin_family)) == AF_INET) {
/* Now consider ipv4 only */
THIS->__retvalue = ntohs(kread(&(cl_xprt->addr.sin_port)));
+ }
#endif
- } else
+ else
THIS->__retvalue = 0;
CATCH_DEREF_FAULT();
%}
@@ -970,10 +960,7 @@ function proc_from_msg:long(msg:long)
{
if (msg == 0)
return 0
- else {
- rpc_proc = @cast(msg, "rpc_message", "kernel")->rpc_proc
- return @cast(rpc_proc, "rpc_procinfo", "kernel")->p_proc
- }
+ return @cast(msg, "rpc_message", "kernel:sunrpc")->rpc_proc->p_proc
}
function vers_from_prog:long(program:long, vers:long)
diff --git a/tapset/scsi.stp b/tapset/scsi.stp
index b1b2d19b..6d332e8b 100644
--- a/tapset/scsi.stp
+++ b/tapset/scsi.stp
@@ -137,6 +137,6 @@ function scsi_timer_pending:long(var:long)
function get_devstate_from_req:long(var:long)
{
- sdev = @cast(var, "request_queue", "kernel")->queuedata
- return @cast(sdev, "scsi_device", "kernel")->sdev_state
+ sdev = @cast(var, "request_queue", "kernel:scsi_mod")->queuedata
+ return @cast(sdev, "scsi_device", "kernel:scsi_mod")->sdev_state
}
diff --git a/tapset/vfs.stp b/tapset/vfs.stp
index 3bb9292d..23d95098 100644
--- a/tapset/vfs.stp
+++ b/tapset/vfs.stp
@@ -74,21 +74,15 @@ function __page_dev:long (page:long)
host = __address_inode(page)
if (host == -1)
return -1
- else {
- i_sb = @cast(host, "inode", "kernel")->i_sb
- return @cast(i_sb, "super_block", "kernel")->s_dev
- }
+ return @cast(host, "inode", "kernel")->i_sb->s_dev
}
function __page_bdev:long (page:long)
{
- host = __address_inode(page)
- if (host == -1)
- return 0
- else {
- i_sb = @cast(host, "inode", "kernel")->i_sb
- return @cast(i_sb, "super_block", "kernel")->s_bdev
- }
+ host = __address_inode(page)
+ if (host == -1)
+ return 0
+ return @cast(host, "inode", "kernel")->i_sb->s_bdev
}
function __page_index:long (page:long)
@@ -101,41 +95,31 @@ function __file_dev:long (file:long)
d_inode = __file_inode(file)
if (d_inode == 0)
return 0
- else {
- i_sb = @cast(d_inode, "inode", "kernel")->i_sb
- return @cast(i_sb, "super_block", "kernel")->s_dev
- }
+ return @cast(d_inode, "inode", "kernel")->i_sb->s_dev
}
function __file_bdev:long (file:long)
{
- d_inode = __file_inode(file)
- if (d_inode == 0)
- return 0
- else {
- i_sb = @cast(d_inode, "inode", "kernel")->i_sb
- return @cast(i_sb, "super_block", "kernel")->s_bdev
- }
+ d_inode = __file_inode(file)
+ if (d_inode == 0)
+ return 0
+ return @cast(d_inode, "inode", "kernel")->i_sb->s_bdev
}
function __file_ino:long (file:long)
{
- d_inode = __file_inode(file)
- if (d_inode == 0)
- return 0
- else
- return @cast(d_inode, "inode", "kernel")->i_ino
+ d_inode = __file_inode(file)
+ if (d_inode == 0)
+ return 0
+ return @cast(d_inode, "inode", "kernel")->i_ino
}
function __file_maxbytes:long (file:long)
{
- d_inode = __file_inode(file)
- if (d_inode == 0)
- return 0
- else {
- i_sb = @cast(d_inode, "inode", "kernel")->i_sb
- return @cast(i_sb, "super_block", "kernel")->s_maxbytes
- }
+ d_inode = __file_inode(file)
+ if (d_inode == 0)
+ return 0
+ return @cast(d_inode, "inode", "kernel")->i_sb->s_maxbytes
}
function __file_filename:string (file:long)
@@ -153,7 +137,7 @@ function __file_filename:string (file:long)
}
function _get_fopv_size:long (iov:long, nr_segs:long)
-%{
+%{ /* pure */
struct iovec *iovp = (struct iovec *)(long)THIS->iov;
if (iovp) {
int i;
diff --git a/tapsets.cxx b/tapsets.cxx
index ce9a0ca1..b66dd123 100644
--- a/tapsets.cxx
+++ b/tapsets.cxx
@@ -4913,14 +4913,14 @@ struct dwarf_cast_query : public base_query
{
const cast_op& e;
const bool lvalue;
- exp_type& pe_type;
- bool resolved;
- string code;
+ exp_type& pe_type;
+ string& code;
- dwarf_cast_query(dwflpp& dw, const cast_op& e, bool lvalue, exp_type& pe_type):
- base_query(dw, e.module), e(e), lvalue(lvalue), pe_type(pe_type), resolved(false) {}
- const string& get_code();
+ dwarf_cast_query(dwflpp& dw, const string& module, const cast_op& e,
+ bool lvalue, exp_type& pe_type, string& code):
+ base_query(dw, module), e(e), lvalue(lvalue),
+ pe_type(pe_type), code(code) {}
void handle_query_module();
int handle_query_cu(Dwarf_Die * cudie);
@@ -4929,23 +4929,10 @@ struct dwarf_cast_query : public base_query
};
-const string&
-dwarf_cast_query::get_code()
-{
- if (!resolved)
- dw.query_modules(this);
-
- if (!resolved)
- throw semantic_error("type definition not found");
-
- return code;
-}
-
-
void
dwarf_cast_query::handle_query_module()
{
- if (resolved)
+ if (!code.empty())
return;
// look for the type in each CU
@@ -4956,7 +4943,7 @@ dwarf_cast_query::handle_query_module()
int
dwarf_cast_query::handle_query_cu(Dwarf_Die * cudie)
{
- if (resolved)
+ if (!code.empty())
return DWARF_CB_ABORT;
dw.focus_on_cu (cudie);
@@ -4973,10 +4960,7 @@ dwarf_cast_query::handle_query_cu(Dwarf_Die * cudie)
// XXX might be better to save the error
// and try again in another CU
sess.print_error (e);
- return DWARF_CB_ABORT;
}
-
- resolved = true;
return DWARF_CB_ABORT;
}
return DWARF_CB_OK;
@@ -5014,12 +4998,18 @@ void dwarf_cast_expanding_visitor::visit_cast_op (cast_op* e)
string code;
exp_type type = pe_long;
- try
+ size_t mod_end = -1;
+ do
{
+ // split the module string by ':' for alternatives
+ size_t mod_begin = mod_end + 1;
+ mod_end = e->module.find(':', mod_begin);
+ string module = e->module.substr(mod_begin, mod_end);
+
// NB: This uses '/' to distinguish between kernel modules and userspace,
// which means that userspace modules won't get any PATH searching.
dwflpp* dw;
- if (e->module.find('/') == string::npos)
+ if (module.find('/') == string::npos)
{
// kernel or kernel module target
if (! db.kern_dw)
@@ -5031,36 +5021,37 @@ void dwarf_cast_expanding_visitor::visit_cast_op (cast_op* e)
}
else
{
- e->module = find_executable (e->module); // canonicalize it
+ module = find_executable (module); // canonicalize it
// user-space target; we use one dwflpp instance per module name
// (= program or shared library)
- if (db.user_dw.find(e->module) == db.user_dw.end())
+ if (db.user_dw.find(module) == db.user_dw.end())
{
dw = new dwflpp(s);
- dw->setup_user(e->module);
- db.user_dw[e->module] = dw;
+ dw->setup_user(module);
+ db.user_dw[module] = dw;
}
else
- dw = db.user_dw[e->module];
+ dw = db.user_dw[module];
}
- dwarf_cast_query q (*dw, *e, lvalue, type);
- code = q.get_code();
+ dwarf_cast_query q (*dw, module, *e, lvalue, type, code);
+ dw->query_modules(&q);
}
- catch (const semantic_error& er)
+ while (code.empty() && mod_end != string::npos);
+
+ if (code.empty())
{
- // We suppress this error message, and pass the unresolved
+ // We generate an error message, and pass the unresolved
// cast_op to the next pass. We hope that this value ends
// up not being referenced after all, so it can be optimized out
// quietly.
- semantic_error* saveme = new semantic_error (er); // copy it
- saveme->tok1 = e->tok; // XXX: token not passed to dw code generation routines
+ semantic_error* er = new semantic_error ("type definition not found", e->tok);
// NB: we can have multiple errors, since a @cast
// may be expanded in several different contexts:
// function ("*") { @cast(...) }
- saveme->chain = e->saved_conversion_error;
- e->saved_conversion_error = saveme;
+ er->chain = e->saved_conversion_error;
+ e->saved_conversion_error = er;
provide (e);
return;
}