diff options
| author | Michael Matz <matz@suse.de> | 2014-04-14 03:33:50 +0200 |
|---|---|---|
| committer | Michael Matz <matz@suse.de> | 2014-04-14 03:33:50 +0200 |
| commit | a9fda392a0d03d62f0bef0acd42ec82b29216ab3 (patch) | |
| tree | 7cdbdd2db558d77235413fa16b8734fcd099bc59 | |
| parent | fbda78aefeaaa97182658bb81b5a6f215cc24b17 (diff) | |
| download | tinycc-a9fda392a0d03d62f0bef0acd42ec82b29216ab3.tar.gz tinycc-a9fda392a0d03d62f0bef0acd42ec82b29216ab3.tar.bz2 | |
Parse assembler .hidden directive
This makes TCCs assembler understand the '.hidden symbol' directive
(and emits a STV_HIDDEN ELF symbol then).
| -rw-r--r-- | libtcc.c | 3 | ||||
| -rw-r--r-- | tccasm.c | 12 | ||||
| -rw-r--r-- | tcctok.h | 1 |
3 files changed, 12 insertions, 4 deletions
@@ -508,6 +508,9 @@ ST_FUNC void put_extern_sym2(Sym *sym, Section *section, if (sym->type.t & VT_IMPORT) other |= 4; } +#else + if (! (sym->type.t & VT_STATIC)) + other = (sym->type.t & VT_VIS_MASK) >> VT_VIS_SHIFT; #endif if (tcc_state->leading_underscore && can_add_underscore) { buf1[0] = '_'; @@ -483,6 +483,7 @@ static void asm_parse_directive(TCCState *s1) case TOK_ASM_globl: case TOK_ASM_global: case TOK_ASM_weak: + case TOK_ASM_hidden: tok1 = tok; do { Sym *sym; @@ -493,9 +494,12 @@ static void asm_parse_directive(TCCState *s1) sym = label_push(&s1->asm_labels, tok, 0); sym->type.t = VT_VOID; } - sym->type.t &= ~VT_STATIC; + if (tok1 != TOK_ASM_hidden) + sym->type.t &= ~VT_STATIC; if (tok1 == TOK_ASM_weak) sym->type.t |= VT_WEAK; + else if (tok1 == TOK_ASM_hidden) + sym->type.t |= STV_HIDDEN << VT_VIS_SHIFT; next(); } while (tok == ','); break; @@ -588,12 +592,12 @@ static void asm_parse_directive(TCCState *s1) tcc_error("label not found: %s", get_tok_str(tok, NULL)); } - next(); - skip(','); /* XXX .size name,label2-label1 */ if (s1->warn_unsupported) tcc_warning("ignoring .size %s,*", get_tok_str(tok, NULL)); + next(); + skip(','); while (tok != '\n' && tok != CH_EOF) { next(); } @@ -622,7 +626,7 @@ static void asm_parse_directive(TCCState *s1) } if (!strcmp(newtype, "function") || !strcmp(newtype, "STT_FUNC")) { - sym->type.t = VT_FUNC; + sym->type.t = (sym->type.t & ~VT_BTYPE) | VT_FUNC; } else if (s1->warn_unsupported) tcc_warning("change type of '%s' from 0x%x to '%s' ignored", @@ -266,6 +266,7 @@ DEF_ASM(file) DEF_ASM(globl) DEF_ASM(global) + DEF_ASM(hidden) DEF_ASM(ident) DEF_ASM(size) DEF_ASM(type) |
