aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMike Pall <mike>2010-01-10 09:39:05 +0100
committerMike Pall <mike>2010-01-10 09:39:05 +0100
commit767035f0311cd16fca001acbb26a4a6cca239405 (patch)
tree9bb2e4cbe7f03e69ce3999e328ba48ca1b518c2f /src
parent99d153bef9725db226614558d01df829afafee3c (diff)
downloadluajit-767035f0311cd16fca001acbb26a4a6cca239405.tar.gz
luajit-767035f0311cd16fca001acbb26a4a6cca239405.tar.bz2
luajit-767035f0311cd16fca001acbb26a4a6cca239405.zip
Strip '@' suffix from external symbols for MACH-O, too.
Fixes OSX build.
Diffstat (limited to 'src')
-rw-r--r--src/buildvm_asm.c33
1 files changed, 16 insertions, 17 deletions
diff --git a/src/buildvm_asm.c b/src/buildvm_asm.c
index cc821365..bd835ebc 100644
--- a/src/buildvm_asm.c
+++ b/src/buildvm_asm.c
@@ -23,27 +23,18 @@ static void emit_asm_bytes(BuildCtx *ctx, uint8_t *p, int n)
23} 23}
24 24
25/* Emit relocation */ 25/* Emit relocation */
26static void emit_asm_reloc(BuildCtx *ctx, BuildReloc *r) 26static void emit_asm_reloc(BuildCtx *ctx, int type, const char *sym)
27{ 27{
28 const char *sym = ctx->extnames[r->sym];
29 const char *p = strchr(sym, '@');
30 char buf[80];
31 if (p) {
32 /* Always strip fastcall suffix. Wrong for (unused) COFF on Win32. */
33 strncpy(buf, sym, p-sym);
34 buf[p-sym] = '\0';
35 sym = buf;
36 }
37 switch (ctx->mode) { 28 switch (ctx->mode) {
38 case BUILD_elfasm: 29 case BUILD_elfasm:
39 if (r->type) 30 if (type)
40 fprintf(ctx->fp, "\t.long %s-.-4\n", sym); 31 fprintf(ctx->fp, "\t.long %s-.-4\n", sym);
41 else 32 else
42 fprintf(ctx->fp, "\t.long %s\n", sym); 33 fprintf(ctx->fp, "\t.long %s\n", sym);
43 break; 34 break;
44 case BUILD_coffasm: 35 case BUILD_coffasm:
45 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);
46 if (r->type) 37 if (type)
47 fprintf(ctx->fp, "\t.long _%s-.-4\n", sym); 38 fprintf(ctx->fp, "\t.long _%s-.-4\n", sym);
48 else 39 else
49 fprintf(ctx->fp, "\t.long _%s\n", sym); 40 fprintf(ctx->fp, "\t.long _%s\n", sym);
@@ -173,13 +164,21 @@ void emit_asm(BuildCtx *ctx)
173 emit_asm_label(ctx, name, size, 1); 164 emit_asm_label(ctx, name, size, 1);
174 } 165 }
175 while (rel < ctx->nreloc && ctx->reloc[rel].ofs < stop) { 166 while (rel < ctx->nreloc && ctx->reloc[rel].ofs < stop) {
176 int n = ctx->reloc[rel].ofs - prev; 167 BuildReloc *r = &ctx->reloc[rel];
177 if (ctx->mode == BUILD_machasm && ctx->reloc[rel].type != 0) { 168 int n = r->ofs - prev;
178 emit_asm_reloc_mach(ctx, ctx->code+prev, n, 169 const char *sym = ctx->extnames[r->sym];
179 ctx->extnames[ctx->reloc[rel].sym]); 170 const char *p = strchr(sym, '@');
171 if (p) {
172 /* Always strip fastcall suffix. Wrong for (unused) COFF on Win32. */
173 strncpy(name, sym, p-sym);
174 name[p-sym] = '\0';
175 sym = name;
176 }
177 if (ctx->mode == BUILD_machasm && r->type != 0) {
178 emit_asm_reloc_mach(ctx, ctx->code+prev, n, sym);
180 } else { 179 } else {
181 emit_asm_bytes(ctx, ctx->code+prev, n); 180 emit_asm_bytes(ctx, ctx->code+prev, n);
182 emit_asm_reloc(ctx, &ctx->reloc[rel]); 181 emit_asm_reloc(ctx, r->type, sym);
183 } 182 }
184 prev += n+4; 183 prev += n+4;
185 rel++; 184 rel++;