Remove C language front end dependencies.
* tree-convert.c: New file. * treetree.c: Don't include c-tree.h. Include target.h. (struct lang_identifier, union lang_tree_node, struct lang_type, struct lang_function): New, minimal language-specific datastructs. (tree_lang_truthvalue_conversion, tree_mark_addressable, tree_lang_type_for_size, tree_lang_type_for_mode, tree_lang_unsigned_type, tree_lang_signed_type, tree_lang_signed_or_unsigned): New functions. (LANG_HOOKS_*): Don't use C front end langhooks. Use new functions. (pushlevel, poplevel, global_bindings_p, insert_block, set_block, pushdecl, getdecls, kept_level_p, tree_push_type_decl, tree_push_atomic_type_decl): New functions. (struct resword, struct reswords): Remove. * Make-lang.in: Update. Don't depend on C front end objects. * config-lang.in: Likewise. Co-Authored-By: Steven Bosscher <steven@gcc.gnu.org> From-SVN: r69178
This commit is contained in:
parent
cde6384093
commit
31c56a8ba7
|
@ -1,3 +1,22 @@
|
|||
2003-07-10 Fergus Henderson <fjh@cs.mu.oz.au>
|
||||
Steven Bosscher <steven@gcc.gnu.org>
|
||||
|
||||
* tree-convert.c: New file.
|
||||
* treetree.c: Don't include c-tree.h. Include target.h.
|
||||
(struct lang_identifier, union lang_tree_node, struct lang_type,
|
||||
struct lang_function): New, minimal language-specific datastructs.
|
||||
(tree_lang_truthvalue_conversion, tree_mark_addressable,
|
||||
tree_lang_type_for_size, tree_lang_type_for_mode,
|
||||
tree_lang_unsigned_type, tree_lang_signed_type,
|
||||
tree_lang_signed_or_unsigned): New functions.
|
||||
(LANG_HOOKS_*): Don't use C front end langhooks. Use new functions.
|
||||
(pushlevel, poplevel, global_bindings_p, insert_block, set_block,
|
||||
pushdecl, getdecls, kept_level_p, tree_push_type_decl,
|
||||
tree_push_atomic_type_decl): New functions.
|
||||
(struct resword, struct reswords): Remove.
|
||||
* Make-lang.in: Update. Don't depend on C front end objects.
|
||||
* config-lang.in: Likewise.
|
||||
|
||||
2003-07-07 Nathan Sidwell <nathan@codesourcery.com>
|
||||
|
||||
* treelang/treetree.c (tree_code_if_start, tree_code_if_else,
|
||||
|
|
|
@ -47,7 +47,9 @@ TREELANGSED = sed
|
|||
TREELANGSEDFLAGS = -n
|
||||
|
||||
# back end compiler libraries etc
|
||||
TREE_BE_LIBS = $(C_TARGET_OBJS) $(BACKEND) $(LIBIBERTY) $(INTLLIBS) $(LIBS) $(LIBDEPS)
|
||||
TREE_BE_LIBS = $(BACKEND) $(LIBIBERTY) $(INTLIBS) $(LIBS) $(LIBDEPS)
|
||||
|
||||
|
||||
GCC_EXTRAS = -B./ -B$(build_tooldir)/bin/ -isystem $(build_tooldir)/include
|
||||
|
||||
# ./xgcc is the just built compiler. See GCC_FOR_TARGET in the GCC Makefile.in.
|
||||
|
@ -56,10 +58,9 @@ GCC_EXTRAS = -B./ -B$(build_tooldir)/bin/ -isystem $(build_tooldir)/include
|
|||
|
||||
# GCC_FOR_TREELANG = ./xgcc $(GCC_EXTRAS)
|
||||
|
||||
TREE_GENERATED = $(srcdir)/treelang/lex.c $(srcdir)/treelang/parse.c\
|
||||
$(srcdir)/treelang/parse.h $(srcdir)/treelang/parse.output $(srcdir)/treelang/TAGS
|
||||
|
||||
TREE_SOURCE = ${srcdir}/treelang/parse.y ${srcdir}/treelang/lex.l ${srcdir}/treelang/tree1.c ${srcdir}/treelang/treelang.h ${srcdir}/treelang/treetree.c $(srcdir)/treelang/treetree.h ${srcdir}/treelang/opts.h
|
||||
TREE_GENERATED = $(srcdir)/treelang/lex.c $(srcdir)/treelang/parse.c \
|
||||
$(srcdir)/treelang/parse.h $(srcdir)/treelang/parse.output \
|
||||
$(srcdir)/treelang/TAGS
|
||||
|
||||
TREE_EXES = tree1$(exeext)
|
||||
|
||||
|
@ -83,13 +84,13 @@ treelang.done: tree1$(exeext)
|
|||
# no preprocessor
|
||||
|
||||
# core compiler
|
||||
tree1$(exeext): treelang/tree1.o treelang/treetree.o treelang/lex.o treelang/parse.o\
|
||||
$(TREE_BE_LIBS) c-convert.o c-typeck.o c-common.o c-cppbuiltin.o \
|
||||
c-decl.o attribs.o
|
||||
tree1$(exeext): treelang/tree1.o treelang/treetree.o treelang/tree-convert.o \
|
||||
treelang/lex.o treelang/parse.o \
|
||||
$(TREE_BE_LIBS) attribs.o
|
||||
$(CC) $(ALL_CFLAGS) $(LDFLAGS) -o $@ \
|
||||
treelang/tree1.o treelang/treetree.o treelang/lex.o treelang/parse.o \
|
||||
c-convert.o c-typeck.o c-common.o c-cppbuiltin.o c-decl.o attribs.o \
|
||||
$(TREE_BE_LIBS)
|
||||
treelang/tree1.o treelang/treetree.o treelang/tree-convert.o \
|
||||
treelang/lex.o treelang/parse.o \
|
||||
$(TREE_BE_LIBS) attribs.o
|
||||
|
||||
#
|
||||
# Compiling object files from source files.
|
||||
|
@ -106,6 +107,9 @@ treelang/treetree.o: treelang/treetree.c $(CONFIG_H) $(SYSTEM_H) coretypes.h \
|
|||
varray.h $(LANGHOOKS_DEF_H) langhooks.h treelang/treelang.h input.h \
|
||||
treelang/treetree.h treelang/parse.h
|
||||
|
||||
treelang/tree-convert.o: treelang/tree-convert.c $(CONFIG_H) $(SYSTEM_) \
|
||||
coretypes.h diagnostic.h $(TREE_H) flags.h toplev.h langhooks.h
|
||||
|
||||
treelang/parse.o: treelang/parse.c $(CONFIG_H) $(SYSTEM_H) coretypes.h \
|
||||
$(TM_H) diagnostic.h treelang/treelang.h input.h treelang/treetree.h
|
||||
|
||||
|
@ -314,9 +318,6 @@ treelang.check.fix: force
|
|||
-cp testsuite/treelang/*runpgm* t
|
||||
-rm -f t/*nofilename
|
||||
|
||||
treelang.wc: force
|
||||
wc ${TREE_SOURCE}
|
||||
|
||||
#
|
||||
|
||||
.PHONY: treelang.html
|
||||
|
@ -324,3 +325,5 @@ treelang.wc: force
|
|||
treelang.html:
|
||||
cd $(srcdir)/treelang && texi2html -I ../doc/include -verbose -menu -split_chapter -number treelang.texi
|
||||
# mv treelang*.html $(srcdir)/treelang
|
||||
|
||||
config.status: treelang/config-lang.in
|
||||
|
|
|
@ -36,4 +36,4 @@ diff_excludes="-x lex.c -x parse.c -x parse.h"
|
|||
headers=
|
||||
build_by_default="no"
|
||||
|
||||
gtfiles="\$(srcdir)/c-decl.c \$(srcdir)/c-common.c \$(srcdir)/c-common.h \$(srcdir)/treelang/tree1.c \$(srcdir)/treelang/treelang.h"
|
||||
gtfiles="\$(srcdir)/treelang/tree1.c \$(srcdir)/treelang/treetree.c \$(srcdir)/treelang/treelang.h"
|
||||
|
|
|
@ -0,0 +1,108 @@
|
|||
/* Language-level data type conversion for Treelang.
|
||||
This is a very slightly modified copy of c-convert.c.
|
||||
Copyright (C) 1987, 1988, 1991, 1998, 2002 Free Software Foundation, Inc.
|
||||
|
||||
This file is part of GCC.
|
||||
|
||||
GCC is free software; you can redistribute it and/or modify it under
|
||||
the terms of the GNU General Public License as published by the Free
|
||||
Software Foundation; either version 2, or (at your option) any later
|
||||
version.
|
||||
|
||||
GCC is distributed in the hope that it will be useful, but WITHOUT ANY
|
||||
WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with GCC; see the file COPYING. If not, write to the Free
|
||||
Software Foundation, 59 Temple Place - Suite 330, Boston, MA
|
||||
02111-1307, USA. */
|
||||
|
||||
|
||||
/* This file contains the functions for converting C expressions
|
||||
to different data types. The only entry point is `convert'.
|
||||
Every language front end must have a `convert' function
|
||||
but what kind of conversions it does will depend on the language. */
|
||||
|
||||
#include "config.h"
|
||||
#include "system.h"
|
||||
#include "coretypes.h"
|
||||
#include "tm.h"
|
||||
#include "diagnostic.h"
|
||||
#include "tree.h"
|
||||
#include "flags.h"
|
||||
#include "convert.h"
|
||||
#include "toplev.h"
|
||||
#include "langhooks.h"
|
||||
|
||||
/* Change of width--truncation and extension of integers or reals--
|
||||
is represented with NOP_EXPR. Proper functioning of many things
|
||||
assumes that no other conversions can be NOP_EXPRs.
|
||||
|
||||
Conversion between integer and pointer is represented with CONVERT_EXPR.
|
||||
Converting integer to real uses FLOAT_EXPR
|
||||
and real to integer uses FIX_TRUNC_EXPR.
|
||||
|
||||
Here is a list of all the functions that assume that widening and
|
||||
narrowing is always done with a NOP_EXPR:
|
||||
In convert.c, convert_to_integer.
|
||||
In c-typeck.c, build_binary_op (boolean ops), and
|
||||
c_common_truthvalue_conversion.
|
||||
In expr.c: expand_expr, for operands of a MULT_EXPR.
|
||||
In fold-const.c: fold.
|
||||
In tree.c: get_narrower and get_unwidened. */
|
||||
|
||||
/* Create an expression whose value is that of EXPR,
|
||||
converted to type TYPE. The TREE_TYPE of the value
|
||||
is always TYPE. This function implements all reasonable
|
||||
conversions; callers should filter out those that are
|
||||
not permitted by the language being compiled. */
|
||||
|
||||
tree
|
||||
convert (type, expr)
|
||||
tree type, expr;
|
||||
{
|
||||
tree e = expr;
|
||||
enum tree_code code = TREE_CODE (type);
|
||||
|
||||
if (type == TREE_TYPE (expr)
|
||||
|| TREE_CODE (expr) == ERROR_MARK
|
||||
|| code == ERROR_MARK || TREE_CODE (TREE_TYPE (expr)) == ERROR_MARK)
|
||||
return expr;
|
||||
|
||||
if (TYPE_MAIN_VARIANT (type) == TYPE_MAIN_VARIANT (TREE_TYPE (expr)))
|
||||
return fold (build1 (NOP_EXPR, type, expr));
|
||||
if (TREE_CODE (TREE_TYPE (expr)) == ERROR_MARK)
|
||||
return error_mark_node;
|
||||
if (TREE_CODE (TREE_TYPE (expr)) == VOID_TYPE)
|
||||
{
|
||||
error ("void value not ignored as it ought to be");
|
||||
return error_mark_node;
|
||||
}
|
||||
if (code == VOID_TYPE)
|
||||
return build1 (CONVERT_EXPR, type, e);
|
||||
if (code == INTEGER_TYPE || code == ENUMERAL_TYPE)
|
||||
return fold (convert_to_integer (type, e));
|
||||
if (code == BOOLEAN_TYPE)
|
||||
{
|
||||
tree t = (*lang_hooks.truthvalue_conversion) (expr);
|
||||
/* If it returns a NOP_EXPR, we must fold it here to avoid
|
||||
infinite recursion between fold () and convert (). */
|
||||
if (TREE_CODE (t) == NOP_EXPR)
|
||||
return fold (build1 (NOP_EXPR, type, TREE_OPERAND (t, 0)));
|
||||
else
|
||||
return fold (build1 (NOP_EXPR, type, t));
|
||||
}
|
||||
if (code == POINTER_TYPE || code == REFERENCE_TYPE)
|
||||
return fold (convert_to_pointer (type, e));
|
||||
if (code == REAL_TYPE)
|
||||
return fold (convert_to_real (type, e));
|
||||
if (code == COMPLEX_TYPE)
|
||||
return fold (convert_to_complex (type, e));
|
||||
if (code == VECTOR_TYPE)
|
||||
return fold (convert_to_vector (type, e));
|
||||
|
||||
error ("conversion to non-scalar type requested");
|
||||
return error_mark_node;
|
||||
}
|
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue