summaryrefslogtreecommitdiffstats
path: root/gnu/usr.bin
diff options
context:
space:
mode:
authorpeter <peter@FreeBSD.org>2001-09-04 23:04:48 +0000
committerpeter <peter@FreeBSD.org>2001-09-04 23:04:48 +0000
commitaf9d8ab82eb19c6d992f9234eea558fa129b50ab (patch)
treef20d1920cd581b06592f8f79a0599ac0cbef0599 /gnu/usr.bin
parent56f948a181f7da844c8f5138493b2c165ef55c4a (diff)
downloadFreeBSD-src-af9d8ab82eb19c6d992f9234eea558fa129b50ab.zip
FreeBSD-src-af9d8ab82eb19c6d992f9234eea558fa129b50ab.tar.gz
Implement .previous (swap section back to the last section)
This enables: .data .asciz "foo" .previous .. just like on current binutils
Diffstat (limited to 'gnu/usr.bin')
-rw-r--r--gnu/usr.bin/as/as.h4
-rw-r--r--gnu/usr.bin/as/read.c28
-rw-r--r--gnu/usr.bin/as/read.h2
3 files changed, 32 insertions, 2 deletions
diff --git a/gnu/usr.bin/as/as.h b/gnu/usr.bin/as/as.h
index 6b81ac9..4a6893b 100644
--- a/gnu/usr.bin/as/as.h
+++ b/gnu/usr.bin/as/as.h
@@ -187,11 +187,11 @@ typedef enum _segT {
typedef int subsegT;
-COMMON subsegT now_subseg;
+COMMON subsegT now_subseg, prev_subseg;
/* What subseg we are accreting now? */
-COMMON segT now_seg;
+COMMON segT now_seg, prev_seg;
/* Segment our instructions emit to. */
/* Only OK values are SEG_TEXT or SEG_DATA. */
diff --git a/gnu/usr.bin/as/read.c b/gnu/usr.bin/as/read.c
index f25f363..1b64ee6 100644
--- a/gnu/usr.bin/as/read.c
+++ b/gnu/usr.bin/as/read.c
@@ -248,6 +248,7 @@ static const pseudo_typeS
{ "octa", big_cons, 16 },
{ "org", s_org, 0 },
{ "p2align", s_align_ptwo, 0 },
+ { "previous", s_previous, 0 },
#ifdef NO_LISTING
{ "psize", s_ignore, 0 }, /* set paper size */
#else
@@ -741,6 +742,9 @@ void
{
register int temp;
+ prev_seg = now_seg;
+ prev_subseg = now_subseg;
+
temp = get_absolute_expression();
subseg_new (SEG_DATA, (subsegT)temp);
@@ -750,6 +754,27 @@ void
demand_empty_rest_of_line();
}
+void
+ s_previous()
+{
+ segT oprev_seg = now_seg;
+ subsegT oprev_subseg = now_subseg;
+
+ oprev_seg = now_seg;
+ oprev_subseg = now_subseg;
+
+ subseg_new (prev_seg, prev_subseg);
+
+ prev_seg = oprev_seg;
+ prev_subseg = oprev_subseg;
+
+#ifdef OBJ_VMS
+ const_flag = 0;
+#endif /* not OBJ_VMS */
+ demand_empty_rest_of_line();
+}
+
+
/* Handle the .appfile pseudo-op. This is automatically generated by
do_scrub_next_char when a preprocessor # line comment is seen with
a file name. This default definition may be overridden by the
@@ -1313,6 +1338,9 @@ void
{
register int temp;
+ prev_seg = now_seg;
+ prev_subseg = now_subseg;
+
temp = get_absolute_expression();
subseg_new (SEG_TEXT, (subsegT)temp);
demand_empty_rest_of_line();
diff --git a/gnu/usr.bin/as/read.h b/gnu/usr.bin/as/read.h
index e396922..29d3dfc 100644
--- a/gnu/usr.bin/as/read.h
+++ b/gnu/usr.bin/as/read.h
@@ -96,6 +96,7 @@ void s_ignore(int arg);
void s_include(int arg);
void s_lcomm(int needs_align);
void s_lsym(void);
+void s_previous(void);
void s_org(void);
void s_set(void);
void s_size(void);
@@ -138,6 +139,7 @@ void s_ignore();
void s_include();
void s_lcomm();
void s_lsym();
+void s_previous();
void s_org();
void s_set();
void s_size();
OpenPOWER on IntegriCloud