forked from mirrors/gecko-dev
Bug 1477048 - part 2 - remove non-ipc/chromium moz.build uses of OS_TEST; r=gps
The deletions in xptcall are when we don't even have support for the CPU in moz.configure, so I assume that people haven't been compiling on those architectures for quite some time.
This commit is contained in:
parent
5158597854
commit
309ddc0be2
14 changed files with 43 additions and 1017 deletions
2
config/external/ffi/moz.build
vendored
2
config/external/ffi/moz.build
vendored
|
|
@ -110,7 +110,7 @@ else:
|
|||
SOURCES += ['!win64.asm']
|
||||
elif CONFIG['FFI_TARGET'] == 'X86_DARWIN':
|
||||
DEFINES['FFI_MMAP_EXEC_WRIT'] = True
|
||||
if CONFIG['OS_TEST'] != 'x86_64':
|
||||
if CONFIG['CPU_ARCH'] == 'x86':
|
||||
ffi_srcs = ('ffi.c', 'darwin.S', 'ffi64.c', 'darwin64.S',
|
||||
'win32.S')
|
||||
DEFINES['SYMBOL_UNDERSCORE'] = True
|
||||
|
|
|
|||
|
|
@ -84,19 +84,19 @@ use_arm_simd_gcc = False
|
|||
use_arm_neon_gcc = False
|
||||
if CONFIG['INTEL_ARCHITECTURE']:
|
||||
use_sse2 = True
|
||||
if '64' not in CONFIG['OS_TEST']:
|
||||
if CONFIG['CPU_ARCH'] == 'x86':
|
||||
if CONFIG['CC_TYPE'] in ('msvc', 'clang-cl'):
|
||||
use_mmx = True
|
||||
if CONFIG['CC_TYPE'] in ('clang', 'gcc'):
|
||||
use_mmx = True
|
||||
elif 'ppc' in CONFIG['OS_TEST']:
|
||||
elif CONFIG['CPU_ARCH'] in ('ppc', 'ppc64'):
|
||||
if CONFIG['CC_TYPE'] in ('clang', 'gcc'):
|
||||
use_vmx = True
|
||||
# Apple's arm assembler doesn't support the same syntax as
|
||||
# the standard GNU assembler, so use the C fallback paths for now.
|
||||
# This may be fixable if clang's ARM/iOS assembler improves into a
|
||||
# viable solution in the future.
|
||||
elif 'arm' in CONFIG['OS_TEST']:
|
||||
elif CONFIG['CPU_ARCH'] == 'arm':
|
||||
if CONFIG['OS_ARCH'] != 'Darwin':
|
||||
if CONFIG['HAVE_ARM_SIMD']:
|
||||
use_arm_simd_gcc = True
|
||||
|
|
|
|||
|
|
@ -28,7 +28,7 @@ use_altivec = False
|
|||
if CONFIG['INTEL_ARCHITECTURE']:
|
||||
use_sse2 = True
|
||||
if CONFIG['CC_TYPE'] in ('msvc', 'clang-cl'):
|
||||
if CONFIG['OS_ARCH'] != 'WINNT' or CONFIG['OS_TEST'] != 'x86_64':
|
||||
if CONFIG['OS_ARCH'] != 'WINNT' or CONFIG['CPU_ARCH'] != 'x86_64':
|
||||
use_sse1 = True
|
||||
else:
|
||||
use_sse1 = True
|
||||
|
|
|
|||
|
|
@ -25,7 +25,7 @@ if CONFIG['INTEL_ARCHITECTURE']:
|
|||
|
||||
# MSVC doesn't support MMX when targeting AMD64.
|
||||
if CONFIG['CC_TYPE'] in ('msvc', 'clang-cl'):
|
||||
if CONFIG['OS_TEST'] != 'x86_64':
|
||||
if CONFIG['CPU_ARCH'] == 'x86':
|
||||
SOURCES += [
|
||||
'yuv_convert_mmx.cpp',
|
||||
]
|
||||
|
|
@ -34,7 +34,7 @@ if CONFIG['INTEL_ARCHITECTURE']:
|
|||
SOURCES['yuv_convert_mmx.cpp'].flags += CONFIG['MMX_FLAGS']
|
||||
|
||||
if CONFIG['CC_TYPE'] in ('msvc', 'clang-cl'):
|
||||
if CONFIG['OS_TEST'] == 'x86_64' or CONFIG['CC_TYPE'] == 'clang-cl':
|
||||
if CONFIG['CPU_ARCH'] == 'x86_64' or CONFIG['CC_TYPE'] == 'clang-cl':
|
||||
SOURCES += [
|
||||
'yuv_row_win64.cpp',
|
||||
]
|
||||
|
|
|
|||
|
|
@ -53,15 +53,15 @@ if CONFIG['INTEL_ARCHITECTURE']:
|
|||
if CONFIG['CC_TYPE'] == 'clang-cl':
|
||||
# clang-cl can't handle libtheora's inline asm.
|
||||
pass
|
||||
elif CONFIG['OS_ARCH'] != 'WINNT' or CONFIG['OS_TEST'] != 'x86_64':
|
||||
elif CONFIG['OS_ARCH'] != 'WINNT' or CONFIG['CPU_ARCH'] != 'x86_64':
|
||||
DEFINES['OC_X86_ASM'] = True
|
||||
if '64' in CONFIG['OS_TEST']:
|
||||
if CONFIG['CPU_ARCH'] == 'x86_64':
|
||||
DEFINES['OC_X86_64_ASM'] = True
|
||||
if CONFIG['CC_TYPE'] in ('msvc', 'clang-cl'):
|
||||
if CONFIG['CC_TYPE'] == 'clang-cl':
|
||||
# clang-cl can't handle libtheora's inline asm.
|
||||
pass
|
||||
elif '64' not in CONFIG['OS_TEST']:
|
||||
elif CONFIG['CPU_ARCH'] == 'x86':
|
||||
SOURCES += [
|
||||
'lib/x86_vc/mmxfrag.c',
|
||||
'lib/x86_vc/mmxidct.c',
|
||||
|
|
@ -80,7 +80,7 @@ if CONFIG['INTEL_ARCHITECTURE']:
|
|||
]
|
||||
|
||||
if CONFIG['GNU_AS']:
|
||||
if 'arm' in CONFIG['OS_TEST']:
|
||||
if CONFIG['CPU_ARCH'] == 'arm':
|
||||
SOURCES += [
|
||||
'lib/arm/armcpu.c',
|
||||
'lib/arm/armstate.c',
|
||||
|
|
|
|||
|
|
@ -9,12 +9,12 @@ if CONFIG['OS_ARCH'] == 'Darwin':
|
|||
'xptcinvoke_darwin.cpp',
|
||||
'xptcstubs_darwin.cpp',
|
||||
]
|
||||
if CONFIG['OS_TEST'] == 'powerpc':
|
||||
if CONFIG['CPU_ARCH'] == 'ppc':
|
||||
SOURCES += [
|
||||
'!xptcstubs_asm_ppc_darwin.s',
|
||||
'xptcinvoke_asm_ppc_rhapsody.s',
|
||||
]
|
||||
if CONFIG['OS_TEST'] == 'x86_64':
|
||||
if CONFIG['CPU_ARCH'] == 'x86_64':
|
||||
SOURCES += [
|
||||
'xptcinvoke_asm_x86_64_unix.S',
|
||||
]
|
||||
|
|
@ -28,20 +28,20 @@ if CONFIG['OS_ARCH'] == 'GNU':
|
|||
|
||||
if CONFIG['OS_ARCH'] in ('Linux', 'Bitrig', 'DragonFly', 'FreeBSD', 'NetBSD', 'OpenBSD') or \
|
||||
CONFIG['OS_ARCH'].startswith('GNU_'):
|
||||
if CONFIG['OS_TEST'] == 'x86_64':
|
||||
if CONFIG['CPU_ARCH'] == 'x86_64':
|
||||
SOURCES += [
|
||||
'xptcinvoke_asm_x86_64_unix.S',
|
||||
'xptcinvoke_x86_64_unix.cpp',
|
||||
'xptcstubs_x86_64_linux.cpp',
|
||||
]
|
||||
elif '86' in CONFIG['OS_TEST']:
|
||||
elif CONFIG['CPU_ARCH'] == 'x86':
|
||||
SOURCES += [
|
||||
'xptcinvoke_gcc_x86_unix.cpp',
|
||||
'xptcstubs_gcc_x86_unix.cpp'
|
||||
]
|
||||
|
||||
if CONFIG['OS_ARCH'] in ('Linux', 'FreeBSD'):
|
||||
if 'ia64' in CONFIG['OS_TEST']:
|
||||
if CONFIG['CPU_ARCH'] == 'ia64':
|
||||
SOURCES += [
|
||||
'xptcinvoke_asm_ipf64.s',
|
||||
'xptcinvoke_ipf64.cpp',
|
||||
|
|
@ -50,7 +50,7 @@ if CONFIG['OS_ARCH'] in ('Linux', 'FreeBSD'):
|
|||
]
|
||||
|
||||
if CONFIG['OS_ARCH'] == 'SunOS' and CONFIG['INTEL_ARCHITECTURE']:
|
||||
if CONFIG['OS_TEST'] == 'x86_64':
|
||||
if CONFIG['CPU_ARCH'] == 'x86_64':
|
||||
if CONFIG['CC_TYPE'] in ('clang', 'gcc'):
|
||||
SOURCES += [
|
||||
'xptcinvoke_asm_x86_64_unix.S',
|
||||
|
|
@ -84,7 +84,7 @@ if CONFIG['OS_ARCH'] == 'SunOS' and CONFIG['INTEL_ARCHITECTURE']:
|
|||
'xptcstubs_x86_solaris.cpp'
|
||||
]
|
||||
|
||||
if CONFIG['OS_TEST'] == 'alpha':
|
||||
if CONFIG['CPU_ARCH'] == 'Alpha':
|
||||
if CONFIG['OS_ARCH'] in ('Linux', 'FreeBSD', 'NetBSD'):
|
||||
SOURCES += [
|
||||
'xptcinvoke_linux_alpha.cpp',
|
||||
|
|
@ -96,7 +96,7 @@ if CONFIG['OS_TEST'] == 'alpha':
|
|||
'xptcstubs_alpha_openbsd.cpp',
|
||||
]
|
||||
|
||||
if CONFIG['CPU_ARCH'] == 'arm' or CONFIG['OS_TEST'] == 'sa110':
|
||||
if CONFIG['CPU_ARCH'] == 'arm':
|
||||
if CONFIG['OS_ARCH'] == 'Linux':
|
||||
SOURCES += [
|
||||
'xptcinvoke_arm.cpp',
|
||||
|
|
@ -117,7 +117,7 @@ if CONFIG['CPU_ARCH'] == 'arm' and CONFIG['OS_ARCH'] in ('Bitrig', 'OpenBSD'):
|
|||
|
||||
if CONFIG['OS_ARCH'] == 'HP-UX':
|
||||
if CONFIG['CC'] != 'gcc':
|
||||
if CONFIG['OS_TEST'] == 'ia64':
|
||||
if CONFIG['CPU_ARCH'] == 'ia64':
|
||||
SOURCES += [
|
||||
'xptcinvoke_asm_ipf32.s',
|
||||
'xptcinvoke_ipf32.cpp',
|
||||
|
|
@ -133,7 +133,7 @@ if CONFIG['OS_ARCH'] == 'HP-UX':
|
|||
]
|
||||
|
||||
if CONFIG['OS_ARCH'] == 'Linux':
|
||||
if CONFIG['OS_TEST'] in ('hppa', 'hppa2.0', 'hppa1.1'):
|
||||
if CONFIG['CPU_ARCH'] == 'hppa':
|
||||
if CONFIG['CC_TYPE'] in ('clang', 'gcc'):
|
||||
SOURCES += [
|
||||
'xptcinvoke_asm_parisc_linux.s',
|
||||
|
|
@ -144,42 +144,28 @@ if CONFIG['OS_ARCH'] == 'Linux':
|
|||
elif CONFIG['COMPILE_ENVIRONMENT']:
|
||||
error('Unknown C++ compiler, xptcall assembly will probably be incorrect.')
|
||||
|
||||
if CONFIG['OS_ARCH'] == 'NetBSD':
|
||||
if CONFIG['OS_TEST'] in ('amiga', 'atari', 'hp300', 'mac68k', 'mvme68k',
|
||||
'next68k', 'sun3', 'sun3x', 'x68k'):
|
||||
SOURCES += [
|
||||
'xptcinvoke_netbsd_m68k.cpp',
|
||||
'xptcstubs_netbsd_m68k.cpp'
|
||||
]
|
||||
|
||||
if CONFIG['OS_ARCH'] in ('Linux', 'FreeBSD', 'NetBSD', 'OpenBSD'):
|
||||
if CONFIG['OS_TEST'] == 'aarch64':
|
||||
if CONFIG['CPU_ARCH'] == 'aarch64':
|
||||
SOURCES += [
|
||||
'xptcinvoke_aarch64.cpp',
|
||||
'xptcinvoke_asm_aarch64.s',
|
||||
'xptcstubs_aarch64.cpp',
|
||||
'xptcstubs_asm_aarch64.s',
|
||||
]
|
||||
if CONFIG['OS_TEST'] == 'm68k':
|
||||
if CONFIG['CPU_ARCH'] == 'mips64':
|
||||
SOURCES += [
|
||||
'xptcinvoke_linux_m68k.cpp',
|
||||
'xptcstubs_linux_m68k.cpp',
|
||||
'xptcinvoke_asm_mips64.S',
|
||||
'xptcinvoke_mips64.cpp',
|
||||
'xptcstubs_asm_mips64.S',
|
||||
'xptcstubs_mips64.cpp',
|
||||
]
|
||||
if CONFIG['CPU_ARCH'] == 'mips32':
|
||||
SOURCES += [
|
||||
'xptcinvoke_asm_mips.S',
|
||||
'xptcinvoke_mips.cpp',
|
||||
'xptcstubs_asm_mips.S',
|
||||
'xptcstubs_mips.cpp',
|
||||
]
|
||||
if 'mips' in CONFIG['OS_TEST']:
|
||||
if 'mips64' in CONFIG['OS_TEST']:
|
||||
SOURCES += [
|
||||
'xptcinvoke_asm_mips64.S',
|
||||
'xptcinvoke_mips64.cpp',
|
||||
'xptcstubs_asm_mips64.S',
|
||||
'xptcstubs_mips64.cpp',
|
||||
]
|
||||
else:
|
||||
SOURCES += [
|
||||
'xptcinvoke_asm_mips.S',
|
||||
'xptcinvoke_mips.cpp',
|
||||
'xptcstubs_asm_mips.S',
|
||||
'xptcstubs_mips.cpp',
|
||||
]
|
||||
|
||||
if CONFIG['OS_ARCH'] == 'AIX':
|
||||
if CONFIG['HAVE_64BIT_BUILD']:
|
||||
|
|
@ -204,7 +190,7 @@ if CONFIG['OS_ARCH'] == 'AIX':
|
|||
'xptcinvoke_asm_ppc_aix.s',
|
||||
]
|
||||
|
||||
if CONFIG['OS_TEST'] == 'powerpc':
|
||||
if CONFIG['CPU_ARCH'] == 'ppc':
|
||||
if CONFIG['OS_ARCH'] in ('Linux', 'FreeBSD'):
|
||||
SOURCES += [
|
||||
'xptcinvoke_asm_ppc_linux.S',
|
||||
|
|
@ -213,7 +199,7 @@ if CONFIG['OS_TEST'] == 'powerpc':
|
|||
'xptcstubs_ppc_linux.cpp',
|
||||
]
|
||||
|
||||
if CONFIG['OS_TEST'] in ('powerpc64', 'powerpc64le'):
|
||||
if CONFIG['CPU_ARCH'] == 'ppc64':
|
||||
if CONFIG['OS_ARCH'] in ('Linux', 'FreeBSD'):
|
||||
SOURCES += [
|
||||
'xptcinvoke_asm_ppc64_linux.S',
|
||||
|
|
@ -222,16 +208,7 @@ if CONFIG['OS_TEST'] in ('powerpc64', 'powerpc64le'):
|
|||
'xptcstubs_ppc64_linux.cpp',
|
||||
]
|
||||
|
||||
if CONFIG['OS_TEST'] in ('macppc', 'bebox', 'ofppc', 'prep', 'amigappc'):
|
||||
if CONFIG['OS_ARCH'] == 'NetBSD':
|
||||
SOURCES += [
|
||||
'xptcinvoke_asm_ppc_netbsd.s',
|
||||
'xptcinvoke_ppc_netbsd.cpp',
|
||||
'xptcstubs_asm_ppc_netbsd.s',
|
||||
'xptcstubs_ppc_netbsd.cpp',
|
||||
]
|
||||
|
||||
if CONFIG['OS_ARCH'] == 'OpenBSD' and CONFIG['OS_TEST'] == 'powerpc':
|
||||
if CONFIG['OS_ARCH'] == 'OpenBSD' and CONFIG['CPU_ARCH'] == 'ppc':
|
||||
SOURCES += [
|
||||
'xptcinvoke_asm_ppc_openbsd.S',
|
||||
'xptcinvoke_ppc_openbsd.cpp',
|
||||
|
|
@ -239,7 +216,7 @@ if CONFIG['OS_ARCH'] == 'OpenBSD' and CONFIG['OS_TEST'] == 'powerpc':
|
|||
'xptcstubs_ppc_openbsd.cpp',
|
||||
]
|
||||
|
||||
if CONFIG['OS_ARCH'] == 'Linux' and CONFIG['OS_TEST'] == 'sparc':
|
||||
if CONFIG['OS_ARCH'] == 'Linux' and CONFIG['CPU_ARCH'] == 'sparc':
|
||||
SOURCES += [
|
||||
'xptcinvoke_asm_sparc_linux_GCC3.s',
|
||||
'xptcinvoke_sparc_solaris.cpp',
|
||||
|
|
@ -247,7 +224,7 @@ if CONFIG['OS_ARCH'] == 'Linux' and CONFIG['OS_TEST'] == 'sparc':
|
|||
'xptcstubs_sparc_solaris.cpp',
|
||||
]
|
||||
|
||||
if CONFIG['OS_ARCH'] == 'NetBSD' and CONFIG['OS_TEST'] == 'sparc':
|
||||
if CONFIG['OS_ARCH'] == 'NetBSD' and CONFIG['CPU_ARCH'] == 'sparc':
|
||||
SOURCES += [
|
||||
'xptcinvoke_asm_sparc_netbsd.s',
|
||||
'xptcinvoke_sparc_netbsd.cpp',
|
||||
|
|
@ -255,7 +232,7 @@ if CONFIG['OS_ARCH'] == 'NetBSD' and CONFIG['OS_TEST'] == 'sparc':
|
|||
'xptcstubs_sparc_netbsd.cpp',
|
||||
]
|
||||
|
||||
if CONFIG['OS_ARCH'] == 'OpenBSD' and CONFIG['OS_TEST'] == 'sparc':
|
||||
if CONFIG['OS_ARCH'] == 'OpenBSD' and CONFIG['CPU_ARCH'] == 'sparc':
|
||||
SOURCES += [
|
||||
'xptcinvoke_asm_sparc_openbsd.s',
|
||||
'xptcinvoke_sparc_openbsd.cpp',
|
||||
|
|
@ -263,7 +240,7 @@ if CONFIG['OS_ARCH'] == 'OpenBSD' and CONFIG['OS_TEST'] == 'sparc':
|
|||
'xptcstubs_sparc_openbsd.cpp',
|
||||
]
|
||||
|
||||
if CONFIG['OS_ARCH'] in ('OpenBSD', 'FreeBSD', 'Linux') and CONFIG['OS_TEST'] == 'sparc64':
|
||||
if CONFIG['OS_ARCH'] in ('OpenBSD', 'FreeBSD', 'Linux') and CONFIG['CPU_ARCH'] == 'sparc64':
|
||||
SOURCES += [
|
||||
'xptcinvoke_asm_sparc64_openbsd.s',
|
||||
'xptcinvoke_sparc64_openbsd.cpp',
|
||||
|
|
@ -301,7 +278,7 @@ if CONFIG['OS_ARCH'] == 'SunOS' and not CONFIG['INTEL_ARCHITECTURE']:
|
|||
]
|
||||
|
||||
if CONFIG['OS_ARCH'] == 'Linux':
|
||||
if CONFIG['OS_TEST'] == 's390':
|
||||
if CONFIG['CPU_ARCH'] == 's390':
|
||||
SOURCES += [
|
||||
'xptcinvoke_linux_s390.cpp',
|
||||
'xptcstubs_linux_s390.cpp',
|
||||
|
|
@ -312,7 +289,7 @@ if CONFIG['OS_ARCH'] == 'Linux':
|
|||
'-fomit-frame-pointer',
|
||||
'-mbackchain',
|
||||
]
|
||||
elif CONFIG['OS_TEST'] == 's390x':
|
||||
elif CONFIG['CPU_ARCH'] == 's390x':
|
||||
SOURCES += [
|
||||
'xptcinvoke_linux_s390x.cpp',
|
||||
'xptcstubs_linux_s390x.cpp',
|
||||
|
|
|
|||
|
|
@ -1,95 +0,0 @@
|
|||
# -*- Mode: Asm -*-
|
||||
#
|
||||
# This Source Code Form is subject to the terms of the Mozilla Public
|
||||
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||
.set r0,0; .set sp,1; .set RTOC,2; .set r3,3; .set r4,4
|
||||
.set r5,5; .set r6,6; .set r7,7; .set r8,8; .set r9,9
|
||||
.set r10,10; .set r11,11; .set r12,12; .set r13,13; .set r14,14
|
||||
.set r15,15; .set r16,16; .set r17,17; .set r18,18; .set r19,19
|
||||
.set r20,20; .set r21,21; .set r22,22; .set r23,23; .set r24,24
|
||||
.set r25,25; .set r26,26; .set r27,27; .set r28,28; .set r29,29
|
||||
.set r30,30; .set r31,31
|
||||
.set f0,0; .set f1,1; .set f2,2; .set f3,3; .set f4,4
|
||||
.set f5,5; .set f6,6; .set f7,7; .set f8,8; .set f9,9
|
||||
.set f10,10; .set f11,11; .set f12,12; .set f13,13; .set f14,14
|
||||
.set f15,15; .set f16,16; .set f17,17; .set f18,18; .set f19,19
|
||||
.set f20,20; .set f21,21; .set f22,22; .set f23,23; .set f24,24
|
||||
.set f25,25; .set f26,26; .set f27,27; .set f28,28; .set f29,29
|
||||
.set f30,30; .set f31,31
|
||||
|
||||
.section ".text"
|
||||
.align 2
|
||||
.globl XPTC_InvokeByIndex
|
||||
.type XPTC_InvokeByIndex,@function
|
||||
|
||||
#
|
||||
# XPTC_InvokeByIndex(nsISupports* that, uint32_t methodIndex,
|
||||
# uint32_t paramCount, nsXPTCVariant* params)
|
||||
#
|
||||
|
||||
XPTC_InvokeByIndex:
|
||||
stwu sp,-32(sp) # setup standard stack frame
|
||||
mflr r0 # save LR
|
||||
stw r3,8(sp) # r3 <= that
|
||||
stw r4,12(sp) # r4 <= methodIndex
|
||||
stw r30,16(sp)
|
||||
stw r31,20(sp)
|
||||
|
||||
stw r0,36(sp) # store LR backchain
|
||||
mr r31,sp
|
||||
|
||||
rlwinm r10,r5,3,0,27 # r10 = (ParamCount * 2 * 4) & ~0x0f
|
||||
addi r0,r10,96 # reserve stack for GPR and FPR register save area r0 = r10 + 96
|
||||
lwz r9,0(sp) # r9 = backchain
|
||||
neg r0,r0
|
||||
stwux r9,sp,r0 # reserve stack sapce and save SP backchain
|
||||
|
||||
addi r3,sp,8 # r3 <= args
|
||||
mr r4,r5 # r4 <= paramCount
|
||||
mr r5,r6 # r5 <= params
|
||||
add r6,r3,r10 # r6 <= gpregs ( == args + r10 )
|
||||
mr r30,r6 # store in r30 for use later...
|
||||
addi r7,r6,32 # r7 <= fpregs ( == gpregs + 32 )
|
||||
|
||||
bl invoke_copy_to_stack@local # (args, paramCount, params, gpregs, fpregs)
|
||||
|
||||
lfd f1,32(r30) # load FP registers with method parameters
|
||||
lfd f2,40(r30)
|
||||
lfd f3,48(r30)
|
||||
lfd f4,56(r30)
|
||||
lfd f5,64(r30)
|
||||
lfd f6,72(r30)
|
||||
lfd f7,80(r30)
|
||||
lfd f8,88(r30)
|
||||
|
||||
lwz r3,8(r31) # r3 <= that
|
||||
lwz r4,12(r31) # r4 <= methodIndex
|
||||
lwz r5,0(r3) # r5 <= vtable ( == *that )
|
||||
slwi r4,r4,3 # convert to offset ( *= 8 )
|
||||
addi r4,r4,8 # skip first two vtable entries
|
||||
add r4,r4,r5
|
||||
lhz r0,0(r4) # virtual base offset
|
||||
extsh r0,r0
|
||||
add r3,r3,r0
|
||||
lwz r0,4(r4) # r0 <= methodpointer ( == vtable + offset )
|
||||
|
||||
lwz r4,4(r30) # load GP regs with method parameters
|
||||
lwz r5,8(r30)
|
||||
lwz r6,12(r30)
|
||||
lwz r7,16(r30)
|
||||
lwz r8,20(r30)
|
||||
lwz r9,24(r30)
|
||||
lwz r10,28(r30)
|
||||
|
||||
mtlr r0 # copy methodpointer to LR
|
||||
blrl # call method
|
||||
|
||||
lwz r30,16(r31) # restore r30 & r31
|
||||
lwz r31,20(r31)
|
||||
|
||||
lwz r11,0(sp) # clean up the stack
|
||||
lwz r0,4(r11)
|
||||
mtlr r0
|
||||
mr sp,r11
|
||||
blr
|
||||
|
|
@ -1,130 +0,0 @@
|
|||
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
|
||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
|
||||
/* Platform specific code to invoke XPCOM methods on native objects */
|
||||
|
||||
#include "xptcprivate.h"
|
||||
|
||||
// Remember that these 'words' are 32bit DWORDS
|
||||
|
||||
extern "C" {
|
||||
static uint32_t
|
||||
invoke_count_words(uint32_t paramCount, nsXPTCVariant* s)
|
||||
{
|
||||
uint32_t result = 0;
|
||||
for(uint32_t i = 0; i < paramCount; i++, s++)
|
||||
{
|
||||
if(s->IsPtrData())
|
||||
{
|
||||
result++;
|
||||
continue;
|
||||
}
|
||||
switch(s->type)
|
||||
{
|
||||
case nsXPTType::T_I8 :
|
||||
case nsXPTType::T_I16 :
|
||||
case nsXPTType::T_I32 :
|
||||
result++;
|
||||
break;
|
||||
case nsXPTType::T_I64 :
|
||||
result+=2;
|
||||
break;
|
||||
case nsXPTType::T_U8 :
|
||||
case nsXPTType::T_U16 :
|
||||
case nsXPTType::T_U32 :
|
||||
result++;
|
||||
break;
|
||||
case nsXPTType::T_U64 :
|
||||
result+=2;
|
||||
break;
|
||||
case nsXPTType::T_FLOAT :
|
||||
result++;
|
||||
break;
|
||||
case nsXPTType::T_DOUBLE :
|
||||
result+=2;
|
||||
break;
|
||||
case nsXPTType::T_BOOL :
|
||||
case nsXPTType::T_CHAR :
|
||||
case nsXPTType::T_WCHAR :
|
||||
result++;
|
||||
break;
|
||||
default:
|
||||
// all the others are plain pointer types
|
||||
result++;
|
||||
break;
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
void
|
||||
invoke_copy_to_stack(uint32_t* d, uint32_t paramCount, nsXPTCVariant* s)
|
||||
{
|
||||
for(uint32_t i = 0; i < paramCount; i++, d++, s++)
|
||||
{
|
||||
if(s->IsPtrData())
|
||||
{
|
||||
*((void**)d) = s->ptr;
|
||||
continue;
|
||||
}
|
||||
switch(s->type)
|
||||
{
|
||||
// 8 and 16 bit types should be promoted to 32 bits when copying
|
||||
// onto the stack.
|
||||
case nsXPTType::T_I8 : *((uint32_t*)d) = s->val.i8; break;
|
||||
case nsXPTType::T_I16 : *((uint32_t*)d) = s->val.i16; break;
|
||||
case nsXPTType::T_I32 : *((int32_t*) d) = s->val.i32; break;
|
||||
case nsXPTType::T_I64 : *((int64_t*) d) = s->val.i64; d++; break;
|
||||
case nsXPTType::T_U8 : *((uint32_t*)d) = s->val.u8; break;
|
||||
case nsXPTType::T_U16 : *((uint32_t*)d) = s->val.u16; break;
|
||||
case nsXPTType::T_U32 : *((uint32_t*)d) = s->val.u32; break;
|
||||
case nsXPTType::T_U64 : *((uint64_t*)d) = s->val.u64; d++; break;
|
||||
case nsXPTType::T_FLOAT : *((float*) d) = s->val.f; break;
|
||||
case nsXPTType::T_DOUBLE : *((double*) d) = s->val.d; d++; break;
|
||||
case nsXPTType::T_BOOL : *((uint32_t*)d) = s->val.b; break;
|
||||
case nsXPTType::T_CHAR : *((uint32_t*)d) = s->val.c; break;
|
||||
case nsXPTType::T_WCHAR : *((wchar_t*) d) = s->val.wc; break;
|
||||
|
||||
default:
|
||||
// all the others are plain pointer types
|
||||
*((void**)d) = s->val.p;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
EXPORT_XPCOM_API(nsresult)
|
||||
NS_InvokeByIndex(nsISupports* that, uint32_t methodIndex,
|
||||
uint32_t paramCount, nsXPTCVariant* params)
|
||||
{
|
||||
uint32_t result, n;
|
||||
|
||||
n = invoke_count_words(paramCount, params) * 4;
|
||||
|
||||
__asm__ __volatile__(
|
||||
"subl %5, %%sp\n\t" /* make room for params */
|
||||
"movel %4, %%sp@-\n\t"
|
||||
"movel %3, %%sp@-\n\t"
|
||||
"pea %%sp@(8)\n\t"
|
||||
"jbsr invoke_copy_to_stack\n\t" /* copy params */
|
||||
"addw #12, %%sp\n\t"
|
||||
"movel %1, %%sp@-\n\t"
|
||||
"movel %1@, %%a0\n\t"
|
||||
"movel %%a0@(%2:l:4), %%a0\n\t"
|
||||
"jbsr %%a0@\n\t" /* safe to not cleanup sp */
|
||||
"lea %%sp@(4,%5:l), %%sp\n\t"
|
||||
"movel %%d0, %0"
|
||||
: "=d" (result) /* %0 */
|
||||
: "a" (that), /* %1 */
|
||||
"d" (methodIndex), /* %2 */
|
||||
"g" (paramCount), /* %3 */
|
||||
"g" (params), /* %4 */
|
||||
"d" (n) /* %5 */
|
||||
: "a0", "a1", "d0", "d1", "memory"
|
||||
);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
|
@ -1,143 +0,0 @@
|
|||
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
|
||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
|
||||
/* Platform specific code to invoke XPCOM methods on native objects */
|
||||
|
||||
#include "xptcprivate.h"
|
||||
|
||||
// Remember that these 'words' are 32bit DWORDS
|
||||
|
||||
#if !defined(__NetBSD__) || !defined(__m68k__)
|
||||
#error This code is for NetBSD/m68k only
|
||||
#endif
|
||||
|
||||
extern "C" {
|
||||
static uint32_t
|
||||
invoke_count_words(uint32_t paramCount, nsXPTCVariant* s)
|
||||
{
|
||||
uint32_t result = 0;
|
||||
for(uint32_t i = 0; i < paramCount; i++, s++)
|
||||
{
|
||||
if(s->IsPtrData())
|
||||
{
|
||||
result++;
|
||||
continue;
|
||||
}
|
||||
switch(s->type)
|
||||
{
|
||||
case nsXPTType::T_I8 :
|
||||
case nsXPTType::T_I16 :
|
||||
case nsXPTType::T_I32 :
|
||||
result++;
|
||||
break;
|
||||
case nsXPTType::T_I64 :
|
||||
result+=2;
|
||||
break;
|
||||
case nsXPTType::T_U8 :
|
||||
case nsXPTType::T_U16 :
|
||||
case nsXPTType::T_U32 :
|
||||
result++;
|
||||
break;
|
||||
case nsXPTType::T_U64 :
|
||||
result+=2;
|
||||
break;
|
||||
case nsXPTType::T_FLOAT :
|
||||
result++;
|
||||
break;
|
||||
case nsXPTType::T_DOUBLE :
|
||||
result+=2;
|
||||
break;
|
||||
case nsXPTType::T_BOOL :
|
||||
case nsXPTType::T_CHAR :
|
||||
case nsXPTType::T_WCHAR :
|
||||
result++;
|
||||
break;
|
||||
default:
|
||||
// all the others are plain pointer types
|
||||
result++;
|
||||
break;
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
static void
|
||||
invoke_copy_to_stack(uint32_t* d, uint32_t paramCount, nsXPTCVariant* s)
|
||||
{
|
||||
for(uint32_t i = 0; i < paramCount; i++, d++, s++)
|
||||
{
|
||||
if(s->IsPtrData())
|
||||
{
|
||||
*((void**)d) = s->ptr;
|
||||
continue;
|
||||
}
|
||||
switch(s->type)
|
||||
{
|
||||
// 8 and 16 bit types should be promoted to 32 bits when copying
|
||||
// onto the stack.
|
||||
case nsXPTType::T_I8 : *((uint32_t*)d) = s->val.i8; break;
|
||||
case nsXPTType::T_I16 : *((uint32_t*)d) = s->val.i16; break;
|
||||
case nsXPTType::T_I32 : *((int32_t*) d) = s->val.i32; break;
|
||||
case nsXPTType::T_I64 : *((int64_t*) d) = s->val.i64; d++; break;
|
||||
case nsXPTType::T_U8 : *((uint32_t*)d) = s->val.u8; break;
|
||||
case nsXPTType::T_U16 : *((uint32_t*)d) = s->val.u16; break;
|
||||
case nsXPTType::T_U32 : *((uint32_t*)d) = s->val.u32; break;
|
||||
case nsXPTType::T_U64 : *((uint64_t*)d) = s->val.u64; d++; break;
|
||||
case nsXPTType::T_FLOAT : *((float*) d) = s->val.f; break;
|
||||
case nsXPTType::T_DOUBLE : *((double*) d) = s->val.d; d++; break;
|
||||
case nsXPTType::T_BOOL : *((uint32_t*)d) = s->val.b; break;
|
||||
case nsXPTType::T_CHAR : *((uint32_t*)d) = s->val.c; break;
|
||||
// wchar_t is an int (32 bits) on NetBSD
|
||||
case nsXPTType::T_WCHAR : *((wchar_t*) d) = s->val.wc; break;
|
||||
default:
|
||||
// all the others are plain pointer types
|
||||
*((void**)d) = s->val.p;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
XPTC_PUBLIC_API(nsresult)
|
||||
XPTC_InvokeByIndex(nsISupports* that, uint32_t methodIndex,
|
||||
uint32_t paramCount, nsXPTCVariant* params)
|
||||
{
|
||||
uint32_t result;
|
||||
|
||||
__asm__ __volatile__(
|
||||
"movl %4, sp@-\n\t"
|
||||
"movl %3, sp@-\n\t"
|
||||
"jbsr _invoke_count_words\n\t" /* count words */
|
||||
"addql #8, sp\n\t"
|
||||
"lsll #2, d0\n\t" /* *= 4 */
|
||||
"movl sp, a2\n\t" /* save original sp */
|
||||
"subl d0, sp\n\t" /* make room for params */
|
||||
"movl sp, a0\n\t"
|
||||
"movl %4, sp@-\n\t"
|
||||
"movl %3, sp@-\n\t"
|
||||
"movl a0, sp@-\n\t"
|
||||
"jbsr _invoke_copy_to_stack\n\t" /* copy params */
|
||||
"addl #12, sp\n\t"
|
||||
"movl %1, a0\n\t"
|
||||
"movl a0@, a1\n\t"
|
||||
"movl %2, d0\n\t" /* function index */
|
||||
"movl a0, d1\n\t"
|
||||
"movw a1@(8,d0:l:8), a0\n\t"
|
||||
"addl a0, d1\n\t"
|
||||
"movl a1@(12,d0:l:8), a1\n\t"
|
||||
"movl d1, sp@-\n\t"
|
||||
"jbsr a1@\n\t"
|
||||
"movl a2, sp\n\t" /* restore original sp */
|
||||
"movl d0, %0\n\t"
|
||||
: "=g" (result) /* %0 */
|
||||
: "g" (that), /* %1 */
|
||||
"g" (methodIndex), /* %2 */
|
||||
"g" (paramCount), /* %3 */
|
||||
"g" (params) /* %4 */
|
||||
: "a0", "a1", "a2", "d0", "d1", "memory"
|
||||
);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
|
@ -1,115 +0,0 @@
|
|||
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
|
||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
|
||||
// Platform specific code to invoke XPCOM methods on native objects
|
||||
|
||||
// The purpose of XPTC_InvokeByIndex() is to map a platform
|
||||
// indepenpent call to the platform ABI. To do that,
|
||||
// XPTC_InvokeByIndex() has to determine the method to call via vtable
|
||||
// access. The parameters for the method are read from the
|
||||
// nsXPTCVariant* and prepared for the native ABI. For the Linux/PPC
|
||||
// ABI this means that the first 8 integral and floating point
|
||||
// parameters are passed in registers.
|
||||
|
||||
#include "xptcprivate.h"
|
||||
|
||||
// 8 integral parameters are passed in registers
|
||||
#define GPR_COUNT 8
|
||||
|
||||
// 8 floating point parameters are passed in registers, floats are
|
||||
// promoted to doubles when passed in registers
|
||||
#define FPR_COUNT 8
|
||||
|
||||
extern "C" uint32_t
|
||||
invoke_count_words(uint32_t paramCount, nsXPTCVariant* s)
|
||||
{
|
||||
return uint32_t(((paramCount * 2) + 3) & ~3);
|
||||
}
|
||||
|
||||
extern "C" void
|
||||
invoke_copy_to_stack(uint32_t* d,
|
||||
uint32_t paramCount,
|
||||
nsXPTCVariant* s,
|
||||
uint32_t* gpregs,
|
||||
double* fpregs)
|
||||
{
|
||||
uint32_t gpr = 1; // skip one GP reg for 'that'
|
||||
uint32_t fpr = 0;
|
||||
uint32_t tempu32;
|
||||
uint64_t tempu64;
|
||||
|
||||
for(uint32_t i = 0; i < paramCount; i++, s++) {
|
||||
if(s->IsPtrData()) {
|
||||
if(s->type == nsXPTType::T_JSVAL)
|
||||
tempu32 = (uint32_t) &(s->ptr);
|
||||
else
|
||||
tempu32 = (uint32_t) s->ptr;
|
||||
} else {
|
||||
switch(s->type) {
|
||||
case nsXPTType::T_FLOAT: break;
|
||||
case nsXPTType::T_DOUBLE: break;
|
||||
case nsXPTType::T_I8: tempu32 = s->val.i8; break;
|
||||
case nsXPTType::T_I16: tempu32 = s->val.i16; break;
|
||||
case nsXPTType::T_I32: tempu32 = s->val.i32; break;
|
||||
case nsXPTType::T_I64: tempu64 = s->val.i64; break;
|
||||
case nsXPTType::T_U8: tempu32 = s->val.u8; break;
|
||||
case nsXPTType::T_U16: tempu32 = s->val.u16; break;
|
||||
case nsXPTType::T_U32: tempu32 = s->val.u32; break;
|
||||
case nsXPTType::T_U64: tempu64 = s->val.u64; break;
|
||||
case nsXPTType::T_BOOL: tempu32 = s->val.b; break;
|
||||
case nsXPTType::T_CHAR: tempu32 = s->val.c; break;
|
||||
case nsXPTType::T_WCHAR: tempu32 = s->val.wc; break;
|
||||
default: tempu32 = (uint32_t) s->val.p; break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!s->IsPtrData() && s->type == nsXPTType::T_DOUBLE) {
|
||||
if (fpr < FPR_COUNT)
|
||||
fpregs[fpr++] = s->val.d;
|
||||
else {
|
||||
if ((uint32_t) d & 4) d++; // doubles are 8-byte aligned on stack
|
||||
*((double*) d) = s->val.d;
|
||||
d += 2;
|
||||
if (gpr < GPR_COUNT)
|
||||
gpr += 2;
|
||||
}
|
||||
}
|
||||
else if (!s->IsPtrData() && s->type == nsXPTType::T_FLOAT) {
|
||||
if (fpr < FPR_COUNT)
|
||||
fpregs[fpr++] = s->val.f; // if passed in registers, floats are promoted to doubles
|
||||
else {
|
||||
*((float*) d) = s->val.f;
|
||||
d += 1;
|
||||
if (gpr < GPR_COUNT)
|
||||
gpr += 1;
|
||||
}
|
||||
}
|
||||
else if (!s->IsPtrData() && (s->type == nsXPTType::T_I64
|
||||
|| s->type == nsXPTType::T_U64)) {
|
||||
if ((gpr + 1) < GPR_COUNT) {
|
||||
if (gpr & 1) gpr++; // longlongs are aligned in odd/even register pairs, eg. r5/r6
|
||||
*((uint64_t*) &gpregs[gpr]) = tempu64;
|
||||
gpr += 2;
|
||||
}
|
||||
else {
|
||||
if ((uint32_t) d & 4) d++; // longlongs are 8-byte aligned on stack
|
||||
*((uint64_t*) d) = tempu64;
|
||||
d += 2;
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (gpr < GPR_COUNT)
|
||||
gpregs[gpr++] = tempu32;
|
||||
else
|
||||
*d++ = tempu32;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
extern "C"
|
||||
XPTC_PUBLIC_API(nsresult)
|
||||
XPTC_InvokeByIndex(nsISupports* that, uint32_t methodIndex,
|
||||
uint32_t paramCount, nsXPTCVariant* params);
|
||||
|
|
@ -1,70 +0,0 @@
|
|||
# -*- Mode: Asm -*-
|
||||
#
|
||||
# This Source Code Form is subject to the terms of the Mozilla Public
|
||||
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||
|
||||
.set r0,0; .set sp,1; .set RTOC,2; .set r3,3; .set r4,4
|
||||
.set r5,5; .set r6,6; .set r7,7; .set r8,8; .set r9,9
|
||||
.set r10,10; .set r11,11; .set r12,12; .set r13,13; .set r14,14
|
||||
.set r15,15; .set r16,16; .set r17,17; .set r18,18; .set r19,19
|
||||
.set r20,20; .set r21,21; .set r22,22; .set r23,23; .set r24,24
|
||||
.set r25,25; .set r26,26; .set r27,27; .set r28,28; .set r29,29
|
||||
.set r30,30; .set r31,31
|
||||
.set f0,0; .set f1,1; .set f2,2; .set f3,3; .set f4,4
|
||||
.set f5,5; .set f6,6; .set f7,7; .set f8,8; .set f9,9
|
||||
.set f10,10; .set f11,11; .set f12,12; .set f13,13; .set f14,14
|
||||
.set f15,15; .set f16,16; .set f17,17; .set f18,18; .set f19,19
|
||||
.set f20,20; .set f21,21; .set f22,22; .set f23,23; .set f24,24
|
||||
.set f25,25; .set f26,26; .set f27,27; .set f28,28; .set f29,29
|
||||
.set f30,30; .set f31,31
|
||||
|
||||
.section ".text"
|
||||
.align 2
|
||||
.globl SharedStub
|
||||
.type SharedStub,@function
|
||||
|
||||
SharedStub:
|
||||
stwu sp,-112(sp) # room for
|
||||
# linkage (8),
|
||||
# gprData (32),
|
||||
# fprData (64),
|
||||
# stack alignment(8)
|
||||
mflr r0
|
||||
stw r0,116(sp) # save LR backchain
|
||||
|
||||
stw r4,12(sp) # save GP registers
|
||||
stw r5,16(sp) # (n.b. that we don't save r3
|
||||
stw r6,20(sp) # because PrepareAndDispatch() is savvy)
|
||||
stw r7,24(sp)
|
||||
stw r8,28(sp)
|
||||
stw r9,32(sp)
|
||||
stw r10,36(sp)
|
||||
|
||||
stfd f1,40(sp) # save FP registers
|
||||
stfd f2,48(sp)
|
||||
stfd f3,56(sp)
|
||||
stfd f4,64(sp)
|
||||
stfd f5,72(sp)
|
||||
stfd f6,80(sp)
|
||||
stfd f7,88(sp)
|
||||
stfd f8,96(sp)
|
||||
|
||||
# r3 has the 'self' pointer already
|
||||
|
||||
mr r4,r11 # r4 <= methodIndex selector, passed
|
||||
# via r11 in the nsXPTCStubBase::StubXX() call
|
||||
|
||||
addi r5,sp,120 # r5 <= pointer to callers args area,
|
||||
# beyond r3-r10/f1-f8 mapped range
|
||||
|
||||
addi r6,sp,8 # r6 <= gprData
|
||||
addi r7,sp,40 # r7 <= fprData
|
||||
|
||||
bl PrepareAndDispatch@local # Go!
|
||||
|
||||
lwz r0,116(sp) # restore LR
|
||||
mtlr r0
|
||||
la sp,112(sp) # clean up the stack
|
||||
blr
|
||||
|
||||
|
|
@ -1,102 +0,0 @@
|
|||
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
|
||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
|
||||
/* Implement shared vtbl methods. */
|
||||
|
||||
#include "xptcprivate.h"
|
||||
|
||||
extern "C" {
|
||||
nsresult ATTRIBUTE_USED
|
||||
PrepareAndDispatch(nsXPTCStubBase* self, uint32_t methodIndex, uint32_t* args)
|
||||
{
|
||||
#define PARAM_BUFFER_COUNT 16
|
||||
|
||||
nsXPTCMiniVariant paramBuffer[PARAM_BUFFER_COUNT];
|
||||
nsXPTCMiniVariant* dispatchParams = nullptr;
|
||||
const nsXPTMethodInfo* info;
|
||||
uint8_t paramCount;
|
||||
uint8_t i;
|
||||
|
||||
NS_ASSERTION(self,"no self");
|
||||
|
||||
self->mEntry->GetMethodInfo(uint16_t(methodIndex), &info);
|
||||
NS_ASSERTION(info,"no method info");
|
||||
|
||||
paramCount = info->GetParamCount();
|
||||
|
||||
// setup variant array pointer
|
||||
if(paramCount > PARAM_BUFFER_COUNT)
|
||||
dispatchParams = new nsXPTCMiniVariant[paramCount];
|
||||
else
|
||||
dispatchParams = paramBuffer;
|
||||
NS_ASSERTION(dispatchParams,"no place for params");
|
||||
|
||||
const uint8_t indexOfJSContext = info->IndexOfJSContext();
|
||||
|
||||
uint32_t* ap = args;
|
||||
for(i = 0; i < paramCount; i++, ap++)
|
||||
{
|
||||
const nsXPTParamInfo& param = info->GetParam(i);
|
||||
const nsXPTType& type = param.GetType();
|
||||
nsXPTCMiniVariant* dp = &dispatchParams[i];
|
||||
|
||||
if (i == indexOfJSContext)
|
||||
ap++;
|
||||
|
||||
if(param.IsOut() || !type.IsArithmetic())
|
||||
{
|
||||
dp->val.p = (void*) *ap;
|
||||
continue;
|
||||
}
|
||||
|
||||
switch(type)
|
||||
{
|
||||
// the 8 and 16 bit types will have been promoted to 32 bits before
|
||||
// being pushed onto the stack. Since the 68k is big endian, we
|
||||
// need to skip over the leading high order bytes.
|
||||
case nsXPTType::T_I8 : dp->val.i8 = *(((int8_t*) ap) + 3); break;
|
||||
case nsXPTType::T_I16 : dp->val.i16 = *(((int16_t*) ap) + 1); break;
|
||||
case nsXPTType::T_I32 : dp->val.i32 = *((int32_t*) ap); break;
|
||||
case nsXPTType::T_I64 : dp->val.i64 = *((int64_t*) ap); ap++; break;
|
||||
case nsXPTType::T_U8 : dp->val.u8 = *(((uint8_t*) ap) + 3); break;
|
||||
case nsXPTType::T_U16 : dp->val.u16 = *(((uint16_t*)ap) + 1); break;
|
||||
case nsXPTType::T_U32 : dp->val.u32 = *((uint32_t*)ap); break;
|
||||
case nsXPTType::T_U64 : dp->val.u64 = *((uint64_t*)ap); ap++; break;
|
||||
case nsXPTType::T_FLOAT : dp->val.f = *((float*) ap); break;
|
||||
case nsXPTType::T_DOUBLE : dp->val.d = *((double*) ap); ap++; break;
|
||||
case nsXPTType::T_BOOL : dp->val.b = *((uint32_t* ap); break;
|
||||
case nsXPTType::T_CHAR : dp->val.c = *(((char*) ap) + 3); break;
|
||||
case nsXPTType::T_WCHAR : dp->val.wc = *((wchar_t*) ap); break;
|
||||
default:
|
||||
NS_ERROR("bad type");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
nsresult result = self->mOuter->CallMethod((uint16_t)methodIndex, info,
|
||||
dispatchParams);
|
||||
|
||||
if(dispatchParams != paramBuffer)
|
||||
delete [] dispatchParams;
|
||||
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
#define STUB_ENTRY(n) \
|
||||
nsresult nsXPTCStubBase::Stub##n() \
|
||||
{ \
|
||||
void *frame = __builtin_frame_address(0); \
|
||||
return PrepareAndDispatch(this, n, (uint32_t*)frame + 3); \
|
||||
}
|
||||
|
||||
#define SENTINEL_ENTRY(n) \
|
||||
nsresult nsXPTCStubBase::Sentinel##n() \
|
||||
{ \
|
||||
NS_ERROR("nsXPTCStubBase::Sentinel called"); \
|
||||
return NS_ERROR_NOT_IMPLEMENTED; \
|
||||
}
|
||||
|
||||
#include "xptcstubsdef.inc"
|
||||
|
|
@ -1,113 +0,0 @@
|
|||
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
|
||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
|
||||
/* Implement shared vtbl methods. */
|
||||
|
||||
#include "xptcprivate.h"
|
||||
|
||||
#if !defined(__NetBSD__) || !defined(__m68k__)
|
||||
#error This code is for NetBSD/m68k only
|
||||
#endif
|
||||
|
||||
extern "C" {
|
||||
static nsresult ATTRIBUTE_USED
|
||||
PrepareAndDispatch(nsXPTCStubBase* self, uint32_t methodIndex, uint32_t* args)
|
||||
{
|
||||
#define PARAM_BUFFER_COUNT 16
|
||||
|
||||
nsXPTCMiniVariant paramBuffer[PARAM_BUFFER_COUNT];
|
||||
nsXPTCMiniVariant* dispatchParams = nullptr;
|
||||
const nsXPTInterfaceInfo* iface_info = nullptr;
|
||||
const nsXPTMethodInfo* info;
|
||||
uint8_t paramCount;
|
||||
uint8_t i;
|
||||
|
||||
NS_ASSERTION(self,"no self");
|
||||
|
||||
self->GetInterfaceInfo(&iface_info);
|
||||
NS_ASSERTION(iface_info,"no interface info");
|
||||
|
||||
iface_info->GetMethodInfo(uint16_t(methodIndex), &info);
|
||||
NS_ASSERTION(info,"no interface info");
|
||||
|
||||
paramCount = info->GetParamCount();
|
||||
|
||||
// setup variant array pointer
|
||||
if(paramCount > PARAM_BUFFER_COUNT)
|
||||
dispatchParams = new nsXPTCMiniVariant[paramCount];
|
||||
else
|
||||
dispatchParams = paramBuffer;
|
||||
NS_ASSERTION(dispatchParams,"no place for params");
|
||||
|
||||
uint32_t* ap = args;
|
||||
for(i = 0; i < paramCount; i++, ap++)
|
||||
{
|
||||
const nsXPTParamInfo& param = info->GetParam(i);
|
||||
const nsXPTType& type = param.GetType();
|
||||
nsXPTCMiniVariant* dp = &dispatchParams[i];
|
||||
|
||||
if(param.IsOut() || !type.IsArithmetic())
|
||||
{
|
||||
dp->val.p = (void*) *ap;
|
||||
continue;
|
||||
}
|
||||
|
||||
switch(type)
|
||||
{
|
||||
// the 8 and 16 bit types will have been promoted to 32 bits before
|
||||
// being pushed onto the stack. Since the 68k is big endian, we
|
||||
// need to skip over the leading high order bytes.
|
||||
case nsXPTType::T_I8 : dp->val.i8 = *(((int8_t*) ap) + 3); break;
|
||||
case nsXPTType::T_I16 : dp->val.i16 = *(((int16_t*) ap) + 1); break;
|
||||
case nsXPTType::T_I32 : dp->val.i32 = *((int32_t*) ap); break;
|
||||
case nsXPTType::T_I64 : dp->val.i64 = *((int64_t*) ap); ap++; break;
|
||||
case nsXPTType::T_U8 : dp->val.u8 = *(((uint8_t*) ap) + 3); break;
|
||||
case nsXPTType::T_U16 : dp->val.u16 = *(((uint16_t*)ap) + 1); break;
|
||||
case nsXPTType::T_U32 : dp->val.u32 = *((uint32_t*)ap); break;
|
||||
case nsXPTType::T_U64 : dp->val.u64 = *((uint64_t*)ap); ap++; break;
|
||||
case nsXPTType::T_FLOAT : dp->val.f = *((float*) ap); break;
|
||||
case nsXPTType::T_DOUBLE : dp->val.d = *((double*) ap); ap++; break;
|
||||
case nsXPTType::T_BOOL : dp->val.b = *(((char*) ap) + 3); break;
|
||||
case nsXPTType::T_CHAR : dp->val.c = *(((char*) ap) + 3); break;
|
||||
// wchar_t is an int (32 bits) on NetBSD
|
||||
case nsXPTType::T_WCHAR : dp->val.wc = *((wchar_t*) ap); break;
|
||||
default:
|
||||
NS_ERROR("bad type");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
nsresult result = self->CallMethod((uint16_t)methodIndex, info,
|
||||
dispatchParams);
|
||||
|
||||
if(dispatchParams != paramBuffer)
|
||||
delete [] dispatchParams;
|
||||
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
#define STUB_ENTRY(n) \
|
||||
__asm__( \
|
||||
".global _Stub"#n"__14nsXPTCStubBase\n\t" \
|
||||
"_Stub"#n"__14nsXPTCStubBase:\n\t" \
|
||||
"link a6,#0 \n\t" \
|
||||
"lea a6@(12), a0 \n\t" /* pointer to args */ \
|
||||
"movl a0, sp@- \n\t" \
|
||||
"movl #"#n", sp@- \n\t" /* method index */ \
|
||||
"movl a6@(8), sp@- \n\t" /* this */ \
|
||||
"jbsr _PrepareAndDispatch \n\t" \
|
||||
"unlk a6 \n\t" \
|
||||
"rts \n\t" \
|
||||
);
|
||||
|
||||
#define SENTINEL_ENTRY(n) \
|
||||
nsresult nsXPTCStubBase::Sentinel##n() \
|
||||
{ \
|
||||
NS_ERROR("nsXPTCStubBase::Sentinel called"); \
|
||||
return NS_ERROR_NOT_IMPLEMENTED; \
|
||||
}
|
||||
|
||||
#include "xptcstubsdef.inc"
|
||||
|
|
@ -1,183 +0,0 @@
|
|||
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
|
||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
|
||||
// Implement shared vtbl methods.
|
||||
|
||||
#include "xptcprivate.h"
|
||||
|
||||
// The Linux/PPC ABI (aka PPC/SYSV ABI) passes the first 8 integral
|
||||
// parameters and the first 8 floating point parameters in registers
|
||||
// (r3-r10 and f1-f8), no stack space is allocated for these by the
|
||||
// caller. The rest of the parameters are passed in the callers stack
|
||||
// area. The stack pointer has to retain 16-byte alignment, longlongs
|
||||
// and doubles are aligned on 8-byte boundaries.
|
||||
|
||||
#define PARAM_BUFFER_COUNT 16
|
||||
#define GPR_COUNT 8
|
||||
#define FPR_COUNT 8
|
||||
|
||||
// PrepareAndDispatch() is called by SharedStub() and calls the actual method.
|
||||
//
|
||||
// - 'args[]' contains the arguments passed on stack
|
||||
// - 'gprData[]' contains the arguments passed in integer registers
|
||||
// - 'fprData[]' contains the arguments passed in floating point registers
|
||||
//
|
||||
// The parameters are mapped into an array of type 'nsXPTCMiniVariant'
|
||||
// and then the method gets called.
|
||||
|
||||
extern "C" nsresult ATTRIBUTE_USED
|
||||
PrepareAndDispatch(nsXPTCStubBase* self,
|
||||
uint32_t methodIndex,
|
||||
uint32_t* args,
|
||||
uint32_t *gprData,
|
||||
double *fprData)
|
||||
{
|
||||
nsXPTCMiniVariant paramBuffer[PARAM_BUFFER_COUNT];
|
||||
nsXPTCMiniVariant* dispatchParams = nullptr;
|
||||
const nsXPTInterfaceInfo* iface_info = nullptr;
|
||||
const nsXPTMethodInfo* info;
|
||||
uint32_t paramCount;
|
||||
uint32_t i;
|
||||
|
||||
NS_ASSERTION(self,"no self");
|
||||
|
||||
self->GetInterfaceInfo(&iface_info);
|
||||
NS_ASSERTION(iface_info,"no interface info");
|
||||
if (! iface_info)
|
||||
return NS_ERROR_UNEXPECTED;
|
||||
|
||||
iface_info->GetMethodInfo(uint16_t(methodIndex), &info);
|
||||
NS_ASSERTION(info,"no method info");
|
||||
if (! info)
|
||||
return NS_ERROR_UNEXPECTED;
|
||||
|
||||
paramCount = info->GetParamCount();
|
||||
|
||||
// setup variant array pointer
|
||||
if(paramCount > PARAM_BUFFER_COUNT)
|
||||
dispatchParams = new nsXPTCMiniVariant[paramCount];
|
||||
else
|
||||
dispatchParams = paramBuffer;
|
||||
|
||||
NS_ASSERTION(dispatchParams,"no place for params");
|
||||
if (! dispatchParams)
|
||||
return NS_ERROR_OUT_OF_MEMORY;
|
||||
|
||||
uint32_t* ap = args;
|
||||
uint32_t gpr = 1; // skip one GPR register
|
||||
uint32_t fpr = 0;
|
||||
uint32_t tempu32;
|
||||
uint64_t tempu64;
|
||||
|
||||
for(i = 0; i < paramCount; i++) {
|
||||
const nsXPTParamInfo& param = info->GetParam(i);
|
||||
const nsXPTType& type = param.GetType();
|
||||
nsXPTCMiniVariant* dp = &dispatchParams[i];
|
||||
|
||||
if (!param.IsOut() && type == nsXPTType::T_DOUBLE) {
|
||||
if (fpr < FPR_COUNT)
|
||||
dp->val.d = fprData[fpr++];
|
||||
else {
|
||||
if ((uint32_t) ap & 4) ap++; // doubles are 8-byte aligned on stack
|
||||
dp->val.d = *(double*) ap;
|
||||
ap += 2;
|
||||
if (gpr < GPR_COUNT)
|
||||
gpr += 2;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
else if (!param.IsOut() && type == nsXPTType::T_FLOAT) {
|
||||
if (fpr < FPR_COUNT)
|
||||
dp->val.f = (float) fprData[fpr++]; // in registers floats are passed as doubles
|
||||
else {
|
||||
dp->val.f = *(float*) ap;
|
||||
ap += 1;
|
||||
if (gpr < GPR_COUNT)
|
||||
gpr += 1;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
else if (!param.IsOut() && (type == nsXPTType::T_I64
|
||||
|| type == nsXPTType::T_U64)) {
|
||||
if (gpr & 1) gpr++; // longlongs are aligned in odd/even register pairs, eg. r5/r6
|
||||
if ((gpr + 1) < GPR_COUNT) {
|
||||
tempu64 = *(uint64_t*) &gprData[gpr];
|
||||
gpr += 2;
|
||||
}
|
||||
else {
|
||||
if ((uint32_t) ap & 4) ap++; // longlongs are 8-byte aligned on stack
|
||||
tempu64 = *(uint64_t*) ap;
|
||||
ap += 2;
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (gpr < GPR_COUNT)
|
||||
tempu32 = gprData[gpr++];
|
||||
else
|
||||
tempu32 = *ap++;
|
||||
}
|
||||
|
||||
if(param.IsOut() || !type.IsArithmetic()) {
|
||||
if (type == nsXPTType::T_JSVAL)
|
||||
dp->val.p = *((void**) tempu32);
|
||||
else
|
||||
dp->val.p = (void*) tempu32;
|
||||
continue;
|
||||
}
|
||||
|
||||
switch(type) {
|
||||
case nsXPTType::T_I8: dp->val.i8 = (int8_t) tempu32; break;
|
||||
case nsXPTType::T_I16: dp->val.i16 = (int16_t) tempu32; break;
|
||||
case nsXPTType::T_I32: dp->val.i32 = (int32_t) tempu32; break;
|
||||
case nsXPTType::T_I64: dp->val.i64 = (int64_t) tempu64; break;
|
||||
case nsXPTType::T_U8: dp->val.u8 = (uint8_t) tempu32; break;
|
||||
case nsXPTType::T_U16: dp->val.u16 = (uint16_t) tempu32; break;
|
||||
case nsXPTType::T_U32: dp->val.u32 = (uint32_t) tempu32; break;
|
||||
case nsXPTType::T_U64: dp->val.u64 = (uint64_t) tempu64; break;
|
||||
case nsXPTType::T_BOOL: dp->val.b = (bool) tempu32; break;
|
||||
case nsXPTType::T_CHAR: dp->val.c = (char) tempu32; break;
|
||||
case nsXPTType::T_WCHAR: dp->val.wc = (wchar_t) tempu32; break;
|
||||
|
||||
default:
|
||||
NS_ERROR("bad type");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
nsresult result = self->CallMethod((uint16_t) methodIndex, info,
|
||||
dispatchParams);
|
||||
|
||||
if (dispatchParams != paramBuffer)
|
||||
delete [] dispatchParams;
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
// Load r11 with the constant 'n' and branch to SharedStub().
|
||||
//
|
||||
// XXX Yes, it's ugly that we're relying on gcc's name-mangling here;
|
||||
// however, it's quick, dirty, and'll break when the ABI changes on
|
||||
// us, which is what we want ;-).
|
||||
|
||||
#define STUB_ENTRY(n) \
|
||||
__asm__ ( \
|
||||
".section \".text\" \n\t" \
|
||||
".align 2 \n\t" \
|
||||
".globl Stub"#n"__14nsXPTCStubBase \n\t" \
|
||||
".type Stub"#n"__14nsXPTCStubBase,@function \n\n" \
|
||||
\
|
||||
"Stub"#n"__14nsXPTCStubBase: \n\t" \
|
||||
"li 11,"#n" \n\t" \
|
||||
"b SharedStub@local \n" \
|
||||
);
|
||||
|
||||
#define SENTINEL_ENTRY(n) \
|
||||
nsresult nsXPTCStubBase::Sentinel##n() \
|
||||
{ \
|
||||
NS_ERROR("nsXPTCStubBase::Sentinel called"); \
|
||||
return NS_ERROR_NOT_IMPLEMENTED; \
|
||||
}
|
||||
|
||||
#include "xptcstubsdef.inc"
|
||||
Loading…
Reference in a new issue