+2004-07-05 Zack Weinberg <zack@codesourcery.com>
+
+ * tree-mudflap.c: Include cgraph.h.
+ (mf_init_extern_trees): Rename to mudflap_init. Export.
+ Rewrite to create synthetic declarations instead of looking
+ up declarations from mf-runtime.h.
+ (mf_make_builtin, mf_make_cache_struct_type): New functions.
+ (mf_cache_shift_decl, mf_cache_mask_decl, mf_unregister_fndecl):
+ Correct commentary.
+ (execute_mudflap_function_decls, mudflap_register_call):
+ Don't call mf_init_extern_trees.
+ (mudflap_finish_file): Use cgraph_build_static_cdtor.
+
+ * tree-mudflap.h: Update prototypes.
+ * c-mudflap.c: Delete file.
+ * c-common.c: Include tree-mudflap.h.
+ (c_common_nodes_and_builtins): Call mudflap_init if appropriate.
+ * Makefile.in: Remove all references to c-mudflap.o.
+ Update dependencies.
+
2004-07-05 John David Anglin <dave.anglin@nrc-cnrc.gc.ca>
* pa.md (prefetch, prefetch_32, prefetch_64): Only allow short
c-convert.o c-aux-info.o c-common.o c-opts.o c-format.o c-semantics.o \
c-incpath.o cppdefault.o c-ppoutput.o c-cppbuiltin.o prefix.o \
c-objc-common.o c-dump.o c-pch.o $(C_TARGET_OBJS) \
- c-gimplify.o tree-mudflap.o c-mudflap.o c-pretty-print.o
+ c-gimplify.o tree-mudflap.o c-pretty-print.o
# Language-specific object files for C.
C_OBJS = c-parse.o c-lang.o stub-objc.o $(C_AND_OBJC_OBJS)
$(OBSTACK_H) $(C_COMMON_H) $(FLAGS_H) toplev.h output.h c-pragma.h intl.h \
$(GGC_H) $(EXPR_H) $(TM_P_H) builtin-types.def builtin-attrs.def \
$(DIAGNOSTIC_H) gt-c-common.h langhooks.h varray.h $(RTL_H) \
- $(TARGET_H) $(C_TREE_H) tree-iterator.h langhooks.h
+ $(TARGET_H) $(C_TREE_H) tree-iterator.h langhooks.h tree-mudflap.h
c-pretty-print.o : c-pretty-print.c $(C_PRETTY_PRINT_H) \
$(C_COMMON_H) $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) real.h \
$(DIAGNOSTIC_H)
tree-mudflap.o : $(CONFIG_H) errors.h $(SYSTEM_H) $(TREE_H) tree-inline.h \
$(C_TREE_H) $(C_COMMON_H) $(TREE_GIMPLE_H) diagnostic.h $(HASHTAB_H) \
output.h varray.h langhooks.h tree-mudflap.h $(TM_H) coretypes.h \
- $(TREE_DUMP_H) tree-pass.h
-c-mudflap.o : $(CONFIG_H) errors.h $(SYSTEM_H) $(TREE_H) tree-inline.h \
- $(C_TREE_H) $(C_COMMON_H) $(TREE_GIMPLE_H) diagnostic.h $(HASHTAB_H) \
- output.h varray.h langhooks.h tree-mudflap.h $(TM_H) coretypes.h
+ $(TREE_DUMP_H) tree-pass.h cgraph.h
tree-nomudflap.o : $(CONFIG_H) errors.h $(SYSTEM_H) $(TREE_H) tree-inline.h \
$(C_TREE_H) $(C_COMMON_H) $(TREE_GIMPLE_H) diagnostic.h $(HASHTAB_H) \
output.h varray.h langhooks.h tree-mudflap.h $(TM_H) coretypes.h
#include "toplev.h"
#include "tree-iterator.h"
#include "hashtab.h"
+#include "tree-mudflap.h"
cpp_reader *parse_in; /* Declared in c-pragma.h. */
#undef DEF_BUILTIN
targetm.init_builtins ();
+ if (flag_mudflap)
+ mudflap_init ();
main_identifier_node = get_identifier ("main");
}
+++ /dev/null
-/* Mudflap: narrow-pointer bounds-checking by tree rewriting:
- C front-end interface.
-
- Copyright (C) 2002, 2003, 2004 Free Software Foundation, Inc.
- Contributed by Frank Ch. Eigler <fche@redhat.com>
- and Graydon Hoare <graydon@redhat.com>
-
-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. */
-
-
-#include "config.h"
-#include "errors.h"
-#include "system.h"
-#include "coretypes.h"
-#include "tm.h"
-#include "tree.h"
-#include "tree-inline.h"
-#include "c-tree.h"
-#include "c-common.h"
-#include "diagnostic.h"
-#include "output.h"
-#include "varray.h"
-#include "tree-mudflap.h"
-#include "target.h"
-#include "flags.h"
-#include "rtl.h"
-#include "toplev.h"
-#include "function.h"
-
-
-
-/* ------------------------------------------------------------------------ */
-
-
-/* Initialize the global tree nodes that correspond to mf-runtime.h
- declarations. */
-tree
-mflang_lookup_decl (const char* name)
-{
- tree decl = lookup_name (get_identifier (name));
- if (decl == NULL_TREE)
- internal_error ("mudflap: cannot find declaration of `%s' from mf-runtime.h",
- name);
-
- return decl;
-}
-
-
-/* Emit a synthetic CTOR function for the current file. Populate it from
- the enqueued __mf_register calls. Compile the function. */
-
-void
-mflang_flush_calls (tree enqueued_call_stmt_chain)
-{
- tree fnname, t1, t2, cs;
-
- /* Short-circuit! */
- if (enqueued_call_stmt_chain == NULL_TREE)
- return;
-
- fnname = get_identifier ("__mudflap_static_initializer");
- t1 = build_tree_list (NULL_TREE, void_type_node);
- t2 = tree_cons (NULL, NULL, t1);
- start_function (t1, build_nt (CALL_EXPR, fnname, t2, NULL), NULL);
- store_parm_decls ();
-
- DECL_STATIC_CONSTRUCTOR (current_function_decl) = 1;
- TREE_PUBLIC (current_function_decl) = 0;
- TREE_USED (current_function_decl) = 1;
- mf_mark (current_function_decl);
-
- cs = c_begin_compound_stmt (true);
- c_finish_expr_stmt (enqueued_call_stmt_chain);
- add_stmt (c_end_compound_stmt (cs, true));
-
- finish_function ();
-}
+2004-07-05 Zack Weinberg <zack@codesourcery.com>
+
+ * cp-mudflap.c: Delete file.
+ * Makefile.in: Remove all references to cp-mudflap.o.
+
2004-07-05 Zack Weinberg <zack@codesourcery.com>
* decl.c (cxx_init_decl_processing): Call
cp/typeck.o cp/cvt.o cp/except.o cp/friend.o cp/init.o cp/method.o \
cp/search.o cp/semantics.o cp/tree.o cp/repo.o cp/dump.o cp/optimize.o \
cp/mangle.o cp/cp-lang.o cp/name-lookup.o cp/cxx-pretty-print.o \
- cp/cp-gimplify.o tree-mudflap.o cp/cp-mudflap.o
+ cp/cp-gimplify.o tree-mudflap.o
# Use strict warnings for this front end.
cp-warn = $(STRICT_WARN) $(WERROR)
output.h
cp/cp-gimplify.o: cp/cp-gimplify.c $(CXX_TREE_H) toplev.h c-common.h \
$(TM_H) coretypes.h
-cp/cp-mudflap.o: cp/cp-mudflap.c $(CXX_TREE_H) toplev.h c-common.h \
- $(TM_H) coretypes.h
cp/name-lookup.o: cp/name-lookup.c $(CONFIG_H) $(SYSTEM_H) coretypes.h \
$(TM_H) $(CXX_TREE_H) timevar.h gt-cp-name-lookup.h toplev.h \
+++ /dev/null
-/* Mudflap: narrow-pointer bounds-checking by tree rewriting:
- C++ front-end interface.
-
- Copyright (C) 2002, 2003, 2004 Free Software Foundation, Inc.
- Contributed by Frank Ch. Eigler <fche@redhat.com>
- and Graydon Hoare <graydon@redhat.com>
-
-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. */
-
-
-#include "config.h"
-#include "errors.h"
-#include "system.h"
-#include "coretypes.h"
-#include "tm.h"
-#include "tree.h"
-#include "tree-inline.h"
-#include "cp-tree.h"
-#include "c-common.h"
-#include "diagnostic.h"
-#include "output.h"
-#include "varray.h"
-#include "tree-mudflap.h"
-#include "target.h"
-#include "flags.h"
-#include "rtl.h"
-#include "toplev.h"
-
-
-/* Initialize the global tree nodes that correspond to mf-runtime.h
- declarations. */
-tree
-mflang_lookup_decl (const char* name)
-{
- tree decl = lookup_name (get_identifier (name), 1);
- if (decl == NULL_TREE)
- internal_error ("mudflap: cannot find declaration of `%s' from mf-runtime.h",
- name);
-
- return decl;
-}
-
-
-/* Emit a synthetic CTOR function for the current file. Populate it from
- the enqueued __mf_register calls. Register it with the constructors. */
-
-void
-mflang_flush_calls (tree enqueued_call_stmt_chain)
-{
- tree fnname, fndecl, body;
- tree type;
-
- /* Short-circuit! */
- if (enqueued_call_stmt_chain == NULL_TREE)
- return;
-
- /* Create a ctor function declaration. */
- fnname = get_identifier ("__static_initialization_and_destruction_mudflap");
- type = build_function_type (void_type_node, void_list_node);
- fndecl = build_lang_decl (FUNCTION_DECL, fnname, type);
-
- TREE_PUBLIC (fndecl) = 0;
- TREE_USED (fndecl) = 1;
- DECL_ARTIFICIAL (fndecl) = 1;
- mf_mark (fndecl);
-
- /* Generate the body, one statement at a time. */
- start_preparsed_function (fndecl, /*attrs=*/NULL_TREE, SF_PRE_PARSED);
- body = begin_compound_stmt (BCS_FN_BODY);
-
- while (enqueued_call_stmt_chain)
- {
- tree next = TREE_CHAIN (enqueued_call_stmt_chain);
- finish_expr_stmt (enqueued_call_stmt_chain);
- enqueued_call_stmt_chain = next;
- }
-
- finish_compound_stmt (body);
- fndecl = finish_function (0);
-
- /* NB: We cannot call expand_or_defer_fn here, since that goes through
- the callgraph queue. This queue will have already been processed by the
- time this function is running. */
- expand_body (fndecl);
- if (targetm.have_ctors_dtors)
- (* targetm.asm_out.constructor) (XEXP (DECL_RTL (fndecl), 0),
- DEFAULT_INIT_PRIORITY);
- else
- /* By this time, it's too late to do this:
- static_ctors = tree_cons (NULL_TREE, fndecl, static_ctors); */
- abort ();
-}
#include <demangle.h>
#include "langhooks.h"
#include "ggc.h"
+#include "cgraph.h"
/* Internal function decls */
static tree mf_varname_tree (tree);
static tree mf_file_function_line_tree (location_t);
-/* Initialization of all the mf-runtime.h extern decls. */
-static void mf_init_extern_trees (void);
-
/* Indirection-related instrumentation. */
static void mf_decl_cache_locals (void);
static void mf_decl_clear_locals (void);
/* extern struct __mf_cache __mf_lookup_cache []; */
static GTY (()) tree mf_cache_array_decl;
-/* extern const unsigned char __mf_lc_shift; */
+/* extern unsigned char __mf_lc_shift; */
static GTY (()) tree mf_cache_shift_decl;
-/* extern const uintptr_t __mf_lc_mask; */
+/* extern uintptr_t __mf_lc_mask; */
static GTY (()) tree mf_cache_mask_decl;
/* Their function-scope local shadows, used in single-threaded mode only. */
/* extern void __mf_register (void *ptr, size_t sz, int type, const char *); */
static GTY (()) tree mf_register_fndecl;
-/* extern void __mf_unregister (void *ptr, size_t sz); */
+/* extern void __mf_unregister (void *ptr, size_t sz, int type); */
static GTY (()) tree mf_unregister_fndecl;
+/* Helper for mudflap_init: construct a decl with the given category,
+ name, and type, mark it an external reference, and pushdecl it. */
+static inline tree
+mf_make_builtin (enum tree_code category, const char *name, tree type)
+{
+ tree decl = mf_mark (build_decl (category, get_identifier (name), type));
+ TREE_PUBLIC (decl) = 1;
+ DECL_EXTERNAL (decl) = 1;
+ lang_hooks.decls.pushdecl (decl);
+ return decl;
+}
+
+/* Helper for mudflap_init: construct a tree corresponding to the type
+ struct __mf_cache { uintptr_t low; uintptr_t high; };
+ where uintptr_t is the FIELD_TYPE argument. */
+static inline tree
+mf_make_mf_cache_struct_type (tree field_type)
+{
+ /* There is, abominably, no language-independent way to construct a
+ RECORD_TYPE. So we have to call the basic type construction
+ primitives by hand. */
+ tree fieldlo = build_decl (FIELD_DECL, get_identifier ("low"), field_type);
+ tree fieldhi = build_decl (FIELD_DECL, get_identifier ("high"), field_type);
+
+ tree struct_type = make_node (RECORD_TYPE);
+ DECL_CONTEXT (fieldlo) = struct_type;
+ DECL_CONTEXT (fieldhi) = struct_type;
+ TREE_CHAIN (fieldlo) = fieldhi;
+ TYPE_FIELDS (struct_type) = fieldlo;
+ TYPE_NAME (struct_type) = get_identifier ("__mf_cache");
+ layout_type (struct_type);
+
+ return struct_type;
+}
+
+#define build_function_type_3(rtype, arg1, arg2, arg3) \
+ build_function_type (rtype, tree_cons (0, arg1, tree_cons (0, arg2, \
+ tree_cons (0, arg3, void_list_node))))
+#define build_function_type_4(rtype, arg1, arg2, arg3, arg4) \
+ build_function_type (rtype, tree_cons (0, arg1, tree_cons (0, arg2, \
+ tree_cons (0, arg3, tree_cons (0, arg4, \
+ void_list_node)))))
/* Initialize the global tree nodes that correspond to mf-runtime.h
declarations. */
-static void
-mf_init_extern_trees (void)
+void
+mudflap_init (void)
{
static bool done = false;
+ tree mf_const_string_type;
+ tree mf_cache_array_type;
+ tree mf_check_register_fntype;
+ tree mf_unregister_fntype;
if (done)
return;
done = true;
- mf_uintptr_type = TREE_TYPE (mflang_lookup_decl ("uintptr_t"));
- mf_cache_array_decl = mf_mark (mflang_lookup_decl ("__mf_lookup_cache"));
- mf_cache_struct_type = TREE_TYPE (TREE_TYPE (mf_cache_array_decl));
+ mf_uintptr_type = lang_hooks.types.type_for_mode (ptr_mode,
+ /*unsignedp=*/true);
+ mf_const_string_type
+ = build_pointer_type (build_qualified_type
+ (char_type_node, TYPE_QUAL_CONST));
+
+ mf_cache_struct_type = mf_make_mf_cache_struct_type (mf_uintptr_type);
mf_cache_structptr_type = build_pointer_type (mf_cache_struct_type);
- mf_cache_shift_decl = mf_mark (mflang_lookup_decl ("__mf_lc_shift"));
- mf_cache_mask_decl = mf_mark (mflang_lookup_decl ("__mf_lc_mask"));
- mf_check_fndecl = mflang_lookup_decl ("__mf_check");
- mf_register_fndecl = mflang_lookup_decl ("__mf_register");
- mf_unregister_fndecl = mflang_lookup_decl ("__mf_unregister");
+ mf_cache_array_type = build_array_type (mf_cache_struct_type, 0);
+ mf_check_register_fntype =
+ build_function_type_4 (void_type_node, ptr_type_node, size_type_node,
+ integer_type_node, mf_const_string_type);
+ mf_unregister_fntype =
+ build_function_type_3 (void_type_node, ptr_type_node, size_type_node,
+ integer_type_node);
+
+ mf_cache_array_decl = mf_make_builtin (VAR_DECL, "__mf_lookup_cache",
+ mf_cache_array_type);
+ mf_cache_shift_decl = mf_make_builtin (VAR_DECL, "__mf_lc_shift",
+ unsigned_char_type_node);
+ mf_cache_mask_decl = mf_make_builtin (VAR_DECL, "__mf_lc_mask",
+ mf_uintptr_type);
+ mf_check_fndecl = mf_make_builtin (FUNCTION_DECL, "__mf_check",
+ mf_check_register_fntype);
+ mf_register_fndecl = mf_make_builtin (FUNCTION_DECL, "__mf_register",
+ mf_check_register_fntype);
+ mf_unregister_fndecl = mf_make_builtin (FUNCTION_DECL, "__mf_unregister",
+ mf_unregister_fntype);
}
+#undef build_function_type_4
+#undef build_function_type_3
/* ------------------------------------------------------------------------ */
push_gimplify_context ();
- mf_init_extern_trees ();
mf_xform_decls (DECL_SAVED_TREE (current_function_decl),
DECL_ARGUMENTS (current_function_decl));
arg = convert (ptr_type_node, arg);
args = tree_cons (NULL_TREE, arg, args);
- mf_init_extern_trees ();
call_stmt = build_function_call_expr (mf_register_fndecl, args);
append_to_statement_list (call_stmt, &enqueued_call_stmt_chain);
VARRAY_CLEAR (deferred_static_decls);
}
- mflang_flush_calls (enqueued_call_stmt_chain);
+ if (enqueued_call_stmt_chain)
+ {
+ cgraph_build_static_cdtor ('I', enqueued_call_stmt_chain);
+ enqueued_call_stmt_chain = 0;
+ }
}
#define TREE_MUDFLAP_H
/* Instrumentation. */
+extern void mudflap_init (void);
extern void mudflap_c_function_decls (tree);
extern void mudflap_c_function_ops (tree);
extern void mudflap_enqueue_decl (tree);
extern int mf_marked_p (tree);
extern tree mf_mark (tree);
-/* To be provided by a front-end interface module. */
-extern tree mflang_lookup_decl (const char *);
-extern void mflang_flush_calls (tree);
-
-
#endif /* TREE_MUDFLAP_H */
+2004-07-05 Zack Weinberg <zack@codesourcery.com>
+
+ * mf-runtime.h.in: Wrap declarations of struct __mf_cache,
+ __mf_lookup_cache, __mf_lc_mask, or __mf_lc_shift in
+ #ifndef _MUDFLAP.
+
2004-06-29 Frank Ch. Eigler <fche@redhat.com>
Splay tree implementation fork.
* testsuite/libmudflap.c/pass46-frag.c: Ditto.
* configure, Makefile, aclocal.m4, config.h.in, testsuite/Makefile.in:
Regenerated with autoconf 2.57 and automake 1.7.
-
+
2004-06-04 Per Bothner <per@bothner.com>
* configure.in (LIBMUDFLAPTH): Fix thinko.
2003-11-19 Frank Ch. Eigler <fche@redhat.com>
libstdc++/11696
- * mf-runtime.h.in: Switch to #pragma redefine_extname for
- symbols interposed at compile time.
+ * mf-runtime.h.in: Switch to #pragma redefine_extname for
+ symbols interposed at compile time.
* testsuite/libmudflap.c++/pass41-frag.cxx: New test.
libmudflap/12939
2003-07-29 Gerald Pfeifer <pfeifer@dbai.tuwien.ac.at>
- * configure.in: Update check for union semun.
+ * configure.in: Update check for union semun.
2003-07-29 Gerald Pfeifer <pfeifer@dbai.tuwien.ac.at>
#endif
-/* Global declarations used by instrumentation. */
-
+/* Global declarations used by instrumentation. When _MUDFLAP is
+ defined, these have been auto-declared by the compiler and we
+ should not declare them again (ideally we *would* declare them
+ again, to verify that the compiler's declarations match the
+ library's, but the C++ front end has no mechanism for allowing
+ the re-definition of a structure type). */
+#ifndef _MUDFLAP
struct __mf_cache { uintptr_t low; uintptr_t high; };
extern struct __mf_cache __mf_lookup_cache [];
extern uintptr_t __mf_lc_mask;
extern unsigned char __mf_lc_shift;
+#endif
/* Multithreading support. */
#ifdef _MUDFLAPTH