diff options
| author | Michael Matz <matz@suse.de> | 2016-06-28 15:11:06 +0200 |
|---|---|---|
| committer | Michael Matz <matz@suse.de> | 2016-12-15 17:47:06 +0100 |
| commit | c82e52d55bd31eea943c616ad780f27e5ab9dc7a (patch) | |
| tree | d4be595e9a770393e69a54a4a9233e64894eb088 /tccasm.c | |
| parent | 6763b02abc5e0076b6f5bc0e116205250ef9fbd6 (diff) | |
| download | tinycc-c82e52d55bd31eea943c616ad780f27e5ab9dc7a.tar.gz tinycc-c82e52d55bd31eea943c616ad780f27e5ab9dc7a.tar.bz2 | |
tccasm: Implement .pushsection and .popsection
Diffstat (limited to 'tccasm.c')
| -rw-r--r-- | tccasm.c | 27 |
1 files changed, 26 insertions, 1 deletions
@@ -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: { |
