Skip to content
Projeler
Gruplar
Parçacıklar
Yardım
Yükleniyor...
Oturum aç / Kaydol
Gezinmeyi değiştir
C
core
Proje
Proje
Ayrıntılar
Etkinlik
Cycle Analytics
Depo (repository)
Depo (repository)
Dosyalar
Kayıtlar (commit)
Dallar (branch)
Etiketler
Katkıda bulunanlar
Grafik
Karşılaştır
Grafikler
Konular (issue)
0
Konular (issue)
0
Liste
Pano
Etiketler
Kilometre Taşları
Birleştirme (merge) Talepleri
0
Birleştirme (merge) Talepleri
0
CI / CD
CI / CD
İş akışları (pipeline)
İşler
Zamanlamalar
Grafikler
Paketler
Paketler
Wiki
Wiki
Parçacıklar
Parçacıklar
Üyeler
Üyeler
Collapse sidebar
Close sidebar
Etkinlik
Grafik
Grafikler
Yeni bir konu (issue) oluştur
İşler
Kayıtlar (commit)
Konu (issue) Panoları
Kenar çubuğunu aç
LibreOffice
core
Commits
e29862bc
Kaydet (Commit)
e29862bc
authored
Eyl 22, 2014
tarafından
Tor Lillqvist
Dosyalara gözat
Seçenekler
Dosyalara Gözat
İndir
Eposta Yamaları
Sade Fark
PPC Mac support can go away now (again)
Change-Id: Ie1b2ab13eda584c48aaa0a4a0941f1be451697c1
üst
0ea9722f
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
0 additions
and
1767 deletions
+0
-1767
Library_cpp_uno.mk
bridges/Library_cpp_uno.mk
+0
-6
cpp2uno.cxx
bridges/source/cpp_uno/gcc3_macosx_powerpc/cpp2uno.cxx
+0
-732
except.cxx
bridges/source/cpp_uno/gcc3_macosx_powerpc/except.cxx
+0
-273
share.hxx
bridges/source/cpp_uno/gcc3_macosx_powerpc/share.hxx
+0
-86
uno2cpp.cxx
bridges/source/cpp_uno/gcc3_macosx_powerpc/uno2cpp.cxx
+0
-647
configure.ac
configure.ac
+0
-6
MACOSX_POWERPC_GCC.mk
solenv/gbuild/platform/MACOSX_POWERPC_GCC.mk
+0
-17
No files found.
bridges/Library_cpp_uno.mk
Dosyayı görüntüle @
e29862bc
...
...
@@ -154,12 +154,6 @@ bridge_noncallexception_noopt_objects := callvirtualmethod
bridge_exception_objects := abi cpp2uno except uno2cpp
endif
else ifeq ($(OS)-$(CPUNAME),MACOSX-POWERPC)
bridges_SELECTED_BRIDGE := gcc3_macosx_powerpc
bridge_noopt_objects := uno2cpp
bridge_exception_objects := cpp2uno except
else ifeq ($(OS)-$(CPUNAME),SOLARIS-SPARC)
bridges_SELECTED_BRIDGE := gcc3_solaris_sparc
...
...
bridges/source/cpp_uno/gcc3_macosx_powerpc/cpp2uno.cxx
deleted
100644 → 0
Dosyayı görüntüle @
0ea9722f
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
* This file is part of the LibreOffice project.
*
* 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/.
*
* This file incorporates work covered by the following license notice:
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed
* with this work for additional information regarding copyright
* ownership. The ASF licenses this file to you under the Apache
* License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 .
*/
#include <com/sun/star/uno/genfunc.hxx>
#include <uno/data.h>
#include <typelib/typedescription.hxx>
#include "bridges/cpp_uno/shared/bridge.hxx"
#include "bridges/cpp_uno/shared/cppinterfaceproxy.hxx"
#include "bridges/cpp_uno/shared/types.hxx"
#include "bridges/cpp_uno/shared/vtablefactory.hxx"
#include "share.hxx"
using
namespace
::
com
::
sun
::
star
::
uno
;
namespace
{
static
typelib_TypeClass
cpp2uno_call
(
bridges
::
cpp_uno
::
shared
::
CppInterfaceProxy
*
pThis
,
const
typelib_TypeDescription
*
pMemberTypeDescr
,
typelib_TypeDescriptionReference
*
pReturnTypeRef
,
// 0 indicates void return
sal_Int32
nParams
,
typelib_MethodParameter
*
pParams
,
void
**
gpreg
,
void
**
fpreg
,
void
**
ovrflw
,
sal_Int64
*
pRegisterReturn
/* space for register return */
)
{
int
ng
=
0
;
//number of gpr registers used
int
nf
=
0
;
//number of fpr regsiters used
void
**
pCppStack
;
//temporary stack pointer
// gpreg: [ret *], this, [gpr params]
// fpreg: [fpr params]
// ovrflw: [gpr or fpr params (properly aligned)]
// return
typelib_TypeDescription
*
pReturnTypeDescr
=
0
;
if
(
pReturnTypeRef
)
TYPELIB_DANGER_GET
(
&
pReturnTypeDescr
,
pReturnTypeRef
);
void
*
pUnoReturn
=
0
;
void
*
pCppReturn
=
0
;
// complex return ptr: if != 0 && != pUnoReturn, reconversion need
// handle optional return pointer
if
(
pReturnTypeDescr
)
{
if
(
bridges
::
cpp_uno
::
shared
::
isSimpleType
(
pReturnTypeDescr
))
{
pUnoReturn
=
pRegisterReturn
;
// direct way for simple types
}
else
// complex return via ptr (pCppReturn)
{
pCppReturn
=
*
gpreg
;
gpreg
++
;
//ovrflw++;
ng
++
;
pUnoReturn
=
(
bridges
::
cpp_uno
::
shared
::
relatesToInterfaceType
(
pReturnTypeDescr
)
?
alloca
(
pReturnTypeDescr
->
nSize
)
:
pCppReturn
);
// direct way
}
}
// pop "this"
gpreg
++
;
//ovrflw++;
ng
++
;
// stack space
OSL_ENSURE
(
sizeof
(
void
*
)
==
sizeof
(
sal_Int32
),
"### unexpected size!"
);
// parameters
void
**
pUnoArgs
=
(
void
**
)
alloca
(
4
*
sizeof
(
void
*
)
*
nParams
);
void
**
pCppArgs
=
pUnoArgs
+
nParams
;
// indices of values this have to be converted (interface conversion cpp<=>uno)
sal_Int32
*
pTempIndices
=
(
sal_Int32
*
)(
pUnoArgs
+
(
2
*
nParams
));
// type descriptions for reconversions
typelib_TypeDescription
**
ppTempParamTypeDescr
=
(
typelib_TypeDescription
**
)(
pUnoArgs
+
(
3
*
nParams
));
sal_Int32
nTempIndices
=
0
;
for
(
sal_Int32
nPos
=
0
;
nPos
<
nParams
;
++
nPos
)
{
const
typelib_MethodParameter
&
rParam
=
pParams
[
nPos
];
typelib_TypeDescription
*
pParamTypeDescr
=
0
;
TYPELIB_DANGER_GET
(
&
pParamTypeDescr
,
rParam
.
pTypeRef
);
if
(
!
rParam
.
bOut
&&
bridges
::
cpp_uno
::
shared
::
isSimpleType
(
pParamTypeDescr
))
// value
{
switch
(
pParamTypeDescr
->
eTypeClass
)
{
case
typelib_TypeClass_DOUBLE
:
if
(
nf
<
13
)
{
pCppArgs
[
nPos
]
=
fpreg
;
pUnoArgs
[
nPos
]
=
fpreg
;
nf
++
;
fpreg
+=
2
;
}
else
{
if
(((
long
)
ovrflw
)
&
4
)
ovrflw
++
;
pCppArgs
[
nPos
]
=
ovrflw
;
pUnoArgs
[
nPos
]
=
ovrflw
;
ovrflw
+=
2
;
}
break
;
case
typelib_TypeClass_FLOAT
:
// fpreg are all double values so need to
// modify fpreg to be a single word float value
if
(
nf
<
13
)
{
float
tmp
=
(
float
)
(
*
((
double
*
)
fpreg
));
(
*
((
float
*
)
fpreg
))
=
tmp
;
pCppArgs
[
nPos
]
=
fpreg
;
pUnoArgs
[
nPos
]
=
fpreg
;
nf
++
;
fpreg
+=
2
;
}
else
{
#if 0 /* abi is not being followed correctly */
if (((long)ovrflw) & 4) ovrflw++;
float tmp = (float) (*((double *)ovrflw));
(*((float *) ovrflw)) = tmp;
pCppArgs[nPos] = ovrflw;
pUnoArgs[nPos] = ovrflw;
ovrflw += 2;
#else
pCppArgs
[
nPos
]
=
ovrflw
;
pUnoArgs
[
nPos
]
=
ovrflw
;
ovrflw
+=
1
;
#endif
}
break
;
case
typelib_TypeClass_HYPER
:
case
typelib_TypeClass_UNSIGNED_HYPER
:
if
(
ng
&
1
)
{
ng
++
;
gpreg
++
;
}
if
(
ng
<
8
)
{
pCppArgs
[
nPos
]
=
gpreg
;
pUnoArgs
[
nPos
]
=
gpreg
;
ng
+=
2
;
gpreg
+=
2
;
}
else
{
if
(((
long
)
ovrflw
)
&
4
)
ovrflw
++
;
pCppArgs
[
nPos
]
=
ovrflw
;
pUnoArgs
[
nPos
]
=
ovrflw
;
ovrflw
+=
2
;
}
break
;
case
typelib_TypeClass_BYTE
:
case
typelib_TypeClass_BOOLEAN
:
if
(
ng
<
8
)
{
pCppArgs
[
nPos
]
=
(((
char
*
)
gpreg
)
+
3
);
pUnoArgs
[
nPos
]
=
(((
char
*
)
gpreg
)
+
3
);
ng
++
;
gpreg
++
;
}
else
{
pCppArgs
[
nPos
]
=
(((
char
*
)
ovrflw
)
+
3
);
pUnoArgs
[
nPos
]
=
(((
char
*
)
ovrflw
)
+
3
);
ovrflw
++
;
}
break
;
case
typelib_TypeClass_CHAR
:
case
typelib_TypeClass_SHORT
:
case
typelib_TypeClass_UNSIGNED_SHORT
:
if
(
ng
<
8
)
{
pCppArgs
[
nPos
]
=
(((
char
*
)
gpreg
)
+
2
);
pUnoArgs
[
nPos
]
=
(((
char
*
)
gpreg
)
+
2
);
ng
++
;
gpreg
++
;
}
else
{
pCppArgs
[
nPos
]
=
(((
char
*
)
ovrflw
)
+
2
);
pUnoArgs
[
nPos
]
=
(((
char
*
)
ovrflw
)
+
2
);
ovrflw
++
;
}
break
;
default
:
if
(
ng
<
8
)
{
pCppArgs
[
nPos
]
=
gpreg
;
pUnoArgs
[
nPos
]
=
gpreg
;
ng
++
;
gpreg
++
;
}
else
{
pCppArgs
[
nPos
]
=
ovrflw
;
pUnoArgs
[
nPos
]
=
ovrflw
;
ovrflw
++
;
}
break
;
}
// no longer needed
TYPELIB_DANGER_RELEASE
(
pParamTypeDescr
);
}
else
// ptr to complex value | ref
{
if
(
ng
<
8
)
{
pCppArgs
[
nPos
]
=
*
(
void
**
)
gpreg
;
pCppStack
=
gpreg
;
ng
++
;
gpreg
++
;
}
else
{
pCppArgs
[
nPos
]
=
*
(
void
**
)
ovrflw
;
pCppStack
=
ovrflw
;
ovrflw
++
;
}
if
(
!
rParam
.
bIn
)
// is pure out
{
// uno out is unconstructed mem!
pUnoArgs
[
nPos
]
=
alloca
(
pParamTypeDescr
->
nSize
);
pTempIndices
[
nTempIndices
]
=
nPos
;
// will be released at reconversion
ppTempParamTypeDescr
[
nTempIndices
++
]
=
pParamTypeDescr
;
}
// is in/inout
else
if
(
bridges
::
cpp_uno
::
shared
::
relatesToInterfaceType
(
pParamTypeDescr
))
{
uno_copyAndConvertData
(
pUnoArgs
[
nPos
]
=
alloca
(
pParamTypeDescr
->
nSize
),
*
(
void
**
)
pCppStack
,
pParamTypeDescr
,
pThis
->
getBridge
()
->
getCpp2Uno
()
);
pTempIndices
[
nTempIndices
]
=
nPos
;
// has to be reconverted
// will be released at reconversion
ppTempParamTypeDescr
[
nTempIndices
++
]
=
pParamTypeDescr
;
}
else
// direct way
{
pUnoArgs
[
nPos
]
=
*
(
void
**
)
pCppStack
;
// no longer needed
TYPELIB_DANGER_RELEASE
(
pParamTypeDescr
);
}
}
}
// ExceptionHolder
uno_Any
aUnoExc
;
// Any will be constructed by callee
uno_Any
*
pUnoExc
=
&
aUnoExc
;
// invoke uno dispatch call
(
*
pThis
->
getUnoI
()
->
pDispatcher
)(
pThis
->
getUnoI
(),
pMemberTypeDescr
,
pUnoReturn
,
pUnoArgs
,
&
pUnoExc
);
// in case an exception occurred...
if
(
pUnoExc
)
{
// destruct temporary in/inout params
for
(
;
nTempIndices
--
;
)
{
sal_Int32
nIndex
=
pTempIndices
[
nTempIndices
];
if
(
pParams
[
nIndex
].
bIn
)
// is in/inout => was constructed
uno_destructData
(
pUnoArgs
[
nIndex
],
ppTempParamTypeDescr
[
nTempIndices
],
0
);
TYPELIB_DANGER_RELEASE
(
ppTempParamTypeDescr
[
nTempIndices
]
);
}
if
(
pReturnTypeDescr
)
TYPELIB_DANGER_RELEASE
(
pReturnTypeDescr
);
CPPU_CURRENT_NAMESPACE
::
raiseException
(
&
aUnoExc
,
pThis
->
getBridge
()
->
getUno2Cpp
()
);
// has to destruct the any
// is here for dummy
return
typelib_TypeClass_VOID
;
}
else
// else no exception occurred...
{
// temporary params
for
(
;
nTempIndices
--
;
)
{
sal_Int32
nIndex
=
pTempIndices
[
nTempIndices
];
typelib_TypeDescription
*
pParamTypeDescr
=
ppTempParamTypeDescr
[
nTempIndices
];
if
(
pParams
[
nIndex
].
bOut
)
// inout/out
{
// convert and assign
uno_destructData
(
pCppArgs
[
nIndex
],
pParamTypeDescr
,
cpp_release
);
uno_copyAndConvertData
(
pCppArgs
[
nIndex
],
pUnoArgs
[
nIndex
],
pParamTypeDescr
,
pThis
->
getBridge
()
->
getUno2Cpp
()
);
}
// destroy temp uno param
uno_destructData
(
pUnoArgs
[
nIndex
],
pParamTypeDescr
,
0
);
TYPELIB_DANGER_RELEASE
(
pParamTypeDescr
);
}
// return
if
(
pCppReturn
)
// has complex return
{
if
(
pUnoReturn
!=
pCppReturn
)
// needs reconversion
{
uno_copyAndConvertData
(
pCppReturn
,
pUnoReturn
,
pReturnTypeDescr
,
pThis
->
getBridge
()
->
getUno2Cpp
()
);
// destroy temp uno return
uno_destructData
(
pUnoReturn
,
pReturnTypeDescr
,
0
);
}
// complex return ptr is set to return reg
*
(
void
**
)
pRegisterReturn
=
pCppReturn
;
}
if
(
pReturnTypeDescr
)
{
typelib_TypeClass
eRet
=
(
typelib_TypeClass
)
pReturnTypeDescr
->
eTypeClass
;
TYPELIB_DANGER_RELEASE
(
pReturnTypeDescr
);
return
eRet
;
}
else
return
typelib_TypeClass_VOID
;
}
}
static
typelib_TypeClass
cpp_mediate
(
sal_Int32
nFunctionIndex
,
sal_Int32
nVtableOffset
,
void
**
gpreg
,
void
**
fpreg
,
void
**
ovrflw
,
sal_Int64
*
pRegisterReturn
/* space for register return */
)
{
OSL_ENSURE
(
sizeof
(
sal_Int32
)
==
sizeof
(
void
*
),
"### unexpected!"
);
// gpreg: [ret *], this, [other gpr params]
// fpreg: [fpr params]
// ovrflw: [gpr or fpr params (properly aligned)]
void
*
pThis
;
if
(
nFunctionIndex
&
0x80000000
)
{
nFunctionIndex
&=
0x7fffffff
;
pThis
=
gpreg
[
1
];
}
else
{
pThis
=
gpreg
[
0
];
}
pThis
=
static_cast
<
char
*
>
(
pThis
)
-
nVtableOffset
;
bridges
::
cpp_uno
::
shared
::
CppInterfaceProxy
*
pCppI
=
bridges
::
cpp_uno
::
shared
::
CppInterfaceProxy
::
castInterfaceToProxy
(
pThis
);
typelib_InterfaceTypeDescription
*
pTypeDescr
=
pCppI
->
getTypeDescr
();
OSL_ENSURE
(
nFunctionIndex
<
pTypeDescr
->
nMapFunctionIndexToMemberIndex
,
"### illegal vtable index!"
);
if
(
nFunctionIndex
>=
pTypeDescr
->
nMapFunctionIndexToMemberIndex
)
{
throw
RuntimeException
(
"illegal vtable index!"
,
(
XInterface
*
)
pThis
);
}
// determine called method
sal_Int32
nMemberPos
=
pTypeDescr
->
pMapFunctionIndexToMemberIndex
[
nFunctionIndex
];
OSL_ENSURE
(
nMemberPos
<
pTypeDescr
->
nAllMembers
,
"### illegal member index!"
);
TypeDescription
aMemberDescr
(
pTypeDescr
->
ppAllMembers
[
nMemberPos
]
);
typelib_TypeClass
eRet
;
switch
(
aMemberDescr
.
get
()
->
eTypeClass
)
{
case
typelib_TypeClass_INTERFACE_ATTRIBUTE
:
{
if
(
pTypeDescr
->
pMapMemberIndexToFunctionIndex
[
nMemberPos
]
==
nFunctionIndex
)
{
// is GET method
eRet
=
cpp2uno_call
(
pCppI
,
aMemberDescr
.
get
(),
((
typelib_InterfaceAttributeTypeDescription
*
)
aMemberDescr
.
get
())
->
pAttributeTypeRef
,
0
,
0
,
// no params
gpreg
,
fpreg
,
ovrflw
,
pRegisterReturn
);
}
else
{
// is SET method
typelib_MethodParameter
aParam
;
aParam
.
pTypeRef
=
((
typelib_InterfaceAttributeTypeDescription
*
)
aMemberDescr
.
get
())
->
pAttributeTypeRef
;
aParam
.
bIn
=
sal_True
;
aParam
.
bOut
=
sal_False
;
eRet
=
cpp2uno_call
(
pCppI
,
aMemberDescr
.
get
(),
0
,
// indicates void return
1
,
&
aParam
,
gpreg
,
fpreg
,
ovrflw
,
pRegisterReturn
);
}
break
;
}
case
typelib_TypeClass_INTERFACE_METHOD
:
{
// is METHOD
switch
(
nFunctionIndex
)
{
case
1
:
// acquire()
pCppI
->
acquireProxy
();
// non virtual call!
eRet
=
typelib_TypeClass_VOID
;
break
;
case
2
:
// release()
pCppI
->
releaseProxy
();
// non virtual call!
eRet
=
typelib_TypeClass_VOID
;
break
;
case
0
:
// queryInterface() opt
{
typelib_TypeDescription
*
pTD
=
0
;
TYPELIB_DANGER_GET
(
&
pTD
,
reinterpret_cast
<
Type
*
>
(
gpreg
[
2
]
)
->
getTypeLibType
()
);
if
(
pTD
)
{
XInterface
*
pInterface
=
0
;
(
*
pCppI
->
getBridge
()
->
getCppEnv
()
->
getRegisteredInterface
)(
pCppI
->
getBridge
()
->
getCppEnv
(),
(
void
**
)
&
pInterface
,
pCppI
->
getOid
().
pData
,
(
typelib_InterfaceTypeDescription
*
)
pTD
);
if
(
pInterface
)
{
::
uno_any_construct
(
reinterpret_cast
<
uno_Any
*
>
(
gpreg
[
0
]
),
&
pInterface
,
pTD
,
cpp_acquire
);
pInterface
->
release
();
TYPELIB_DANGER_RELEASE
(
pTD
);
*
(
void
**
)
pRegisterReturn
=
gpreg
[
0
];
eRet
=
typelib_TypeClass_ANY
;
break
;
}
TYPELIB_DANGER_RELEASE
(
pTD
);
}
}
// else perform queryInterface()
default
:
eRet
=
cpp2uno_call
(
pCppI
,
aMemberDescr
.
get
(),
((
typelib_InterfaceMethodTypeDescription
*
)
aMemberDescr
.
get
())
->
pReturnTypeRef
,
((
typelib_InterfaceMethodTypeDescription
*
)
aMemberDescr
.
get
())
->
nParams
,
((
typelib_InterfaceMethodTypeDescription
*
)
aMemberDescr
.
get
())
->
pParams
,
gpreg
,
fpreg
,
ovrflw
,
pRegisterReturn
);
}
break
;
}
default
:
{
throw
RuntimeException
(
"no member description found!"
,
(
XInterface
*
)
pThis
);
}
}
return
eRet
;
}
/**
* is called on incoming vtable calls
* (called by asm snippets)
*/
static
void
cpp_vtable_call
(
int
nFunctionIndex
,
int
nVtableOffset
,
void
**
gpregptr
,
void
**
fpregptr
,
void
**
ovrflw
)
{
sal_Int32
gpreg
[
8
];
memcpy
(
gpreg
,
gpregptr
,
32
);
double
fpreg
[
13
];
memcpy
(
fpreg
,
fpregptr
,
13
*
8
);
volatile
long
nRegReturn
[
2
];
// fprintf(stderr,"in cpp_vtable_call nFunctionIndex is %x\n",nFunctionIndex);
// fprintf(stderr,"in cpp_vtable_call nVtableOffset is %x\n",nVtableOffset);
// fflush(stderr);
typelib_TypeClass
aType
=
cpp_mediate
(
nFunctionIndex
,
nVtableOffset
,
(
void
**
)
gpreg
,
(
void
**
)
fpreg
,
ovrflw
,
(
sal_Int64
*
)
nRegReturn
);
switch
(
aType
)
{
// move return value into register space
// (will be loaded by machine code snippet)
case
typelib_TypeClass_BOOLEAN
:
case
typelib_TypeClass_BYTE
:
__asm__
(
"lbz r3,%0"
:
:
"m"
(
nRegReturn
[
0
])
);
break
;
case
typelib_TypeClass_CHAR
:
case
typelib_TypeClass_SHORT
:
case
typelib_TypeClass_UNSIGNED_SHORT
:
__asm__
(
"lhz r3,%0"
:
:
"m"
(
nRegReturn
[
0
])
);
break
;
case
typelib_TypeClass_FLOAT
:
__asm__
(
"lfs f1,%0"
:
:
"m"
(
*
((
float
*
)
nRegReturn
))
);
break
;
case
typelib_TypeClass_DOUBLE
:
__asm__
(
"lfd f1,%0"
:
:
"m"
(
*
((
double
*
)
nRegReturn
))
);
break
;
case
typelib_TypeClass_HYPER
:
case
typelib_TypeClass_UNSIGNED_HYPER
:
__asm__
(
"lwz r4,%0"
:
:
"m"
(
nRegReturn
[
1
])
);
// no break, fall through
default
:
__asm__
(
"lwz r3,%0"
:
:
"m"
(
nRegReturn
[
0
])
);
break
;
}
}
int
const
codeSnippetSize
=
136
;
unsigned
char
*
codeSnippet
(
unsigned
char
*
code
,
sal_Int32
functionIndex
,
sal_Int32
vtableOffset
,
bool
simpleRetType
)
{
// fprintf(stderr,"in codeSnippet functionIndex is %x\n", functionIndex);
// fprintf(stderr,"in codeSnippet vtableOffset is %x\n", vtableOffset);
// fflush(stderr);
if
(
!
simpleRetType
)
functionIndex
|=
0x80000000
;
unsigned
long
*
p
=
(
unsigned
long
*
)
code
;
// OSL_ASSERT( sizeof (long) == 4 );
OSL_ASSERT
((((
unsigned
long
)
code
)
&
0x3
)
==
0
);
//aligned to 4 otherwise a mistake
/* generate this code */
// # so first save gpr 3 to gpr 10 (aligned to 4)
// stw r3,-2048(r1)
// stw r4,-2044(r1)
// stw r5,-2040(r1)
// stw r6,-2036(r1)
// stw r7,-2032(r1)
// stw r8,-2028(r1)
// stw r9,-2024(r1)
// stw r10,-2020(r1)
// # next save fpr 1 to fpr 13 (aligned to 8)
// if dedicated floating point registers are used
// stfd f1,-2016(r1)
// stfd f2,-2008(r1)
// stfd f3,-2000(r1)
// stfd f4,-1992(r1)
// stfd f5,-1984(r1)
// stfd f6,-1976(r1)
// stfd f7,-1968(r1)
// stfd f8,-1960(r1)
// stfd f9,-1952(r1)
// stfd f10,-1944(r1)
// stfd f11,-1936(r1)
// stfd f12,-1928(r1)
// stfd f13,-1920(r1)
// # now here is where cpp_vtable_call must go
// lis r3,0xdead
// ori r3,r3,0xbeef
// mtctr r3
// # now load up the functionIndex
// lis r3,0xdead
// ori r3,r3,0xbeef
// # now load up the vtableOffset
// lis r4,0xdead
// ori r4,r4,0xbeef
// #now load up the pointer to the saved gpr registers
// addi r5,r1,-2048
// #now load up the pointer to the saved fpr registers
// addi r6,r1,-2016
// if no dedicated floating point registers are used than we have NULL
// pointer there
// li r6, 0
//
// #now load up the pointer to the overflow call stack
// addi r7,r1,24 # frame pointer + 24
// bctr
*
p
++
=
0x9061f800
;
*
p
++
=
0x9081f804
;
*
p
++
=
0x90a1f808
;
*
p
++
=
0x90c1f80c
;
*
p
++
=
0x90e1f810
;
*
p
++
=
0x9101f814
;
*
p
++
=
0x9121f818
;
*
p
++
=
0x9141f81c
;
*
p
++
=
0xd821f820
;
*
p
++
=
0xd841f828
;
*
p
++
=
0xd861f830
;
*
p
++
=
0xd881f838
;
*
p
++
=
0xd8a1f840
;
*
p
++
=
0xd8c1f848
;
*
p
++
=
0xd8e1f850
;
*
p
++
=
0xd901f858
;
*
p
++
=
0xd921f860
;
*
p
++
=
0xd941f868
;
*
p
++
=
0xd961f870
;
*
p
++
=
0xd981f878
;
*
p
++
=
0xd9a1f880
;
*
p
++
=
0x3c600000
|
(((
unsigned
long
)
cpp_vtable_call
)
>>
16
);
*
p
++
=
0x60630000
|
(((
unsigned
long
)
cpp_vtable_call
)
&
0x0000FFFF
);
*
p
++
=
0x7c6903a6
;
*
p
++
=
0x3c600000
|
(((
unsigned
long
)
functionIndex
)
>>
16
);
*
p
++
=
0x60630000
|
(((
unsigned
long
)
functionIndex
)
&
0x0000FFFF
);
*
p
++
=
0x3c800000
|
(((
unsigned
long
)
vtableOffset
)
>>
16
);
*
p
++
=
0x60840000
|
(((
unsigned
long
)
vtableOffset
)
&
0x0000FFFF
);
*
p
++
=
0x38a1f800
;
*
p
++
=
0x38c1f820
;
*
p
++
=
0x38e10018
;
*
p
++
=
0x4e800420
;
return
(
code
+
codeSnippetSize
);
}
}
void
bridges
::
cpp_uno
::
shared
::
VtableFactory
::
flushCode
(
unsigned
char
const
*
bptr
,
unsigned
char
const
*
eptr
)
{
int
const
lineSize
=
32
;
for
(
unsigned
char
const
*
p
=
bptr
;
p
<
eptr
+
lineSize
;
p
+=
lineSize
)
{
__asm__
volatile
(
"dcbst 0, %0"
:
:
"r"
(
p
)
:
"memory"
);
}
__asm__
volatile
(
"sync"
:
:
:
"memory"
);
for
(
unsigned
char
const
*
p
=
bptr
;
p
<
eptr
+
lineSize
;
p
+=
lineSize
)
{
__asm__
volatile
(
"icbi 0, %0"
:
:
"r"
(
p
)
:
"memory"
);
}
__asm__
volatile
(
"isync"
:
:
:
"memory"
);
}
struct
bridges
::
cpp_uno
::
shared
::
VtableFactory
::
Slot
{
void
*
fn
;
};
bridges
::
cpp_uno
::
shared
::
VtableFactory
::
Slot
*
bridges
::
cpp_uno
::
shared
::
VtableFactory
::
mapBlockToVtable
(
void
*
block
)
{
return
static_cast
<
Slot
*
>
(
block
)
+
2
;
}
sal_Size
bridges
::
cpp_uno
::
shared
::
VtableFactory
::
getBlockSize
(
sal_Int32
slotCount
)
{
return
(
slotCount
+
2
)
*
sizeof
(
Slot
)
+
slotCount
*
codeSnippetSize
;
}
bridges
::
cpp_uno
::
shared
::
VtableFactory
::
Slot
*
bridges
::
cpp_uno
::
shared
::
VtableFactory
::
initializeBlock
(
void
*
block
,
sal_Int32
slotCount
,
sal_Int32
,
typelib_InterfaceTypeDescription
*
)
{
Slot
*
slots
=
mapBlockToVtable
(
block
);
slots
[
-
2
].
fn
=
0
;
slots
[
-
1
].
fn
=
0
;
return
slots
+
slotCount
;
}
unsigned
char
*
bridges
::
cpp_uno
::
shared
::
VtableFactory
::
addLocalFunctions
(
Slot
**
slots
,
unsigned
char
*
code
,
typelib_InterfaceTypeDescription
const
*
type
,
sal_Int32
functionOffset
,
sal_Int32
functionCount
,
sal_Int32
vtableOffset
)
{
(
*
slots
)
-=
functionCount
;
Slot
*
s
=
*
slots
;
// fprintf(stderr, "in addLocalFunctions functionOffset is %x\n",functionOffset);
// fprintf(stderr, "in addLocalFunctions vtableOffset is %x\n",vtableOffset);
// fflush(stderr);
for
(
sal_Int32
i
=
0
;
i
<
type
->
nMembers
;
++
i
)
{
typelib_TypeDescription
*
member
=
0
;
TYPELIB_DANGER_GET
(
&
member
,
type
->
ppMembers
[
i
]);
OSL_ASSERT
(
member
!=
0
);
switch
(
member
->
eTypeClass
)
{
case
typelib_TypeClass_INTERFACE_ATTRIBUTE
:
// Getter:
(
s
++
)
->
fn
=
code
;
code
=
codeSnippet
(
code
,
functionOffset
++
,
vtableOffset
,
bridges
::
cpp_uno
::
shared
::
isSimpleType
(
reinterpret_cast
<
typelib_InterfaceAttributeTypeDescription
*
>
(
member
)
->
pAttributeTypeRef
));
// Setter:
if
(
!
reinterpret_cast
<
typelib_InterfaceAttributeTypeDescription
*
>
(
member
)
->
bReadOnly
)
{
(
s
++
)
->
fn
=
code
;
code
=
codeSnippet
(
code
,
functionOffset
++
,
vtableOffset
,
true
);
}
break
;
case
typelib_TypeClass_INTERFACE_METHOD
:
(
s
++
)
->
fn
=
code
;
code
=
codeSnippet
(
code
,
functionOffset
++
,
vtableOffset
,
bridges
::
cpp_uno
::
shared
::
isSimpleType
(
reinterpret_cast
<
typelib_InterfaceMethodTypeDescription
*
>
(
member
)
->
pReturnTypeRef
));
break
;
default
:
OSL_ASSERT
(
false
);
break
;
}
TYPELIB_DANGER_RELEASE
(
member
);
}
return
code
;
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
bridges/source/cpp_uno/gcc3_macosx_powerpc/except.cxx
deleted
100644 → 0
Dosyayı görüntüle @
0ea9722f
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
* This file is part of the LibreOffice project.
*
* 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/.
*
* This file incorporates work covered by the following license notice:
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed
* with this work for additional information regarding copyright
* ownership. The ASF licenses this file to you under the Apache
* License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 .
*/
#include <stdio.h>
#include <dlfcn.h>
#include <cxxabi.h>
#include <boost/unordered_map.hpp>
#include <rtl/strbuf.hxx>
#include <rtl/ustrbuf.hxx>
#include <osl/diagnose.h>
#include <osl/mutex.hxx>
#include <com/sun/star/uno/genfunc.hxx>
#include <typelib/typedescription.hxx>
#include <uno/any2.h>
#include "share.hxx"
using
namespace
::
std
;
using
namespace
::
osl
;
using
namespace
::
rtl
;
using
namespace
::
com
::
sun
::
star
::
uno
;
using
namespace
::
__cxxabiv1
;
namespace
CPPU_CURRENT_NAMESPACE
{
void
dummy_can_throw_anything
(
char
const
*
)
{
}
static
OUString
toUNOname
(
char
const
*
p
)
{
#if OSL_DEBUG_LEVEL > 1
char
const
*
start
=
p
;
#endif
// example: N3com3sun4star4lang24IllegalArgumentExceptionE
OUStringBuffer
buf
(
64
);
OSL_ASSERT
(
'N'
==
*
p
);
++
p
;
// skip N
while
(
'E'
!=
*
p
)
{
// read chars count
long
n
=
(
*
p
++
-
'0'
);
while
(
'0'
<=
*
p
&&
'9'
>=
*
p
)
{
n
*=
10
;
n
+=
(
*
p
++
-
'0'
);
}
buf
.
appendAscii
(
p
,
n
);
p
+=
n
;
if
(
'E'
!=
*
p
)
buf
.
append
(
'.'
);
}
#if OSL_DEBUG_LEVEL > 1
OUString
ret
(
buf
.
makeStringAndClear
()
);
OString
c_ret
(
OUStringToOString
(
ret
,
RTL_TEXTENCODING_ASCII_US
)
);
fprintf
(
stderr
,
"> toUNOname(): %s => %s
\n
"
,
start
,
c_ret
.
getStr
()
);
return
ret
;
#else
return
buf
.
makeStringAndClear
();
#endif
}
class
RTTI
{
typedef
boost
::
unordered_map
<
OUString
,
type_info
*
,
OUStringHash
>
t_rtti_map
;
Mutex
m_mutex
;
t_rtti_map
m_rttis
;
t_rtti_map
m_generatedRttis
;
void
*
m_hApp
;
public
:
RTTI
();
~
RTTI
();
type_info
*
getRTTI
(
typelib_CompoundTypeDescription
*
);
};
RTTI
::
RTTI
()
:
m_hApp
(
dlopen
(
0
,
RTLD_LAZY
)
)
{
}
RTTI
::~
RTTI
()
{
dlclose
(
m_hApp
);
}
type_info
*
RTTI
::
getRTTI
(
typelib_CompoundTypeDescription
*
pTypeDescr
)
{
type_info
*
rtti
;
OUString
const
&
unoName
=
*
(
OUString
const
*
)
&
pTypeDescr
->
aBase
.
pTypeName
;
MutexGuard
guard
(
m_mutex
);
t_rtti_map
::
const_iterator
iRttiFind
(
m_rttis
.
find
(
unoName
)
);
if
(
iRttiFind
==
m_rttis
.
end
())
{
// RTTI symbol
OStringBuffer
buf
(
64
);
buf
.
append
(
"_ZTIN"
);
sal_Int32
index
=
0
;
do
{
OUString
token
(
unoName
.
getToken
(
0
,
'.'
,
index
)
);
buf
.
append
(
token
.
getLength
()
);
OString
c_token
(
OUStringToOString
(
token
,
RTL_TEXTENCODING_ASCII_US
)
);
buf
.
append
(
c_token
);
}
while
(
index
>=
0
);
buf
.
append
(
'E'
);
OString
symName
(
buf
.
makeStringAndClear
()
);
rtti
=
(
type_info
*
)
dlsym
(
m_hApp
,
symName
.
getStr
()
);
if
(
rtti
)
{
pair
<
t_rtti_map
::
iterator
,
bool
>
insertion
(
m_rttis
.
insert
(
t_rtti_map
::
value_type
(
unoName
,
rtti
)
)
);
OSL_ENSURE
(
insertion
.
second
,
"### inserting new rtti failed?!"
);
}
else
{
// try to lookup the symbol in the generated rtti map
t_rtti_map
::
const_iterator
iFind
(
m_generatedRttis
.
find
(
unoName
)
);
if
(
iFind
==
m_generatedRttis
.
end
())
{
// we must generate it !
// symbol and rtti-name is nearly identical,
// the symbol is prefixed with _ZTI
char
const
*
rttiName
=
symName
.
getStr
()
+
4
;
#if OSL_DEBUG_LEVEL > 1
fprintf
(
stderr
,
"generated rtti for %s
\n
"
,
rttiName
);
#endif
if
(
pTypeDescr
->
pBaseTypeDescription
)
{
// ensure availability of base
type_info
*
base_rtti
=
getRTTI
(
(
typelib_CompoundTypeDescription
*
)
pTypeDescr
->
pBaseTypeDescription
);
rtti
=
new
__si_class_type_info
(
strdup
(
rttiName
),
(
__class_type_info
*
)
base_rtti
);
}
else
{
// this class has no base class
rtti
=
new
__class_type_info
(
strdup
(
rttiName
)
);
}
pair
<
t_rtti_map
::
iterator
,
bool
>
insertion
(
m_generatedRttis
.
insert
(
t_rtti_map
::
value_type
(
unoName
,
rtti
)
)
);
OSL_ENSURE
(
insertion
.
second
,
"### inserting new generated rtti failed?!"
);
}
else
// taking already generated rtti
{
rtti
=
iFind
->
second
;
}
}
}
else
{
rtti
=
iRttiFind
->
second
;
}
return
rtti
;
}
static
void
deleteException
(
void
*
pExc
)
{
__cxa_exception
const
*
header
=
((
__cxa_exception
const
*
)
pExc
-
1
);
typelib_TypeDescription
*
pTD
=
0
;
OUString
unoName
(
toUNOname
(
header
->
exceptionType
->
name
()
)
);
::
typelib_typedescription_getByName
(
&
pTD
,
unoName
.
pData
);
OSL_ENSURE
(
pTD
,
"### unknown exception type! leaving out destruction => leaking!!!"
);
if
(
pTD
)
{
::
uno_destructData
(
pExc
,
pTD
,
cpp_release
);
::
typelib_typedescription_release
(
pTD
);
}
}
void
raiseException
(
uno_Any
*
pUnoExc
,
uno_Mapping
*
pUno2Cpp
)
{
void
*
pCppExc
;
type_info
*
rtti
;
{
// construct cpp exception object
typelib_TypeDescription
*
pTypeDescr
=
0
;
TYPELIB_DANGER_GET
(
&
pTypeDescr
,
pUnoExc
->
pType
);
OSL_ASSERT
(
pTypeDescr
);
if
(
!
pTypeDescr
)
terminate
();
pCppExc
=
__cxa_allocate_exception
(
pTypeDescr
->
nSize
);
::
uno_copyAndConvertData
(
pCppExc
,
pUnoExc
->
pData
,
pTypeDescr
,
pUno2Cpp
);
// destruct uno exception
::
uno_any_destruct
(
pUnoExc
,
0
);
// avoiding locked counts
static
RTTI
*
s_rtti
=
0
;
if
(
!
s_rtti
)
{
MutexGuard
guard
(
Mutex
::
getGlobalMutex
()
);
if
(
!
s_rtti
)
{
#ifdef LEAK_STATIC_DATA
s_rtti
=
new
RTTI
();
#else
static
RTTI
rtti_data
;
s_rtti
=
&
rtti_data
;
#endif
}
}
rtti
=
(
type_info
*
)
s_rtti
->
getRTTI
(
(
typelib_CompoundTypeDescription
*
)
pTypeDescr
);
TYPELIB_DANGER_RELEASE
(
pTypeDescr
);
OSL_ENSURE
(
rtti
,
"### no rtti for throwing exception!"
);
if
(
!
rtti
)
terminate
();
}
__cxa_throw
(
pCppExc
,
rtti
,
deleteException
);
}
void
fillUnoException
(
__cxa_exception
*
header
,
uno_Any
*
pExc
,
uno_Mapping
*
pCpp2Uno
)
{
OSL_ENSURE
(
header
,
"### no exception header!!!"
);
if
(
!
header
)
terminate
();
typelib_TypeDescription
*
pExcTypeDescr
=
0
;
OUString
unoName
(
toUNOname
(
header
->
exceptionType
->
name
()
)
);
::
typelib_typedescription_getByName
(
&
pExcTypeDescr
,
unoName
.
pData
);
OSL_ENSURE
(
pExcTypeDescr
,
"### can not get type description for exception!!!"
);
if
(
!
pExcTypeDescr
)
terminate
();
// construct uno exception any
::
uno_any_constructAndConvert
(
pExc
,
header
->
adjustedPtr
,
pExcTypeDescr
,
pCpp2Uno
);
::
typelib_typedescription_release
(
pExcTypeDescr
);
}
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
bridges/source/cpp_uno/gcc3_macosx_powerpc/share.hxx
deleted
100644 → 0
Dosyayı görüntüle @
0ea9722f
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
* This file is part of the LibreOffice project.
*
* 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/.
*
* This file incorporates work covered by the following license notice:
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed
* with this work for additional information regarding copyright
* ownership. The ASF licenses this file to you under the Apache
* License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 .
*/
#ifndef INCLUDED_BRIDGES_SOURCE_CPP_UNO_GCC3_MACOSX_POWERPC_SHARE_HXX
#define INCLUDED_BRIDGES_SOURCE_CPP_UNO_GCC3_MACOSX_POWERPC_SHARE_HXX
#include "uno/mapping.h"
#include <typeinfo>
#include <exception>
#include <cstddef>
namespace
CPPU_CURRENT_NAMESPACE
{
void
dummy_can_throw_anything
(
char
const
*
);
// ----- following decl from libstdc++-v3/libsupc++/unwind-cxx.h and unwind.h
struct
_Unwind_Exception
{
unsigned
exception_class
__attribute__
((
__mode__
(
__DI__
)));
void
*
exception_cleanup
;
unsigned
private_1
__attribute__
((
__mode__
(
__word__
)));
unsigned
private_2
__attribute__
((
__mode__
(
__word__
)));
}
__attribute__
((
__aligned__
));
struct
__cxa_exception
{
::
std
::
type_info
*
exceptionType
;
void
(
*
exceptionDestructor
)(
void
*
);
::
std
::
unexpected_handler
unexpectedHandler
;
::
std
::
terminate_handler
terminateHandler
;
__cxa_exception
*
nextException
;
int
handlerCount
;
int
handlerSwitchValue
;
const
unsigned
char
*
actionRecord
;
const
unsigned
char
*
languageSpecificData
;
void
*
catchTemp
;
void
*
adjustedPtr
;
_Unwind_Exception
unwindHeader
;
};
extern
"C"
void
*
__cxa_allocate_exception
(
std
::
size_t
thrown_size
)
throw
();
extern
"C"
void
__cxa_throw
(
void
*
thrown_exception
,
std
::
type_info
*
tinfo
,
void
(
*
dest
)
(
void
*
)
)
__attribute__
((
noreturn
));
struct
__cxa_eh_globals
{
__cxa_exception
*
caughtExceptions
;
unsigned
int
uncaughtExceptions
;
};
extern
"C"
__cxa_eh_globals
*
__cxa_get_globals
()
throw
();
void
raiseException
(
uno_Any
*
pUnoExc
,
uno_Mapping
*
pUno2Cpp
);
void
fillUnoException
(
__cxa_exception
*
header
,
uno_Any
*
,
uno_Mapping
*
pCpp2Uno
);
}
#endif
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
bridges/source/cpp_uno/gcc3_macosx_powerpc/uno2cpp.cxx
deleted
100644 → 0
Dosyayı görüntüle @
0ea9722f
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
* This file is part of the LibreOffice project.
*
* 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/.
*
* This file incorporates work covered by the following license notice:
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed
* with this work for additional information regarding copyright
* ownership. The ASF licenses this file to you under the Apache
* License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 .
*/
#include <sys/types.h>
#include <sys/malloc.h>
#include <com/sun/star/uno/genfunc.hxx>
#include <uno/data.h>
#include "bridges/cpp_uno/shared/bridge.hxx"
#include "bridges/cpp_uno/shared/types.hxx"
#include "bridges/cpp_uno/shared/unointerfaceproxy.hxx"
#include "bridges/cpp_uno/shared/vtables.hxx"
#include "share.hxx"
using
namespace
::
rtl
;
using
namespace
::
com
::
sun
::
star
::
uno
;
namespace
{
static
void
callVirtualMethod
(
void
*
pAdjustedThisPtr
,
sal_Int32
nVtableIndex
,
void
*
pRegisterReturn
,
typelib_TypeClass
eReturnType
,
char
*
pPT
,
sal_Int32
*
pStackLongs
,
sal_Int32
nStackLongs
)
{
// parameter list is mixed list of * and values
// reference parameters are pointers
// the basic idea here is to use gpr[8] as a storage area for
// the future values of registers r3 to r10 needed for the call,
// and similarly fpr[13] as a storage area for the future values
// of floating point registers f1 to f13
unsigned
long
*
mfunc
;
// actual function to be invoked
int
gpr
[
8
];
// storage for gp registers, map to r3-r10
int
off
;
// offset used to find function
double
fpr
[
13
];
// storage for fp registers, map to f1-f13
int
f
;
// number of fprs mapped so far
double
dret
;
// temporary function return values
int
n
;
// number of gprs mapped so far
long
*
p
;
// pointer to parameter overflow area
int
c
;
// character of parameter type being decoded
int
iret
,
iret2
;
// Because of the Power PC calling conventions we could be passing
// parameters in both register types and on the stack. To create the
// stack parameter area we need we now simply allocate local
// variable storage param[] that is at least the size of the parameter stack
// (more than enough space) which we can overwrite the parameters into.
// Note: This keeps us from having to decode the signature twice and
// prevents problems with later local variables.
// Note: could require up to 2*nStackLongs words of parameter stack area
// if the call has many float parameters (i.e. floats take up only 1
// word on the stack but double takes 2 words in parameter area in the
// stack frame .
// Update! floats on the outgoing parameter stack only take up 1 word
// (stfs is used) which is not correct according to the ABI but we
// will match what the compiler does until this is figured out
// this grows the current stack to the appropriate size
// and sets the outgoing stack pointer p to the right place
__asm__
__volatile__
(
"rlwinm %0,%0,3,3,28
\n\t
"
"addi %0,%0,22
\n\t
"
"rlwinm %0,%0,0,4,28
\n\t
"
"lwz r0,0(r1)
\n\t
"
"subf r1,%0,r1
\n\t
"
"stw r0,0(r1)
\n\t
"
:
:
"r"
(
nStackLongs
)
:
"0"
);
__asm__
__volatile__
(
"addi %0,r1,24"
:
"=r"
(
p
)
:
);
// never called
// if (! pAdjustedThisPtr ) dummy_can_throw_anything("xxx"); // address something
// now begin to load the C++ function arguments into storage
n
=
0
;
f
=
0
;
// now we need to parse the entire signature string */
// until we get the END indicator */
// treat complex return pointer like any other parameter
#if OSL_DEBUG_LEVEL > 2
/* Let's figure out what is really going on here*/
fprintf
(
stderr
,
"callVirtualMethod parameters string is %s
\n
"
,
pPT
);
int
k
=
nStackLongs
;
long
*
q
=
(
long
*
)
pStackLongs
;
while
(
k
>
0
)
{
fprintf
(
stderr
,
"uno stack is: %x
\n
"
,
*
q
);
k
--
;
q
++
;
}
#endif
/* parse the argument list up to the ending ) */
while
(
*
pPT
!=
'X'
)
{
c
=
*
pPT
;
switch
(
c
)
{
case
'D'
:
/* type is double */
if
(
f
<
13
)
{
fpr
[
f
++
]
=
*
((
double
*
)
pStackLongs
);
/* store in register */
}
else
{
if
(((
long
)
p
)
&
4
)
p
++
;
*
p
++
=
*
pStackLongs
;
/* or on the parameter stack */
*
p
++
=
*
(
pStackLongs
+
1
);
}
pStackLongs
+=
2
;
break
;
case
'F'
:
/* type is float */
/* this assumes that floats are stored as 1 32 bit word on param
stack and that if passed in parameter stack to C, should be
as double word.
Whoops: the abi is not actually followed by gcc, need to
store floats as a *single* word on outgoing parameter stack
to match what gcc actually does
*/
if
(
f
<
13
)
{
fpr
[
f
++
]
=
*
((
float
*
)
pStackLongs
);
}
else
{
#if 0 /* if abi were followed */
if (((long) p) & 4)
p++;
*((double *)p) = *((float *)pStackLongs);
p += 2;
#else
*
((
float
*
)
p
)
=
*
((
float
*
)
pStackLongs
);
p
+=
1
;
#endif
}
pStackLongs
+=
1
;
break
;
case
'H'
:
/* type is long long */
if
(
n
&
1
)
n
++
;
/* note even elements gpr[] will map to
odd registers*/
if
(
n
<=
6
)
{
gpr
[
n
++
]
=
*
pStackLongs
;
gpr
[
n
++
]
=
*
(
pStackLongs
+
1
);
}
else
{
if
(((
long
)
p
)
&
4
)
p
++
;
*
p
++
=
*
pStackLongs
;
*
p
++
=
*
(
pStackLongs
+
1
);
}
pStackLongs
+=
2
;
break
;
case
'S'
:
if
(
n
<
8
)
{
gpr
[
n
++
]
=
*
((
unsigned
short
*
)
pStackLongs
);
}
else
{
*
p
++
=
*
((
unsigned
short
*
)
pStackLongs
);
}
pStackLongs
+=
1
;
break
;
case
'B'
:
if
(
n
<
8
)
{
gpr
[
n
++
]
=
*
((
char
*
)
pStackLongs
);
}
else
{
*
p
++
=
*
((
char
*
)
pStackLongs
);
}
pStackLongs
+=
1
;
break
;
default
:
if
(
n
<
8
)
{
gpr
[
n
++
]
=
*
pStackLongs
;
}
else
{
*
p
++
=
*
pStackLongs
;
}
pStackLongs
+=
1
;
break
;
}
pPT
++
;
}
/* figure out the address of the function we need to invoke */
off
=
nVtableIndex
;
off
=
off
*
4
;
// 4 bytes per slot
mfunc
=
*
((
unsigned
long
**
)
pAdjustedThisPtr
);
// get the address of the vtable
mfunc
=
(
unsigned
long
*
)((
char
*
)
mfunc
+
off
);
// get the address from the vtable entry at offset
mfunc
=
*
((
unsigned
long
**
)
mfunc
);
// the function is stored at the address
typedef
void
(
*
FunctionCall
)(
sal_uInt32
,
sal_uInt32
,
sal_uInt32
,
sal_uInt32
,
sal_uInt32
,
sal_uInt32
,
sal_uInt32
,
sal_uInt32
);
FunctionCall
ptr
=
(
FunctionCall
)
mfunc
;
/* Set up the machine registers and invoke the function */
__asm__
__volatile__
(
"lwz r3, 0(%0)
\n\t
"
"lwz r4, 4(%0)
\n\t
"
"lwz r5, 8(%0)
\n\t
"
"lwz r6, 12(%0)
\n\t
"
"lwz r7, 16(%0)
\n\t
"
"lwz r8, 20(%0)
\n\t
"
"lwz r9, 24(%0)
\n\t
"
"lwz r10, 28(%0)
\n\t
"
"lfd f1, 0(%1)
\n\t
"
"lfd f2, 8(%1)
\n\t
"
"lfd f3, 16(%1)
\n\t
"
"lfd f4, 24(%1)
\n\t
"
"lfd f5, 32(%1)
\n\t
"
"lfd f6, 40(%1)
\n\t
"
"lfd f7, 48(%1)
\n\t
"
"lfd f8, 56(%1)
\n\t
"
"lfd f9, 64(%1)
\n\t
"
"lfd f10, 72(%1)
\n\t
"
"lfd f11, 80(%1)
\n\t
"
"lfd f12, 88(%1)
\n\t
"
"lfd f13, 96(%1)
\n\t
"
:
:
"r"
(
gpr
),
"r"
(
fpr
)
:
"0"
,
"3"
,
"4"
,
"5"
,
"6"
,
"7"
,
"8"
,
"9"
,
"10"
,
"1"
,
"2"
,
"3"
,
"4"
,
"5"
,
"6"
,
"7"
,
"8"
,
"9"
,
"10"
,
"11"
,
"12"
,
"13"
);
// tell gcc that r3 to r10 are not available to it for doing the TOC and exception munge on the func call
register
sal_uInt32
r3
__asm__
(
"r3"
);
register
sal_uInt32
r4
__asm__
(
"r4"
);
register
sal_uInt32
r5
__asm__
(
"r5"
);
register
sal_uInt32
r6
__asm__
(
"r6"
);
register
sal_uInt32
r7
__asm__
(
"r7"
);
register
sal_uInt32
r8
__asm__
(
"r8"
);
register
sal_uInt32
r9
__asm__
(
"r9"
);
register
sal_uInt32
r10
__asm__
(
"r10"
);
(
*
ptr
)(
r3
,
r4
,
r5
,
r6
,
r7
,
r8
,
r9
,
r10
);
__asm__
__volatile__
(
"mr %0,r3
\n\t
"
"mr %1,r4
\n\t
"
"fmr %2,f1
\n\t
"
:
"=r"
(
iret
),
"=r"
(
iret2
),
"=f"
(
dret
)
:
);
switch
(
eReturnType
)
{
case
typelib_TypeClass_HYPER
:
case
typelib_TypeClass_UNSIGNED_HYPER
:
((
long
*
)
pRegisterReturn
)[
0
]
=
iret
;
((
long
*
)
pRegisterReturn
)[
1
]
=
iret2
;
case
typelib_TypeClass_LONG
:
case
typelib_TypeClass_UNSIGNED_LONG
:
case
typelib_TypeClass_ENUM
:
((
long
*
)
pRegisterReturn
)[
0
]
=
iret
;
break
;
case
typelib_TypeClass_CHAR
:
case
typelib_TypeClass_SHORT
:
case
typelib_TypeClass_UNSIGNED_SHORT
:
*
(
unsigned
short
*
)
pRegisterReturn
=
(
unsigned
short
)
iret
;
break
;
case
typelib_TypeClass_BOOLEAN
:
case
typelib_TypeClass_BYTE
:
*
(
unsigned
char
*
)
pRegisterReturn
=
(
unsigned
char
)
iret
;
break
;
case
typelib_TypeClass_FLOAT
:
*
(
float
*
)
pRegisterReturn
=
(
float
)
dret
;
break
;
case
typelib_TypeClass_DOUBLE
:
*
(
double
*
)
pRegisterReturn
=
dret
;
break
;
default
:
break
;
}
}
static
void
cpp_call
(
bridges
::
cpp_uno
::
shared
::
UnoInterfaceProxy
*
pThis
,
bridges
::
cpp_uno
::
shared
::
VtableSlot
aVtableSlot
,
typelib_TypeDescriptionReference
*
pReturnTypeRef
,
sal_Int32
nParams
,
typelib_MethodParameter
*
pParams
,
void
*
pUnoReturn
,
void
*
pUnoArgs
[],
uno_Any
**
ppUnoExc
)
{
// max space for: [complex ret ptr], values|ptr ...
char
*
pCppStack
=
(
char
*
)
alloca
(
sizeof
(
sal_Int32
)
+
((
nParams
+
2
)
*
sizeof
(
sal_Int64
))
);
char
*
pCppStackStart
=
pCppStack
;
// need to know parameter types for callVirtualMethod so generate a signature string
char
*
pParamType
=
(
char
*
)
alloca
(
nParams
+
2
);
char
*
pPT
=
pParamType
;
// return
typelib_TypeDescription
*
pReturnTypeDescr
=
0
;
TYPELIB_DANGER_GET
(
&
pReturnTypeDescr
,
pReturnTypeRef
);
// OSL_ENSURE( pReturnTypeDescr, "### expected return type description!" );
void
*
pCppReturn
=
0
;
// if != 0 && != pUnoReturn, needs reconversion
if
(
pReturnTypeDescr
)
{
if
(
bridges
::
cpp_uno
::
shared
::
isSimpleType
(
pReturnTypeDescr
))
{
pCppReturn
=
pUnoReturn
;
// direct way for simple types
}
else
{
// complex return via ptr
pCppReturn
=
*
(
void
**
)
pCppStack
=
(
bridges
::
cpp_uno
::
shared
::
relatesToInterfaceType
(
pReturnTypeDescr
)
?
alloca
(
pReturnTypeDescr
->
nSize
)
:
pUnoReturn
);
// direct way
*
pPT
++
=
'I'
;
//signify that a complex return type on stack
pCppStack
+=
sizeof
(
void
*
);
}
}
// push this
void
*
pAdjustedThisPtr
=
reinterpret_cast
<
void
**>
(
pThis
->
getCppI
())
+
aVtableSlot
.
offset
;
*
(
void
**
)
pCppStack
=
pAdjustedThisPtr
;
pCppStack
+=
sizeof
(
void
*
);
*
pPT
++
=
'I'
;
// stack space
// OSL_ENSURE( sizeof(void *) == sizeof(sal_Int32), "### unexpected size!" );
// args
void
**
pCppArgs
=
(
void
**
)
alloca
(
3
*
sizeof
(
void
*
)
*
nParams
);
// indices of values this have to be converted (interface conversion cpp<=>uno)
sal_Int32
*
pTempIndices
=
(
sal_Int32
*
)(
pCppArgs
+
nParams
);
// type descriptions for reconversions
typelib_TypeDescription
**
ppTempParamTypeDescr
=
(
typelib_TypeDescription
**
)(
pCppArgs
+
(
2
*
nParams
));
sal_Int32
nTempIndices
=
0
;
for
(
sal_Int32
nPos
=
0
;
nPos
<
nParams
;
++
nPos
)
{
const
typelib_MethodParameter
&
rParam
=
pParams
[
nPos
];
typelib_TypeDescription
*
pParamTypeDescr
=
0
;
TYPELIB_DANGER_GET
(
&
pParamTypeDescr
,
rParam
.
pTypeRef
);
if
(
!
rParam
.
bOut
&&
bridges
::
cpp_uno
::
shared
::
isSimpleType
(
pParamTypeDescr
))
{
uno_copyAndConvertData
(
pCppArgs
[
nPos
]
=
pCppStack
,
pUnoArgs
[
nPos
],
pParamTypeDescr
,
pThis
->
getBridge
()
->
getUno2Cpp
()
);
switch
(
pParamTypeDescr
->
eTypeClass
)
{
// we need to know type of each param so that we know whether to use
// gpr or fpr to pass in parameters:
// Key: I - int, long, pointer, etc means pass in gpr
// B - byte value passed in gpr
// S - short value passed in gpr
// F - float value pass in fpr
// D - double value pass in fpr
// H - long long int pass in proper pairs of gpr (3,4) (5,6), etc
// X - indicates end of parameter description string
case
typelib_TypeClass_LONG
:
case
typelib_TypeClass_UNSIGNED_LONG
:
case
typelib_TypeClass_ENUM
:
*
pPT
++
=
'I'
;
break
;
case
typelib_TypeClass_SHORT
:
case
typelib_TypeClass_CHAR
:
case
typelib_TypeClass_UNSIGNED_SHORT
:
*
pPT
++
=
'S'
;
break
;
case
typelib_TypeClass_BOOLEAN
:
case
typelib_TypeClass_BYTE
:
*
pPT
++
=
'B'
;
break
;
case
typelib_TypeClass_FLOAT
:
*
pPT
++
=
'F'
;
break
;
case
typelib_TypeClass_DOUBLE
:
*
pPT
++
=
'D'
;
pCppStack
+=
sizeof
(
sal_Int32
);
// extra long
break
;
case
typelib_TypeClass_HYPER
:
case
typelib_TypeClass_UNSIGNED_HYPER
:
*
pPT
++
=
'H'
;
pCppStack
+=
sizeof
(
sal_Int32
);
// extra long
default
:
break
;
}
// no longer needed
TYPELIB_DANGER_RELEASE
(
pParamTypeDescr
);
}
else
// ptr to complex value | ref
{
if
(
!
rParam
.
bIn
)
// is pure out
{
// cpp out is constructed mem, uno out is not!
uno_constructData
(
*
(
void
**
)
pCppStack
=
pCppArgs
[
nPos
]
=
alloca
(
pParamTypeDescr
->
nSize
),
pParamTypeDescr
);
pTempIndices
[
nTempIndices
]
=
nPos
;
// default constructed for cpp call
// will be released at reconversion
ppTempParamTypeDescr
[
nTempIndices
++
]
=
pParamTypeDescr
;
}
// is in/inout
else
if
(
bridges
::
cpp_uno
::
shared
::
relatesToInterfaceType
(
pParamTypeDescr
))
{
uno_copyAndConvertData
(
*
(
void
**
)
pCppStack
=
pCppArgs
[
nPos
]
=
alloca
(
pParamTypeDescr
->
nSize
),
pUnoArgs
[
nPos
],
pParamTypeDescr
,
pThis
->
getBridge
()
->
getUno2Cpp
()
);
pTempIndices
[
nTempIndices
]
=
nPos
;
// has to be reconverted
// will be released at reconversion
ppTempParamTypeDescr
[
nTempIndices
++
]
=
pParamTypeDescr
;
}
else
// direct way
{
*
(
void
**
)
pCppStack
=
pCppArgs
[
nPos
]
=
pUnoArgs
[
nPos
];
// no longer needed
TYPELIB_DANGER_RELEASE
(
pParamTypeDescr
);
}
// KBH: FIXME: is this the right way to pass these
*
pPT
++=
'I'
;
}
pCppStack
+=
sizeof
(
sal_Int32
);
// standard parameter length
}
// terminate the signature string
*
pPT
++=
'X'
;
*
pPT
=
0
;
try
{
OSL_ENSURE
(
!
(
(
pCppStack
-
pCppStackStart
)
&
3
),
"UNALIGNED STACK !!! (Please DO panic)"
);
callVirtualMethod
(
pAdjustedThisPtr
,
aVtableSlot
.
index
,
pCppReturn
,
pReturnTypeDescr
->
eTypeClass
,
pParamType
,
(
sal_Int32
*
)
pCppStackStart
,
(
pCppStack
-
pCppStackStart
)
/
sizeof
(
sal_Int32
)
);
// NO exception occurred...
*
ppUnoExc
=
0
;
// reconvert temporary params
for
(
;
nTempIndices
--
;
)
{
sal_Int32
nIndex
=
pTempIndices
[
nTempIndices
];
typelib_TypeDescription
*
pParamTypeDescr
=
ppTempParamTypeDescr
[
nTempIndices
];
if
(
pParams
[
nIndex
].
bIn
)
{
if
(
pParams
[
nIndex
].
bOut
)
// inout
{
uno_destructData
(
pUnoArgs
[
nIndex
],
pParamTypeDescr
,
0
);
// destroy uno value
uno_copyAndConvertData
(
pUnoArgs
[
nIndex
],
pCppArgs
[
nIndex
],
pParamTypeDescr
,
pThis
->
getBridge
()
->
getCpp2Uno
()
);
}
}
else
// pure out
{
uno_copyAndConvertData
(
pUnoArgs
[
nIndex
],
pCppArgs
[
nIndex
],
pParamTypeDescr
,
pThis
->
getBridge
()
->
getCpp2Uno
()
);
}
// destroy temp cpp param => cpp: every param was constructed
uno_destructData
(
pCppArgs
[
nIndex
],
pParamTypeDescr
,
cpp_release
);
TYPELIB_DANGER_RELEASE
(
pParamTypeDescr
);
}
// return value
if
(
pCppReturn
&&
pUnoReturn
!=
pCppReturn
)
{
uno_copyAndConvertData
(
pUnoReturn
,
pCppReturn
,
pReturnTypeDescr
,
pThis
->
getBridge
()
->
getCpp2Uno
()
);
uno_destructData
(
pCppReturn
,
pReturnTypeDescr
,
cpp_release
);
}
}
catch
(...)
{
// fill uno exception
fillUnoException
(
CPPU_CURRENT_NAMESPACE
::
__cxa_get_globals
()
->
caughtExceptions
,
*
ppUnoExc
,
pThis
->
getBridge
()
->
getCpp2Uno
()
);
// temporary params
for
(
;
nTempIndices
--
;
)
{
sal_Int32
nIndex
=
pTempIndices
[
nTempIndices
];
// destroy temp cpp param => cpp: every param was constructed
uno_destructData
(
pCppArgs
[
nIndex
],
ppTempParamTypeDescr
[
nTempIndices
],
cpp_release
);
TYPELIB_DANGER_RELEASE
(
ppTempParamTypeDescr
[
nTempIndices
]
);
}
// return type
if
(
pReturnTypeDescr
)
TYPELIB_DANGER_RELEASE
(
pReturnTypeDescr
);
}
}
}
namespace
bridges
{
namespace
cpp_uno
{
namespace
shared
{
void
unoInterfaceProxyDispatch
(
uno_Interface
*
pUnoI
,
const
typelib_TypeDescription
*
pMemberDescr
,
void
*
pReturn
,
void
*
pArgs
[],
uno_Any
**
ppException
)
{
// is my surrogate
bridges
::
cpp_uno
::
shared
::
UnoInterfaceProxy
*
pThis
=
static_cast
<
bridges
::
cpp_uno
::
shared
::
UnoInterfaceProxy
*>
(
pUnoI
);
switch
(
pMemberDescr
->
eTypeClass
)
{
case
typelib_TypeClass_INTERFACE_ATTRIBUTE
:
{
VtableSlot
aVtableSlot
(
getVtableSlot
(
reinterpret_cast
<
typelib_InterfaceAttributeTypeDescription
const
*
>
(
pMemberDescr
)));
if
(
pReturn
)
{
// dependent dispatch
cpp_call
(
pThis
,
aVtableSlot
,
((
typelib_InterfaceAttributeTypeDescription
*
)
pMemberDescr
)
->
pAttributeTypeRef
,
0
,
0
,
// no params
pReturn
,
pArgs
,
ppException
);
}
else
{
// is SET
typelib_MethodParameter
aParam
;
aParam
.
pTypeRef
=
((
typelib_InterfaceAttributeTypeDescription
*
)
pMemberDescr
)
->
pAttributeTypeRef
;
aParam
.
bIn
=
sal_True
;
aParam
.
bOut
=
sal_False
;
typelib_TypeDescriptionReference
*
pReturnTypeRef
=
0
;
OUString
aVoidName
(
"void"
);
typelib_typedescriptionreference_new
(
&
pReturnTypeRef
,
typelib_TypeClass_VOID
,
aVoidName
.
pData
);
// dependent dispatch
aVtableSlot
.
index
+=
1
;
//get then set method
cpp_call
(
pThis
,
aVtableSlot
,
pReturnTypeRef
,
1
,
&
aParam
,
pReturn
,
pArgs
,
ppException
);
typelib_typedescriptionreference_release
(
pReturnTypeRef
);
}
break
;
}
case
typelib_TypeClass_INTERFACE_METHOD
:
{
VtableSlot
aVtableSlot
(
getVtableSlot
(
reinterpret_cast
<
typelib_InterfaceMethodTypeDescription
const
*
>
(
pMemberDescr
)));
switch
(
aVtableSlot
.
index
)
{
// standard calls
case
1
:
// acquire uno interface
(
*
pUnoI
->
acquire
)(
pUnoI
);
*
ppException
=
0
;
break
;
case
2
:
// release uno interface
(
*
pUnoI
->
release
)(
pUnoI
);
*
ppException
=
0
;
break
;
case
0
:
// queryInterface() opt
{
typelib_TypeDescription
*
pTD
=
0
;
TYPELIB_DANGER_GET
(
&
pTD
,
reinterpret_cast
<
Type
*
>
(
pArgs
[
0
]
)
->
getTypeLibType
()
);
if
(
pTD
)
{
uno_Interface
*
pInterface
=
0
;
(
*
pThis
->
pBridge
->
getUnoEnv
()
->
getRegisteredInterface
)(
pThis
->
pBridge
->
getUnoEnv
(),
(
void
**
)
&
pInterface
,
pThis
->
oid
.
pData
,
(
typelib_InterfaceTypeDescription
*
)
pTD
);
if
(
pInterface
)
{
::
uno_any_construct
(
reinterpret_cast
<
uno_Any
*
>
(
pReturn
),
&
pInterface
,
pTD
,
0
);
(
*
pInterface
->
release
)(
pInterface
);
TYPELIB_DANGER_RELEASE
(
pTD
);
*
ppException
=
0
;
break
;
}
TYPELIB_DANGER_RELEASE
(
pTD
);
}
}
// else perform queryInterface()
default
:
// dependent dispatch
cpp_call
(
pThis
,
aVtableSlot
,
((
typelib_InterfaceMethodTypeDescription
*
)
pMemberDescr
)
->
pReturnTypeRef
,
((
typelib_InterfaceMethodTypeDescription
*
)
pMemberDescr
)
->
nParams
,
((
typelib_InterfaceMethodTypeDescription
*
)
pMemberDescr
)
->
pParams
,
pReturn
,
pArgs
,
ppException
);
}
break
;
}
default
:
{
::
com
::
sun
::
star
::
uno
::
RuntimeException
aExc
(
OUString
(
"illegal member type description!"
),
::
com
::
sun
::
star
::
uno
::
Reference
<
::
com
::
sun
::
star
::
uno
::
XInterface
>
()
);
Type
const
&
rExcType
=
::
getCppuType
(
&
aExc
);
// binary identical null reference
::
uno_type_any_construct
(
*
ppException
,
&
aExc
,
rExcType
.
getTypeLibType
(),
0
);
}
}
}
}
}
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
configure.ac
Dosyayı görüntüle @
e29862bc
...
...
@@ -3960,12 +3960,6 @@ darwin*)
OS=IOS
SDKDIR=sdk
;;
powerpc*)
CPUNAME=POWERPC
RTL_ARCH=PowerPC
PLATFORMID=macosx_powerpc
OUTPATH=unxmacxp
;;
i*86)
AC_MSG_ERROR([Can't build 64-bit code in 32-bit OS])
CPUNAME=INTEL
...
...
solenv/gbuild/platform/MACOSX_POWERPC_GCC.mk
deleted
100644 → 0
Dosyayı görüntüle @
0ea9722f
# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*-
#
# This file is part of the LibreOffice project.
#
# 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/.
#
#*************************************************************************
gb_CPUDEFS := -DPPC
gb_COMPILERDEFAULTOPTFLAGS := -O2
include $(GBUILDDIR)/platform/macosx.mk
# vim: set noet sw=4 ts=4:
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment