mirror of
https://github.com/mirror/tinycc.git
synced 2024-12-28 04:00:06 +08:00
tccasm: Implement .pushsection and .popsection
This commit is contained in:
parent
6763b02abc
commit
c82e52d55b
4
tcc.h
4
tcc.h
@ -448,8 +448,8 @@ typedef struct Section {
|
|||||||
int nb_hashed_syms; /* used to resize the hash table */
|
int nb_hashed_syms; /* used to resize the hash table */
|
||||||
struct Section *link; /* link to another section */
|
struct Section *link; /* link to another section */
|
||||||
struct Section *reloc; /* corresponding section for relocation, if any */
|
struct Section *reloc; /* corresponding section for relocation, if any */
|
||||||
struct Section *hash; /* hash table for symbols */
|
struct Section *hash; /* hash table for symbols */
|
||||||
struct Section *next;
|
struct Section *prev; /* previous section on section stack */
|
||||||
char name[1]; /* section name */
|
char name[1]; /* section name */
|
||||||
} Section;
|
} Section;
|
||||||
|
|
||||||
|
27
tccasm.c
27
tccasm.c
@ -335,6 +335,22 @@ static void use_section(TCCState *s1, const char *name)
|
|||||||
use_section1(s1, sec);
|
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)
|
static void asm_parse_directive(TCCState *s1)
|
||||||
{
|
{
|
||||||
int n, offset, v, size, tok1;
|
int n, offset, v, size, tok1;
|
||||||
@ -683,10 +699,12 @@ static void asm_parse_directive(TCCState *s1)
|
|||||||
next();
|
next();
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case TOK_ASMDIR_pushsection:
|
||||||
case TOK_ASMDIR_section:
|
case TOK_ASMDIR_section:
|
||||||
{
|
{
|
||||||
char sname[256];
|
char sname[256];
|
||||||
|
|
||||||
|
tok1 = tok;
|
||||||
/* XXX: support more options */
|
/* XXX: support more options */
|
||||||
next();
|
next();
|
||||||
sname[0] = '\0';
|
sname[0] = '\0';
|
||||||
@ -711,7 +729,10 @@ static void asm_parse_directive(TCCState *s1)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
last_text_section = cur_text_section;
|
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;
|
break;
|
||||||
case TOK_ASMDIR_previous:
|
case TOK_ASMDIR_previous:
|
||||||
@ -725,6 +746,10 @@ static void asm_parse_directive(TCCState *s1)
|
|||||||
last_text_section = sec;
|
last_text_section = sec;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case TOK_ASMDIR_popsection:
|
||||||
|
next();
|
||||||
|
pop_section(s1);
|
||||||
|
break;
|
||||||
#ifdef TCC_TARGET_I386
|
#ifdef TCC_TARGET_I386
|
||||||
case TOK_ASMDIR_code16:
|
case TOK_ASMDIR_code16:
|
||||||
{
|
{
|
||||||
|
2
tcctok.h
2
tcctok.h
@ -323,6 +323,8 @@
|
|||||||
DEF_ASMDIR(data)
|
DEF_ASMDIR(data)
|
||||||
DEF_ASMDIR(bss)
|
DEF_ASMDIR(bss)
|
||||||
DEF_ASMDIR(previous)
|
DEF_ASMDIR(previous)
|
||||||
|
DEF_ASMDIR(pushsection)
|
||||||
|
DEF_ASMDIR(popsection)
|
||||||
DEF_ASMDIR(fill)
|
DEF_ASMDIR(fill)
|
||||||
DEF_ASMDIR(rept)
|
DEF_ASMDIR(rept)
|
||||||
DEF_ASMDIR(endr)
|
DEF_ASMDIR(endr)
|
||||||
|
@ -717,6 +717,16 @@ ft1: ft2: ft3: ft4: ft5: ft6: ft7: ft8: ft9:
|
|||||||
.endr
|
.endr
|
||||||
.fill 4,1,0x90
|
.fill 4,1,0x90
|
||||||
|
|
||||||
|
.section .text.one,"ax"
|
||||||
|
nop
|
||||||
|
.previous
|
||||||
|
.pushsection .text.one,"ax"
|
||||||
|
nop
|
||||||
|
.pushsection .text.two,"ax"
|
||||||
|
nop
|
||||||
|
.popsection
|
||||||
|
.popsection
|
||||||
|
|
||||||
movd %esi, %mm1
|
movd %esi, %mm1
|
||||||
movd %edi, %xmm2
|
movd %edi, %xmm2
|
||||||
movd (%ebx), %mm3
|
movd (%ebx), %mm3
|
||||||
|
Loading…
Reference in New Issue
Block a user