diff options
author | peter <peter@FreeBSD.org> | 2001-09-04 23:04:48 +0000 |
---|---|---|
committer | peter <peter@FreeBSD.org> | 2001-09-04 23:04:48 +0000 |
commit | af9d8ab82eb19c6d992f9234eea558fa129b50ab (patch) | |
tree | f20d1920cd581b06592f8f79a0599ac0cbef0599 /gnu | |
parent | 56f948a181f7da844c8f5138493b2c165ef55c4a (diff) | |
download | FreeBSD-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')
-rw-r--r-- | gnu/usr.bin/as/as.h | 4 | ||||
-rw-r--r-- | gnu/usr.bin/as/read.c | 28 | ||||
-rw-r--r-- | gnu/usr.bin/as/read.h | 2 |
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(); |