summaryrefslogtreecommitdiffstats
path: root/parse.cxx
diff options
context:
space:
mode:
authorjistone <jistone>2006-12-09 02:03:58 +0000
committerjistone <jistone>2006-12-09 02:03:58 +0000
commit9ba8c134d15dcf75e42dfaef7f72a6bc492fdbbb (patch)
tree5def76740609ffd298ee2d558905d535a2072350 /parse.cxx
parent6a256b03673beeea1c2d6731d5b680b50778b124 (diff)
downloadsystemtap-steved-9ba8c134d15dcf75e42dfaef7f72a6bc492fdbbb.tar.gz
systemtap-steved-9ba8c134d15dcf75e42dfaef7f72a6bc492fdbbb.tar.xz
systemtap-steved-9ba8c134d15dcf75e42dfaef7f72a6bc492fdbbb.zip
2006-12-08 Josh Stone <joshua.i.stone@intel.com>
PR 3681. * staptree.h (struct vardecl): Add a literal 'init' member for the initialization value of globals. * staptree.cxx (vardecl::vardecl): Initialize 'init' to NULL. (vardecl::print): Print global init value during pass-1 output. * main.cxx (printscript): Print global init values during verbose pass-2 output. * parse.cxx (parser::parse_global): Set the initialization literal of global vardecls. * translate.cxx (var::init): Don't unconditionally override the value of numeric globals when the module_param isn't used. (c_unparser::emit_global_param): Write numeric module_params directly into the global variable, as an int64_t instead of long. (c_unparser::emit_global): Add initialization to global declarations. Don't create a temp module_param long for numeric globals anymore. runtime/ * runtime.h (param_set_int64_t, param_get_int64_t, param_check_int64_t): New functions to allow taking module parameters directly as int64_t values. testsuite/ * systemtap.base/global_init.exp, systemtap.base/global_init.stp: New test for checking the timeliness of global initialization.
Diffstat (limited to 'parse.cxx')
-rw-r--r--parse.cxx46
1 files changed, 3 insertions, 43 deletions
diff --git a/parse.cxx b/parse.cxx
index be9fd1d4..36b97dbc 100644
--- a/parse.cxx
+++ b/parse.cxx
@@ -1046,49 +1046,9 @@ parser::parse_global (vector <vardecl*>& globals, vector<probe*>& probes)
if (t && t->type == tok_operator && t->content == "=") // initialization
{
next ();
-
- // Create synthetic "begin" probe to assign value to global.
- //
- // An alternative would be to store the initializer value
- // within a new field of vardecl, and use e.g. the
- // type-resolution stage to do the rewriting. It could go
- // farther: the initializer could live through till
- // translation and be emitted as a plain C-level variable
- // initializer.
-
- literal* value = parse_literal ();
-
- probe_point* pp = new probe_point;
- probe_point::component* ppc = new probe_point::component;
- ppc->functor = string("begin");
- pp->tok = t;
- pp->components.push_back (ppc);
-
- probe* p = new probe;
- p->tok = t;
- p->locations.push_back (pp);
-
- symbol* sym = new symbol;
- sym->tok = t;
- sym->name = d->name;
-
- assignment* a = new assignment;
- a->tok = t;
- a->op = "=";
- a->left = sym;
- a->right = value;
-
- expr_statement* es = new expr_statement;
- es->tok = t;
- es->value = a;
-
- block* blk = new block;
- blk->tok = t;
- blk->statements.push_back (es);
-
- p->body = blk;
- probes.push_back (p);
-
+ d->init = parse_literal ();
+ d->set_arity(0);
+ d->type = d->init->type;
t = peek ();
}