[PATCH v2] wdscore: Implement CurrentIP.

Jinoh Kang jinoh.kang.kr at gmail.com
Fri Jan 14 08:31:17 CST 2022


On 1/14/22 20:28, Mohamad Al-Jaf wrote:
> Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=51850
> Signed-off-by: Mohamad Al-Jaf <mohamadaljaf at gmail.com>
> ---
> v2: -Add architecture-specific assembly (Credit: Zebediah Figura)
>     -Update copyright year
>     -Add basic unit test
>     -Explicitly declare function takes no parameters
> Note: I compared the native wdscore to this one in both
> Wine and Windows. The functions behaved identically.
> ---
>  configure.ac                   |  1 +
>  dlls/wdscore/Makefile.in       |  3 ++
>  dlls/wdscore/main.c            | 55 ++++++++++++++++++++++++++++++++++
>  dlls/wdscore/tests/Makefile.in |  5 ++++
>  dlls/wdscore/tests/main.c      | 37 +++++++++++++++++++++++
>  dlls/wdscore/wdscore.spec      |  2 +-
>  6 files changed, 102 insertions(+), 1 deletion(-)
>  create mode 100644 dlls/wdscore/main.c
>  create mode 100644 dlls/wdscore/tests/Makefile.in
>  create mode 100644 dlls/wdscore/tests/main.c
> 
> diff --git a/configure.ac b/configure.ac
> index b42cb8a5346..a50881cc2fb 100644
> --- a/configure.ac
> +++ b/configure.ac
> @@ -3347,6 +3347,7 @@ WINE_CONFIG_MAKEFILE(dlls/wbemdisp/tests)
>  WINE_CONFIG_MAKEFILE(dlls/wbemprox)
>  WINE_CONFIG_MAKEFILE(dlls/wbemprox/tests)
>  WINE_CONFIG_MAKEFILE(dlls/wdscore)
> +WINE_CONFIG_MAKEFILE(dlls/wdscore/tests)
>  WINE_CONFIG_MAKEFILE(dlls/webservices)
>  WINE_CONFIG_MAKEFILE(dlls/webservices/tests)
>  WINE_CONFIG_MAKEFILE(dlls/websocket)
> diff --git a/dlls/wdscore/Makefile.in b/dlls/wdscore/Makefile.in
> index 20ba1d3b1c9..2020e72c7bb 100644
> --- a/dlls/wdscore/Makefile.in
> +++ b/dlls/wdscore/Makefile.in
> @@ -1,3 +1,6 @@
>  MODULE    = wdscore.dll
>  
>  EXTRADLLFLAGS = -Wb,--prefer-native
> +
> +C_SRCS = \
> +	main.c
> diff --git a/dlls/wdscore/main.c b/dlls/wdscore/main.c
> new file mode 100644
> index 00000000000..1ed860e02ea
> --- /dev/null
> +++ b/dlls/wdscore/main.c
> @@ -0,0 +1,55 @@
> +/*
> + * Copyright 2022 Mohamad Al-Jaf
> + *
> + * 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
> + */
> +
> +#include <stdarg.h>
> +#include <stdint.h>
> +
> +#include "windef.h"
> +#include "winbase.h"
> +
> +#include "wine/asm.h"
> +#include "wine/debug.h"
> +
> +WINE_DEFAULT_DEBUG_CHANNEL(wdscore);
> +
> +/***********************************************************************
> + *           CurrentIP (wdscore.@)
> + */
> +#ifdef __i386__
> +__ASM_STDCALL_FUNC(CurrentIP, 0,
> +    "movl 0(%esp), %eax\n\t"

You can get rid of "0".

> +    "ret" )
> +#elif defined(__x86_64__)
> +__ASM_STDCALL_FUNC(CurrentIP, 0,
> +    "movq 0(%rsp), %rax\n\t"

Ditto.

> +    "ret" )
> +#elif defined(__arm__)
> +__ASM_STDCALL_FUNC(CurrentIP, 0,
> +    "mov lr, r0\n\t"

Operands are swapped. This is not AT&T syntax. Should be "mov r0, lr".

> +    "bx lr" )
> +#elif defined(__aarch64__)
> +__ASM_STDCALL_FUNC(CurrentIP, 0,
> +    "mov lr, x0\n\t"

Also swapped.

> +    "ret" )
> +#else
> +int WINAPI CurrentIP(void)

As the other reviewer pointed out, use void * as the return address.

> +{
> +    FIXME( "not implemented\n" );
> +    return 0;

Let me suggest an alternative: instead of assembly, we can just use GCC's built-in functions here for all architectures.

#ifdef __has_builtin
#if __has_builtin(__builtin_extract_return_addr)
#define extract_retaddr(x) __builtin_extract_return_addr(x)
#endif
#elif defined(__GNUC__) && __GNUC__ >= 5
#define extract_retaddr(x) __builtin_extract_return_addr(x)
#else
#define extract_retaddr(x) (x)
#endif

void *WINAPI CurrentIP(void)
{
    return extract_retaddr( __builtin_return_address( 0 ));
}

Also this means the debug channel is (again) no longer needed.

> +}
> +#endif
> diff --git a/dlls/wdscore/tests/Makefile.in b/dlls/wdscore/tests/Makefile.in
> new file mode 100644
> index 00000000000..f0606d902d5
> --- /dev/null
> +++ b/dlls/wdscore/tests/Makefile.in
> @@ -0,0 +1,5 @@
> +TESTDLL   = wdscore.dll
> +IMPORTS   = wdscore
> +
> +C_SRCS = \
> +	main.c
> diff --git a/dlls/wdscore/tests/main.c b/dlls/wdscore/tests/main.c
> new file mode 100644
> index 00000000000..262c75641af
> --- /dev/null
> +++ b/dlls/wdscore/tests/main.c
> @@ -0,0 +1,37 @@
> +/*
> + * Unit test suite for wdscore
> + *
> + * Copyright 2022 Mohamad Al-Jaf
> + *
> + * 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
> + *
> + */
> +
> +#include "wine/test.h"
> +#include "winbase.h"
> +
> +static void test_CurrentIP(void)
> +{
> +    int ret;

Use void *.

> +
> +    ret = CurrentIP();
> +    trace("CurrentIP() = %d\n", ret);

s/%d/%p/

> +    ok(ret != 0, "Unsupported architecture\n");
> +}
> +
> +START_TEST(main)
> +{
> +    test_CurrentIP();
> +}
> diff --git a/dlls/wdscore/wdscore.spec b/dlls/wdscore/wdscore.spec
> index 15958b86aba..8b6febe6b3b 100644
> --- a/dlls/wdscore/wdscore.spec
> +++ b/dlls/wdscore/wdscore.spec
> @@ -71,7 +71,7 @@
>  @ stub ConstructPartialMsgIfW
>  @ stub ConstructPartialMsgVA
>  @ stub ConstructPartialMsgVW
> -@ stub CurrentIP
> +@ stdcall CurrentIP()
>  @ stub EndMajorTask
>  @ stub EndMinorTask
>  @ stub GetMajorTask
> 


-- 
Sincerely,
Jinoh Kang



More information about the wine-devel mailing list