1e320db38d
the community-driven continuation of the Mozilla Suite, which is no longer maintained by Mozilla.
84 lines
2.9 KiB
Text
84 lines
2.9 KiB
Text
$NetBSD: patch-bx,v 1.1.1.1 2006/03/30 19:15:50 ghen Exp $
|
|
|
|
--- xpcom/reflect/xptcall/src/md/unix/xptcstubs_ppc_netbsd.cpp.orig 2001-09-28 22:12:53.000000000 +0200
|
|
+++ xpcom/reflect/xptcall/src/md/unix/xptcstubs_ppc_netbsd.cpp
|
|
@@ -119,8 +119,10 @@ PrepareAndDispatch(nsXPTCStubBase* self,
|
|
if ((PRUint32) ap & 4) ap++; // doubles are 8-byte aligned on stack
|
|
dp->val.d = *(double*) ap;
|
|
ap += 2;
|
|
+#if __GXX_ABI_VERSION < 100
|
|
if (gpr < GPR_COUNT)
|
|
gpr += 2;
|
|
+#endif
|
|
}
|
|
continue;
|
|
}
|
|
@@ -130,8 +132,10 @@ PrepareAndDispatch(nsXPTCStubBase* self,
|
|
else {
|
|
dp->val.f = *(float*) ap;
|
|
ap += 1;
|
|
+#if __GXX_ABI_VERSION < 100
|
|
if (gpr < GPR_COUNT)
|
|
gpr += 1;
|
|
+#endif
|
|
}
|
|
continue;
|
|
}
|
|
@@ -195,7 +199,9 @@ PrepareAndDispatch(nsXPTCStubBase* self,
|
|
// however, it's quick, dirty, and'll break when the ABI changes on
|
|
// us, which is what we want ;-).
|
|
|
|
-#define STUB_ENTRY(n) \
|
|
+#if __GXX_ABI_VERSION < 100
|
|
+// gcc-2 version
|
|
+# define STUB_ENTRY(n) \
|
|
__asm__ ( \
|
|
".section \".text\" \n\t" \
|
|
".align 2 \n\t" \
|
|
@@ -206,6 +212,46 @@ __asm__ (
|
|
"li 11,"#n" \n\t" \
|
|
"b SharedStub@local \n" \
|
|
);
|
|
+#else
|
|
+// gcc-3 version
|
|
+//
|
|
+// As G++3 ABI contains the length of the functionname in the mangled
|
|
+// name, it is difficult to get a generic assembler mechanism like
|
|
+// in the G++ 2.95 case.
|
|
+// Create names would be like:
|
|
+// _ZN14nsXPTCStubBase5Stub1Ev
|
|
+// _ZN14nsXPTCStubBase6Stub12Ev
|
|
+// _ZN14nsXPTCStubBase7Stub123Ev
|
|
+// _ZN14nsXPTCStubBase8Stub1234Ev
|
|
+// etc.
|
|
+// Use assembler directives to get the names right...
|
|
+
|
|
+# define STUB_ENTRY(n) \
|
|
+__asm__ ( \
|
|
+ ".align 2 \n\t" \
|
|
+ ".if "#n" < 10 \n\t" \
|
|
+ ".globl _ZN14nsXPTCStubBase5Stub"#n"Ev \n\t" \
|
|
+ ".type _ZN14nsXPTCStubBase5Stub"#n"Ev,@function \n\n" \
|
|
+"_ZN14nsXPTCStubBase5Stub"#n"Ev: \n\t" \
|
|
+ \
|
|
+ ".elseif "#n" < 100 \n\t" \
|
|
+ ".globl _ZN14nsXPTCStubBase6Stub"#n"Ev \n\t" \
|
|
+ ".type _ZN14nsXPTCStubBase6Stub"#n"Ev,@function \n\n" \
|
|
+"_ZN14nsXPTCStubBase6Stub"#n"Ev: \n\t" \
|
|
+ \
|
|
+ ".elseif "#n" < 1000 \n\t" \
|
|
+ ".globl _ZN14nsXPTCStubBase7Stub"#n"Ev \n\t" \
|
|
+ ".type _ZN14nsXPTCStubBase7Stub"#n"Ev,@function \n\n" \
|
|
+"_ZN14nsXPTCStubBase7Stub"#n"Ev: \n\t" \
|
|
+ \
|
|
+ ".else \n\t" \
|
|
+ ".err \"stub number "#n" >= 1000 not yet supported\"\n" \
|
|
+ ".endif \n\t" \
|
|
+ \
|
|
+ "li 11,"#n" \n\t" \
|
|
+ "b SharedStub@local \n" \
|
|
+);
|
|
+#endif
|
|
|
|
#define SENTINEL_ENTRY(n) \
|
|
nsresult nsXPTCStubBase::Sentinel##n() \
|