Commit ca55abae by Jason Merrill

dwarf2 EH support

From-SVN: r15464
parent 5168dcfc
...@@ -12,6 +12,47 @@ Mon Sep 15 15:39:26 1997 Jeffrey A Law (law@cygnus.com) ...@@ -12,6 +12,47 @@ Mon Sep 15 15:39:26 1997 Jeffrey A Law (law@cygnus.com)
mode wider than HOST_WIDE_INT, then the high word of a CONST_INT mode wider than HOST_WIDE_INT, then the high word of a CONST_INT
is derived from the sign bit of the low word. is derived from the sign bit of the low word.
Mon Sep 15 11:43:38 1997 Jason Merrill <jason@yorick.cygnus.com>
Support dwarf2 unwinding on PUSH_ROUNDING targets like the x86.
* dwarf2.h: Add DW_CFA_GNU_args_size.
* frame.c (execute_cfa_insn): Likewise.
* dwarf2out.c (dwarf_cfi_name, output_cfi): Likewise.
(dwarf2out_args_size, dwarf2out_stack_adjust): New fns.
(dwarf2out_frame_debug): If this isn't a prologue or epilogue
insn, hand it off to dwarf2out_stack_adjust.
(dwarf2out_begin_prologue): Initialize args_size.
* frame.h (struct frame_state): Add args_size.
* libgcc2.c (__throw): Use args_size.
* final.c (final_scan_insn): If we push args, hand off all insns
to dwarf2out_frame_debug.
* defaults.h (DWARF2_UNWIND_INFO): OK for !ACCUMULATE_OUTGOING_ARGS.
* dwarf2out.c dwarf2out_frame_debug): Fix typo.
Handle epilogue restore of SP from FP.
* emit-rtl.c (gen_sequence): Still generate a sequence if the
lone insn has RTX_FRAME_RELATED_P set.
* frame.c (extract_cie_info): Handle "e" augmentation.
* dwarf2out.c (ASM_OUTPUT_DWARF_*): Provide definitions in the
absence of UNALIGNED_*_ASM_OP.
(UNALIGNED_*_ASM_OP): Only provide defaults if OBJECT_FORMAT_ELF.
(output_call_frame_info): Use "e" instead of "z" for augmentation.
Don't emit augmentation fields length.
(dwarf2out_do_frame): Move outside of #ifdefs.
* defaults.h (DWARF2_UNWIND_INFO): Don't require unaligned data
opcodes.
* sparc.h (UNALIGNED_INT_ASM_OP et al): Don't define here after all.
* sparc/sysv4.h (UNALIGNED_INT_ASM_OP): Define here.
* sparc/sunos4.h (DWARF2_UNWIND_INFO): Define to 0.
* sparc/sun4gas.h: New file.
* configure.in: Use sun4gas.h if SunOS 4 --with-gnu-as.
* collect2.c (write_c_file_stat, write_c_file_glob): Declare
__register_frame_table and __deregister_frame.
1997-09-15 Brendan Kehoe <brendan@cygnus.com> 1997-09-15 Brendan Kehoe <brendan@cygnus.com>
* except.c (find_exception_handler_labels): Use xmalloc instead of * except.c (find_exception_handler_labels): Use xmalloc instead of
...@@ -45,6 +86,11 @@ Sat Sep 13 12:57:26 1997 Jeffrey A Law (law@cygnus.com) ...@@ -45,6 +86,11 @@ Sat Sep 13 12:57:26 1997 Jeffrey A Law (law@cygnus.com)
* haifa-sched.c (add_branch_dependences): Make each insn in * haifa-sched.c (add_branch_dependences): Make each insn in
a SCHED_GROUP_P block explicitly depend on the previous insn. a SCHED_GROUP_P block explicitly depend on the previous insn.
Fri Sep 12 13:49:58 1997 Jason Merrill <jason@yorick.cygnus.com>
* except.h: Prototype dwarf2 hooks.
* expr.c: Adjust.
Thu Sep 11 17:43:55 1997 Jim Wilson <wilson@cygnus.com> Thu Sep 11 17:43:55 1997 Jim Wilson <wilson@cygnus.com>
* configure.in (native_prefix): Delete. * configure.in (native_prefix): Delete.
...@@ -112,6 +158,95 @@ Wed Sep 10 14:05:08 1997 H.J. Lu (hjl@gnu.ai.mit.edu) ...@@ -112,6 +158,95 @@ Wed Sep 10 14:05:08 1997 H.J. Lu (hjl@gnu.ai.mit.edu)
(check-gcc, check-g++): Depend on testsuite/site.exp. (check-gcc, check-g++): Depend on testsuite/site.exp.
Don't stop for failure. Don't stop for failure.
Wed Sep 10 12:59:57 1997 Jason Merrill <jason@yorick.cygnus.com>
* expr.c (expand_builtin): Only support __builtin_dwarf_fp_regnum()
if DWARF2_UNWIND_INFO.
Wed Sep 10 11:49:20 1997 Jason Merrill <jason@yorick.cygnus.com>
Add support for exception handling using DWARF 2 frame unwind info.
Currently works on SPARC and MIPS, and almost on x86.
* libgcc2.c (get_reg, put_reg, get_return_addr, put_return_addr,
next_stack_level, in_reg_window): Helper fns.
(__throw): Implement for DWARF2_UNWIND_INFO.
* expr.c (expand_builtin): Handle builtins used by __throw.
* tree.h (enum built_in_function): Add builtins used by __throw.
* c-decl.c (init_decl_processing): Declare builtins used by __throw.
* dwarf2out.c (expand_builtin_dwarf_fp_regnum): Used by __throw.
* except.c (expand_builtin_unwind_init): Hook for dwarf2 __throw.
(expand_builtin_extract_return_addr): Likewise.
(expand_builtin_frob_return_addr): Likewise.
(expand_builtin_set_return_addr_reg): Likewise.
(expand_builtin_eh_stub): Likewise.
(expand_builtin_set_eh_regs): Likewise.
(eh_regs): Choose two call-clobbered registers for passing back values.
* frame.c, frame.h: New files for parsing dwarf 2 frame info.
* Makefile.in (LIB2ADD): New variable. Add $(srcdir)/frame.c.
(libgcc2.a): Use it instead of $(LIB2FUNCS_EXTRA) $(LANG_LIB2FUNCS)
(stmp-multilib): Likewise.
($(T)crtbegin.o, $(T)crtend.o): Add -fno-exceptions.
* except.c: #include "defaults.h".
(exceptions_via_longjmp): Default depends on DWARF2_UNWIND_INFO.
(emit_throw): Don't defeat assemble_external if DWARF2_UNWIND_INFO.
(register_exception_table_p): New fn.
(start_eh_unwinder): Don't do anything if DWARF2_UNWIND_INFO.
(end_eh_unwinder): Likewise.
* crtstuff.c: Wrap .eh_frame section, use EH_FRAME_SECTION_ASM_OP,
call __register_frame and __deregister_frame as needed.
* varasm.c (eh_frame_section): New fn if EH_FRAME_SECTION_ASM_OP.
* dwarf2out.c (EH_FRAME_SECTION): Now a function-like macro. Check
EH_FRAME_SECTION_ASM_OP.
* sparc/sysv4.h (EH_FRAME_SECTION_ASM_OP): Define.
* mips/iris6.h: (EH_FRAME_SECTION_ASM_OP): Define.
(LINK_SPEC): Add __EH_FRAME_BEGIN__ to hidden symbols.
* dwarf2out.c (output_call_frame_info): If no support for
EXCEPTION_SECTION, mark the start of the frame info with a
collectable tag.
* collect2.c (frame_tables): New list.
(is_ctor_dtor): Recognise frame entries.
(scan_prog_file): Likewise.
(main): Pass -fno-exceptions to sub-compile. Also do collection
if there are any frame entries.
(write_c_file_stat): Call __register_frame_table and
__deregister_frame as needed.
(write_c_file_glob): Likewise.
* defaults.h (DWARF2_UNWIND_INFO): Default to 1 if supported.
Also require unaligned reloc support.
* sparc.h (UNALIGNED_SHORT_ASM_OP, UNALIGNED_INT_ASM_OP,
UNALIGNED_DOUBLE_INT_ASM_OP): Define here.
* sparc/sysv4.h: Not here.
* toplev.c (compile_file): Call dwarf2out_frame_{init,finish}.
* dwarf2out.c (dwarf2out_init): Don't call dwarf2out_frame_init.
(dwarf2out_finish): Don't call dwarf2out_frame_finish.
* libgcc2.c (L_eh): Reorganize, moving code shared by different
EH implementations to the top.
(find_exception_handler): Split out. Start from 0. Compare against
end with >=.
(__find_first_exception_table_match): Use it.
* except.c (output_exception_table): Don't do anything if there's
no table. Don't output a first entry of zeroes.
(eh_outer_context): Adjust properly.
(add_eh_table_entry): Use xrealloc.
* toplev.c (compile_file): Just call output_exception_table.
Wed Sep 10 11:30:36 1997 Jason Merrill <jason@cygnus.com>
* i386.c (ix86_prologue): Add dwarf2 support for !do_rtl case.
Wed Sep 10 08:17:10 1997 Torbjorn Granlund <tege@pdc.kth..se>
* except.c (eh_outer_context): Do masking using expand_and.
Wed Sep 10 01:38:30 1997 Doug Evans <dje@cygnus.com> Wed Sep 10 01:38:30 1997 Doug Evans <dje@cygnus.com>
Add port done awhile ago for the ARC cpu. Add port done awhile ago for the ARC cpu.
...@@ -152,10 +287,38 @@ Tue Sep 9 17:07:36 1997 Stan Cox <coxs@dg-rtp.dg.com> ...@@ -152,10 +287,38 @@ Tue Sep 9 17:07:36 1997 Stan Cox <coxs@dg-rtp.dg.com>
* m88k.c (m88k_expand_prologue): Set MEM_IN_STRUCT_P of va_list * m88k.c (m88k_expand_prologue): Set MEM_IN_STRUCT_P of va_list
template. template.
Tue Sep 9 09:50:02 1997 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
* dwarf2out.c (output_call_frame_info): Call named_section.
Tue Sep 9 09:12:17 1997 Jeffrey A Law (law@cygnus.com) Tue Sep 9 09:12:17 1997 Jeffrey A Law (law@cygnus.com)
* haifa-sched.c (print_value): Fix last change. * haifa-sched.c (print_value): Fix last change.
Tue Sep 9 01:30:37 1997 Jason Merrill <jason@yorick.cygnus.com>
* mips.h (DWARF_FRAME_REGNUM): Use the same numbering regardless of
write_symbols.
Mon Sep 8 16:32:43 1997 Jason Merrill <jason@yorick.cygnus.com>
* mips.c (function_prologue): Set up the CFA when ABI_32.
* sparc.c (save_regs): Check dwarf2out_do_frame instead of DWARF2_DEBUG
for dwarf2 unwind info.
(output_function_prologue, sparc_flat_output_function_prologue): Same.
* final.c (final_end_function): Check dwarf2out_do_frame instead
of DWARF2_DEBUG for dwarf2 unwind info.
(final_scan_insn): Likewise.
(final_start_function): Likewise. Initialize dwarf2 frame debug here.
(final): Not here.
* expr.c (expand_builtin_return_addr): Only SETUP_FRAME_ADDRESSES if
count > 0.
* varasm.c (exception_section): Check EXCEPTION_SECTION first.
Mon Sep 8 15:15:11 1997 Nick Clifton <nickc@cygnus.com> Mon Sep 8 15:15:11 1997 Nick Clifton <nickc@cygnus.com>
* v850.h (ASM_SPEC): Pass on target processor. * v850.h (ASM_SPEC): Pass on target processor.
......
...@@ -268,7 +268,7 @@ LIBGCC2 = libgcc2.a ...@@ -268,7 +268,7 @@ LIBGCC2 = libgcc2.a
# -g1 causes output of debug info only for file-scope entities. # -g1 causes output of debug info only for file-scope entities.
# we use this here because that should be enough, and also # we use this here because that should be enough, and also
# so that -g1 will be tested. # so that -g1 will be tested.
LIBGCC2_DEBUG_CFLAGS = -g1 LIBGCC2_DEBUG_CFLAGS = -g
LIBGCC2_CFLAGS = -O2 $(LIBGCC2_INCLUDES) $(GCC_CFLAGS) $(TARGET_LIBGCC2_CFLAGS) $(LIBGCC2_DEBUG_CFLAGS) -DIN_LIBGCC2 -D__GCC_FLOAT_NOT_NEEDED LIBGCC2_CFLAGS = -O2 $(LIBGCC2_INCLUDES) $(GCC_CFLAGS) $(TARGET_LIBGCC2_CFLAGS) $(LIBGCC2_DEBUG_CFLAGS) -DIN_LIBGCC2 -D__GCC_FLOAT_NOT_NEEDED
# Additional options to use when compiling libgcc2.a. # Additional options to use when compiling libgcc2.a.
...@@ -949,8 +949,9 @@ libgcc2.ready: $(GCC_PASSES) $(LIBGCC2_DEPS) stmp-int-hdrs ...@@ -949,8 +949,9 @@ libgcc2.ready: $(GCC_PASSES) $(LIBGCC2_DEPS) stmp-int-hdrs
touch libgcc2.ready; \ touch libgcc2.ready; \
fi fi
libgcc2.a: libgcc2.c libgcc2.ready $(CONFIG_H) $(LIB2FUNCS_EXTRA) \ LIB2ADD = $(srcdir)/frame.c $(LIB2FUNCS_EXTRA) $(LANG_LIB2FUNCS)
$(LANG_LIB2FUNCS) machmode.h longlong.h gbl-ctors.h config.status libgcc2.a: libgcc2.c libgcc2.ready $(CONFIG_H) $(LIB2ADD) \
machmode.h longlong.h gbl-ctors.h config.status
# Actually build it in tmplibgcc2.a, then rename at end, # Actually build it in tmplibgcc2.a, then rename at end,
# so that libgcc2.a itself remains nonexistent if compilation is aborted. # so that libgcc2.a itself remains nonexistent if compilation is aborted.
-rm -f tmplibgcc2.a -rm -f tmplibgcc2.a
...@@ -975,35 +976,31 @@ libgcc2.a: libgcc2.c libgcc2.ready $(CONFIG_H) $(LIB2FUNCS_EXTRA) \ ...@@ -975,35 +976,31 @@ libgcc2.a: libgcc2.c libgcc2.ready $(CONFIG_H) $(LIB2FUNCS_EXTRA) \
# We don't use -e here because there are if statements # We don't use -e here because there are if statements
# that should not make the command give up when the if condition is false. # that should not make the command give up when the if condition is false.
# Instead, we test for failure after each command where it matters. # Instead, we test for failure after each command where it matters.
for file in .. $(LIB2FUNCS_EXTRA) $(LANG_LIB2FUNCS); \ for file in $(LIB2ADD); do \
do \ name=`echo $${file} | sed -e 's/[.][cSo]$$//' -e 's/[.]asm$$//' -e 's/[.]txt$$//'`; \
if [ x$${file} != x.. ]; then \ oname=` echo $${name} | sed -e 's,.*/,,'`; \
name=`echo $${file} | sed -e 's/[.][cSo]$$//' -e 's/[.]asm$$//' -e 's/[.]txt$$//'`; \ if [ $${name}.txt = $${file} ]; then \
oname=` echo $${name} | sed -e 's,.*/,,'`; \ for f in .. `cat $${file}`; do if [ x$${f} != x.. ]; then \
if [ $${name}.txt = $${file} ]; then \ $(MAKE) GCC_FOR_TARGET="$(GCC_FOR_TARGET)" \
for f in .. `cat $${file}`; do if [ x$${f} != x.. ]; then \ AR="$(AR)" AR_FLAGS="$(AR_FLAGS)" CC="$(CC)" \
$(MAKE) GCC_FOR_TARGET="$(GCC_FOR_TARGET)" \ CFLAGS="$(CFLAGS)" HOST_PREFIX="$(HOST_PREFIX)" \
AR="$(AR)" AR_FLAGS="$(AR_FLAGS)" CC="$(CC)" \ HOST_PREFIX_1="$(HOST_PREFIX_1)" \
CFLAGS="$(CFLAGS)" HOST_PREFIX="$(HOST_PREFIX)" \ LANGUAGES="$(LANGUAGES)" \
HOST_PREFIX_1="$(HOST_PREFIX_1)" \ LIBGCC2_CFLAGS="$(LIBGCC2_CFLAGS)" $${f}; \
LANGUAGES="$(LANGUAGES)" \
LIBGCC2_CFLAGS="$(LIBGCC2_CFLAGS)" $${f}; \
if [ $$? -eq 0 ] ; then true; else exit 1; fi; \
$(AR) $(AR_FLAGS) tmplibgcc2.a $${f}; \
rm -f $${f}; \
else true; \
fi; done; \
else \
echo $${name}; \
if [ $${name}.asm = $${file} ]; then \
cp $${file} $${name}.s || exit 1; file=$${name}.s; \
else true; fi; \
$(GCC_FOR_TARGET) $(LIBGCC2_CFLAGS) $(INCLUDES) -c $${file}; \
if [ $$? -eq 0 ] ; then true; else exit 1; fi; \ if [ $$? -eq 0 ] ; then true; else exit 1; fi; \
$(AR) $(AR_FLAGS) tmplibgcc2.a $${oname}$(objext); \ $(AR) $(AR_FLAGS) tmplibgcc2.a $${f}; \
rm -f $${name}.s $${oname}$(objext); \ rm -f $${f}; \
fi; \ else true; \
else true; \ fi; done; \
else \
echo $${name}; \
if [ $${name}.asm = $${file} ]; then \
cp $${file} $${name}.s || exit 1; file=$${name}.s; \
else true; fi; \
$(GCC_FOR_TARGET) $(LIBGCC2_CFLAGS) $(INCLUDES) -c $${file}; \
if [ $$? -eq 0 ] ; then true; else exit 1; fi; \
$(AR) $(AR_FLAGS) tmplibgcc2.a $${oname}$(objext); \
rm -f $${name}.s $${oname}$(objext); \
fi; \ fi; \
done done
mv tmplibgcc2.a libgcc2.a mv tmplibgcc2.a libgcc2.a
...@@ -1050,8 +1047,7 @@ stamp-mlib: $(srcdir)/genmultilib Makefile ...@@ -1050,8 +1047,7 @@ stamp-mlib: $(srcdir)/genmultilib Makefile
# Build multiple copies of libgcc.a, one for each target switch. # Build multiple copies of libgcc.a, one for each target switch.
stmp-multilib: $(LIBGCC1) libgcc2.c libgcc2.ready $(CONFIG_H) \ stmp-multilib: $(LIBGCC1) libgcc2.c libgcc2.ready $(CONFIG_H) \
$(LIB2FUNCS_EXTRA) $(LANG_LIB2FUNCS) machmode.h longlong.h gbl-ctors.h \ $(LIB2ADD) machmode.h longlong.h gbl-ctors.h config.status
config.status
for i in `$(GCC_FOR_TARGET) --print-multi-lib`; do \ for i in `$(GCC_FOR_TARGET) --print-multi-lib`; do \
dir=`echo $$i | sed -e 's/;.*$$//'`; \ dir=`echo $$i | sed -e 's/;.*$$//'`; \
flags=`echo $$i | sed -e 's/^[^;]*;//' -e 's/@/ -/g'`; \ flags=`echo $$i | sed -e 's/^[^;]*;//' -e 's/@/ -/g'`; \
...@@ -1121,12 +1117,12 @@ stmp-multilib-sub: ...@@ -1121,12 +1117,12 @@ stmp-multilib-sub:
# constructors. # constructors.
$(T)crtbegin.o: crtstuff.c $(GCC_PASSES) $(CONFIG_H) gbl-ctors.h $(T)crtbegin.o: crtstuff.c $(GCC_PASSES) $(CONFIG_H) gbl-ctors.h
$(GCC_FOR_TARGET) $(GCC_CFLAGS) $(INCLUDES) $(MULTILIB_CFLAGS) -g0 \ $(GCC_FOR_TARGET) $(GCC_CFLAGS) $(INCLUDES) $(MULTILIB_CFLAGS) -g0 \
-finhibit-size-directive -fno-inline-functions $(CRTSTUFF_T_CFLAGS) \ -finhibit-size-directive -fno-inline-functions -fno-exceptions $(CRTSTUFF_T_CFLAGS) \
-c $(srcdir)/crtstuff.c -DCRT_BEGIN -o $(T)crtbegin$(objext) -c $(srcdir)/crtstuff.c -DCRT_BEGIN -o $(T)crtbegin$(objext)
$(T)crtend.o: crtstuff.c $(GCC_PASSES) $(CONFIG_H) gbl-ctors.h $(T)crtend.o: crtstuff.c $(GCC_PASSES) $(CONFIG_H) gbl-ctors.h
$(GCC_FOR_TARGET) $(GCC_CFLAGS) $(INCLUDES) $(MULTILIB_CFLAGS) -g0 \ $(GCC_FOR_TARGET) $(GCC_CFLAGS) $(INCLUDES) $(MULTILIB_CFLAGS) -g0 \
-finhibit-size-directive -fno-inline-functions $(CRTSTUFF_T_CFLAGS) \ -finhibit-size-directive -fno-inline-functions -fno-exceptions $(CRTSTUFF_T_CFLAGS) \
-c $(srcdir)/crtstuff.c -DCRT_END -o $(T)crtend$(objext) -c $(srcdir)/crtstuff.c -DCRT_END -o $(T)crtend$(objext)
# On some systems we also want to install versions of these files # On some systems we also want to install versions of these files
......
...@@ -2313,7 +2313,7 @@ for machine in $build $host $target; do ...@@ -2313,7 +2313,7 @@ for machine in $build $host $target; do
i[3456]86-*-freebsd*) i[3456]86-*-freebsd*)
tm_file=i386/freebsd.h tm_file=i386/freebsd.h
xm_file=i386/xm-freebsd.h xm_file=i386/xm-freebsd.h
# On FreeBSD, the headers are already ok, except for math.h # On FreeBSD, the headers are already ok, except for math.h.
fixincludes=fixinc.math fixincludes=fixinc.math
tmake_file=i386/t-freebsd tmake_file=i386/t-freebsd
;; ;;
...@@ -3897,6 +3897,9 @@ for machine in $build $host $target; do ...@@ -3897,6 +3897,9 @@ for machine in $build $host $target; do
tm_file=sparc/sunos4.h tm_file=sparc/sunos4.h
tmake_file=sparc/t-sunos41 tmake_file=sparc/t-sunos41
use_collect2=yes use_collect2=yes
if [ x$gas = xyes ]; then
tm_file="${tm_file} sparc/sun4gas.h"
fi
;; ;;
sparc-*-sunos3*) sparc-*-sunos3*)
tm_file=sparc/sun4o3.h tm_file=sparc/sun4o3.h
......
...@@ -2383,6 +2383,9 @@ for machine in $build $host $target; do ...@@ -2383,6 +2383,9 @@ for machine in $build $host $target; do
tm_file=sparc/sunos4.h tm_file=sparc/sunos4.h
tmake_file=sparc/t-sunos41 tmake_file=sparc/t-sunos41
use_collect2=yes use_collect2=yes
if [[ x$gas = xyes ]]; then
tm_file="${tm_file} sparc/sun4gas.h"
fi
;; ;;
sparc-*-sunos3*) sparc-*-sunos3*)
tm_file=sparc/sun4o3.h tm_file=sparc/sun4o3.h
......
...@@ -36,6 +36,14 @@ Thu Sep 11 10:08:45 1997 Mark Mitchell <mmitchell@usa.net> ...@@ -36,6 +36,14 @@ Thu Sep 11 10:08:45 1997 Mark Mitchell <mmitchell@usa.net>
(tsubst): Do constant folding as necessary to make sure that (tsubst): Do constant folding as necessary to make sure that
arguments passed to lookup_template_class really are constants. arguments passed to lookup_template_class really are constants.
Wed Sep 10 11:21:55 1997 Jason Merrill <jason@yorick.cygnus.com>
* except.c (expand_builtin_throw): #ifndef DWARF2_UNWIND_INFO.
* decl2.c (finish_file): Only register exception tables if we
need to.
* decl.c (init_decl_processing): Add __builtin_[fs]p.
Tue Sep 9 19:49:38 1997 Jason Merrill <jason@yorick.cygnus.com> Tue Sep 9 19:49:38 1997 Jason Merrill <jason@yorick.cygnus.com>
* pt.c (unify): Just return 0 for a TYPENAME_TYPE. * pt.c (unify): Just return 0 for a TYPENAME_TYPE.
......
...@@ -4725,7 +4725,7 @@ init_decl_processing () ...@@ -4725,7 +4725,7 @@ init_decl_processing ()
tree string_ftype_ptr_ptr, int_ftype_string_string; tree string_ftype_ptr_ptr, int_ftype_string_string;
tree sizetype_endlink; tree sizetype_endlink;
tree ptr_ftype, ptr_ftype_unsigned, ptr_ftype_sizetype; tree ptr_ftype, ptr_ftype_unsigned, ptr_ftype_sizetype;
tree void_ftype, void_ftype_int, void_ftype_ptr; tree void_ftype, void_ftype_int, void_ftype_ptr, ptr_ftype_void;
/* Have to make these distinct before we try using them. */ /* Have to make these distinct before we try using them. */
lang_name_cplusplus = get_identifier ("C++"); lang_name_cplusplus = get_identifier ("C++");
...@@ -5103,6 +5103,10 @@ init_decl_processing () ...@@ -5103,6 +5103,10 @@ init_decl_processing ()
builtin_function ("__builtin_frame_address", ptr_ftype_unsigned, builtin_function ("__builtin_frame_address", ptr_ftype_unsigned,
BUILT_IN_FRAME_ADDRESS, NULL_PTR); BUILT_IN_FRAME_ADDRESS, NULL_PTR);
ptr_ftype_void = build_function_type (ptr_type_node, endlink);
builtin_function ("__builtin_fp", ptr_ftype_void, BUILT_IN_FP, NULL_PTR);
builtin_function ("__builtin_sp", ptr_ftype_void, BUILT_IN_SP, NULL_PTR);
builtin_function ("__builtin_alloca", ptr_ftype_sizetype, builtin_function ("__builtin_alloca", ptr_ftype_sizetype,
BUILT_IN_ALLOCA, "alloca"); BUILT_IN_ALLOCA, "alloca");
builtin_function ("__builtin_ffs", int_ftype_int, BUILT_IN_FFS, NULL_PTR); builtin_function ("__builtin_ffs", int_ftype_int, BUILT_IN_FFS, NULL_PTR);
......
...@@ -3196,6 +3196,7 @@ gen_sequence () ...@@ -3196,6 +3196,7 @@ gen_sequence ()
(Now that we cache SEQUENCE expressions, it isn't worth special-casing (Now that we cache SEQUENCE expressions, it isn't worth special-casing
the case of an empty list.) */ the case of an empty list.) */
if (len == 1 if (len == 1
&& ! RTX_FRAME_RELATED_P (first_insn)
&& (GET_CODE (first_insn) == INSN && (GET_CODE (first_insn) == INSN
|| GET_CODE (first_insn) == JUMP_INSN || GET_CODE (first_insn) == JUMP_INSN
/* Don't discard the call usage field. */ /* Don't discard the call usage field. */
......
...@@ -36,6 +36,7 @@ Boston, MA 02111-1307, USA. */ ...@@ -36,6 +36,7 @@ Boston, MA 02111-1307, USA. */
#include "recog.h" #include "recog.h"
#include "output.h" #include "output.h"
#include "typeclass.h" #include "typeclass.h"
#include "defaults.h"
#include "bytecode.h" #include "bytecode.h"
#include "bc-opcode.h" #include "bc-opcode.h"
...@@ -7997,7 +7998,8 @@ expand_builtin_return_addr (fndecl_code, count, tem) ...@@ -7997,7 +7998,8 @@ expand_builtin_return_addr (fndecl_code, count, tem)
arbitrary frames. For example, on the sparc, we must first flush arbitrary frames. For example, on the sparc, we must first flush
all register windows to the stack. */ all register windows to the stack. */
#ifdef SETUP_FRAME_ADDRESSES #ifdef SETUP_FRAME_ADDRESSES
SETUP_FRAME_ADDRESSES (); if (count > 0)
SETUP_FRAME_ADDRESSES ();
#endif #endif
/* On the sparc, the return address is not in the frame, it is in a /* On the sparc, the return address is not in the frame, it is in a
...@@ -9137,6 +9139,32 @@ expand_builtin (exp, target, subtarget, mode, ignore) ...@@ -9137,6 +9139,32 @@ expand_builtin (exp, target, subtarget, mode, ignore)
return const0_rtx; return const0_rtx;
} }
/* Various hooks for the DWARF 2 __throw routine. */
case BUILT_IN_UNWIND_INIT:
expand_builtin_unwind_init ();
return const0_rtx;
case BUILT_IN_FP:
return frame_pointer_rtx;
case BUILT_IN_SP:
return stack_pointer_rtx;
#ifdef DWARF2_UNWIND_INFO
case BUILT_IN_DWARF_FP_REGNUM:
return expand_builtin_dwarf_fp_regnum ();
#endif
case BUILT_IN_FROB_RETURN_ADDR:
return expand_builtin_frob_return_addr (TREE_VALUE (arglist));
case BUILT_IN_EXTRACT_RETURN_ADDR:
return expand_builtin_extract_return_addr (TREE_VALUE (arglist));
case BUILT_IN_SET_RETURN_ADDR_REG:
expand_builtin_set_return_addr_reg (TREE_VALUE (arglist));
return const0_rtx;
case BUILT_IN_EH_STUB:
return expand_builtin_eh_stub ();
case BUILT_IN_SET_EH_REGS:
expand_builtin_set_eh_regs (TREE_VALUE (arglist),
TREE_VALUE (TREE_CHAIN (arglist)));
return const0_rtx;
default: /* just do library call, if unknown builtin */ default: /* just do library call, if unknown builtin */
error ("built-in function `%s' not currently supported", error ("built-in function `%s' not currently supported",
IDENTIFIER_POINTER (DECL_NAME (fndecl))); IDENTIFIER_POINTER (DECL_NAME (fndecl)));
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment