コード例 #1
0
void dc_callvm_mode_ppc32(DCCallVM* in_self, DCint mode)
{
    DCCallVM_ppc32* self = (DCCallVM_ppc32*) in_self;
    DCCallVM_vt* vt;
    switch(mode) {

    case DC_CALL_C_PPC32_OSX:

#if defined(DC__ABI_Darwin)
    case DC_CALL_C_DEFAULT:
    case DC_CALL_C_ELLIPSIS:
#endif

        vt = &gVT_ppc32_darwin;
        break;

    case DC_CALL_C_PPC32_SYSV:

#if defined(DC__ABI_SysV)
    case DC_CALL_C_DEFAULT:
    case DC_CALL_C_ELLIPSIS:
#endif

        vt = &gVT_ppc32_sysv;
        break;

    default:
        self->mInterface.mError = DC_ERROR_UNSUPPORTED_MODE;
        return;
    }

    dc_callvm_base_init(&self->mInterface, vt);

    dcReset(in_self);
}
コード例 #2
0
void dc_callvm_mode_ppc64(DCCallVM* in_self, DCint mode)
{
  DCCallVM_ppc64* self = (DCCallVM_ppc64*) in_self;
  DCCallVM_vt* vt;
  switch(mode) {

    case DC_CALL_C_PPC64: 
    case DC_CALL_C_DEFAULT:
    case DC_CALL_C_ELLIPSIS:
#if DC__ABI_PPC64_ELF_V == 2
      vt = &gVT_ppc64;
      break;
    case DC_CALL_C_ELLIPSIS_VARARGS:
      vt = &gVT_ppc64_ellipsis;
      break;
#else
    case DC_CALL_C_ELLIPSIS_VARARGS:
      vt = &gVT_ppc64;
      break;
#endif

    case DC_CALL_SYS_DEFAULT:
    case DC_CALL_SYS_PPC64:
      vt = &gVT_ppc64_syscall;
      break;

    default: 
      self->mInterface.mError = DC_ERROR_UNSUPPORTED_MODE; 
      return;
  }
  
  dc_callvm_base_init(&self->mInterface, vt);
}
コード例 #3
0
static DCCallVM* dc_callvm_new_arm32_thumb(DCCallVM_vt* vt, DCsize size)
{
  /* Store at least 16 bytes (4 words) for internal spill area. Assembly code depends on it. */
  DCCallVM_arm32_thumb* self = (DCCallVM_arm32_thumb*)dcAllocMem(sizeof(DCCallVM_arm32_thumb)+size+16);
  dc_callvm_base_init(&self->mInterface, vt);
  dcVecInit(&self->mVecHead, size);
  return (DCCallVM*)self;
}
コード例 #4
0
static DCCallVM* dc_callvm_new_mips_o32(DCCallVM_vt* vt, DCsize size)
{
  DCCallVM_mips_o32* self = (DCCallVM_mips_o32*)dcAllocMem(sizeof(DCCallVM_mips_o32)+size);
  dc_callvm_base_init(&self->mInterface, vt);
  dcVecInit(&self->mVecHead, size);
  dc_callvm_reset_mips_o32( (DCCallVM*) self );
  return (DCCallVM*)self;
}
コード例 #5
0
/* the six output registers %o0-%o5 are always loaded, thus we need to ensure the argument buffer has space for at least 24 bytes. */
static DCCallVM* dc_callvm_new_sparc(DCCallVM_vt* vt, DCsize size)
{
  size=DC_MAX(size,sizeof(void*)*(6+1));
  DCCallVM_sparc* self = (DCCallVM_sparc*) dcAllocMem(sizeof(DCCallVM_sparc)+size);
  dc_callvm_base_init(&self->mInterface, vt);
  dcVecInit(&self->mVecHead,size);
  return (DCCallVM*)self;
}
コード例 #6
0
/* the six output registers %o0-%o5 are always loaded, thus we need to ensure the argument buffer has space for at least 24 bytes. */
static DCCallVM* dc_callvm_new_sparc64(DCCallVM_vt* vt, DCsize size)
{
  DCCallVM_sparc64* self = (DCCallVM_sparc64*) dcAllocMem(sizeof(DCCallVM_sparc64)+DHEAD+size);
  dc_callvm_base_init(&self->mInterface, vt);
  dcVecInit(&self->mVecHead,DHEAD+size);
  dc_callvm_reset_sparc64(&self->mInterface);
  return (DCCallVM*)self;
}
コード例 #7
0
ファイル: dyncall_callvm_x86.c プロジェクト: Arcterus/nqp
static DCCallVM* dc_callvm_new_x86(DCCallVM_vt* vt, DCsize size)
{
  DCCallVM_x86* self = (DCCallVM_x86*) dcAllocMem( sizeof(DCCallVM_x86)+size );

  dc_callvm_base_init(&self->mInterface, vt);

  self->mIntRegs              = 0;
  dcVecInit(&self->mVecHead, size);
  return (DCCallVM*) self;
}
コード例 #8
0
static DCCallVM* dc_callvm_new_arm32_armhf(DCCallVM_vt* vt, DCsize size)
{
  /* Store at least 16 bytes (4 words) for internal spill area. Assembly code depends on it. */
  DCCallVM_arm32_armhf* p = (DCCallVM_arm32_armhf*)dcAllocMem(sizeof(DCCallVM_arm32_armhf)+size+16);
  dc_callvm_base_init(&p->mInterface, vt);
  dcVecInit(&p->mVecHead, size);
  p->i = 0;
  p->s = 0;
  p->d = 0;
  return (DCCallVM*)p;
}
コード例 #9
0
static DCCallVM* dc_callvm_new_arm64(DCCallVM_vt* vt, DCsize size)
{
  DCCallVM_arm64* p = (DCCallVM_arm64*) dcAllocMem(size);

  dc_callvm_base_init(&p->mInterface, vt);

  dcVecInit(&p->mVecHead, size);

  p->i = 0;
  p->f = 0;

  return (DCCallVM*)p;
}
コード例 #10
0
ファイル: dyncall_callvm_x64.c プロジェクト: QAndot/dyncall
static DCCallVM* dc_callvm_new_x64(DCCallVM_vt* vt, DCsize size)
{
  DCCallVM_x64* self = (DCCallVM_x64*)dcAllocMem(sizeof(DCCallVM_x64)+size);
  
  dc_callvm_base_init(&self->mInterface, vt);

  /* Since we store register parameters in DCCallVM_x64 directly, adjust the stack size. */
  size -= sizeof(DCRegData_x64);
  size = (((signed long)size) < 0) ? 0 : size;


  self->mRegCount.i = self->mRegCount.f =  0;

  dcVecInit(&self->mVecHead, size);
  return (DCCallVM*)self;
}
コード例 #11
0
/* mode: only a single mode available currently. */
static void dc_callvm_mode_mips_eabi(DCCallVM* in_self, DCint mode)
{
  DCCallVM_mips_eabi* self = (DCCallVM_mips_eabi*)in_self;
  DCCallVM_vt* vt;

  switch(mode) {
    case DC_CALL_C_DEFAULT:
    case DC_CALL_C_MIPS32_EABI:
    case DC_CALL_C_ELLIPSIS:
    case DC_CALL_C_ELLIPSIS_VARARGS:
      vt = &gVT_mips_eabi;
      break;
    default:
      self->mInterface.mError = DC_ERROR_UNSUPPORTED_MODE; 
      return;
  }
  dc_callvm_base_init(&self->mInterface, vt);
}
コード例 #12
0
static void mode(DCCallVM* in_self, DCint mode)
{
  DCCallVM_arm32_armhf* self = (DCCallVM_arm32_armhf*)in_self;
  DCCallVM_vt* vt;

  switch(mode) {
    case DC_CALL_C_DEFAULT:
    case DC_CALL_C_ARM_ARMHF:
      vt = &vt_armhf;
      break;
    case DC_CALL_C_ELLIPSIS:
    case DC_CALL_C_ELLIPSIS_VARARGS:
      vt = &vt_armhf_ellipsis;
      break;
    default:
      self->mInterface.mError = DC_ERROR_UNSUPPORTED_MODE; 
      return;
  }
  dc_callvm_base_init(&self->mInterface, vt);
}
コード例 #13
0
ファイル: dyncall_callvm_x86.c プロジェクト: MoarVM/dyncall
void dc_callvm_mode_x86(DCCallVM* in_self, DCint mode)
{
  DCCallVM_x86* self = (DCCallVM_x86*)in_self;
  DCCallVM_vt* vt;

  switch(mode) {
    case DC_CALL_C_DEFAULT:
    case DC_CALL_C_ELLIPSIS:
    case DC_CALL_C_ELLIPSIS_VARARGS:
/* Plan9 (and forks) have their own calling convention (and no support for foreign ones). */
#if defined(DC_PLAN9)
    case DC_CALL_C_X86_PLAN9:          vt = &gVT_x86_plan9;          break;
#else
    case DC_CALL_C_X86_CDECL:          vt = &gVT_x86_cdecl;          break;
    case DC_CALL_C_X86_WIN32_STD:      vt = &gVT_x86_win32_std;      break;
    case DC_CALL_C_X86_WIN32_FAST_MS:  vt = &gVT_x86_win32_fast_ms;  break;
    case DC_CALL_C_X86_WIN32_THIS_MS:  vt = &gVT_x86_win32_this_ms;  break;
    case DC_CALL_C_X86_WIN32_FAST_GNU: vt = &gVT_x86_win32_fast_gnu; break;
    case DC_CALL_C_X86_WIN32_THIS_GNU: vt = &gVT_x86_cdecl;          break;
    case DC_CALL_SYS_DEFAULT:         
# if defined DC_UNIX
#   if defined DC__OS_Linux
      vt = &gVT_x86_sys_int80h_linux; break;
#   else
      vt = &gVT_x86_sys_int80h_bsd;   break;
#   endif
# else
      self->mInterface.mError = DC_ERROR_UNSUPPORTED_MODE; return;
# endif
    case DC_CALL_SYS_X86_INT80H_LINUX: vt = &gVT_x86_sys_int80h_linux; break;
    case DC_CALL_SYS_X86_INT80H_BSD:   vt = &gVT_x86_sys_int80h_bsd;   break;
#endif
    default: 
      self->mInterface.mError = DC_ERROR_UNSUPPORTED_MODE;
      return;
  }
  dc_callvm_base_init(&self->mInterface, vt);
}