+Mon Dec 15 00:04:48 1997 Jeffrey A Law (law@cygnus.com)
+
+ * haifa-sched.c (remove_dependencies): Set RTX_INTEGRATED_P on
+ dependency we delete. Properly update prev for multiple consecutive
+ deletions.
+ (priority): Skip deleted dependence.
+
Fri Dec 12 18:54:23 1997 Per Bothner <bothner@cygnus.com>
* expr.c (expand_builtin): Support BUILT_IN_FMOD - just call fmod.
-Fri Dec 12 08:01:44 1997 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
+Sun Dec 14 06:49:05 1997 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
+
+ * Version 2.8.0 released.
+
+ * expr.c (expand_expr, case PLACEHOLDER_EXPR): Use placeholder_list
+ expression in preference to any other if correct type.
+
+ * i386.h (INITIAL_ELIMINATION_OFFSET): Correctly test for PIC
+ register used.
+
+Sat Dec 13 06:11:32 1997 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
+
+ * frame.h (__register_frame_info_table): Fix typo in declaration.
+
+Fri Dec 12 07:55:18 1997 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
+
+ * function.c (purge_addressof_1): For (mem (address (mem ...)),
+ when collapsing, preserve mode of outer MEM.
+
+ * frame.c (__register_frame_info): Renamed from __register_frame.
+ (__register_frame_info_table, __deregister_frame_info): Similarly.
+ * frame.h (__{,de}register_frame_info): Likewise.
+ (__register_frame_info_table): New declaration.
+ * crtstuff.c (__do_global_dtors{,_aux}): Rename __deregister_frame.
+ (frame_dummy, __do_global_ctors): Likewise for __register_frame.
+ * collect2.c (write_c_file_{stat,glob}): Rename __register_frame
+ to __register_frame_info and similarly for __deregister_frame and
+ __register_frame_table.
+
+ * sched.c (remove_dependencies): Set RTX_INTEGRATED_P on dependency
+ we delete. Properly update prev for multiple consecutive deletions.
+ (priority): Skip deleted dependence.
* integrate.c (initialize_for_inline): In DECL_RTL of a PARM_DECL,
look inside a (mem (addressof (mem ...))).
+Fri Dec 12 05:49:58 1997 Paul Eggert <eggert@twinsun.com>
+
+ * collect2.c (write_c_file_glob):
+ Allocate initial frame object in static storage and pass its address.
+
+Thu Dec 11 18:01:31 1997 Philippe De Muyter <phdm@macqel.be>
+
+ * acconfig.h (NEED_DECLARATION_GETENV): Define slot added.
+
+Thu Dec 11 17:54:23 1997 Paul Eggert <eggert@twinsun.com>
+
+ * crtstuff.c (__do_global_ctors): Fix typo in last change.
+
Wed Dec 10 18:38:28 1997 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
* libgcc2.c (__bb_exit_func): Fix test of return value of fopen.
`--nfp' currently has no effect, though perhaps there are
other systems where it could usefully make a difference.
- `--enable-objcthreads=TYPE'
+ `--enable-threads=TYPE'
Certain systems, notably Linux-based GNU systems, can't be
relied on to supply a threads facility for the Objective C
runtime and so will default to single-threaded runtime. They
Rates for non-profit organizations are substantially lower, and possibly free.
Please note that I have no interest in working with any Micro$oft related
-products. I will accept work that involves other non-free, non-Micro$oft
-software, but I would want the primary focus of the work to be contributing
+products! I want the primary focus of my work to be contributing
to the free software community.
Updated: 1997-12-04
/* Whether rindex must be declared even if <stdlib.h> is included. */
#undef NEED_DECLARATION_RINDEX
+
+/* Whether getenv must be declared even if <stdlib.h> is included. */
+#undef NEED_DECLARATION_GETENV
@TOP@
fprintf (stream, " struct object *next;\n");
fprintf (stream, "};\n");
- fprintf (stream, "extern void __register_frame_table (void *, struct object *);\n");
- fprintf (stream, "extern void __deregister_frame (void *);\n");
+ fprintf (stream, "extern void __register_frame_info_table (void *, struct object *);\n");
+ fprintf (stream, "extern void __deregister_frame_info (void *);\n");
fprintf (stream, "static void reg_frame () {\n");
fprintf (stream, "\tstatic struct object ob;\n");
- fprintf (stream, "\t__register_frame_table (frame_table, &ob);\n");
+ fprintf (stream, "\t__register_frame_info_table (frame_table, &ob);\n");
fprintf (stream, "\t}\n");
fprintf (stream, "static void dereg_frame () {\n");
- fprintf (stream, "\t__deregister_frame (frame_table);\n");
+ fprintf (stream, "\t__deregister_frame_info (frame_table);\n");
fprintf (stream, "\t}\n");
}
fprintf (stream, " struct object *next;\n");
fprintf (stream, "};\n");
- fprintf (stream, "extern void __register_frame_table (void *, struct object *);\n");
- fprintf (stream, "extern void __deregister_frame (void *);\n");
+ fprintf (stream, "extern void __register_frame_info_table (void *, struct object *);\n");
+ fprintf (stream, "extern void __deregister_frame_info (void *);\n");
fprintf (stream, "static void reg_frame () {\n");
fprintf (stream, "\tstatic struct object ob;\n");
- fprintf (stream, "\t__register_frame_table (frame_table, &ob);\n");
+ fprintf (stream, "\t__register_frame_info_table (frame_table, &ob);\n");
fprintf (stream, "\t}\n");
fprintf (stream, "static void dereg_frame () {\n");
- fprintf (stream, "\t__deregister_frame (frame_table);\n");
+ fprintf (stream, "\t__deregister_frame_info (frame_table);\n");
fprintf (stream, "\t}\n");
}
/* Whether rindex must be declared even if <stdlib.h> is included. */
#undef NEED_DECLARATION_RINDEX
+/* Whether getenv must be declared even if <stdlib.h> is included. */
+#undef NEED_DECLARATION_GETENV
+
/* Define if you have the ANSI C header files. */
#undef STDC_HEADERS
\
for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++) \
if ((regs_ever_live[regno] && ! call_used_regs[regno]) \
- || (current_function_uses_pic_offset_table \
- && regno == PIC_OFFSET_TABLE_REGNUM)) \
+ || ((current_function_uses_pic_offset_table \
+ || current_function_uses_const_pool) \
+ && flag_pic && regno == PIC_OFFSET_TABLE_REGNUM)) \
offset += 4; \
\
(OFFSET) = offset + get_frame_size (); \
}
#ifdef EH_FRAME_SECTION_ASM_OP
- __deregister_frame (__EH_FRAME_BEGIN__);
+ __deregister_frame_info (__EH_FRAME_BEGIN__);
#endif
completed = 1;
}
}
#ifdef EH_FRAME_SECTION_ASM_OP
-/* Stick a call to __register_frame into the .init section. For some reason
- calls with no arguments work more reliably in .init, so stick the call
- in another function. */
+/* Stick a call to __register_frame_info into the .init section. For some
+ reason calls with no arguments work more reliably in .init, so stick the
+ call in another function. */
static void
frame_dummy ()
{
static struct object object;
- __register_frame (__EH_FRAME_BEGIN__, &object);
+ __register_frame_info (__EH_FRAME_BEGIN__, &object);
}
static void
(*p) ();
#ifdef EH_FRAME_SECTION_ASM_OP
- __deregister_frame (__EH_FRAME_BEGIN__);
+ __deregister_frame_info (__EH_FRAME_BEGIN__);
#endif
}
#endif
func_ptr *p;
#ifdef EH_FRAME_SECTION_ASM_OP
static struct object object;
- __register_frame (__EH_FRAME_BEGIN__, &object);
+ __register_frame_info (__EH_FRAME_BEGIN__, &object);
#endif
for (p = __CTOR_END__ - 1; *p != (func_ptr) -1; p--)
(*p) ();
On targets that support crtstuff.c, the unwind information
is stored in a section named .eh_frame and the information for the
entire shared object or program is registered with a call to
- __register_frame. On other targets, the information for each
+ __register_frame_info. On other targets, the information for each
translation unit is registered from the file generated by collect2.
- __register_frame is defined in frame.c, and is responsible for
+ __register_frame_info is defined in frame.c, and is responsible for
recording all of the unwind regions into one list (which is kept in a
static variable named unwind_table_list).
tree placeholder_expr;
/* If there is an object on the head of the placeholder list,
- see if some object in it's references is of type TYPE. For
+ see if some object in its references is of type TYPE. For
further information, see tree.def. */
for (placeholder_expr = placeholder_list;
placeholder_expr != 0;
== need_type))
object = TREE_PURPOSE (placeholder_expr);
- /* Find the innermost reference that is of the type we want. */
+ /* Find the outermost reference that is of the type we want. */
for (elt = TREE_PURPOSE (placeholder_expr);
- elt != 0
+ elt != 0 && object == 0
&& (TREE_CODE_CLASS (TREE_CODE (elt)) == 'r'
|| TREE_CODE_CLASS (TREE_CODE (elt)) == '1'
|| TREE_CODE_CLASS (TREE_CODE (elt)) == '2'
if (TREE_CODE_CLASS (TREE_CODE (elt)) == 'r'
&& (TYPE_MAIN_VARIANT (TREE_TYPE (TREE_OPERAND (elt, 0)))
== need_type))
- {
- object = TREE_OPERAND (elt, 0);
- break;
- }
+ object = TREE_OPERAND (elt, 0);
if (object != 0)
{
/* Called from crtbegin.o to register the unwind info for an object. */
void
-__register_frame (void *begin, struct object *ob)
+__register_frame_info (void *begin, struct object *ob)
{
ob->fde_begin = begin;
collect2. */
void
-__register_frame_table (void *begin, struct object *ob)
+__register_frame_info_table (void *begin, struct object *ob)
{
ob->fde_begin = begin;
ob->fde_array = begin;
/* Called from crtend.o to deregister the unwind info for an object. */
void
-__deregister_frame (void *begin)
+__deregister_frame_info (void *begin)
{
struct object **p;
/* Called either from crtbegin.o or a static constructor to register the
unwind info for an object or translation unit, respectively. */
-extern void __register_frame (void *, struct object *);
+extern void __register_frame_info (void *, struct object *);
+
+/* Similar, but BEGIN is actually a pointer to a table of unwind entries
+ for different translation units. Called from the file generated by
+ collect2. */
+extern void __register_frame_info_table (void *, struct object *);
/* Called from crtend.o to deregister the unwind info for an object. */
-extern void __deregister_frame (void *);
+extern void __deregister_frame_info (void *);
/* Called from __throw to find the registers to restore for a given
PC_TARGET. The caller should allocate a local variable of `struct
else if (code == MEM && GET_CODE (XEXP (x, 0)) == ADDRESSOF && ! force)
{
rtx sub = XEXP (XEXP (x, 0), 0);
- if (GET_CODE (sub) != REG)
- sub = copy_rtx (sub);
+ if (GET_CODE (sub) == MEM)
+ sub = gen_rtx (MEM, GET_MODE (x), copy_rtx (XEXP (sub, 0)));
if (GET_CODE (sub) == REG && GET_MODE (x) != GET_MODE (sub))
{
if (! BYTES_BIG_ENDIAN && ! WORDS_BIG_ENDIAN)
rtx prev, link;
int found = 0;
- for (prev = 0, link = LOG_LINKS (insn); link;
- prev = link, link = XEXP (link, 1))
+ for (prev = 0, link = LOG_LINKS (insn); link; link = XEXP (link, 1))
{
if (XEXP (link, 0) == elem)
{
+ RTX_INTEGRATED_P (link) = 1;
if (prev)
XEXP (prev, 1) = XEXP (link, 1);
else
LOG_LINKS (insn) = XEXP (link, 1);
found = 1;
}
+ else
+ prev = link;
}
if (!found)
rtx next;
int next_priority;
+ if (RTX_INTEGRATED_P (link))
+ continue;
+
next = XEXP (link, 0);
/* critical path is meaningful in block boundaries only */
@cindex Objective C threads
@cindex threads, Objective C
-@item --enable-objcthreads=@var{type}
+@item --enable-threads=@var{type}
Certain systems, notably Linux-based GNU systems, can't be relied on to
supply a threads facility for the Objective C runtime and so will
default to single-threaded runtime. They may, however, have a library
/* This is a kludge to get around the Microsoft C spawn functions' propensity
to remove the outermost set of double quotes from all arguments. */
-const char * const *
+char * const *
fix_argv (argvec)
char **argvec;
{
argvec[i] = temp;
}
- return (const char * const *) argvec;
+ return (char * const *) argvec;
}
#endif /* ! defined (__CYGWIN32__) */
char * const *argv;
const char *this_pname;
const char *temp_base;
- char **errmsg_fmt, **errmsg_arg;
+ char **errmsg_fmt;
+ const char **errmsg_arg;
int flags;
{
int pid;
if ((flags & PEXECUTE_ONE) != PEXECUTE_ONE)
abort ();
pid = (flags & PEXECUTE_SEARCH ? _spawnvp : _spawnv)
- (_P_NOWAIT, program, fix_argv(argv));
+ (_P_NOWAIT, program, fix_argv (argv));
if (pid == -1)
{
*errmsg_fmt = install_error_msg;
rtx prev, link;
int found = 0;
- for (prev = 0, link = LOG_LINKS (insn); link;
- prev = link, link = XEXP (link, 1))
+ for (prev = 0, link = LOG_LINKS (insn); link; link = XEXP (link, 1))
{
if (XEXP (link, 0) == elem)
{
+ RTX_INTEGRATED_P (link) = 1;
if (prev)
XEXP (prev, 1) = XEXP (link, 1);
else
LOG_LINKS (insn) = XEXP (link, 1);
found = 1;
}
+ else
+ prev = link;
}
if (! found)
{
rtx x = XEXP (prev, 0);
+ /* If this was a duplicate of a dependence we already deleted,
+ ignore it. */
+ if (RTX_INTEGRATED_P (prev))
+ continue;
+
/* A dependence pointing to a note or deleted insn is always
obsolete, because sched_analyze_insn will have created any
necessary new dependences which replace it. Notes and deleted