aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorMichael Tiemann <tiemann@gnu.org>1992-02-17 13:20:31 +0000
committerMichael Tiemann <tiemann@gnu.org>1992-02-17 13:20:31 +0000
commitfff9e713b5d8d6a7bd89abe715fb56cc363116e7 (patch)
treed804ad07459719afeeebef4b119f764cc86a1de8 /gcc
parent3785a1d8481231e6aa9a00d0d1679eae52190100 (diff)
downloadgcc-fff9e713b5d8d6a7bd89abe715fb56cc363116e7.zip
gcc-fff9e713b5d8d6a7bd89abe715fb56cc363116e7.tar.gz
gcc-fff9e713b5d8d6a7bd89abe715fb56cc363116e7.tar.bz2
*** empty log message ***
From-SVN: r334
Diffstat (limited to 'gcc')
-rw-r--r--gcc/varasm.c51
1 files changed, 41 insertions, 10 deletions
diff --git a/gcc/varasm.c b/gcc/varasm.c
index 23964c0..b6b218b 100644
--- a/gcc/varasm.c
+++ b/gcc/varasm.c
@@ -201,6 +201,19 @@ decode_reg_name (asmspec)
{
int i;
+ /* Allow a decimal number as a "register name". */
+ for (i = strlen (asmspec) - 1; i >= 0; i--)
+ if (! (asmspec[i] >= '0' && asmspec[i] <= '9'))
+ break;
+ if (asmspec[0] != 0 && i < 0)
+ {
+ i = atoi (asmspec);
+ if (i < FIRST_PSEUDO_REGISTER && i >= 0)
+ return i;
+ else
+ return -2;
+ }
+
for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
if (reg_names[i][0] && ! strcmp (asmspec, reg_names[i]))
return i;
@@ -896,22 +909,26 @@ assemble_variable (decl, top_level, at_end)
}
/* Output something to declare an external symbol to the assembler.
- (Most assemblers don't need this, so we normally output nothing.) */
+ (Most assemblers don't need this, so we normally output nothing.)
+ Do nothing if DECL is not external. */
void
assemble_external (decl)
tree decl;
{
- rtx rtl = DECL_RTL (decl);
-
#ifdef ASM_OUTPUT_EXTERNAL
- if (TREE_PUBLIC (decl)
- && GET_CODE (rtl) == MEM && GET_CODE (XEXP (rtl, 0)) == SYMBOL_REF
- && ! SYMBOL_REF_USED (XEXP (rtl, 0)))
+ if (TREE_CODE_CLASS (TREE_CODE (decl)) == 'd'
+ && TREE_EXTERNAL (decl) && TREE_PUBLIC (decl))
{
- /* Some systems do require some output. */
- SYMBOL_REF_USED (XEXP (rtl, 0)) = 1;
- ASM_OUTPUT_EXTERNAL (asm_out_file, decl, XSTR (XEXP (rtl, 0), 0));
+ rtx rtl = DECL_RTL (decl);
+
+ if (GET_CODE (rtl) == MEM && GET_CODE (XEXP (rtl, 0)) == SYMBOL_REF
+ && ! SYMBOL_REF_USED (XEXP (rtl, 0)))
+ {
+ /* Some systems do require some output. */
+ SYMBOL_REF_USED (XEXP (rtl, 0)) = 1;
+ ASM_OUTPUT_EXTERNAL (asm_out_file, decl, XSTR (XEXP (rtl, 0), 0));
+ }
}
#endif
}
@@ -1107,11 +1124,16 @@ assemble_integer (x, size, force)
if (word == 0)
break;
- assemble_integer (word, UNITS_PER_WORD);
+ if (! assemble_integer (word, UNITS_PER_WORD, 0))
+ break;
}
if (i == size / UNITS_PER_WORD)
return 1;
+ /* If we output at least one word and then could not finish,
+ there is no valid way to continue. */
+ if (i > 0)
+ abort ();
}
if (force)
@@ -2455,6 +2477,15 @@ output_constant (exp, size)
if (size == 0)
return;
+ /* Allow a constructor with no elements for any data type.
+ This means to fill the space with zeros. */
+ if (TREE_CODE (exp) == CONSTRUCTOR
+ && TREE_OPERAND (exp, 1) == 0)
+ {
+ assemble_zeros (size);
+ return;
+ }
+
/* Eliminate the NOP_EXPR that makes a cast not be an lvalue.
That way we get the constant (we hope) inside it. */
if (TREE_CODE (exp) == NOP_EXPR