History

macos: Fix asm-c-connect-test

via some heavy-handed hackery in the ASM symbol handling in case C symbols get a leading underscore (but ASM symbols do not). But this is now like clang and GCC on Darwin work: asm symbols are undecorated, C symbols get a _ prepended, so to connect both some trickery is involved for the ASM symbols that don't have a _ prepended. They must be included in the C symbol table (because that's what we use to lookup also ASM labels), but they also must not disturb the normal C symbol (which don't have the _ prepended), so they need some mangling. A bit unsatisfying, but well. So, add asm-c-connect-test to the working ones for Darwin as well.

Michael Matz committed 6 years ago

Commit fbfe6201 parent 3cf7bec8 files · +69 −9Browse files

Unified · Split

8 files
  1. i386-asm.c +2 −0
  2. lib/alloca86_64-bt.S +1 −0
  3. tccasm.c +37 −3
  4. tests/Makefile +1 −1
  5. tests/asm-c-connect-1.c +11 −2
  6. tests/asm-c-connect-2.c +10 −1
  7. tests/tcctest.c +1 −1
  8. tests/tests2/85_asm-outside-function.c +6 −1
i386-asm.c+2−0
@@ -1490,6 +1490,8 @@ ST_FUNC void subst_asm_operand(CString *add_str, · 1489 unmodified lines
14901490 list when we still know the symbol. */
14911491 get_asm_sym(tok_alloc(name, strlen(name))->tok, sv->sym);
14921492 }
1493+ if (tcc_state->leading_underscore)
1494+ cstr_ccat(add_str, '_');
14931495 cstr_cat(add_str, name, -1);
14941496 if ((uint32_t)sv->c.i == 0)
14951497 goto no_offset;
lib/alloca86_64-bt.S+1−0
@@ -4,6 +4,7 @@ · 3 unmodified lines
44 #ifdef __APPLE__
55 #define __bound_alloca ___bound_alloca
66 #define __bound_alloca_nr ___bound_alloca_nr
7+#define __bound_new_region ___bound_new_region
78 #endif
89
910 .globl __bound_alloca
tccasm.c+37−3
@@ -38,9 +38,39 @@ static int tcc_assemble_internal(TCCState *s1, int do_preprocess, int global); · 37 unmodified lines
3838 static Sym* asm_new_label(TCCState *s1, int label, int is_local);
3939 static Sym* asm_new_label1(TCCState *s1, int label, int is_local, int sh_num, int value);
4040
41+/* If a C name has an _ prepended then only asm labels that start
42+ with _ are representable in C, by removing the first _. ASM names
43+ without _ at the beginning don't correspond to C names, but we use
44+ the global C symbol table to track ASM names as well, so we need to
45+ transform those into ones that don't conflict with a C name,
46+ so prepend a '.' for them, but force the ELF asm name to be set. */
47+static int asm2cname(int v, int *addeddot)
48+{
49+ const char *name;
50+ *addeddot = 0;
51+ if (!tcc_state->leading_underscore)
52+ return v;
53+ name = get_tok_str(v, NULL);
54+ if (!name)
55+ return v;
56+ if (name[0] == '_') {
57+ v = tok_alloc(name + 1, strlen(name) - 1)->tok;
58+ } else if (!strchr(name, '.')) {
59+ int n = strlen(name) + 2;
60+ char newname[n];
61+ snprintf(newname, n, ".%s", name);
62+ v = tok_alloc(newname, n - 1)->tok;
63+ *addeddot = 1;
64+ }
65+ return v;
66+}
67+
4168 static Sym *asm_label_find(int v)
4269 {
43− Sym *sym = sym_find(v);
70+ Sym *sym;
71+ int addeddot;
72+ v = asm2cname(v, &addeddot);
73+ sym = sym_find(v);
4474 while (sym && sym->sym_scope && !(sym->type.t & VT_STATIC))
4575 sym = sym->prev_tok;
4676 return sym;
@@ -48,10 +78,14 @@ static Sym *asm_label_find(int v) · 1 unmodified line
4878
4979 static Sym *asm_label_push(int v)
5080 {
81+ int addeddot, v2 = asm2cname(v, &addeddot);
5182 /* We always add VT_EXTERN, for sym definition that's tentative
5283 (for .set, removed for real defs), for mere references it's correct
5384 as is. */
54− return global_identifier_push(v, VT_ASM | VT_EXTERN | VT_STATIC, 0);
85+ Sym *sym = global_identifier_push(v2, VT_ASM | VT_EXTERN | VT_STATIC, 0);
86+ if (addeddot)
87+ sym->asm_label = v;
88+ return sym;
5589 }
5690
5791 /* Return a symbol we can use inside the assembler, having name NAME.
@@ -390,7 +424,7 @@ static Sym* asm_new_label1(TCCState *s1, int label, int is_local, · 332 unmodified lines
390424 sym = asm_label_push(label);
391425 }
392426 if (!sym->c)
393− put_extern_sym2(sym, SHN_UNDEF, 0, 0, 0);
427+ put_extern_sym2(sym, SHN_UNDEF, 0, 0, 1);
394428 esym = elfsym(sym);
395429 esym->st_shndx = sh_num;
396430 esym->st_value = value;
tests/Makefile+1−1
@@ -46,7 +46,7 @@ ifeq ($(ARCH),riscv64) · 45 unmodified lines
4646 endif
4747 endif
4848 ifdef CONFIG_OSX # some don't work yet
49− TESTS := $(filter-out memtest dlltest asm-c-connect-test, $(TESTS))
49+ TESTS := $(filter-out memtest dlltest, $(TESTS))
5050 endif
5151 ifeq (,$(filter arm64 i386 x86_64,$(ARCH)))
5252 TESTS := $(filter-out vla_test-run,$(TESTS))
tests/asm-c-connect-1.c+11−2
@@ -2,11 +2,20 @@ · 1 unmodified line
22
33 #if defined _WIN32 && !defined __TINYC__
44 # define _ "_"
5+#elif defined __APPLE__
6+# define _ "_"
57 #else
68 # define _
79 #endif
810
9−static int x1_c(void)
11+#ifdef __clang__
12+/* clang needs some help tp not throw functions away even at -O0 */
13+#define __USED __attribute__((__used__))
14+#else
15+#define __USED
16+#endif
17+
18+static int __USED x1_c (void)
1019 {
1120 printf(" x1");
1221 return 1;
@@ -37,7 +46,7 @@ int main(int argc, char *argv[]) · 24 unmodified lines
3746 }
3847
3948 static
40−int x2(void)
49+int __USED x2(void)
4150 {
4251 printf(" x2");
4352 return 2;
tests/asm-c-connect-2.c+10−1
@@ -2,10 +2,19 @@ · 1 unmodified line
22
33 #if defined _WIN32 && !defined __TINYC__
44 # define _ "_"
5+#elif defined __APPLE__
6+# define _ "_"
57 #else
68 # define _
79 #endif
810
11+#ifdef __clang__
12+/* clang needs some help tp not throw functions away even at -O0 */
13+#define __USED __attribute__((__used__))
14+#else
15+#define __USED
16+#endif
17+
918 int x3(void)
1019 {
1120 printf(" x3");
@@ -30,7 +39,7 @@ void callx5_again(void) · 18 unmodified lines
3039 asm("call "_"x6");
3140 }
3241
33−static void x6()
42+static void __USED x6()
3443 {
3544 printf(" x6-2");
3645 }
tests/tcctest.c+1−1
@@ -3650,7 +3650,7 @@ void test_asm_call(void) · 3649 unmodified lines
36503650 asm volatile ("push %%rdi; push %%rdi; mov %0, %%rdi;"
36513651 #if 1 && !defined(__TINYC__) && (defined(__PIC__) || defined(__PIE__)) && !defined(__APPLE__)
36523652 "call getenv@plt;"
3653−#elif defined(__APPLE__) && !defined(__TINYC__)
3653+#elif defined(__APPLE__)
36543654 "call _getenv;"
36553655 #else
36563656 "call getenv;"
tests/tests2/85_asm-outside-function.c+6−1
@@ -1,6 +1,11 @@
1+#ifdef __APPLE__
2+#define _ "_"
3+#else
4+#define _
5+#endif
16 extern int printf (const char *, ...);
27 extern void vide(void);
3−__asm__("vide: ret");
8+__asm__(_"vide: ret");
49
510 int main() {
611 vide();

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t