aboutsummaryrefslogtreecommitdiff
path: root/tccasm.c
diff options
context:
space:
mode:
authorMichael Matz <matz@suse.de>2016-06-28 15:11:06 +0200
committerMichael Matz <matz@suse.de>2016-12-15 17:47:06 +0100
commitc82e52d55bd31eea943c616ad780f27e5ab9dc7a (patch)
treed4be595e9a770393e69a54a4a9233e64894eb088 /tccasm.c
parent6763b02abc5e0076b6f5bc0e116205250ef9fbd6 (diff)
downloadtinycc-c82e52d55bd31eea943c616ad780f27e5ab9dc7a.tar.gz
tinycc-c82e52d55bd31eea943c616ad780f27e5ab9dc7a.tar.bz2
tccasm: Implement .pushsection and .popsection
Diffstat (limited to 'tccasm.c')
-rw-r--r--tccasm.c27
1 files changed, 26 insertions, 1 deletions
diff --git a/tccasm.c b/tccasm.c
index 50fb794..ee14073 100644
--- a/tccasm.c
+++ b/tccasm.c
@@ -335,6 +335,22 @@ static void use_section(TCCState *s1, const char *name)
use_section1(s1, sec);
}
+static void push_section(TCCState *s1, const char *name)
+{
+ Section *sec = find_section(s1, name);
+ sec->prev = cur_text_section;
+ use_section1(s1, sec);
+}
+
+static void pop_section(TCCState *s1)
+{
+ Section *prev = cur_text_section->prev;
+ if (!prev)
+ tcc_error(".popsection without .pushsection");
+ cur_text_section->prev = NULL;
+ use_section1(s1, prev);
+}
+
static void asm_parse_directive(TCCState *s1)
{
int n, offset, v, size, tok1;
@@ -683,10 +699,12 @@ static void asm_parse_directive(TCCState *s1)
next();
}
break;
+ case TOK_ASMDIR_pushsection:
case TOK_ASMDIR_section:
{
char sname[256];
+ tok1 = tok;
/* XXX: support more options */
next();
sname[0] = '\0';
@@ -711,7 +729,10 @@ static void asm_parse_directive(TCCState *s1)
}
}
last_text_section = cur_text_section;
- use_section(s1, sname);
+ if (tok1 == TOK_ASMDIR_section)
+ use_section(s1, sname);
+ else
+ push_section(s1, sname);
}
break;
case TOK_ASMDIR_previous:
@@ -725,6 +746,10 @@ static void asm_parse_directive(TCCState *s1)
last_text_section = sec;
}
break;
+ case TOK_ASMDIR_popsection:
+ next();
+ pop_section(s1);
+ break;
#ifdef TCC_TARGET_I386
case TOK_ASMDIR_code16:
{