From 9ba8c134d15dcf75e42dfaef7f72a6bc492fdbbb Mon Sep 17 00:00:00 2001 From: jistone Date: Sat, 9 Dec 2006 02:03:58 +0000 Subject: 2006-12-08 Josh Stone 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. --- parse.cxx | 46 +++------------------------------------------- 1 file changed, 3 insertions(+), 43 deletions(-) (limited to 'parse.cxx') 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 & globals, vector& 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 (); } -- cgit