]> git.ipfire.org Git - thirdparty/LuaJIT.git/commitdiff
x86/x64: Call external symbols directly from interpreter code.
authorMike Pall <mike>
Mon, 8 Dec 2014 00:58:05 +0000 (01:58 +0100)
committerMike Pall <mike>
Mon, 8 Dec 2014 00:58:05 +0000 (01:58 +0100)
Except for ELF/x86 PIC, where it's easier to use wrappers.

src/.gitignore
src/Makefile
src/host/buildvm.c
src/host/buildvm.h
src/host/buildvm_asm.c
src/lj_vmmath.c
src/vm_x86.dasc

index fc94e82cc88c983b162a528b5eeb668f6874ec37..1a30573c9ffb71e56587852fa3feeb873a8fee87 100644 (file)
@@ -4,4 +4,4 @@ lj_ffdef.h
 lj_libdef.h
 lj_recdef.h
 lj_folddef.h
-lj_vm.s
+lj_vm.[sS]
index fae4c7bae051dfd018c7b007de2ec72f095dc97a..1d6145d8b957eec961a159ee6ba7490aa9f73cc1 100644 (file)
@@ -439,7 +439,7 @@ BUILDVM_X= $(BUILDVM_T)
 HOST_O= $(MINILUA_O) $(BUILDVM_O)
 HOST_T= $(MINILUA_T) $(BUILDVM_T)
 
-LJVM_S= lj_vm.s
+LJVM_S= lj_vm.S
 LJVM_O= lj_vm.o
 LJVM_BOUT= $(LJVM_S)
 LJVM_MODE= elfasm
@@ -647,7 +647,7 @@ lj_folddef.h: $(BUILDVM_T) lj_opt_fold.c
        $(Q)$(TARGET_DYNCC) $(TARGET_ACFLAGS) -c -o $(@:.o=_dyn.o) $<
        $(Q)$(TARGET_CC) $(TARGET_ACFLAGS) -c -o $@ $<
 
-%.o: %.s
+%.o: %.S
        $(E) "ASM       $@"
        $(Q)$(TARGET_DYNCC) $(TARGET_ACFLAGS) -c -o $(@:.o=_dyn.o) $<
        $(Q)$(TARGET_CC) $(TARGET_ACFLAGS) -c -o $@ $<
index 37b20ae294e9bf3ed361c4d32f05e04c49c8544a..d56c65ca044db15e84174f20db4c01c6d48ae164 100644 (file)
@@ -179,6 +179,7 @@ static int build_code(BuildCtx *ctx)
   ctx->nreloc = 0;
 
   ctx->globnames = globnames;
+  ctx->extnames = extnames;
   ctx->relocsym = (const char **)malloc(NRELOCSYM*sizeof(const char *));
   ctx->nrelocsym = 0;
   for (i = 0; i < (int)NRELOCSYM; i++) relocmap[i] = -1;
index f9dc8c4f2024c97404c931abc60128b6a364082f..b321bbdad5ea73926978684266efa55a70ebf683 100644 (file)
@@ -82,6 +82,7 @@ typedef struct BuildCtx {
   const char *beginsym;
   /* Strings generated by DynASM. */
   const char *const *globnames;
+  const char *const *extnames;
   const char *dasm_ident;
   const char *dasm_arch;
   /* Relocations. */
index 079e9a809743bad6ea8a302ce7f5dd18f2514a1d..c91f5bcd08bc2f522de10c21db8beb8f39b31f50 100644 (file)
@@ -51,8 +51,8 @@ static const char *const jccnames[] = {
   "js", "jns", "jpe", "jpo", "jl", "jge", "jle", "jg"
 };
 
-/* Emit relocation for the incredibly stupid OSX assembler. */
-static void emit_asm_reloc_mach(BuildCtx *ctx, uint8_t *cp, int n,
+/* Emit x86/x64 text relocations. */
+static void emit_asm_reloc_text(BuildCtx *ctx, uint8_t *cp, int n,
                                const char *sym)
 {
   const char *opname = NULL;
@@ -71,6 +71,20 @@ err:
     exit(1);
   }
   emit_asm_bytes(ctx, cp, n);
+  if (strncmp(sym+(*sym == '_'), LABEL_PREFIX, sizeof(LABEL_PREFIX)-1)) {
+    /* Various fixups for external symbols outside of our binary. */
+    if (ctx->mode == BUILD_elfasm) {
+      if (LJ_32)
+       fprintf(ctx->fp, "#if __PIC__\n\t%s lj_wrap_%s\n#else\n", opname, sym);
+      fprintf(ctx->fp, "\t%s %s@PLT\n", opname, sym);
+      if (LJ_32)
+       fprintf(ctx->fp, "#endif\n");
+      return;
+    } else if (LJ_32 && ctx->mode == BUILD_machasm) {
+      fprintf(ctx->fp, "\t%s L%s$stub\n", opname, sym);
+      return;
+    }
+  }
   fprintf(ctx->fp, "\t%s %s\n", opname, sym);
 }
 #else
@@ -254,8 +268,9 @@ void emit_asm(BuildCtx *ctx)
       BuildReloc *r = &ctx->reloc[rel];
       int n = r->ofs - ofs;
 #if LJ_TARGET_X86ORX64
-      if (ctx->mode == BUILD_machasm && r->type != 0) {
-       emit_asm_reloc_mach(ctx, ctx->code+ofs, n, ctx->relocsym[r->sym]);
+      if (r->type != 0 &&
+         (ctx->mode == BUILD_elfasm || ctx->mode == BUILD_machasm)) {
+       emit_asm_reloc_text(ctx, ctx->code+ofs, n, ctx->relocsym[r->sym]);
       } else {
        emit_asm_bytes(ctx, ctx->code+ofs, n);
        emit_asm_reloc(ctx, r->type, ctx->relocsym[r->sym]);
index 63886aa7e36fec3f6253676e4806eb4b8489f029..b60858b2b302dd394ba3a5fb19f7bf3d6319fe9f 100644 (file)
 #include "lj_ir.h"
 #include "lj_vm.h"
 
-/* -- Helper functions for generated machine code ------------------------- */
+/* -- Wrapper functions --------------------------------------------------- */
 
-#if LJ_TARGET_X86ORX64
-/* Wrapper functions to avoid linker issues on OSX. */
-LJ_FUNCA double lj_vm_sinh(double x) { return sinh(x); }
-LJ_FUNCA double lj_vm_cosh(double x) { return cosh(x); }
-LJ_FUNCA double lj_vm_tanh(double x) { return tanh(x); }
+#if LJ_TARGET_X86 && __ELF__ && __PIC__
+/* Wrapper functions to deal with the ELF/x86 PIC disaster. */
+LJ_FUNCA double lj_wrap_sinh(double x) { return sinh(x); }
+LJ_FUNCA double lj_wrap_cosh(double x) { return cosh(x); }
+LJ_FUNCA double lj_wrap_tanh(double x) { return tanh(x); }
 #endif
 
+/* -- Helper functions for generated machine code ------------------------- */
+
 #if !LJ_TARGET_X86ORX64
 double lj_vm_foldarith(double x, double y, int op)
 {
index a0c7cc6022b977143c233078b3dc2741dafba582..cd43afbde3ae7ec4697946e79653eb3e55e52a52 100644 (file)
@@ -2084,7 +2084,7 @@ static void build_subroutines(BuildCtx *ctx)
   |  movsd FPARG1, xmm0
   |.endif
   |  mov RB, BASE
-  |  call extern lj_vm_ .. func
+  |  call extern func
   |  mov BASE, RB
   |.if X64
   |  jmp ->fff_resxmm0
@@ -5962,15 +5962,21 @@ static void emit_asm_debug(BuildCtx *ctx)
          "LEFDEY:\n\n", fcsize);
     }
 #endif
-#if LJ_64
-    fprintf(ctx->fp, "\t.subsections_via_symbols\n");
-#else
+#if !LJ_64
     fprintf(ctx->fp,
       "\t.non_lazy_symbol_pointer\n"
       "L_lj_err_unwind_dwarf$non_lazy_ptr:\n"
       ".indirect_symbol _lj_err_unwind_dwarf\n"
-      ".long 0\n");
+      ".long 0\n\n");
+    fprintf(ctx->fp, "\t.section __IMPORT,__jump_table,symbol_stubs,pure_instructions+self_modifying_code,5\n");
+    {
+      const char *const *xn;
+      for (xn = ctx->extnames; *xn; xn++)
+       if (strncmp(*xn, LABEL_PREFIX, sizeof(LABEL_PREFIX)-1))
+         fprintf(ctx->fp, "L_%s$stub:\n\t.indirect_symbol _%s\n\t.ascii \"\\364\\364\\364\\364\\364\"\n", *xn, *xn);
+    }
 #endif
+    fprintf(ctx->fp, ".subsections_via_symbols\n");
     }
     break;
   default:  /* Difficult for other modes. */