diff options
Diffstat (limited to 'src/buildvm_asm.c')
-rw-r--r-- | src/buildvm_asm.c | 60 |
1 files changed, 33 insertions, 27 deletions
diff --git a/src/buildvm_asm.c b/src/buildvm_asm.c index bd835ebc..2d0ba3b5 100644 --- a/src/buildvm_asm.c +++ b/src/buildvm_asm.c | |||
@@ -33,14 +33,14 @@ static void emit_asm_reloc(BuildCtx *ctx, int type, const char *sym) | |||
33 | fprintf(ctx->fp, "\t.long %s\n", sym); | 33 | fprintf(ctx->fp, "\t.long %s\n", sym); |
34 | break; | 34 | break; |
35 | case BUILD_coffasm: | 35 | case BUILD_coffasm: |
36 | fprintf(ctx->fp, "\t.def _%s; .scl 3; .type 32; .endef\n", sym); | 36 | fprintf(ctx->fp, "\t.def %s; .scl 3; .type 32; .endef\n", sym); |
37 | if (type) | 37 | if (type) |
38 | fprintf(ctx->fp, "\t.long _%s-.-4\n", sym); | 38 | fprintf(ctx->fp, "\t.long %s-.-4\n", sym); |
39 | else | 39 | else |
40 | fprintf(ctx->fp, "\t.long _%s\n", sym); | 40 | fprintf(ctx->fp, "\t.long %s\n", sym); |
41 | break; | 41 | break; |
42 | default: /* BUILD_machasm for relative relocations handled below. */ | 42 | default: /* BUILD_machasm for relative relocations handled below. */ |
43 | fprintf(ctx->fp, "\t.long _%s\n", sym); | 43 | fprintf(ctx->fp, "\t.long %s\n", sym); |
44 | break; | 44 | break; |
45 | } | 45 | } |
46 | } | 46 | } |
@@ -70,7 +70,7 @@ err: | |||
70 | exit(1); | 70 | exit(1); |
71 | } | 71 | } |
72 | emit_asm_bytes(ctx, cp, n); | 72 | emit_asm_bytes(ctx, cp, n); |
73 | fprintf(ctx->fp, "\t%s _%s\n", opname, sym); | 73 | fprintf(ctx->fp, "\t%s %s\n", opname, sym); |
74 | } | 74 | } |
75 | 75 | ||
76 | /* Emit an assembler label. */ | 76 | /* Emit an assembler label. */ |
@@ -87,15 +87,15 @@ static void emit_asm_label(BuildCtx *ctx, const char *name, int size, int isfunc | |||
87 | name, name, name, isfunc ? "function" : "object", name, size, name); | 87 | name, name, name, isfunc ? "function" : "object", name, size, name); |
88 | break; | 88 | break; |
89 | case BUILD_coffasm: | 89 | case BUILD_coffasm: |
90 | fprintf(ctx->fp, "\n\t.globl _%s\n", name); | 90 | fprintf(ctx->fp, "\n\t.globl %s\n", name); |
91 | if (isfunc) | 91 | if (isfunc) |
92 | fprintf(ctx->fp, "\t.def _%s; .scl 3; .type 32; .endef\n", name); | 92 | fprintf(ctx->fp, "\t.def %s; .scl 3; .type 32; .endef\n", name); |
93 | fprintf(ctx->fp, "_%s:\n", name); | 93 | fprintf(ctx->fp, "%s:\n", name); |
94 | break; | 94 | break; |
95 | case BUILD_machasm: | 95 | case BUILD_machasm: |
96 | fprintf(ctx->fp, | 96 | fprintf(ctx->fp, |
97 | "\n\t.private_extern _%s\n" | 97 | "\n\t.private_extern %s\n" |
98 | "_%s:\n", name, name); | 98 | "%s:\n", name, name); |
99 | break; | 99 | break; |
100 | default: | 100 | default: |
101 | break; | 101 | break; |
@@ -126,13 +126,22 @@ void emit_asm(BuildCtx *ctx) | |||
126 | char name[80]; | 126 | char name[80]; |
127 | int32_t prev; | 127 | int32_t prev; |
128 | int i, pi, rel; | 128 | int i, pi, rel; |
129 | #if LJ_64 | ||
130 | const char *symprefix = ctx->mode == BUILD_machasm ? "_" : ""; | ||
131 | int keepfc = 0; | ||
132 | #else | ||
133 | const char *symprefix = ctx->mode != BUILD_elfasm ? "_" : ""; | ||
134 | /* Keep fastcall suffix for COFF on WIN32. */ | ||
135 | int keepfc = (ctx->mode == BUILD_coffasm); | ||
136 | #endif | ||
129 | 137 | ||
130 | fprintf(ctx->fp, "\t.file \"buildvm_%s.dasc\"\n", ctx->dasm_arch); | 138 | fprintf(ctx->fp, "\t.file \"buildvm_%s.dasc\"\n", ctx->dasm_arch); |
131 | fprintf(ctx->fp, "\t.text\n"); | 139 | fprintf(ctx->fp, "\t.text\n"); |
132 | emit_asm_align(ctx, 4); | 140 | emit_asm_align(ctx, 4); |
133 | 141 | ||
134 | emit_asm_label(ctx, LABEL_ASM_BEGIN, 0, 0); | 142 | sprintf(name, "%s" LABEL_ASM_BEGIN, symprefix); |
135 | if (ctx->mode == BUILD_elfasm) | 143 | emit_asm_label(ctx, name, 0, 0); |
144 | if (ctx->mode != BUILD_machasm) | ||
136 | fprintf(ctx->fp, ".Lbegin:\n"); | 145 | fprintf(ctx->fp, ".Lbegin:\n"); |
137 | 146 | ||
138 | i = 0; | 147 | i = 0; |
@@ -148,10 +157,10 @@ void emit_asm(BuildCtx *ctx) | |||
148 | int32_t stop = next; | 157 | int32_t stop = next; |
149 | if (pi >= ctx->npc) { | 158 | if (pi >= ctx->npc) { |
150 | char *p; | 159 | char *p; |
151 | sprintf(name, LABEL_PREFIX "%s", ctx->globnames[pi-ctx->npc]); | 160 | sprintf(name, "%s" LABEL_PREFIX "%s", symprefix, |
152 | /* Always strip fastcall suffix. Wrong for (unused) COFF on Win32. */ | 161 | ctx->globnames[pi-ctx->npc]); |
153 | p = strchr(name, '@'); | 162 | p = strchr(name, '@'); |
154 | if (p) *p = '\0'; | 163 | if (p) { if (keepfc) name[0] = '@'; else *p = '\0'; } |
155 | emit_asm_label(ctx, name, size, 1); | 164 | emit_asm_label(ctx, name, size, 1); |
156 | #if LJ_HASJIT | 165 | #if LJ_HASJIT |
157 | } else { | 166 | } else { |
@@ -160,25 +169,21 @@ void emit_asm(BuildCtx *ctx) | |||
160 | pi == BC_JLOOP || pi == BC_IFORL || pi == BC_IITERL || | 169 | pi == BC_JLOOP || pi == BC_IFORL || pi == BC_IITERL || |
161 | pi == BC_ILOOP)) { | 170 | pi == BC_ILOOP)) { |
162 | #endif | 171 | #endif |
163 | sprintf(name, LABEL_PREFIX_BC "%s", bc_names[pi]); | 172 | sprintf(name, "%s" LABEL_PREFIX_BC "%s", symprefix, bc_names[pi]); |
164 | emit_asm_label(ctx, name, size, 1); | 173 | emit_asm_label(ctx, name, size, 1); |
165 | } | 174 | } |
166 | while (rel < ctx->nreloc && ctx->reloc[rel].ofs < stop) { | 175 | while (rel < ctx->nreloc && ctx->reloc[rel].ofs < stop) { |
167 | BuildReloc *r = &ctx->reloc[rel]; | 176 | BuildReloc *r = &ctx->reloc[rel]; |
168 | int n = r->ofs - prev; | 177 | int n = r->ofs - prev; |
169 | const char *sym = ctx->extnames[r->sym]; | 178 | char *p; |
170 | const char *p = strchr(sym, '@'); | 179 | sprintf(name, "%s%s", symprefix, ctx->extnames[r->sym]); |
171 | if (p) { | 180 | p = strchr(name, '@'); |
172 | /* Always strip fastcall suffix. Wrong for (unused) COFF on Win32. */ | 181 | if (p) { if (keepfc) name[0] = '@'; else *p = '\0'; } |
173 | strncpy(name, sym, p-sym); | ||
174 | name[p-sym] = '\0'; | ||
175 | sym = name; | ||
176 | } | ||
177 | if (ctx->mode == BUILD_machasm && r->type != 0) { | 182 | if (ctx->mode == BUILD_machasm && r->type != 0) { |
178 | emit_asm_reloc_mach(ctx, ctx->code+prev, n, sym); | 183 | emit_asm_reloc_mach(ctx, ctx->code+prev, n, name); |
179 | } else { | 184 | } else { |
180 | emit_asm_bytes(ctx, ctx->code+prev, n); | 185 | emit_asm_bytes(ctx, ctx->code+prev, n); |
181 | emit_asm_reloc(ctx, r->type, sym); | 186 | emit_asm_reloc(ctx, r->type, name); |
182 | } | 187 | } |
183 | prev += n+4; | 188 | prev += n+4; |
184 | rel++; | 189 | rel++; |
@@ -203,7 +208,8 @@ void emit_asm(BuildCtx *ctx) | |||
203 | } | 208 | } |
204 | emit_asm_align(ctx, 5); | 209 | emit_asm_align(ctx, 5); |
205 | 210 | ||
206 | emit_asm_label(ctx, LABEL_OP_OFS, 2*ctx->npc, 0); | 211 | sprintf(name, "%s" LABEL_OP_OFS, symprefix); |
212 | emit_asm_label(ctx, name, 2*ctx->npc, 0); | ||
207 | for (i = 0; i < ctx->npc; i++) | 213 | for (i = 0; i < ctx->npc; i++) |
208 | fprintf(ctx->fp, "\t.short %d\n", ctx->sym_ofs[i]); | 214 | fprintf(ctx->fp, "\t.short %d\n", ctx->sym_ofs[i]); |
209 | 215 | ||