More cleanup for --enable-mapped-location.

* class.c (push_class):  If USE_MAPPED_LOCATION don't set
	input_location here.  Instead do it in give_name_to_class.
	(build_class_ref):  Set DECL_ARTIFICIAL, for the sake of dwarf2out.
	* expr.c (expand_byte_code): Call linemap_line_start.
	* expr.c (build_expr_wfl):  If USE_MAPPED_LOCATION, change final
	parameters to a source_location.  Don't need EXPR_WFL_FILENAME_NODE.
	(expr_add_location):  New function, if USE_MAPPED_LOCATION.
	* class.c (maybe_layout_super_class):  Adjust build_expr_wfl call
	to USE_MAPPED_LOCATION case.

From-SVN: r88365
This commit is contained in:
Per Bothner 2004-09-30 16:23:52 -07:00 committed by Per Bothner
parent de1041046f
commit 6744f40032
3 changed files with 80 additions and 6 deletions

View File

@ -1,3 +1,16 @@
2004-09-30 Per Bothner <per@bothner.com>
More cleanup for --enable-mapped-location.
* class.c (push_class): If USE_MAPPED_LOCATION don't set
input_location here. Instead do it in give_name_to_class.
(build_class_ref): Set DECL_ARTIFICIAL, for the sake of dwarf2out.
* expr.c (expand_byte_code): Call linemap_line_start.
* expr.c (build_expr_wfl): If USE_MAPPED_LOCATION, change final
parameters to a source_location. Don't need EXPR_WFL_FILENAME_NODE.
(expr_add_location): New function, if USE_MAPPED_LOCATION.
* class.c (maybe_layout_super_class): Adjust build_expr_wfl call
to USE_MAPPED_LOCATION case.
2004-09-29 Per Bothner <per@bothner.com>
* java-tree.h: Redefine some macros and add soem declaration

View File

@ -428,10 +428,12 @@ push_class (tree class_type, tree class_name)
{
tree decl, signature;
location_t saved_loc = input_location;
#ifndef USE_MAPPED_LOCATION
tree source_name = identifier_subst (class_name, "", '.', '/', ".java");
CLASS_P (class_type) = 1;
input_filename = IDENTIFIER_POINTER (source_name);
input_line = 0;
#endif
CLASS_P (class_type) = 1;
decl = build_decl (TYPE_DECL, class_name, class_type);
/* dbxout needs a DECL_SIZE if in gstabs mode */
@ -1037,6 +1039,7 @@ build_class_ref (tree type)
TREE_STATIC (decl) = 1;
TREE_PUBLIC (decl) = 1;
DECL_EXTERNAL (decl) = 1;
DECL_ARTIFICIAL (decl) = 1;
make_decl_rtl (decl);
pushdecl_top_level (decl);
}
@ -1996,9 +1999,14 @@ maybe_layout_super_class (tree super_class, tree this_class)
if (this_class)
{
tree this_decl = TYPE_NAME (this_class);
#ifdef USE_MAPPED_LOCATION
this_wrap = build_expr_wfl (this_class,
DECL_SOURCE_LOCATION (this_decl));
#else
this_wrap = build_expr_wfl (this_class,
DECL_SOURCE_FILE (this_decl),
DECL_SOURCE_LINE (this_decl), 0);
#endif
}
super_class = do_resolve_class (NULL_TREE, /* FIXME? */
super_class, NULL_TREE, this_wrap);

View File

@ -2695,7 +2695,12 @@ expand_byte_code (JCF *jcf, tree method)
linenumber_pointer += 4;
if (pc == PC)
{
input_location.line = GET_u2 (linenumber_pointer - 2);
int line = GET_u2 (linenumber_pointer - 2);
#ifdef USE_MAPPED_LOCATION
input_location = linemap_line_start (&line_table, line, 1);
#else
input_location.line = line;
#endif
if (!(instruction_bits[PC] & BCODE_HAS_MULTI_LINENUMBERS))
break;
}
@ -3225,21 +3230,33 @@ force_evaluation_order (tree node)
recursively more than one file (Java is one of them). */
tree
build_expr_wfl (tree node, const char *file, int line, int col)
build_expr_wfl (tree node,
#ifdef USE_MAPPED_LOCATION
source_location location
#else
const char *file, int line, int col
#endif
)
{
tree wfl;
#ifdef USE_MAPPED_LOCATION
wfl = make_node (EXPR_WITH_FILE_LOCATION);
SET_EXPR_LOCATION (wfl, location);
#else
wfl = make_node (EXPR_WITH_FILE_LOCATION);
static const char *last_file = 0;
static tree last_filenode = NULL_TREE;
tree wfl = make_node (EXPR_WITH_FILE_LOCATION);
EXPR_WFL_NODE (wfl) = node;
EXPR_WFL_SET_LINECOL (wfl, line, col);
if (file != last_file)
{
last_file = file;
last_filenode = file ? get_identifier (file) : NULL_TREE;
}
EXPR_WFL_FILENAME_NODE (wfl) = last_filenode;
#endif
EXPR_WFL_NODE (wfl) = node;
if (node)
{
if (IS_NON_TYPE_CODE_CLASS (TREE_CODE_CLASS (TREE_CODE (node))))
@ -3250,6 +3267,42 @@ build_expr_wfl (tree node, const char *file, int line, int col)
return wfl;
}
#ifdef USE_MAPPED_LOCATION
tree
expr_add_location (tree node, source_location location, bool statement)
{
tree wfl;
#if 0
/* FIXME. This optimization causes failures in code that expects an
EXPR_WITH_FILE_LOCATION. E.g. in resolve_qualified_expression_name. */
if (node && ! (statement && flag_emit_class_files))
{
source_location node_loc = EXPR_LOCATION (node);
if (node_loc == location || location == UNKNOWN_LOCATION)
return node;
if (node_loc == UNKNOWN_LOCATION
&& IS_EXPR_CODE_CLASS (TREE_CODE_CLASS (TREE_CODE (node))))
{
SET_EXPR_LOCATION (node, location);
return node;
}
}
#endif
wfl = make_node (EXPR_WITH_FILE_LOCATION);
SET_EXPR_LOCATION (wfl, location);
EXPR_WFL_NODE (wfl) = node;
if (statement && debug_info_level != DINFO_LEVEL_NONE)
EXPR_WFL_EMIT_LINE_NOTE (wfl) = 1;
if (node)
{
if (IS_NON_TYPE_CODE_CLASS (TREE_CODE_CLASS (TREE_CODE (node))))
TREE_SIDE_EFFECTS (wfl) = TREE_SIDE_EFFECTS (node);
TREE_TYPE (wfl) = TREE_TYPE (node);
}
return wfl;
}
#endif
/* Build a node to represent empty statements and blocks. */