aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJason Merrill <merrill@gnu.org>1996-11-11 20:12:06 +0000
committerJason Merrill <merrill@gnu.org>1996-11-11 20:12:06 +0000
commit4927276d13ba4b84158e8ab155339e3dcedc5d23 (patch)
treea118b8a2dcfbf02cca6e2ce3ba87ef56df36daa2 /gcc
parent810e3c45595f4076226ad67c5cbee217c15c3bc5 (diff)
downloadgcc-4927276d13ba4b84158e8ab155339e3dcedc5d23.zip
gcc-4927276d13ba4b84158e8ab155339e3dcedc5d23.tar.gz
gcc-4927276d13ba4b84158e8ab155339e3dcedc5d23.tar.bz2
x
From-SVN: r13121
Diffstat (limited to 'gcc')
-rw-r--r--gcc/config/mips/iris6.h103
-rw-r--r--gcc/dwarf2out.c69
-rw-r--r--gcc/varasm.c12
3 files changed, 118 insertions, 66 deletions
diff --git a/gcc/config/mips/iris6.h b/gcc/config/mips/iris6.h
index 038affa..03cbf5f 100644
--- a/gcc/config/mips/iris6.h
+++ b/gcc/config/mips/iris6.h
@@ -144,9 +144,10 @@ Boston, MA 02111-1307, USA. */
#undef SET_ASM_OP /* Has no equivalent. See ASM_OUTPUT_DEF below. */
-/* This is how to equate one symbol to another symbol. The syntax used is
- `SYM1=SYM2'. Note that this is different from the way equates are done
- with most svr4 assemblers, where the syntax is `.set SYM1,SYM2'. */
+#if 0
+/* This is *NOT* how to equate one symbol to another symbol. The assembler
+ '=' syntax just equates a name to a constant expression.
+ See ASM_OUTPUT_WEAK_ALIAS. */
#define ASM_OUTPUT_DEF(FILE,LABEL1,LABEL2) \
do { fprintf ((FILE), "\t"); \
@@ -155,6 +156,28 @@ Boston, MA 02111-1307, USA. */
assemble_name (FILE, LABEL2); \
fprintf (FILE, "\n"); \
} while (0)
+#endif
+
+/* Define the strings used for the special svr4 .type and .size directives. */
+
+#define TYPE_ASM_OP ".type"
+#define SIZE_ASM_OP ".size"
+
+/* This is how we tell the assembler that a symbol is weak. */
+
+#define ASM_OUTPUT_WEAK_ALIAS(FILE,NAME,VALUE) \
+ do { \
+ fputs ("\t.weakext\t", FILE); \
+ assemble_name (FILE, NAME); \
+ if (VALUE) \
+ { \
+ fputc (' ', FILE); \
+ assemble_name (FILE, VALUE); \
+ } \
+ fputc ('\n', FILE); \
+ } while (0)
+
+#define ASM_WEAKEN_LABEL(FILE,NAME) ASM_OUTPUT_WEAK_ALIAS(FILE,NAME,0)
#define POPSECTION_ASM_OP ".popsection"
@@ -195,6 +218,7 @@ Boston, MA 02111-1307, USA. */
and dtor lists this way, so we use -init and -fini to invoke the
do_global_* functions instead of running collect2. */
+#define BSS_SECTION_ASM_OP ".section\t.bss"
#define CONST_SECTION_ASM_OP_32 "\t.rdata"
#define CONST_SECTION_ASM_OP_64 ".section\t.rodata"
#define CTORS_SECTION_ASM_OP ".section\t.ctors,1,2,0,4"
@@ -323,22 +347,69 @@ while (0)
/* ??? SGI assembler gives warning whenever .lcomm is used. */
#undef ASM_OUTPUT_LOCAL
-#define ASM_OUTPUT_ALIGNED_LOCAL(STREAM, NAME, SIZE, ALIGN) \
-do \
- { \
- if (mips_abi != ABI_32) \
- { \
- fputs ("\t.section\t.bss\n", STREAM); \
- ASM_DECLARE_OBJECT_NAME (STREAM, NAME, 0); \
- ASM_OUTPUT_ALIGN (STREAM, floor_log2 (ALIGN / BITS_PER_UNIT)); \
- ASM_OUTPUT_SKIP (STREAM, SIZE); \
- fprintf (STREAM, "\t%s\n", POPSECTION_ASM_OP); \
- } \
- else \
+#define ASM_OUTPUT_ALIGNED_LOCAL(STREAM, NAME, SIZE, ALIGN) \
+do \
+ { \
+ if (mips_abi != ABI_32) \
+ { \
+ fprintf (STREAM, "%s\n", BSS_SECTION_ASM_OP); \
+ mips_declare_object (STREAM, NAME, "", ":\n", 0); \
+ ASM_OUTPUT_ALIGN (STREAM, floor_log2 (ALIGN / BITS_PER_UNIT)); \
+ ASM_OUTPUT_SKIP (STREAM, SIZE); \
+ fprintf (STREAM, "\t%s\n", POPSECTION_ASM_OP); \
+ } \
+ else \
mips_declare_object (STREAM, NAME, "\n\t.lcomm\t", ",%u\n", (SIZE)); \
- } \
+ } \
while (0)
+/* A C statement (sans semicolon) to output to the stdio stream
+ FILE the assembler definition of uninitialized global DECL named
+ NAME whose size is SIZE bytes and alignment is ALIGN bytes.
+ Try to use asm_output_aligned_bss to implement this macro. */
+
+#define ASM_OUTPUT_ALIGNED_BSS(FILE, DECL, NAME, SIZE, ALIGN) \
+ asm_output_aligned_bss (FILE, DECL, NAME, SIZE, ALIGN)
+
+/* Write the extra assembler code needed to declare an object properly. */
+
+#undef ASM_DECLARE_OBJECT_NAME
+#define ASM_DECLARE_OBJECT_NAME(STREAM, NAME, DECL) \
+do \
+ { \
+ size_directive_output = 0; \
+ if (!flag_inhibit_size_directive && DECL_SIZE (DECL)) \
+ { \
+ size_directive_output = 1; \
+ fprintf (STREAM, "\t%s\t ", SIZE_ASM_OP); \
+ assemble_name (STREAM, NAME); \
+ fprintf (STREAM, ",%d\n", int_size_in_bytes (TREE_TYPE (DECL))); \
+ } \
+ mips_declare_object (STREAM, NAME, "", ":\n", 0); \
+ } \
+while (0)
+
+/* Output the size directive for a decl in rest_of_decl_compilation
+ in the case where we did not do so before the initializer.
+ Once we find the error_mark_node, we know that the value of
+ size_directive_output was set
+ by ASM_DECLARE_OBJECT_NAME when it was run for the same decl. */
+
+#define ASM_FINISH_DECLARE_OBJECT(FILE, DECL, TOP_LEVEL, AT_END) \
+do { \
+ char *name = XSTR (XEXP (DECL_RTL (DECL), 0), 0); \
+ if (!flag_inhibit_size_directive && DECL_SIZE (DECL) \
+ && ! AT_END && TOP_LEVEL \
+ && DECL_INITIAL (DECL) == error_mark_node \
+ && !size_directive_output) \
+ { \
+ size_directive_output = 1; \
+ fprintf (FILE, "\t%s\t ", SIZE_ASM_OP); \
+ assemble_name (FILE, name); \
+ fprintf (FILE, ",%d\n", int_size_in_bytes (TREE_TYPE (DECL))); \
+ } \
+ } while (0)
+
#undef LOCAL_LABEL_PREFIX
#define LOCAL_LABEL_PREFIX (mips_abi == ABI_32 ? "$" : ".")
diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c
index e5e2182..51c58ff 100644
--- a/gcc/dwarf2out.c
+++ b/gcc/dwarf2out.c
@@ -252,19 +252,6 @@ pubname_entry;
#define ASM_COMMENT_START ";#"
#endif
-/* Define a macro which returns non-zero for any tagged type which is used
- (directly or indirectly) in the specification of either some function's
- return type or some formal parameter of some function. We use this macro
- when we are operating in "terse" mode to help us know what tagged types
- have to be represented in Dwarf (even in terse mode) and which ones don't.
- A flag bit with this meaning really should be a part of the normal GCC
- ..._TYPE nodes, but at the moment, there is no such bit defined for these
- nodes. For now, we have to just fake it. It it safe for us to simply
- return zero for all complete tagged types (which will get forced out
- anyway if they were used in the specification of some formal or return
- type) and non-zero for all incomplete tagged types. */
-#define TYPE_USED_FOR_FUNCTION(tagged_type) (TYPE_SIZE (tagged_type) == 0)
-
/* Define a macro which returns non-zero for a TYPE_DECL which was
implicitly generated for a tagged type.
@@ -6089,7 +6076,8 @@ scope_die_for (t, context_die)
{
assert (scope_die == comp_unit_die);
assert (TREE_CODE_CLASS (TREE_CODE (containing_scope)) == 't');
- assert (TREE_ASM_WRITTEN (containing_scope));
+ if (debug_info_level > DINFO_LEVEL_TERSE)
+ assert (TREE_ASM_WRITTEN (containing_scope));
}
}
return scope_die;
@@ -6533,7 +6521,6 @@ gen_subprogram_die (decl, context_die)
register dw_die_ref subr_die;
register dw_loc_descr_ref fp_loc = NULL;
register unsigned fp_reg;
- register tree type;
register tree fn_arg_types;
register tree outer_scope;
dw_die_ref old_die = lookup_decl_die (decl);
@@ -6581,9 +6568,12 @@ gen_subprogram_die (decl, context_die)
if (TREE_PUBLIC (decl))
add_AT_flag (subr_die, DW_AT_external, 1);
add_name_and_src_coords_attributes (subr_die, decl);
- type = TREE_TYPE (decl);
- add_prototyped_attribute (subr_die, type);
- add_type_attribute (subr_die, TREE_TYPE (type), 0, 0, context_die);
+ if (debug_info_level > DINFO_LEVEL_TERSE)
+ {
+ register tree type = TREE_TYPE (decl);
+ add_prototyped_attribute (subr_die, type);
+ add_type_attribute (subr_die, TREE_TYPE (type), 0, 0, context_die);
+ }
add_pure_or_virtual_attribute (subr_die, decl);
if (DECL_ARTIFICIAL (decl))
add_AT_flag (subr_die, DW_AT_artificial, 1);
@@ -6668,7 +6658,9 @@ gen_subprogram_die (decl, context_die)
/* In the case where we are describing a mere function declaration, all we
need to do here (and all we *can* do here) is to describe the *types* of
its formal parameters. */
- if (DECL_INITIAL (decl) == NULL_TREE)
+ if (debug_info_level <= DINFO_LEVEL_TERSE)
+ /* do nothing */;
+ else if (DECL_INITIAL (decl) == NULL_TREE)
{
gen_formal_types_die (TREE_TYPE (decl), subr_die);
}
@@ -7009,11 +7001,8 @@ gen_compile_unit_die (main_input_filename)
that the object file is stripped and has no debugging information.
To get the MIPS/SGI debugger to believe that there is debugging
information in the object file, we add a -g to the producer string. */
- if (write_symbols != NO_DEBUG)
- {
- strcat (producer, " -g");
- }
-
+ if (debug_info_level > DINFO_LEVEL_TERSE)
+ strcat (producer, " -g");
#endif
add_AT_string (comp_unit_die, DW_AT_producer, producer);
@@ -7548,7 +7537,8 @@ gen_decl_die (decl, context_die)
/* Before we describe the FUNCTION_DECL itself, make sure that we have
described its return type. */
- gen_type_die (TREE_TYPE (TREE_TYPE (decl)), context_die);
+ if (debug_info_level > DINFO_LEVEL_TERSE)
+ gen_type_die (TREE_TYPE (TREE_TYPE (decl)), context_die);
/* Now output a DIE to represent the function itself. */
gen_subprogram_die (decl, context_die);
@@ -7556,18 +7546,9 @@ gen_decl_die (decl, context_die)
case TYPE_DECL:
/* If we are in terse mode, don't generate any DIEs to represent any
- actual typedefs. Note that even when we are in terse mode, we must
- still output DIEs to represent those tagged types which are used
- (directly or indirectly) in the specification of either a return
- type or a formal parameter type of some function. */
+ actual typedefs. */
if (debug_info_level <= DINFO_LEVEL_TERSE)
- {
- if (! TYPE_DECL_IS_STUB (decl)
- || !TYPE_USED_FOR_FUNCTION (TREE_TYPE (decl)))
- {
- break;
- }
- }
+ break;
/* In the special case of a TYPE_DECL node representing the
declaration of some type tag, if the given TYPE_DECL is marked as
@@ -7752,18 +7733,9 @@ dwarfout_file_scope_decl (decl, set_finalizing)
}
/* If we are in terse mode, don't generate any DIEs to represent any
- actual typedefs. Note that even when we are in terse mode, we must
- still output DIEs to represent those tagged types which are used
- (directly or indirectly) in the specification of either a return
- type or a formal parameter type of some function. */
+ actual typedefs. */
if (debug_info_level <= DINFO_LEVEL_TERSE)
- {
- if (! TYPE_DECL_IS_STUB (decl)
- || !TYPE_USED_FOR_FUNCTION (TREE_TYPE (decl)))
- {
- return;
- }
- }
+ return;
break;
default:
@@ -8204,7 +8176,8 @@ dwarfout_init (asm_out_file, main_input_filename)
gen_compile_unit_die (main_input_filename);
/* clear the association between base types and their DIE's */
- init_base_type_table ();
+ if (debug_info_level > DINFO_LEVEL_TERSE)
+ init_base_type_table ();
ASM_GENERATE_INTERNAL_LABEL (text_end_label, TEXT_END_LABEL, 0);
}
diff --git a/gcc/varasm.c b/gcc/varasm.c
index e7a5663..4659490 100644
--- a/gcc/varasm.c
+++ b/gcc/varasm.c
@@ -4217,12 +4217,12 @@ void
assemble_alias (decl, target)
tree decl, target;
{
-#ifdef ASM_OUTPUT_DEF
char *name;
make_decl_rtl (decl, (char *) 0, 1);
name = XSTR (XEXP (DECL_RTL (decl), 0), 0);
+#ifdef ASM_OUTPUT_DEF
/* Make name accessible from other files, if appropriate. */
if (TREE_PUBLIC (decl))
@@ -4241,7 +4241,15 @@ assemble_alias (decl, target)
ASM_OUTPUT_DEF (asm_out_file, name, IDENTIFIER_POINTER (target));
TREE_ASM_WRITTEN (decl) = 1;
#else
- warning ("alias definitions not supported in this configuration");
+#ifdef ASM_OUTPUT_WEAK_ALIAS
+ if (! DECL_WEAK (decl))
+ warning ("only weak aliases are supported in this configuration");
+
+ ASM_OUTPUT_WEAK_ALIAS (asm_out_file, name, IDENTIFIER_POINTER (target));
+ TREE_ASM_WRITTEN (decl) = 1;
+#else
+ warning ("alias definitions not supported in this configuration; ignored");
+#endif
#endif
}