Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
W
wine-cw
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
wine
wine-cw
Commits
63be52e2
Commit
63be52e2
authored
Sep 05, 2012
by
Piotr Caban
Committed by
Alexandre Julliard
Sep 05, 2012
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
msvcrt: Moved RTTI and thiscall related macros to separate header.
parent
01c9c1cb
Show whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
174 additions
and
133 deletions
+174
-133
cpp.c
dlls/msvcrt/cpp.c
+20
-133
cxx.h
dlls/msvcrt/cxx.h
+154
-0
No files found.
dlls/msvcrt/cpp.c
View file @
63be52e2
...
...
@@ -31,6 +31,7 @@
#include "msvcrt.h"
#include "cppexcept.h"
#include "mtdll.h"
#include "cxx.h"
WINE_DEFAULT_DEBUG_CHANNEL
(
msvcrt
);
...
...
@@ -38,58 +39,6 @@ typedef exception bad_cast;
typedef
exception
bad_typeid
;
typedef
exception
__non_rtti_object
;
typedef
struct
_rtti_base_descriptor
{
const
type_info
*
type_descriptor
;
int
num_base_classes
;
this_ptr_offsets
offsets
;
/* offsets for computing the this pointer */
unsigned
int
attributes
;
}
rtti_base_descriptor
;
typedef
struct
_rtti_base_array
{
const
rtti_base_descriptor
*
bases
[
3
];
/* First element is the class itself */
}
rtti_base_array
;
typedef
struct
_rtti_object_hierarchy
{
unsigned
int
signature
;
unsigned
int
attributes
;
int
array_len
;
/* Size of the array pointed to by 'base_classes' */
const
rtti_base_array
*
base_classes
;
}
rtti_object_hierarchy
;
typedef
struct
_rtti_object_locator
{
unsigned
int
signature
;
int
base_class_offset
;
unsigned
int
flags
;
const
type_info
*
type_descriptor
;
const
rtti_object_hierarchy
*
type_hierarchy
;
}
rtti_object_locator
;
#ifdef __i386__
/* thiscall functions are i386-specific */
#define THISCALL(func) __thiscall_ ## func
#define THISCALL_NAME(func) __ASM_NAME("__thiscall_" #func)
#define __thiscall __stdcall
#define DEFINE_THISCALL_WRAPPER(func,args) \
extern void THISCALL(func)(void); \
__ASM_GLOBAL_FUNC(__thiscall_ ## func, \
"popl %eax\n\t" \
"pushl %ecx\n\t" \
"pushl %eax\n\t" \
"jmp " __ASM_NAME(#func) __ASM_STDCALL(args) )
#else
/* __i386__ */
#define THISCALL(func) func
#define THISCALL_NAME(func) __ASM_NAME(#func)
#define __thiscall __cdecl
#define DEFINE_THISCALL_WRAPPER(func,args)
/* nothing */
#endif
/* __i386__ */
extern
const
vtable_ptr
MSVCRT_exception_vtable
;
extern
const
vtable_ptr
MSVCRT_bad_typeid_vtable
;
extern
const
vtable_ptr
MSVCRT_bad_cast_vtable
;
...
...
@@ -661,91 +610,29 @@ void * __thiscall MSVCRT_type_info_vector_dtor(type_info * _this, unsigned int f
return
_this
;
}
/* vtables */
#ifdef _WIN64
#define __ASM_VTABLE(name,funcs) \
__asm__(".data\n" \
"\t.align 8\n" \
"\t.quad " __ASM_NAME(#name "_rtti") "\n" \
"\t.globl " __ASM_NAME("MSVCRT_" #name "_vtable") "\n" \
__ASM_NAME("MSVCRT_" #name "_vtable") ":\n" \
"\t.quad " THISCALL_NAME(MSVCRT_ ## name ## _vector_dtor) "\n" \
funcs "\n\t.text");
#define __ASM_EXCEPTION_VTABLE(name) \
__ASM_VTABLE(name, "\t.quad " THISCALL_NAME(MSVCRT_what_exception) )
#else
#define __ASM_VTABLE(name,funcs) \
__asm__(".data\n" \
"\t.align 4\n" \
"\t.long " __ASM_NAME(#name "_rtti") "\n" \
"\t.globl " __ASM_NAME("MSVCRT_" #name "_vtable") "\n" \
__ASM_NAME("MSVCRT_" #name "_vtable") ":\n" \
"\t.long " THISCALL_NAME(MSVCRT_ ## name ## _vector_dtor) "\n" \
funcs "\n\t.text");
#define __ASM_EXCEPTION_VTABLE(name) \
__ASM_VTABLE(name, "\t.long " THISCALL_NAME(MSVCRT_what_exception) )
#endif
/* _WIN64 */
#ifndef __GNUC__
void
__asm_dummy_vtables
(
void
)
{
#endif
__ASM_VTABLE
(
type_info
,
""
)
__ASM_EXCEPTION_VTABLE
(
exception
)
__ASM_EXCEPTION_VTABLE
(
bad_typeid
)
__ASM_EXCEPTION_VTABLE
(
bad_cast
)
__ASM_EXCEPTION_VTABLE
(
__non_rtti_object
)
__ASM_VTABLE
(
type_info
,
VTABLE_ADD_FUNC
(
MSVCRT_type_info_vector_dtor
));
__ASM_VTABLE
(
exception
,
VTABLE_ADD_FUNC
(
MSVCRT_exception_vector_dtor
)
VTABLE_ADD_FUNC
(
MSVCRT_what_exception
));
__ASM_VTABLE
(
bad_typeid
,
VTABLE_ADD_FUNC
(
MSVCRT_bad_typeid_vector_dtor
)
VTABLE_ADD_FUNC
(
MSVCRT_what_exception
));
__ASM_VTABLE
(
bad_cast
,
VTABLE_ADD_FUNC
(
MSVCRT_bad_cast_vector_dtor
)
VTABLE_ADD_FUNC
(
MSVCRT_what_exception
));
__ASM_VTABLE
(
__non_rtti_object
,
VTABLE_ADD_FUNC
(
MSVCRT___non_rtti_object_vector_dtor
)
VTABLE_ADD_FUNC
(
MSVCRT_what_exception
));
#ifndef __GNUC__
}
#endif
/* Static RTTI for exported objects */
#define DEFINE_RTTI_DATA(name, base_classes, cl1, cl2, mangled_name) \
static const type_info name ## _type_info = { \
&MSVCRT_type_info_vtable, \
NULL, \
mangled_name \
}; \
\
static const rtti_base_descriptor name ## _rtti_base_descriptor = { \
&name ##_type_info, \
base_classes, \
{ 0, -1, 0}, \
0 \
}; \
\
static const rtti_base_array name ## _rtti_base_array = { \
{ \
&name ## _rtti_base_descriptor, \
cl1, \
cl2 \
} \
}; \
\
static const rtti_object_hierarchy name ## _hierarchy = { \
0, \
0, \
base_classes+1, \
&name ## _rtti_base_array \
}; \
\
const rtti_object_locator name ## _rtti = { \
0, \
0, \
0, \
&name ## _type_info, \
&name ## _hierarchy \
}
#define DEFINE_EXCEPTION_TYPE_INFO(name, base_classes, cl1, cl2) \
static const cxx_type_info name ## _cxx_type_info = \
{ \
...
...
@@ -774,11 +661,11 @@ const cxx_exception_type name ## _exception_type = \
&name ## _type_info_table \
}
DEFINE_RTTI_DATA
(
type_info
,
0
,
NULL
,
NULL
,
".?AVtype_info@@"
);
DEFINE_RTTI_DATA
(
exception
,
0
,
NULL
,
NULL
,
".?AVexception@@"
);
DEFINE_RTTI_DATA
(
bad_typeid
,
1
,
&
exception_rtti_base_descriptor
,
NULL
,
".?AVbad_typeid@@"
);
DEFINE_RTTI_DATA
(
bad_cast
,
1
,
&
exception_rtti_base_descriptor
,
NULL
,
".?AVbad_cast@@"
);
DEFINE_RTTI_DATA
(
__non_rtti_object
,
2
,
&
bad_typeid_rtti_base_descriptor
,
&
exception_rtti_base_descriptor
,
".?AV__non_rtti_object@@"
);
DEFINE_RTTI_DATA
0
(
type_info
,
0
,
".?AVtype_info@@"
);
DEFINE_RTTI_DATA
0
(
exception
,
0
,
".?AVexception@@"
);
DEFINE_RTTI_DATA
1
(
bad_typeid
,
0
,
&
exception_rtti_base_descriptor
,
".?AVbad_typeid@@"
);
DEFINE_RTTI_DATA
1
(
bad_cast
,
0
,
&
exception_rtti_base_descriptor
,
".?AVbad_cast@@"
);
DEFINE_RTTI_DATA
2
(
__non_rtti_object
,
0
,
&
bad_typeid_rtti_base_descriptor
,
&
exception_rtti_base_descriptor
,
".?AV__non_rtti_object@@"
);
DEFINE_EXCEPTION_TYPE_INFO
(
exception
,
0
,
NULL
,
NULL
);
DEFINE_EXCEPTION_TYPE_INFO
(
bad_typeid
,
1
,
&
exception_cxx_type_info
,
NULL
);
...
...
dlls/msvcrt/cxx.h
0 → 100644
View file @
63be52e2
/*
* Copyright 2012 Piotr Caban for CodeWeavers
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
#ifdef __i386__
/* thiscall functions are i386-specific */
#define THISCALL(func) __thiscall_ ## func
#define THISCALL_NAME(func) __ASM_NAME("__thiscall_" #func)
#define __thiscall __stdcall
#define DEFINE_THISCALL_WRAPPER(func,args) \
extern void THISCALL(func)(void); \
__ASM_GLOBAL_FUNC(__thiscall_ ## func, \
"popl %eax\n\t" \
"pushl %ecx\n\t" \
"pushl %eax\n\t" \
"jmp " __ASM_NAME(#func) __ASM_STDCALL(args) )
#else
/* __i386__ */
#define THISCALL(func) func
#define THISCALL_NAME(func) __ASM_NAME(#func)
#define __thiscall __cdecl
#define DEFINE_THISCALL_WRAPPER(func,args)
/* nothing */
#endif
/* __i386__ */
#ifdef _WIN64
#define VTABLE_ADD_FUNC(name) "\t.quad " THISCALL_NAME(name) "\n"
#define __ASM_VTABLE(name,funcs) \
__asm__(".data\n" \
"\t.align 8\n" \
"\t.quad " __ASM_NAME(#name "_rtti") "\n" \
"\t.globl " __ASM_NAME("MSVCRT_" #name "_vtable") "\n" \
__ASM_NAME("MSVCRT_" #name "_vtable") ":\n" \
funcs "\n\t.text")
#else
#define VTABLE_ADD_FUNC(name) "\t.long " THISCALL_NAME(name) "\n"
#define __ASM_VTABLE(name,funcs) \
__asm__(".data\n" \
"\t.align 4\n" \
"\t.long " __ASM_NAME(#name "_rtti") "\n" \
"\t.globl " __ASM_NAME("MSVCRT_" #name "_vtable") "\n" \
__ASM_NAME("MSVCRT_" #name "_vtable") ":\n" \
funcs "\n\t.text")
#endif
/* _WIN64 */
#define DEFINE_RTTI_DATA(name, off, base_classes, cl1, cl2, cl3, cl4, cl5, cl6, cl7, cl8, cl9, mangled_name) \
static const type_info name ## _type_info = { \
&MSVCRT_type_info_vtable, \
NULL, \
mangled_name \
}; \
\
static const rtti_base_descriptor name ## _rtti_base_descriptor = { \
&name ##_type_info, \
base_classes, \
{ 0, -1, 0}, \
64 \
}; \
\
static const rtti_base_array name ## _rtti_base_array = { \
{ \
&name ## _rtti_base_descriptor, \
cl1, \
cl2, \
cl3, \
cl4, \
cl5, \
cl6, \
cl7, \
cl8, \
cl9, \
} \
}; \
\
static const rtti_object_hierarchy name ## _hierarchy = { \
0, \
0, \
base_classes+1, \
&name ## _rtti_base_array \
}; \
\
const rtti_object_locator name ## _rtti = { \
0, \
off, \
0, \
&name ## _type_info, \
&name ## _hierarchy \
}
#define DEFINE_RTTI_DATA0(name, off, mangled_name) \
DEFINE_RTTI_DATA(name, off, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, mangled_name)
#define DEFINE_RTTI_DATA1(name, off, cl1, mangled_name) \
DEFINE_RTTI_DATA(name, off, 1, cl1, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, mangled_name)
#define DEFINE_RTTI_DATA2(name, off, cl1, cl2, mangled_name) \
DEFINE_RTTI_DATA(name, off, 2, cl1, cl2, NULL, NULL, NULL, NULL, NULL, NULL, NULL, mangled_name)
#define DEFINE_RTTI_DATA3(name, off, cl1, cl2, cl3, mangled_name) \
DEFINE_RTTI_DATA(name, off, 3, cl1, cl2, cl3, NULL, NULL, NULL, NULL, NULL, NULL, mangled_name)
#define DEFINE_RTTI_DATA4(name, off, cl1, cl2, cl3, cl4, mangled_name) \
DEFINE_RTTI_DATA(name, off, 4, cl1, cl2, cl3, cl4, NULL, NULL, NULL, NULL, NULL, mangled_name)
#define DEFINE_RTTI_DATA8(name, off, cl1, cl2, cl3, cl4, cl5, cl6, cl7, cl8, mangled_name) \
DEFINE_RTTI_DATA(name, off, 8, cl1, cl2, cl3, cl4, cl5, cl6, cl7, cl8, NULL, mangled_name)
#define DEFINE_RTTI_DATA9(name, off, cl1, cl2, cl3, cl4, cl5, cl6, cl7, cl8, cl9, mangled_name) \
DEFINE_RTTI_DATA(name, off, 9, cl1, cl2, cl3, cl4, cl5, cl6, cl7, cl8, cl9, mangled_name)
/* rtti */
typedef
struct
_rtti_base_descriptor
{
const
type_info
*
type_descriptor
;
int
num_base_classes
;
this_ptr_offsets
offsets
;
/* offsets for computing the this pointer */
unsigned
int
attributes
;
}
rtti_base_descriptor
;
typedef
struct
_rtti_base_array
{
const
rtti_base_descriptor
*
bases
[
10
];
/* First element is the class itself */
}
rtti_base_array
;
typedef
struct
_rtti_object_hierarchy
{
unsigned
int
signature
;
unsigned
int
attributes
;
int
array_len
;
/* Size of the array pointed to by 'base_classes' */
const
rtti_base_array
*
base_classes
;
}
rtti_object_hierarchy
;
typedef
struct
_rtti_object_locator
{
unsigned
int
signature
;
int
base_class_offset
;
unsigned
int
flags
;
const
type_info
*
type_descriptor
;
const
rtti_object_hierarchy
*
type_hierarchy
;
}
rtti_object_locator
;
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