]> git.pld-linux.org Git - packages/firefox.git/commitdiff
- just copied mozilla-amd64.patch, builds
authorJakub Bogusz <qboosh@pld-linux.org>
Wed, 12 May 2004 19:18:50 +0000 (19:18 +0000)
committercvs2git <feedback@pld-linux.org>
Sun, 24 Jun 2012 12:13:13 +0000 (12:13 +0000)
Changed files:
    mozilla-firefox-amd64.patch -> 1.1

mozilla-firefox-amd64.patch [new file with mode: 0644]

diff --git a/mozilla-firefox-amd64.patch b/mozilla-firefox-amd64.patch
new file mode 100644 (file)
index 0000000..6c9d30c
--- /dev/null
@@ -0,0 +1,697 @@
+diff -durN mozilla.orig/config/mkdepend/imakemdep.h mozilla/config/mkdepend/imakemdep.h
+--- mozilla.orig/config/mkdepend/imakemdep.h   1998-09-05 06:22:25.000000000 +0200
++++ mozilla/config/mkdepend/imakemdep.h        2005-01-01 01:18:35.345553032 +0100
+@@ -277,6 +277,9 @@
+ # ifdef __i386__
+       "-D__i386__",
+ # endif
++# ifdef __x86_64__
++      "-D__x86_64__",
++# endif
+ # ifdef __GNUC__
+       "-traditional",
+ # endif
+diff -durN mozilla.orig/directory/c-sdk/ldap/libraries/liblber/lber-int.h mozilla/directory/c-sdk/ldap/libraries/liblber/lber-int.h
+--- mozilla.orig/directory/c-sdk/ldap/libraries/liblber/lber-int.h     2002-03-26 22:53:23.000000000 +0100
++++ mozilla/directory/c-sdk/ldap/libraries/liblber/lber-int.h  2005-01-01 01:18:35.344553184 +0100
+@@ -236,23 +236,22 @@
+            (((_l)&0xff0000)>>8) + (((_l)&0xff000000)>>24))
+ #define LBER_NTOHL(_l) LBER_HTONL(_l)
+-#elif !defined(__alpha) || defined(VMS)
++#elif !defined(__x86_64__) && (!defined(__alpha) || defined(VMS))
+ #define LBER_HTONL( l )       htonl( l )
+ #define LBER_NTOHL( l )       ntohl( l )
+ #else /* __alpha */
+ /*
+- * htonl and ntohl on the DEC Alpha under OSF 1 seem to only swap the
+- * lower-order 32-bits of a (64-bit) long, so we define correct versions
+- * here.
++ * htonl and ntohl on the 64-bit UNIX platforms only swap the lower-order
++ * 32-bits of a (64-bit) long, so we define correct versions here.
+  */
+ #define LBER_HTONL( l )       (((long)htonl( (l) & 0x00000000FFFFFFFF )) << 32 \
+                       | htonl( ( (l) & 0xFFFFFFFF00000000 ) >> 32 ))
+ #define LBER_NTOHL( l )       (((long)ntohl( (l) & 0x00000000FFFFFFFF )) << 32 \
+                       | ntohl( ( (l) & 0xFFFFFFFF00000000 ) >> 32 ))
+-#endif /* __alpha */
++#endif /* __alpha || __x86_64__ */
+ /* function prototypes */
+diff -durN mozilla.orig/nsprpub/configure mozilla/nsprpub/configure
+--- mozilla.orig/nsprpub/configure     2003-08-30 02:18:12.000000000 +0200
++++ mozilla/nsprpub/configure  2005-01-01 01:18:35.337554248 +0100
+@@ -3729,6 +3729,9 @@
+     ia64)
+         PR_MD_ASFILES=os_Linux_ia64.s
+         ;;
++    x86_64)
++        PR_MD_ASFILES=os_Linux_x86_64.s
++        ;;
+     m68k)
+         CFLAGS="$CFLAGS -m68020-60"
+         CXXFLAGS="$CXXFLAGS -m68020-60"
+diff -durN mozilla.orig/nsprpub/configure.in mozilla/nsprpub/configure.in
+--- mozilla.orig/nsprpub/configure.in  2003-08-30 02:18:18.000000000 +0200
++++ mozilla/nsprpub/configure.in       2005-01-01 01:18:35.326555920 +0100
+@@ -1218,6 +1218,9 @@
+     ia64)
+         PR_MD_ASFILES=os_Linux_ia64.s
+         ;;
++    x86_64)
++        PR_MD_ASFILES=os_Linux_x86_64.s
++        ;;
+     m68k)
+         CFLAGS="$CFLAGS -m68020-60"
+         CXXFLAGS="$CXXFLAGS -m68020-60"
+diff -durN mozilla.orig/nsprpub/pr/include/md/_linux.cfg mozilla/nsprpub/pr/include/md/_linux.cfg
+--- mozilla.orig/nsprpub/pr/include/md/_linux.cfg      2003-02-27 00:53:38.000000000 +0100
++++ mozilla/nsprpub/pr/include/md/_linux.cfg   2005-01-01 01:18:35.323556376 +0100
+@@ -182,6 +182,52 @@
+ #define PR_BYTES_PER_WORD_LOG2  3
+ #define PR_BYTES_PER_DWORD_LOG2 3
++#elif defined(__x86_64__)
++
++#define IS_LITTLE_ENDIAN 1
++#undef  IS_BIG_ENDIAN
++#define IS_64
++
++#define PR_BYTES_PER_BYTE   1
++#define PR_BYTES_PER_SHORT  2
++#define PR_BYTES_PER_INT    4
++#define PR_BYTES_PER_INT64  8
++#define PR_BYTES_PER_LONG   8
++#define PR_BYTES_PER_FLOAT  4
++#define PR_BYTES_PER_DOUBLE 8
++#define PR_BYTES_PER_WORD   8
++#define PR_BYTES_PER_DWORD  8
++
++#define PR_BITS_PER_BYTE    8
++#define PR_BITS_PER_SHORT   16
++#define PR_BITS_PER_INT     32
++#define PR_BITS_PER_INT64   64
++#define PR_BITS_PER_LONG    64
++#define PR_BITS_PER_FLOAT   32
++#define PR_BITS_PER_DOUBLE  64
++#define PR_BITS_PER_WORD    64
++
++#define PR_BITS_PER_BYTE_LOG2   3
++#define PR_BITS_PER_SHORT_LOG2  4
++#define PR_BITS_PER_INT_LOG2    5
++#define PR_BITS_PER_INT64_LOG2  6
++#define PR_BITS_PER_LONG_LOG2   6
++#define PR_BITS_PER_FLOAT_LOG2  5
++#define PR_BITS_PER_DOUBLE_LOG2 6
++#define PR_BITS_PER_WORD_LOG2   6
++
++#define PR_ALIGN_OF_SHORT   2
++#define PR_ALIGN_OF_INT     4
++#define PR_ALIGN_OF_LONG    8
++#define PR_ALIGN_OF_INT64   8
++#define PR_ALIGN_OF_FLOAT   4
++#define PR_ALIGN_OF_DOUBLE  8
++#define PR_ALIGN_OF_POINTER 8
++#define PR_ALIGN_OF_WORD    8
++
++#define PR_BYTES_PER_WORD_LOG2  3
++#define PR_BYTES_PER_DWORD_LOG2 3
++
+ #elif defined(__mc68000__)
+ #undef  IS_LITTLE_ENDIAN
+diff -durN mozilla.orig/nsprpub/pr/include/md/_linux.h mozilla/nsprpub/pr/include/md/_linux.h
+--- mozilla.orig/nsprpub/pr/include/md/_linux.h        2003-02-27 00:53:39.000000000 +0100
++++ mozilla/nsprpub/pr/include/md/_linux.h     2005-01-01 01:18:35.323556376 +0100
+@@ -49,6 +49,8 @@
+ #define _PR_SI_ARCHITECTURE "alpha"
+ #elif defined(__ia64__)
+ #define _PR_SI_ARCHITECTURE "ia64"
++#elif defined(__x86_64__)
++#define _PR_SI_ARCHITECTURE "x86-64"
+ #elif defined(__mc68000__)
+ #define _PR_SI_ARCHITECTURE "m68k"
+ #elif defined(__sparc__)
+@@ -107,6 +109,19 @@
+ #define _MD_ATOMIC_SET                _PR_ia64_AtomicSet
+ #endif
++#if defined(__x86_64__)
++#define _PR_HAVE_ATOMIC_OPS
++#define _MD_INIT_ATOMIC()
++extern PRInt32 _PR_x86_64_AtomicIncrement(PRInt32 *val);
++#define _MD_ATOMIC_INCREMENT          _PR_x86_64_AtomicIncrement
++extern PRInt32 _PR_x86_64_AtomicDecrement(PRInt32 *val);
++#define _MD_ATOMIC_DECREMENT          _PR_x86_64_AtomicDecrement
++extern PRInt32 _PR_x86_64_AtomicAdd(PRInt32 *ptr, PRInt32 val);
++#define _MD_ATOMIC_ADD                _PR_x86_64_AtomicAdd
++extern PRInt32 _PR_x86_64_AtomicSet(PRInt32 *val, PRInt32 newval);
++#define _MD_ATOMIC_SET                _PR_x86_64_AtomicSet
++#endif
++
+ #define USE_SETJMP
+ #if defined(__GLIBC__) && __GLIBC__ >= 2
+ #define _PR_POLL_AVAILABLE
+diff -durN mozilla.orig/nsprpub/pr/src/io/prprf.c mozilla/nsprpub/pr/src/io/prprf.c
+--- mozilla.orig/nsprpub/pr/src/io/prprf.c     2003-02-27 00:53:42.000000000 +0100
++++ mozilla/nsprpub/pr/src/io/prprf.c  2005-01-01 01:18:35.324556224 +0100
+@@ -51,7 +51,10 @@
+ ** Note: on some platforms va_list is defined as an array,
+ ** and requires array notation.
+ */
+-#if (defined(LINUX) && defined(__powerpc__)) || \
++#if (defined(LINUX) && defined(__x86_64__))
++#include <stdarg.h>
++#define VARARGS_ASSIGN(foo, bar) __va_copy((foo), (bar))
++#elif (defined(LINUX) && defined(__powerpc__)) || \
+     (defined(LINUX) && defined(__s390__)) || \
+     (defined(LINUX) && defined(__s390x__)) || \
+     defined(WIN16) || defined(QNX) || \
+diff -durN mozilla.orig/nsprpub/pr/src/md/unix/os_Linux_x86_64.s mozilla/nsprpub/pr/src/md/unix/os_Linux_x86_64.s
+--- mozilla.orig/nsprpub/pr/src/md/unix/os_Linux_x86_64.s      1970-01-01 01:00:00.000000000 +0100
++++ mozilla/nsprpub/pr/src/md/unix/os_Linux_x86_64.s   2005-01-01 01:18:35.325556072 +0100
+@@ -0,0 +1,91 @@
++/ -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
++/ 
++/ The contents of this file are subject to the Mozilla Public
++/ License Version 1.1 (the "License"); you may not use this file
++/ except in compliance with the License. You may obtain a copy of
++/ the License at http://www.mozilla.org/MPL/
++/ 
++/ Software distributed under the License is distributed on an "AS
++/ IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
++/ implied. See the License for the specific language governing
++/ rights and limitations under the License.
++/ 
++/ The Original Code is the Netscape Portable Runtime (NSPR).
++/ 
++/ The Initial Developer of the Original Code is Netscape
++/ Communications Corporation.  Portions created by Netscape are 
++/ Copyright (C) 2000 Netscape Communications Corporation.  All
++/ Rights Reserved.
++/ 
++/ Contributor(s):
++/ 
++/ Alternatively, the contents of this file may be used under the
++/ terms of the GNU General Public License Version 2 or later (the
++/ "GPL"), in which case the provisions of the GPL are applicable 
++/ instead of those above.  If you wish to allow use of your 
++/ version of this file only under the terms of the GPL and not to
++/ allow others to use your version of this file under the MPL,
++/ indicate your decision by deleting the provisions above and
++/ replace them with the notice and other provisions required by
++/ the GPL.  If you do not delete the provisions above, a recipient
++/ may use your version of this file under either the MPL or the
++/ GPL.
++/ 
++
++/ PRInt32 _PR_x86_64_AtomicIncrement(PRInt32 *val)
++/
++/ Atomically increment the integer pointed to by 'val' and return
++/ the result of the increment.
++/
++    .text
++    .globl _PR_x86_64_AtomicIncrement
++    .align 4
++_PR_x86_64_AtomicIncrement:
++    movl $1, %eax
++    lock
++    xaddl %eax, (%rdi)
++    incl %eax
++    ret
++
++/ PRInt32 _PR_x86_64_AtomicDecrement(PRInt32 *val)
++/
++/ Atomically decrement the integer pointed to by 'val' and return
++/ the result of the decrement.
++/
++    .text
++    .globl _PR_x86_64_AtomicDecrement
++    .align 4
++_PR_x86_64_AtomicDecrement:
++    movl $-1, %eax
++    lock
++    xaddl %eax, (%rdi)
++    decl %eax
++    ret
++
++/ PRInt32 _PR_x86_64_AtomicSet(PRInt32 *val, PRInt32 newval)
++/
++/ Atomically set the integer pointed to by 'val' to the new
++/ value 'newval' and return the old value.
++    .text
++    .globl _PR_x86_64_AtomicSet
++    .align 4
++_PR_x86_64_AtomicSet:
++    movl %esi, %eax
++    lock
++    xchgl %eax, (%rdi)
++    ret
++
++/ PRInt32 _PR_x86_64_AtomicAdd(PRInt32 *ptr, PRInt32 val)
++/
++/ Atomically add 'val' to the integer pointed to by 'ptr'
++/ and return the result of the addition.
++/
++    .text
++    .globl _PR_x86_64_AtomicAdd
++    .align 4
++_PR_x86_64_AtomicAdd:
++    movl %esi, %eax
++    lock
++    xaddl %eax, (%rdi)
++    addl %esi, %eax
++    ret
+diff -durN mozilla.orig/security/coreconf/Linux.mk mozilla/security/coreconf/Linux.mk
+--- mozilla.orig/security/coreconf/Linux.mk    2003-05-01 02:31:20.000000000 +0200
++++ mozilla/security/coreconf/Linux.mk 2005-01-01 01:18:35.344553184 +0100
+@@ -66,6 +66,10 @@
+       OS_REL_CFLAGS   = -DLINUX1_2 -D_XOPEN_SOURCE
+       CPU_ARCH        = ia64
+ else
++ifeq ($(OS_TEST),x86_64)
++      OS_REL_CFLAGS   = -DLINUX1_2 -D_XOPEN_SOURCE
++      CPU_ARCH        = x86_64
++else
+ ifeq ($(OS_TEST),sparc)
+       OS_REL_CFLAGS   = -DLINUX1_2 -D_XOPEN_SOURCE
+       CPU_ARCH        = sparc
+@@ -107,6 +111,7 @@
+ endif
+ endif
+ endif
++endif
+ LIBC_TAG              = _glibc
+diff -durN mozilla.orig/xpcom/reflect/xptcall/src/md/unix/Makefile.in mozilla/xpcom/reflect/xptcall/src/md/unix/Makefile.in
+--- mozilla.orig/xpcom/reflect/xptcall/src/md/unix/Makefile.in 2003-08-15 06:00:23.000000000 +0200
++++ mozilla/xpcom/reflect/xptcall/src/md/unix/Makefile.in      2005-01-01 01:18:35.345553032 +0100
+@@ -55,10 +55,15 @@
+ # Migrate other platforms here after testing
+ #
+ ifneq (,$(filter Linux,$(OS_ARCH)))
++# Linux/x86-64
++ifeq (x86_64,$(OS_TEST))
++CPPSRCS               := xptcinvoke_x86_64_linux.cpp xptcstubs_x86_64_linux.cpp
++else
+ ifeq (86,$(findstring 86,$(OS_TEST)))
+ CPPSRCS               := xptcinvoke_gcc_x86_unix.cpp xptcstubs_gcc_x86_unix.cpp
+ endif
+ endif
++endif
+ # IA64 Linux
+ ifneq (,$(filter Linux,$(OS_ARCH)))
+ ifneq (,$(findstring ia64,$(OS_TEST)))
+diff -durN mozilla.orig/xpcom/reflect/xptcall/src/md/unix/xptcinvoke_x86_64_linux.cpp mozilla/xpcom/reflect/xptcall/src/md/unix/xptcinvoke_x86_64_linux.cpp
+--- mozilla.orig/xpcom/reflect/xptcall/src/md/unix/xptcinvoke_x86_64_linux.cpp 1970-01-01 01:00:00.000000000 +0100
++++ mozilla/xpcom/reflect/xptcall/src/md/unix/xptcinvoke_x86_64_linux.cpp      2005-01-01 01:18:35.346552880 +0100
+@@ -0,0 +1,174 @@
++/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
++// Platform specific code to invoke XPCOM methods on native objects
++
++#include "xptcprivate.h"
++
++// 6 integral parameters are passed in registers
++const PRUint32 GPR_COUNT = 6;
++
++// 8 floating point parameters are passed in SSE registers
++const PRUint32 FPR_COUNT = 8;
++
++// Remember that these 'words' are 64-bit long
++static inline void
++invoke_count_words(PRUint32 paramCount, nsXPTCVariant * s,
++                   PRUint32 & nr_gpr, PRUint32 & nr_fpr, PRUint32 & nr_stack)
++{
++    nr_gpr = 1; // skip one GP register for 'that'
++    nr_fpr = 0;
++    nr_stack = 0;
++
++    /* Compute number of eightbytes of class MEMORY.  */
++    for (uint32 i = 0; i < paramCount; i++, s++) {
++        if (!s->IsPtrData()
++            && (s->type == nsXPTType::T_FLOAT || s->type == nsXPTType::T_DOUBLE)) {
++            if (nr_fpr < FPR_COUNT)
++                nr_fpr++;
++            else
++                nr_stack++;
++        }
++        else {
++            if (nr_gpr < GPR_COUNT)
++                nr_gpr++;
++            else
++                nr_stack++;
++        }
++    }
++}
++
++static void
++invoke_copy_to_stack(PRUint64 * d, PRUint32 paramCount, nsXPTCVariant * s,
++                     PRUint64 * gpregs, double * fpregs)
++{
++    PRUint32 nr_gpr = 1; // skip one GP register for 'that'
++    PRUint32 nr_fpr = 0;
++    PRUint64 value;
++
++    for (uint32 i = 0; i < paramCount; i++, s++) {
++        if (s->IsPtrData())
++            value = (PRUint64) s->ptr;
++        else {
++            switch (s->type) {
++            case nsXPTType::T_FLOAT:                                break;
++            case nsXPTType::T_DOUBLE:                               break;
++            case nsXPTType::T_I8:     value = s->val.i8;            break;
++            case nsXPTType::T_I16:    value = s->val.i16;           break;
++            case nsXPTType::T_I32:    value = s->val.i32;           break;
++            case nsXPTType::T_I64:    value = s->val.i64;           break;
++            case nsXPTType::T_U8:     value = s->val.u8;            break;
++            case nsXPTType::T_U16:    value = s->val.u16;           break;
++            case nsXPTType::T_U32:    value = s->val.u32;           break;
++            case nsXPTType::T_U64:    value = s->val.u64;           break;
++            case nsXPTType::T_BOOL:   value = s->val.b;             break;
++            case nsXPTType::T_CHAR:   value = s->val.c;             break;
++            case nsXPTType::T_WCHAR:  value = s->val.wc;            break;
++            default:                  value = (PRUint64) s->val.p;  break;
++            }
++        }
++
++        if (!s->IsPtrData() && s->type == nsXPTType::T_DOUBLE) {
++            if (nr_fpr < FPR_COUNT)
++                fpregs[nr_fpr++] = s->val.d;
++            else {
++                *((double *)d) = s->val.d;
++                d++;
++            }
++        }
++        else if (!s->IsPtrData() && s->type == nsXPTType::T_FLOAT) {
++            if (nr_fpr < FPR_COUNT)
++                // The value in %xmm register is already prepared to
++                // be retrieved as a float. Therefore, we pass the
++                // value verbatim, as a double without conversion.
++                fpregs[nr_fpr++] = s->val.d;
++            else {
++                *((float *)d) = s->val.f;
++                d++;
++            }
++        }
++        else {
++            if (nr_gpr < GPR_COUNT)
++                gpregs[nr_gpr++] = value;
++            else
++                *d++ = value;
++        }
++    }
++}
++
++extern "C"
++XPTC_PUBLIC_API(nsresult)
++XPTC_InvokeByIndex(nsISupports * that, PRUint32 methodIndex,
++                   PRUint32 paramCount, nsXPTCVariant * params)
++{
++    PRUint32 nr_gpr, nr_fpr, nr_stack;
++    invoke_count_words(paramCount, params, nr_gpr, nr_fpr, nr_stack);
++    
++    // Stack, if used, must be 16-bytes aligned
++    if (nr_stack)
++        nr_stack = (nr_stack + 1) & ~1;
++
++    // Load parameters to stack, if necessary
++    PRUint64 *stack = (PRUint64 *) __builtin_alloca(nr_stack * 8);
++    PRUint64 gpregs[GPR_COUNT];
++    double fpregs[FPR_COUNT];
++    invoke_copy_to_stack(stack, paramCount, params, gpregs, fpregs);
++
++    // Load FPR registers from fpregs[]
++    register double d0 asm("xmm0");
++    register double d1 asm("xmm1");
++    register double d2 asm("xmm2");
++    register double d3 asm("xmm3");
++    register double d4 asm("xmm4");
++    register double d5 asm("xmm5");
++    register double d6 asm("xmm6");
++    register double d7 asm("xmm7");
++
++    switch (nr_fpr) {
++#define ARG_FPR(N) \
++    case N+1: d##N = fpregs[N];
++        ARG_FPR(7);
++        ARG_FPR(6);
++        ARG_FPR(5);
++        ARG_FPR(4);
++        ARG_FPR(3);
++        ARG_FPR(2);
++        ARG_FPR(1);
++        ARG_FPR(0);
++    case 0:;
++#undef ARG_FPR
++    }
++    
++    // Load GPR registers from gpregs[]
++    register PRUint64 a0 asm("rdi");
++    register PRUint64 a1 asm("rsi");
++    register PRUint64 a2 asm("rdx");
++    register PRUint64 a3 asm("rcx");
++    register PRUint64 a4 asm("r8");
++    register PRUint64 a5 asm("r9");
++    
++    switch (nr_gpr) {
++#define ARG_GPR(N) \
++    case N+1: a##N = gpregs[N];
++        ARG_GPR(5);
++        ARG_GPR(4);
++        ARG_GPR(3);
++        ARG_GPR(2);
++        ARG_GPR(1);
++    case 1: a0 = (PRUint64) that;
++    case 0:;
++#undef ARG_GPR
++    }
++
++    // Ensure that assignments to SSE registers won't be optimized away
++    asm("" ::
++        "x" (d0), "x" (d1), "x" (d2), "x" (d3),
++        "x" (d4), "x" (d5), "x" (d6), "x" (d7));
++    
++    // Get pointer to method
++    PRUint64 methodAddress = *((PRUint64 *)that);
++    methodAddress += 8 * methodIndex;
++    methodAddress = *((PRUint64 *)methodAddress);
++    
++    typedef PRUint32 (*Method)(PRUint64, PRUint64, PRUint64, PRUint64, PRUint64, PRUint64);
++    PRUint32 result = ((Method)methodAddress)(a0, a1, a2, a3, a4, a5);
++    return result;
++}
+diff -durN mozilla.orig/xpcom/reflect/xptcall/src/md/unix/xptcstubs_x86_64_linux.cpp mozilla/xpcom/reflect/xptcall/src/md/unix/xptcstubs_x86_64_linux.cpp
+--- mozilla.orig/xpcom/reflect/xptcall/src/md/unix/xptcstubs_x86_64_linux.cpp  1970-01-01 01:00:00.000000000 +0100
++++ mozilla/xpcom/reflect/xptcall/src/md/unix/xptcstubs_x86_64_linux.cpp       2005-01-01 01:18:35.347552728 +0100
+@@ -0,0 +1,206 @@
++/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
++
++// Implement shared vtbl methods.
++
++#include "xptcprivate.h"
++
++// The Linux/x86-64 ABI passes the first 6 integral parameters and the
++// first 8 floating point parameters in registers (rdi, rsi, rdx, rcx,
++// r8, r9 and xmm0-xmm7), no stack space is allocated for these by the
++// caller.  The rest of the parameters are passed in the callers stack
++// area.
++
++const PRUint32 PARAM_BUFFER_COUNT   = 16;
++const PRUint32 GPR_COUNT            = 6;
++const PRUint32 FPR_COUNT            = 8;
++
++// PrepareAndDispatch() is called by SharedStub() and calls the actual method.
++//
++// - 'args[]' contains the arguments passed on stack
++// - 'gpregs[]' contains the arguments passed in integer registers
++// - 'fpregs[]' 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
++PrepareAndDispatch(nsXPTCStubBase * self, PRUint32 methodIndex,
++                   PRUint64 * args, PRUint64 * gpregs, double *fpregs)
++{
++    nsXPTCMiniVariant paramBuffer[PARAM_BUFFER_COUNT];
++    nsXPTCMiniVariant* dispatchParams = NULL;
++    nsIInterfaceInfo* iface_info = NULL;
++    const nsXPTMethodInfo* info;
++    PRUint32 paramCount;
++    PRUint32 i;
++    nsresult result = NS_ERROR_FAILURE;
++
++    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(PRUint16(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;
++
++    PRUint64* ap = args;
++    PRUint32 nr_gpr = 1;    // skip one GPR register for 'that'
++    PRUint32 nr_fpr = 0;
++    PRUint64 value;
++
++    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 (nr_fpr < FPR_COUNT)
++                dp->val.d = fpregs[nr_fpr++];
++            else
++                dp->val.d = *(double*) ap++;
++            continue;
++        }
++        else if (!param.IsOut() && type == nsXPTType::T_FLOAT) {
++            if (nr_fpr < FPR_COUNT)
++                // The value in %xmm register is already prepared to
++                // be retrieved as a float. Therefore, we pass the
++                // value verbatim, as a double without conversion.
++                dp->val.d = *(double*) ap++;
++            else
++                dp->val.f = *(float*) ap++;
++            continue;
++        }
++        else {
++            if (nr_gpr < GPR_COUNT)
++                value = gpregs[nr_gpr++];
++            else
++                value = *ap++;
++        }
++
++        if (param.IsOut() || !type.IsArithmetic()) {
++            dp->val.p = (void*) value;
++            continue;
++        }
++
++        switch (type) {
++        case nsXPTType::T_I8:      dp->val.i8  = (PRInt8)   value; break;
++        case nsXPTType::T_I16:     dp->val.i16 = (PRInt16)  value; break;
++        case nsXPTType::T_I32:     dp->val.i32 = (PRInt32)  value; break;
++        case nsXPTType::T_I64:     dp->val.i64 = (PRInt64)  value; break;
++        case nsXPTType::T_U8:      dp->val.u8  = (PRUint8)  value; break;
++        case nsXPTType::T_U16:     dp->val.u16 = (PRUint16) value; break;
++        case nsXPTType::T_U32:     dp->val.u32 = (PRUint32) value; break;
++        case nsXPTType::T_U64:     dp->val.u64 = (PRUint64) value; break;
++        case nsXPTType::T_BOOL:    dp->val.b   = (PRBool)   value; break;
++        case nsXPTType::T_CHAR:    dp->val.c   = (char)     value; break;
++        case nsXPTType::T_WCHAR:   dp->val.wc  = (wchar_t)  value; break;
++
++        default:
++            NS_ASSERTION(0, "bad type");
++            break;
++        }
++    }
++
++    result = self->CallMethod((PRUint16) methodIndex, info, dispatchParams);
++
++    NS_RELEASE(iface_info);
++
++    if (dispatchParams != paramBuffer)
++        delete [] dispatchParams;
++
++    return result;
++}
++
++#if defined(__GXX_ABI_VERSION) && __GXX_ABI_VERSION >= 100 /* G++ V3 ABI */
++// Linux/x86-64 uses gcc >= 3.1
++#define STUB_ENTRY(n) \
++asm(".section \".text\"\n\t" \
++    ".align   2\n\t" \
++    ".if      " #n " < 10\n\t" \
++    ".globl   _ZN14nsXPTCStubBase5Stub" #n "Ev\n\t" \
++    ".type    _ZN14nsXPTCStubBase5Stub" #n "Ev,@function\n" \
++    "_ZN14nsXPTCStubBase5Stub" #n "Ev:\n\t" \
++    ".elseif  " #n " < 100\n\t" \
++    ".globl   _ZN14nsXPTCStubBase6Stub" #n "Ev\n\t" \
++    ".type    _ZN14nsXPTCStubBase6Stub" #n "Ev,@function\n" \
++    "_ZN14nsXPTCStubBase6Stub" #n "Ev:\n\t" \
++    ".elseif    " #n " < 1000\n\t" \
++    ".globl     _ZN14nsXPTCStubBase7Stub" #n "Ev\n\t" \
++    ".type      _ZN14nsXPTCStubBase7Stub" #n "Ev,@function\n" \
++    "_ZN14nsXPTCStubBase7Stub" #n "Ev:\n\t" \
++    ".else\n\t" \
++    ".err     \"stub number " #n " >= 1000 not yet supported\"\n\t" \
++    ".endif\n\t" \
++    "movl     $" #n ", %eax\n\t" \
++    "jmp      SharedStub\n\t" \
++    ".if      " #n " < 10\n\t" \
++    ".size    _ZN14nsXPTCStubBase5Stub" #n "Ev,.-_ZN14nsXPTCStubBase5Stub" #n "Ev\n\t" \
++    ".elseif  " #n " < 100\n\t" \
++    ".size    _ZN14nsXPTCStubBase6Stub" #n "Ev,.-_ZN14nsXPTCStubBase6Stub" #n "Ev\n\t" \
++    ".else\n\t" \
++    ".size    _ZN14nsXPTCStubBase7Stub" #n "Ev,.-_ZN14nsXPTCStubBase7Stub" #n "Ev\n\t" \
++    ".endif");
++
++// static nsresult SharedStub(PRUint32 methodIndex)
++asm(".section   \".text\"\n\t"
++    ".align     2\n\t"
++    ".type      SharedStub,@function\n\t"
++    "SharedStub:\n\t"
++    // make room for gpregs (48), fpregs (64)
++    "pushq      %rbp\n\t"
++    "movq       %rsp,%rbp\n\t"
++    "subq       $112,%rsp\n\t"
++    // save GP registers
++    "movq       %rdi,-112(%rbp)\n\t"
++    "movq       %rsi,-104(%rbp)\n\t"
++    "movq       %rdx, -96(%rbp)\n\t"
++    "movq       %rcx, -88(%rbp)\n\t"
++    "movq       %r8 , -80(%rbp)\n\t"
++    "movq       %r9 , -72(%rbp)\n\t"
++    "leaq       -112(%rbp),%rcx\n\t"
++    // save FP registers
++    "movsd      %xmm0,-64(%rbp)\n\t"
++    "movsd      %xmm1,-56(%rbp)\n\t"
++    "movsd      %xmm2,-48(%rbp)\n\t"
++    "movsd      %xmm3,-40(%rbp)\n\t"
++    "movsd      %xmm4,-32(%rbp)\n\t"
++    "movsd      %xmm5,-24(%rbp)\n\t"
++    "movsd      %xmm6,-16(%rbp)\n\t"
++    "movsd      %xmm7, -8(%rbp)\n\t"
++    "leaq       -64(%rbp),%r8\n\t"
++    // rdi has the 'self' pointer already
++    "movl       %eax,%esi\n\t"
++    "leaq       16(%rbp),%rdx\n\t"
++    "call       PrepareAndDispatch@plt\n\t"
++    "leave\n\t"
++    "ret\n\t"
++    ".size      SharedStub,.-SharedStub");
++
++#define SENTINEL_ENTRY(n) \
++nsresult nsXPTCStubBase::Sentinel##n() \
++{ \
++    NS_ASSERTION(0,"nsXPTCStubBase::Sentinel called"); \
++    return NS_ERROR_NOT_IMPLEMENTED; \
++}
++
++#include "xptcstubsdef.inc"
++
++#else
++#error "can't find a compiler to use"
++#endif /* __GNUC__ */
This page took 0.074815 seconds and 4 git commands to generate.