aboutsummaryrefslogtreecommitdiff
path: root/gas
diff options
context:
space:
mode:
authorMichael Meissner <gnu@the-meissners.org>1995-10-16 02:09:01 +0000
committerMichael Meissner <gnu@the-meissners.org>1995-10-16 02:09:01 +0000
commit4c2935f4c0c865a4ab347bd0b5c131923ec41534 (patch)
tree1bfb62f370b9d0ca51a20ae21cd0c8f3c12018fa /gas
parentcd8a3d845bb4c459c5a2d5ba220a721334fe66f4 (diff)
downloadgdb-4c2935f4c0c865a4ab347bd0b5c131923ec41534.zip
gdb-4c2935f4c0c865a4ab347bd0b5c131923ec41534.tar.gz
gdb-4c2935f4c0c865a4ab347bd0b5c131923ec41534.tar.bz2
Add -mcom support.
Diffstat (limited to 'gas')
-rw-r--r--gas/ChangeLog15
-rw-r--r--gas/config/tc-ppc.c41
2 files changed, 45 insertions, 11 deletions
diff --git a/gas/ChangeLog b/gas/ChangeLog
index 70271f2..5aedb42 100644
--- a/gas/ChangeLog
+++ b/gas/ChangeLog
@@ -1,3 +1,18 @@
+Sun Oct 15 22:06:14 1995 Michael Meissner <meissner@cygnus.com>
+
+ * config/tc-ppc.c (md_parse_option): Support for -mcom to turn on
+ common mode operation.
+ (md_show_usage): Add -mcom to usage message.
+ (md_begin): If the target CPU is common mode, only allow
+ instructions in both architectures.
+
+Fri Oct 13 13:32:45 1995 steve chamberlain <sac@slash.cygnus.com>
+
+ * expr.c (op_rank): Add O_symbol_rva.
+ * expr.h (operatorT): Add O_symbol_rva.
+ * read.c (cons_worker): Set O_symbol_rva when necessary.
+ * write.c (fix_new_exp): Understand O_symbol_rva.
+
Tue Oct 10 11:34:14 1995 Ian Lance Taylor <ian@cygnus.com>
* config/tc-mips.c: Correct s_cons arguments. From Michael
diff --git a/gas/config/tc-ppc.c b/gas/config/tc-ppc.c
index 0e98abc..cdc0675 100644
--- a/gas/config/tc-ppc.c
+++ b/gas/config/tc-ppc.c
@@ -582,6 +582,10 @@ md_parse_option (c, arg)
ppc_cpu = PPC_OPCODE_PPC;
ppc_size = PPC_OPCODE_64;
}
+ /* -mcom means assemble for the common intersection between Power
+ and PowerPC. */
+ else if (strcmp (arg, "com") == 0)
+ ppc_cpu = PPC_OPCODE_POWER | PPC_OPCODE_PPC;
/* -many means to assemble for any architecture (PWR/PWRX/PPC). */
else if (strcmp (arg, "any") == 0)
ppc_cpu = PPC_OPCODE_POWER | PPC_OPCODE_POWER2 | PPC_OPCODE_PPC;
@@ -656,6 +660,7 @@ PowerPC options:\n\
-mppc, -mppc32, -m403, -m603, -m604\n\
generate code for Motorola PowerPC 603/604\n\
-mppc64, -m620 generate code for Motorola PowerPC 620\n\
+-mcom generate code Power/PowerPC common instructions\n
-many generate code for any architecture (PWR/PWRX/PPC)\n");
#ifdef OBJ_ELF
fprintf(stream, "\
@@ -737,7 +742,10 @@ md_begin ()
if ((op->flags & ppc_cpu) != 0
&& ((op->flags & (PPC_OPCODE_32 | PPC_OPCODE_64)) == 0
- || (op->flags & (PPC_OPCODE_32 | PPC_OPCODE_64)) == ppc_size))
+ || (op->flags & (PPC_OPCODE_32 | PPC_OPCODE_64)) == ppc_size)
+ /* If -mcom, check for instructions not in both Power/PowerPC */
+ && (ppc_cpu != (PPC_OPCODE_POWER | PPC_OPCODE_PPC)
+ || (op->flags & (PPC_OPCODE_POWER | PPC_OPCODE_PPC)) == ppc_cpu))
{
const char *retval;
@@ -1648,7 +1656,7 @@ ppc_macro (str, macro)
const struct powerpc_macro *macro;
{
char *operands[10];
- int count;
+ unsigned int count;
char *s;
unsigned int len;
const char *format;
@@ -2342,18 +2350,19 @@ ppc_biei (ei)
name = demand_copy_C_string (&len);
+ /* The value of these symbols is actually file offset. Here we set
+ the value to the index into the line number entries. In
+ ppc_frob_symbols we set the fix_line field, which will cause BFD
+ to do the right thing. */
+
sym = symbol_make (name);
- S_SET_SEGMENT (sym, ppc_coff_debug_section);
+ S_SET_SEGMENT (sym, now_seg);
+ S_SET_VALUE (sym, coff_n_line_nos);
sym->bsym->flags |= BSF_DEBUGGING;
- /* FIXME: The value of the .bi or .ei symbol is supposed to be the
- offset in the file to the line number entry to use. That is
- quite difficult to implement using BFD, so I'm just not doing it.
- Sorry. Please add it if you can figure out how. Note that this
- approach is the only way to support multiple files in COFF, since
- line numbers are associated with function symbols. Note further
- that it still doesn't work, since the line numbers are stored as
- offsets from a base line number. */
+ /* obj-coff.c currently only handles line numbers correctly in the
+ .text section. */
+ assert (now_seg == text_section);
S_SET_STORAGE_CLASS (sym, ei ? C_EINCL : C_BINCL);
sym->sy_tc.output = 1;
@@ -3431,6 +3440,8 @@ ppc_frob_symbol (sym)
&& S_GET_STORAGE_CLASS (sym) != C_FCN
&& S_GET_STORAGE_CLASS (sym) != C_BSTAT
&& S_GET_STORAGE_CLASS (sym) != C_ESTAT
+ && S_GET_STORAGE_CLASS (sym) != C_BINCL
+ && S_GET_STORAGE_CLASS (sym) != C_EINCL
&& S_GET_SEGMENT (sym) != ppc_coff_debug_section)
S_SET_STORAGE_CLASS (sym, C_HIDEXT);
@@ -3575,6 +3586,14 @@ ppc_frob_symbol (sym)
resolve_symbol_value (csect);
S_SET_VALUE (sym, S_GET_VALUE (sym) - S_GET_VALUE (csect));
}
+ else if (S_GET_STORAGE_CLASS (sym) == C_BINCL
+ || S_GET_STORAGE_CLASS (sym) == C_EINCL)
+ {
+ /* We want the value to be a file offset into the line numbers.
+ BFD will do that for us if we set the right flags. We have
+ already set the value correctly. */
+ coffsymbol (sym->bsym)->native->fix_line = 1;
+ }
return 0;
}