Hallo,
as Jason noticed, in MSVCRT there is a _thiscall calling convention that uses the ECX register for the 'this' pointer. Should we have another Specfile keyword in our spec files or should the _thiscall calling convention be implemented via the 'register" keyword?
Bye
Uwe Bonnes bon@elektron.ikp.physik.tu-darmstadt.de writes:
as Jason noticed, in MSVCRT there is a _thiscall calling convention that uses the ECX register for the 'this' pointer. Should we have another Specfile keyword in our spec files or should the _thiscall calling convention be implemented via the 'register" keyword?
I don't think it can be done in the spec file, since this would break the mingw build. If there are many of them we could create inline asm macros to make them easier to use than with full-blown register functions. Do we have a list of the offending functions?
"Alexandre" == Alexandre Julliard julliard@winehq.com writes:
Alexandre> Uwe Bonnes bon@elektron.ikp.physik.tu-darmstadt.de writes: >> as Jason noticed, in MSVCRT there is a _thiscall calling convention >> that uses the ECX register for the 'this' pointer. Should we have >> another Specfile keyword in our spec files or should the _thiscall >> calling convention be implemented via the 'register" keyword?
Alexandre> I don't think it can be done in the spec file, since this Alexandre> would break the mingw build. If there are many of them we Alexandre> could create inline asm macros to make them easier to use Alexandre> than with full-blown register functions. Do we have a list of Alexandre> the offending functions?
A quick scan through dlls/m,svcrt/cpp.c for appearances of _this gives:
void MSVCRT_exception_ctor(exception * _this, const char ** name) void MSVCRT_exception_copy_ctor(exception * _this, const exception * rhs) void MSVCRT_exception_default_ctor(exception * _this) void MSVCRT_exception_dtor(exception * _this exception * MSVCRT_exception_opequals(exception * _this, const exception *rhs) void * MSVCRT_exception__unknown_E(exception * _this, unsigned int arg1) void * MSVCRT_exception__unknown_G(exception * _this, unsigned int arg const char * MSVCRT_what_exception(exception * _this void MSVCRT_bad_typeid_copy_ctor(bad_typeid * _this, const bad_typeid * rhs) void MSVCRT_bad_typeid_ctor(bad_typeid * _this, const char * name) void MSVCRT_bad_typeid_dtor(bad_typeid * _this) bad_typeid * MSVCRT_bad_typeid_opequals(bad_typeid * _this, const bad_typeid * rhs) void MSVCRT___non_rtti_object_copy_ctor(__non_rtti_object * _this, void MSVCRT___non_rtti_object_ctor(__non_rtti_object * _this, void MSVCRT___non_rtti_object_dtor(__non_rtti_object * _this __non_rtti_object * MSVCRT___non_rtti_object_opequals(__non_rtti_object * _this, void * MSVCRT___non_rtti_object__unknown_E(__non_rtti_object * _this, unsigned int arg1) void * MSVCRT___non_rtti_object__unknown_G(__non_rtti_object * _this, void MSVCRT_bad_cast_ctor(bad_cast * _this void MSVCRT_bad_cast_copy_ctor(bad_cast * _this,const bad_cast * rhs void MSVCRT_bad_cast_dtor(bad_cast * _this) bad_cast * MSVCRT_bad_cast_opequals(bad_cast * _this, const bad_cast * rhs) int __stdcall MSVCRT_type_info_opequals_equals(type_info * _this, const type_info * rhs) int __stdcall MSVCRT_type_info_opnot_equals(type_info * _this, consttype_info * rhs) void MSVCRT_type_info_dtor(type_info * _this) const char * __stdcall MSVCRT_type_info_name(type_info * _this) const char * __stdcall MSVCRT_type_info_raw_name(type_info * _this)
Bye