From 13a6e091b74b8352cb35a4fb305d1bf7da17dab2 Mon Sep 17 00:00:00 2001 From: hubslave <29800872+hubslave@users.noreply.github.com> Date: Tue, 20 Feb 2018 01:28:36 +0200 Subject: [PATCH 1/4] Common: fix swap functions on Bitrig and OpenBSD swap{16,32,64} are defined as macros on the two, but client code tries to invoke them as Common::swap{16,32,64}, which naturally doesn't work. This hack redefines the macros as inline functions in the Common namespace: the bodies of the functions are the same as the original macros, but relying on OS-specific implementation details like this is of course brittle. --- src/common/swap.h | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/common/swap.h b/src/common/swap.h index d94cbe6b2..4a4012d1a 100644 --- a/src/common/swap.h +++ b/src/common/swap.h @@ -103,7 +103,19 @@ inline __attribute__((always_inline)) u64 swap64(u64 _data) { return __builtin_bswap64(_data); } #elif defined(__Bitrig__) || defined(__OpenBSD__) -// swap16, swap32, swap64 are left as is +// redefine swap16, swap32, swap64 as inline functions +#undef swap16 +#undef swap32 +#undef swap64 +inline u16 swap16(u16 _data) { + return __swap16(_data); +} +inline u32 swap32(u32 _data) { + return __swap32(_data); +} +inline u64 swap64(u64 _data) { + return __swap64(_data); +} #elif defined(__DragonFly__) || defined(__FreeBSD__) || defined(__NetBSD__) inline u16 swap16(u16 _data) { return bswap16(_data); From 27b20359b43db5ea1c0e5061c4bc4dd6b0d1528e Mon Sep 17 00:00:00 2001 From: hubslave <29800872+hubslave@users.noreply.github.com> Date: Tue, 20 Feb 2018 01:42:51 +0200 Subject: [PATCH 2/4] core: EMULTIHOP isn't defined on all Unixes --- src/core/hle/service/soc_u.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/core/hle/service/soc_u.cpp b/src/core/hle/service/soc_u.cpp index 21136772a..0309c51e3 100644 --- a/src/core/hle/service/soc_u.cpp +++ b/src/core/hle/service/soc_u.cpp @@ -94,7 +94,9 @@ static const std::unordered_map error_map = {{ {ERRNO(EMFILE), 33}, {EMLINK, 34}, {ERRNO(EMSGSIZE), 35}, +#ifdef EMULTIHOP {ERRNO(EMULTIHOP), 36}, +#endif {ERRNO(ENAMETOOLONG), 37}, {ERRNO(ENETDOWN), 38}, {ERRNO(ENETRESET), 39}, From fd79b70a878a4a1d9d24aa2a8494680b11ea02a6 Mon Sep 17 00:00:00 2001 From: hubslave <29800872+hubslave@users.noreply.github.com> Date: Fri, 2 Mar 2018 18:12:51 +0200 Subject: [PATCH 3/4] externals: Update fmt to 4d35f94 Versions prior to this didn't compile on OpenBSD due to unconditional use of the non-standard strtod_l() function. The fmt::MemoryWriter API has been removed in the intervening versions, so replace its use with fmt::memory_buffer and fmt::format_to. The library also no longer provides the fmt::fmt ALIAS, so define it in externals/CMakeLists.txt. --- externals/CMakeLists.txt | 1 + externals/fmt | 2 +- src/core/hle/service/service.cpp | 12 ++++++------ 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/externals/CMakeLists.txt b/externals/CMakeLists.txt index 88cc52588..b6909ce15 100644 --- a/externals/CMakeLists.txt +++ b/externals/CMakeLists.txt @@ -21,6 +21,7 @@ endif() # libfmt add_subdirectory(fmt) +add_library(fmt::fmt ALIAS fmt) # getopt if (MSVC) diff --git a/externals/fmt b/externals/fmt index ac5484c4e..4d35f9413 160000 --- a/externals/fmt +++ b/externals/fmt @@ -1 +1 @@ -Subproject commit ac5484c4e7365b59d8c7e14db6778de26635e428 +Subproject commit 4d35f94133ed14794e53c9f8627d047b408e0dc7 diff --git a/src/core/hle/service/service.cpp b/src/core/hle/service/service.cpp index 133e14d5e..4bbe8bfb1 100644 --- a/src/core/hle/service/service.cpp +++ b/src/core/hle/service/service.cpp @@ -150,15 +150,15 @@ void ServiceFrameworkBase::ReportUnimplementedFunction(u32* cmd_buf, const Funct int num_params = header.normal_params_size + header.translate_params_size; std::string function_name = info == nullptr ? fmt::format("{:#08x}", cmd_buf[0]) : info->name; - fmt::MemoryWriter w; - w.write("function '{}': port='{}' cmd_buf={{[0]={:#x}", function_name, service_name, - cmd_buf[0]); + fmt::memory_buffer buf; + fmt::format_to(buf, "function '{}': port='{}' cmd_buf={{[0]={:#x}", function_name, service_name, + cmd_buf[0]); for (int i = 1; i <= num_params; ++i) { - w.write(", [{}]={:#x}", i, cmd_buf[i]); + fmt::format_to(buf, ", [{}]={:#x}", i, cmd_buf[i]); } - w << '}'; + buf.push_back('}'); - LOG_ERROR(Service, "unknown / unimplemented %s", w.c_str()); + LOG_ERROR(Service, "unknown / unimplemented %s", fmt::to_string(buf).c_str()); // TODO(bunnei): Hack - ignore error cmd_buf[1] = 0; } From 93fd55249b8f097e283f14420d55f23adbd2836b Mon Sep 17 00:00:00 2001 From: hubslave <29800872+hubslave@users.noreply.github.com> Date: Fri, 2 Mar 2018 18:15:45 +0200 Subject: [PATCH 4/4] Fix build on platforms without std::string_view json.hpp wants it, but it isn't always available. Rather than patch json.hpp directly to remove the dependency, provide a json.h wrapper header that subs in std::experimental::string_view using preprocessor magic. All the consumers of json.hpp are in src/web_service, so the wrapper header is placed there as well. --- src/web_service/announce_room_json.cpp | 2 +- src/web_service/json.h | 18 ++++++++++++++++++ src/web_service/telemetry_json.h | 2 +- src/web_service/verify_login.cpp | 2 +- 4 files changed, 21 insertions(+), 3 deletions(-) create mode 100644 src/web_service/json.h diff --git a/src/web_service/announce_room_json.cpp b/src/web_service/announce_room_json.cpp index d2b79cbae..87f9327bb 100644 --- a/src/web_service/announce_room_json.cpp +++ b/src/web_service/announce_room_json.cpp @@ -3,9 +3,9 @@ // Refer to the license.txt file included. #include -#include #include "common/logging/log.h" #include "web_service/announce_room_json.h" +#include "web_service/json.h" #include "web_service/web_backend.h" namespace AnnounceMultiplayerRoom { diff --git a/src/web_service/json.h b/src/web_service/json.h new file mode 100644 index 000000000..88b31501e --- /dev/null +++ b/src/web_service/json.h @@ -0,0 +1,18 @@ +// Copyright 2018 Citra Emulator Project +// Licensed under GPLv2 or any later version +// Refer to the license.txt file included. + +#pragma once + +// This hack is needed to support json.hpp on platforms where the C++17 stdlib +// lacks std::string_view. See https://github.com/nlohmann/json/issues/735. +// clang-format off +#if !__has_include() && __has_include() +# include +# define string_view experimental::string_view +# include +# undef string_view +#else +# include +#endif +// clang-format on diff --git a/src/web_service/telemetry_json.h b/src/web_service/telemetry_json.h index ae4a6f3c7..27f71b6ba 100644 --- a/src/web_service/telemetry_json.h +++ b/src/web_service/telemetry_json.h @@ -7,9 +7,9 @@ #include #include #include -#include #include "common/announce_multiplayer_room.h" #include "common/telemetry.h" +#include "web_service/json.h" namespace WebService { diff --git a/src/web_service/verify_login.cpp b/src/web_service/verify_login.cpp index 1bc3b5afe..05082a309 100644 --- a/src/web_service/verify_login.cpp +++ b/src/web_service/verify_login.cpp @@ -2,7 +2,7 @@ // Licensed under GPLv2 or any later version // Refer to the license.txt file included. -#include +#include "web_service/json.h" #include "web_service/verify_login.h" #include "web_service/web_backend.h"