early-access version 3327
This commit is contained in:
parent
a77a8138cb
commit
26ae6cfc1d
12 changed files with 6127 additions and 11 deletions
|
@ -208,6 +208,7 @@ set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/bin)
|
||||||
find_package(enet 1.3 MODULE)
|
find_package(enet 1.3 MODULE)
|
||||||
find_package(fmt 9 REQUIRED)
|
find_package(fmt 9 REQUIRED)
|
||||||
find_package(inih MODULE)
|
find_package(inih MODULE)
|
||||||
|
find_package(LLVM MODULE)
|
||||||
find_package(lz4 REQUIRED)
|
find_package(lz4 REQUIRED)
|
||||||
find_package(nlohmann_json 3.8 REQUIRED)
|
find_package(nlohmann_json 3.8 REQUIRED)
|
||||||
find_package(Opus 1.3 MODULE)
|
find_package(Opus 1.3 MODULE)
|
||||||
|
|
16
CMakeModules/FindLLVM.cmake
Executable file
16
CMakeModules/FindLLVM.cmake
Executable file
|
@ -0,0 +1,16 @@
|
||||||
|
# SPDX-FileCopyrightText: 2023 Alexandre Bouvier <contact@amb.tf>
|
||||||
|
#
|
||||||
|
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
|
find_package(LLVM QUIET CONFIG)
|
||||||
|
|
||||||
|
include(FindPackageHandleStandardArgs)
|
||||||
|
find_package_handle_standard_args(LLVM CONFIG_MODE)
|
||||||
|
|
||||||
|
if (LLVM_FOUND AND NOT TARGET LLVM::Demangle)
|
||||||
|
add_library(LLVM::Demangle INTERFACE IMPORTED)
|
||||||
|
llvm_map_components_to_libnames(LLVM_LIBRARIES demangle)
|
||||||
|
target_compile_definitions(LLVM::Demangle INTERFACE ${LLVM_DEFINITIONS})
|
||||||
|
target_include_directories(LLVM::Demangle INTERFACE ${LLVM_INCLUDE_DIRS})
|
||||||
|
target_link_libraries(LLVM::Demangle INTERFACE ${LLVM_LIBRARIES})
|
||||||
|
endif()
|
|
@ -1,7 +1,7 @@
|
||||||
yuzu emulator early access
|
yuzu emulator early access
|
||||||
=============
|
=============
|
||||||
|
|
||||||
This is the source code for early-access 3326.
|
This is the source code for early-access 3327.
|
||||||
|
|
||||||
## Legal Notice
|
## Legal Notice
|
||||||
|
|
||||||
|
|
3
externals/CMakeLists.txt
vendored
3
externals/CMakeLists.txt
vendored
|
@ -158,6 +158,9 @@ if (YUZU_USE_EXTERNAL_VULKAN_HEADERS)
|
||||||
add_subdirectory(Vulkan-Headers EXCLUDE_FROM_ALL)
|
add_subdirectory(Vulkan-Headers EXCLUDE_FROM_ALL)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
if (NOT TARGET LLVM::Demangle)
|
||||||
add_library(demangle STATIC)
|
add_library(demangle STATIC)
|
||||||
target_include_directories(demangle PUBLIC ./demangle)
|
target_include_directories(demangle PUBLIC ./demangle)
|
||||||
target_sources(demangle PRIVATE demangle/ItaniumDemangle.cpp)
|
target_sources(demangle PRIVATE demangle/ItaniumDemangle.cpp)
|
||||||
|
add_library(LLVM::Demangle ALIAS demangle)
|
||||||
|
endif()
|
||||||
|
|
4
externals/demangle/ItaniumDemangle.cpp
vendored
4
externals/demangle/ItaniumDemangle.cpp
vendored
|
@ -11,8 +11,8 @@
|
||||||
// file does not yet support:
|
// file does not yet support:
|
||||||
// - C++ modules TS
|
// - C++ modules TS
|
||||||
|
|
||||||
#include "Demangle.h"
|
#include "llvm/Demangle/Demangle.h"
|
||||||
#include "ItaniumDemangle.h"
|
#include "llvm/Demangle/ItaniumDemangle.h"
|
||||||
|
|
||||||
#include <cassert>
|
#include <cassert>
|
||||||
#include <cctype>
|
#include <cctype>
|
||||||
|
|
104
externals/demangle/llvm/Demangle/Demangle.h
vendored
Executable file
104
externals/demangle/llvm/Demangle/Demangle.h
vendored
Executable file
|
@ -0,0 +1,104 @@
|
||||||
|
//===--- Demangle.h ---------------------------------------------*- C++ -*-===//
|
||||||
|
//
|
||||||
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
||||||
|
// See https://llvm.org/LICENSE.txt for license information.
|
||||||
|
// SPDX-FileCopyrightText: Part of the LLVM Project
|
||||||
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
||||||
|
//
|
||||||
|
//===----------------------------------------------------------------------===//
|
||||||
|
|
||||||
|
#ifndef LLVM_DEMANGLE_DEMANGLE_H
|
||||||
|
#define LLVM_DEMANGLE_DEMANGLE_H
|
||||||
|
|
||||||
|
#include <cstddef>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
namespace llvm {
|
||||||
|
/// This is a llvm local version of __cxa_demangle. Other than the name and
|
||||||
|
/// being in the llvm namespace it is identical.
|
||||||
|
///
|
||||||
|
/// The mangled_name is demangled into buf and returned. If the buffer is not
|
||||||
|
/// large enough, realloc is used to expand it.
|
||||||
|
///
|
||||||
|
/// The *status will be set to a value from the following enumeration
|
||||||
|
enum : int {
|
||||||
|
demangle_unknown_error = -4,
|
||||||
|
demangle_invalid_args = -3,
|
||||||
|
demangle_invalid_mangled_name = -2,
|
||||||
|
demangle_memory_alloc_failure = -1,
|
||||||
|
demangle_success = 0,
|
||||||
|
};
|
||||||
|
|
||||||
|
char *itaniumDemangle(const char *mangled_name, char *buf, size_t *n,
|
||||||
|
int *status);
|
||||||
|
|
||||||
|
|
||||||
|
enum MSDemangleFlags {
|
||||||
|
MSDF_None = 0,
|
||||||
|
MSDF_DumpBackrefs = 1 << 0,
|
||||||
|
MSDF_NoAccessSpecifier = 1 << 1,
|
||||||
|
MSDF_NoCallingConvention = 1 << 2,
|
||||||
|
MSDF_NoReturnType = 1 << 3,
|
||||||
|
MSDF_NoMemberType = 1 << 4,
|
||||||
|
};
|
||||||
|
char *microsoftDemangle(const char *mangled_name, char *buf, size_t *n,
|
||||||
|
int *status, MSDemangleFlags Flags = MSDF_None);
|
||||||
|
|
||||||
|
/// "Partial" demangler. This supports demangling a string into an AST
|
||||||
|
/// (typically an intermediate stage in itaniumDemangle) and querying certain
|
||||||
|
/// properties or partially printing the demangled name.
|
||||||
|
struct ItaniumPartialDemangler {
|
||||||
|
ItaniumPartialDemangler();
|
||||||
|
|
||||||
|
ItaniumPartialDemangler(ItaniumPartialDemangler &&Other);
|
||||||
|
ItaniumPartialDemangler &operator=(ItaniumPartialDemangler &&Other);
|
||||||
|
|
||||||
|
/// Demangle into an AST. Subsequent calls to the rest of the member functions
|
||||||
|
/// implicitly operate on the AST this produces.
|
||||||
|
/// \return true on error, false otherwise
|
||||||
|
bool partialDemangle(const char *MangledName);
|
||||||
|
|
||||||
|
/// Just print the entire mangled name into Buf. Buf and N behave like the
|
||||||
|
/// second and third parameters to itaniumDemangle.
|
||||||
|
char *finishDemangle(char *Buf, size_t *N) const;
|
||||||
|
|
||||||
|
/// Get the base name of a function. This doesn't include trailing template
|
||||||
|
/// arguments, ie for "a::b<int>" this function returns "b".
|
||||||
|
char *getFunctionBaseName(char *Buf, size_t *N) const;
|
||||||
|
|
||||||
|
/// Get the context name for a function. For "a::b::c", this function returns
|
||||||
|
/// "a::b".
|
||||||
|
char *getFunctionDeclContextName(char *Buf, size_t *N) const;
|
||||||
|
|
||||||
|
/// Get the entire name of this function.
|
||||||
|
char *getFunctionName(char *Buf, size_t *N) const;
|
||||||
|
|
||||||
|
/// Get the parameters for this function.
|
||||||
|
char *getFunctionParameters(char *Buf, size_t *N) const;
|
||||||
|
char *getFunctionReturnType(char *Buf, size_t *N) const;
|
||||||
|
|
||||||
|
/// If this function has any any cv or reference qualifiers. These imply that
|
||||||
|
/// the function is a non-static member function.
|
||||||
|
bool hasFunctionQualifiers() const;
|
||||||
|
|
||||||
|
/// If this symbol describes a constructor or destructor.
|
||||||
|
bool isCtorOrDtor() const;
|
||||||
|
|
||||||
|
/// If this symbol describes a function.
|
||||||
|
bool isFunction() const;
|
||||||
|
|
||||||
|
/// If this symbol describes a variable.
|
||||||
|
bool isData() const;
|
||||||
|
|
||||||
|
/// If this symbol is a <special-name>. These are generally implicitly
|
||||||
|
/// generated by the implementation, such as vtables and typeinfo names.
|
||||||
|
bool isSpecialName() const;
|
||||||
|
|
||||||
|
~ItaniumPartialDemangler();
|
||||||
|
private:
|
||||||
|
void *RootNode;
|
||||||
|
void *Context;
|
||||||
|
};
|
||||||
|
} // namespace llvm
|
||||||
|
|
||||||
|
#endif
|
93
externals/demangle/llvm/Demangle/DemangleConfig.h
vendored
Executable file
93
externals/demangle/llvm/Demangle/DemangleConfig.h
vendored
Executable file
|
@ -0,0 +1,93 @@
|
||||||
|
//===--- DemangleConfig.h ---------------------------------------*- C++ -*-===//
|
||||||
|
//
|
||||||
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
||||||
|
// See https://llvm.org/LICENSE.txt for license information.
|
||||||
|
// SPDX-FileCopyrightText: Part of the LLVM Project
|
||||||
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
||||||
|
//
|
||||||
|
//===----------------------------------------------------------------------===//
|
||||||
|
//
|
||||||
|
// This file contains a variety of feature test macros copied from
|
||||||
|
// include/llvm/Support/Compiler.h so that LLVMDemangle does not need to take
|
||||||
|
// a dependency on LLVMSupport.
|
||||||
|
//
|
||||||
|
//===----------------------------------------------------------------------===//
|
||||||
|
|
||||||
|
#ifndef LLVM_DEMANGLE_COMPILER_H
|
||||||
|
#define LLVM_DEMANGLE_COMPILER_H
|
||||||
|
|
||||||
|
#ifndef __has_feature
|
||||||
|
#define __has_feature(x) 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef __has_cpp_attribute
|
||||||
|
#define __has_cpp_attribute(x) 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef __has_attribute
|
||||||
|
#define __has_attribute(x) 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef __has_builtin
|
||||||
|
#define __has_builtin(x) 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef DEMANGLE_GNUC_PREREQ
|
||||||
|
#if defined(__GNUC__) && defined(__GNUC_MINOR__) && defined(__GNUC_PATCHLEVEL__)
|
||||||
|
#define DEMANGLE_GNUC_PREREQ(maj, min, patch) \
|
||||||
|
((__GNUC__ << 20) + (__GNUC_MINOR__ << 10) + __GNUC_PATCHLEVEL__ >= \
|
||||||
|
((maj) << 20) + ((min) << 10) + (patch))
|
||||||
|
#elif defined(__GNUC__) && defined(__GNUC_MINOR__)
|
||||||
|
#define DEMANGLE_GNUC_PREREQ(maj, min, patch) \
|
||||||
|
((__GNUC__ << 20) + (__GNUC_MINOR__ << 10) >= ((maj) << 20) + ((min) << 10))
|
||||||
|
#else
|
||||||
|
#define DEMANGLE_GNUC_PREREQ(maj, min, patch) 0
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if __has_attribute(used) || DEMANGLE_GNUC_PREREQ(3, 1, 0)
|
||||||
|
#define DEMANGLE_ATTRIBUTE_USED __attribute__((__used__))
|
||||||
|
#else
|
||||||
|
#define DEMANGLE_ATTRIBUTE_USED
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if __has_builtin(__builtin_unreachable) || DEMANGLE_GNUC_PREREQ(4, 5, 0)
|
||||||
|
#define DEMANGLE_UNREACHABLE __builtin_unreachable()
|
||||||
|
#elif defined(_MSC_VER)
|
||||||
|
#define DEMANGLE_UNREACHABLE __assume(false)
|
||||||
|
#else
|
||||||
|
#define DEMANGLE_UNREACHABLE
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if __has_attribute(noinline) || DEMANGLE_GNUC_PREREQ(3, 4, 0)
|
||||||
|
#define DEMANGLE_ATTRIBUTE_NOINLINE __attribute__((noinline))
|
||||||
|
#elif defined(_MSC_VER)
|
||||||
|
#define DEMANGLE_ATTRIBUTE_NOINLINE __declspec(noinline)
|
||||||
|
#else
|
||||||
|
#define DEMANGLE_ATTRIBUTE_NOINLINE
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(NDEBUG)
|
||||||
|
#define DEMANGLE_DUMP_METHOD DEMANGLE_ATTRIBUTE_NOINLINE DEMANGLE_ATTRIBUTE_USED
|
||||||
|
#else
|
||||||
|
#define DEMANGLE_DUMP_METHOD DEMANGLE_ATTRIBUTE_NOINLINE
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if __cplusplus > 201402L && __has_cpp_attribute(fallthrough)
|
||||||
|
#define DEMANGLE_FALLTHROUGH [[fallthrough]]
|
||||||
|
#elif __has_cpp_attribute(gnu::fallthrough)
|
||||||
|
#define DEMANGLE_FALLTHROUGH [[gnu::fallthrough]]
|
||||||
|
#elif !__cplusplus
|
||||||
|
// Workaround for llvm.org/PR23435, since clang 3.6 and below emit a spurious
|
||||||
|
// error when __has_cpp_attribute is given a scoped attribute in C mode.
|
||||||
|
#define DEMANGLE_FALLTHROUGH
|
||||||
|
#elif __has_cpp_attribute(clang::fallthrough)
|
||||||
|
#define DEMANGLE_FALLTHROUGH [[clang::fallthrough]]
|
||||||
|
#else
|
||||||
|
#define DEMANGLE_FALLTHROUGH
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define DEMANGLE_NAMESPACE_BEGIN namespace llvm { namespace itanium_demangle {
|
||||||
|
#define DEMANGLE_NAMESPACE_END } }
|
||||||
|
|
||||||
|
#endif
|
5582
externals/demangle/llvm/Demangle/ItaniumDemangle.h
vendored
Executable file
5582
externals/demangle/llvm/Demangle/ItaniumDemangle.h
vendored
Executable file
File diff suppressed because it is too large
Load diff
127
externals/demangle/llvm/Demangle/StringView.h
vendored
Executable file
127
externals/demangle/llvm/Demangle/StringView.h
vendored
Executable file
|
@ -0,0 +1,127 @@
|
||||||
|
//===--- StringView.h -------------------------------------------*- C++ -*-===//
|
||||||
|
//
|
||||||
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
||||||
|
// See https://llvm.org/LICENSE.txt for license information.
|
||||||
|
// SPDX-FileCopyrightText: Part of the LLVM Project
|
||||||
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
||||||
|
//
|
||||||
|
//===----------------------------------------------------------------------===//
|
||||||
|
//
|
||||||
|
// FIXME: Use std::string_view instead when we support C++17.
|
||||||
|
//
|
||||||
|
//===----------------------------------------------------------------------===//
|
||||||
|
|
||||||
|
#ifndef DEMANGLE_STRINGVIEW_H
|
||||||
|
#define DEMANGLE_STRINGVIEW_H
|
||||||
|
|
||||||
|
#include "DemangleConfig.h"
|
||||||
|
#include <algorithm>
|
||||||
|
#include <cassert>
|
||||||
|
#include <cstring>
|
||||||
|
|
||||||
|
DEMANGLE_NAMESPACE_BEGIN
|
||||||
|
|
||||||
|
class StringView {
|
||||||
|
const char *First;
|
||||||
|
const char *Last;
|
||||||
|
|
||||||
|
public:
|
||||||
|
static const size_t npos = ~size_t(0);
|
||||||
|
|
||||||
|
template <size_t N>
|
||||||
|
StringView(const char (&Str)[N]) : First(Str), Last(Str + N - 1) {}
|
||||||
|
StringView(const char *First_, const char *Last_)
|
||||||
|
: First(First_), Last(Last_) {}
|
||||||
|
StringView(const char *First_, size_t Len)
|
||||||
|
: First(First_), Last(First_ + Len) {}
|
||||||
|
StringView(const char *Str) : First(Str), Last(Str + std::strlen(Str)) {}
|
||||||
|
StringView() : First(nullptr), Last(nullptr) {}
|
||||||
|
|
||||||
|
StringView substr(size_t From) const {
|
||||||
|
return StringView(begin() + From, size() - From);
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t find(char C, size_t From = 0) const {
|
||||||
|
size_t FindBegin = std::min(From, size());
|
||||||
|
// Avoid calling memchr with nullptr.
|
||||||
|
if (FindBegin < size()) {
|
||||||
|
// Just forward to memchr, which is faster than a hand-rolled loop.
|
||||||
|
if (const void *P = ::memchr(First + FindBegin, C, size() - FindBegin))
|
||||||
|
return size_t(static_cast<const char *>(P) - First);
|
||||||
|
}
|
||||||
|
return npos;
|
||||||
|
}
|
||||||
|
|
||||||
|
StringView substr(size_t From, size_t To) const {
|
||||||
|
if (To >= size())
|
||||||
|
To = size() - 1;
|
||||||
|
if (From >= size())
|
||||||
|
From = size() - 1;
|
||||||
|
return StringView(First + From, First + To);
|
||||||
|
}
|
||||||
|
|
||||||
|
StringView dropFront(size_t N = 1) const {
|
||||||
|
if (N >= size())
|
||||||
|
N = size();
|
||||||
|
return StringView(First + N, Last);
|
||||||
|
}
|
||||||
|
|
||||||
|
StringView dropBack(size_t N = 1) const {
|
||||||
|
if (N >= size())
|
||||||
|
N = size();
|
||||||
|
return StringView(First, Last - N);
|
||||||
|
}
|
||||||
|
|
||||||
|
char front() const {
|
||||||
|
assert(!empty());
|
||||||
|
return *begin();
|
||||||
|
}
|
||||||
|
|
||||||
|
char back() const {
|
||||||
|
assert(!empty());
|
||||||
|
return *(end() - 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
char popFront() {
|
||||||
|
assert(!empty());
|
||||||
|
return *First++;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool consumeFront(char C) {
|
||||||
|
if (!startsWith(C))
|
||||||
|
return false;
|
||||||
|
*this = dropFront(1);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool consumeFront(StringView S) {
|
||||||
|
if (!startsWith(S))
|
||||||
|
return false;
|
||||||
|
*this = dropFront(S.size());
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool startsWith(char C) const { return !empty() && *begin() == C; }
|
||||||
|
|
||||||
|
bool startsWith(StringView Str) const {
|
||||||
|
if (Str.size() > size())
|
||||||
|
return false;
|
||||||
|
return std::equal(Str.begin(), Str.end(), begin());
|
||||||
|
}
|
||||||
|
|
||||||
|
const char &operator[](size_t Idx) const { return *(begin() + Idx); }
|
||||||
|
|
||||||
|
const char *begin() const { return First; }
|
||||||
|
const char *end() const { return Last; }
|
||||||
|
size_t size() const { return static_cast<size_t>(Last - First); }
|
||||||
|
bool empty() const { return First == Last; }
|
||||||
|
};
|
||||||
|
|
||||||
|
inline bool operator==(const StringView &LHS, const StringView &RHS) {
|
||||||
|
return LHS.size() == RHS.size() &&
|
||||||
|
std::equal(LHS.begin(), LHS.end(), RHS.begin());
|
||||||
|
}
|
||||||
|
|
||||||
|
DEMANGLE_NAMESPACE_END
|
||||||
|
|
||||||
|
#endif
|
192
externals/demangle/llvm/Demangle/Utility.h
vendored
Executable file
192
externals/demangle/llvm/Demangle/Utility.h
vendored
Executable file
|
@ -0,0 +1,192 @@
|
||||||
|
//===--- Utility.h ----------------------------------------------*- C++ -*-===//
|
||||||
|
//
|
||||||
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
||||||
|
// See https://llvm.org/LICENSE.txt for license information.
|
||||||
|
// SPDX-FileCopyrightText: Part of the LLVM Project
|
||||||
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
||||||
|
//
|
||||||
|
//===----------------------------------------------------------------------===//
|
||||||
|
//
|
||||||
|
// Provide some utility classes for use in the demangler(s).
|
||||||
|
//
|
||||||
|
//===----------------------------------------------------------------------===//
|
||||||
|
|
||||||
|
#ifndef DEMANGLE_UTILITY_H
|
||||||
|
#define DEMANGLE_UTILITY_H
|
||||||
|
|
||||||
|
#include "StringView.h"
|
||||||
|
#include <cstdint>
|
||||||
|
#include <cstdlib>
|
||||||
|
#include <cstring>
|
||||||
|
#include <iterator>
|
||||||
|
#include <limits>
|
||||||
|
|
||||||
|
DEMANGLE_NAMESPACE_BEGIN
|
||||||
|
|
||||||
|
// Stream that AST nodes write their string representation into after the AST
|
||||||
|
// has been parsed.
|
||||||
|
class OutputStream {
|
||||||
|
char *Buffer;
|
||||||
|
size_t CurrentPosition;
|
||||||
|
size_t BufferCapacity;
|
||||||
|
|
||||||
|
// Ensure there is at least n more positions in buffer.
|
||||||
|
void grow(size_t N) {
|
||||||
|
if (N + CurrentPosition >= BufferCapacity) {
|
||||||
|
BufferCapacity *= 2;
|
||||||
|
if (BufferCapacity < N + CurrentPosition)
|
||||||
|
BufferCapacity = N + CurrentPosition;
|
||||||
|
Buffer = static_cast<char *>(std::realloc(Buffer, BufferCapacity));
|
||||||
|
if (Buffer == nullptr)
|
||||||
|
std::terminate();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void writeUnsigned(uint64_t N, bool isNeg = false) {
|
||||||
|
// Handle special case...
|
||||||
|
if (N == 0) {
|
||||||
|
*this << '0';
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
char Temp[21];
|
||||||
|
char *TempPtr = std::end(Temp);
|
||||||
|
|
||||||
|
while (N) {
|
||||||
|
*--TempPtr = '0' + char(N % 10);
|
||||||
|
N /= 10;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add negative sign...
|
||||||
|
if (isNeg)
|
||||||
|
*--TempPtr = '-';
|
||||||
|
this->operator<<(StringView(TempPtr, std::end(Temp)));
|
||||||
|
}
|
||||||
|
|
||||||
|
public:
|
||||||
|
OutputStream(char *StartBuf, size_t Size)
|
||||||
|
: Buffer(StartBuf), CurrentPosition(0), BufferCapacity(Size) {}
|
||||||
|
OutputStream() = default;
|
||||||
|
void reset(char *Buffer_, size_t BufferCapacity_) {
|
||||||
|
CurrentPosition = 0;
|
||||||
|
Buffer = Buffer_;
|
||||||
|
BufferCapacity = BufferCapacity_;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// If a ParameterPackExpansion (or similar type) is encountered, the offset
|
||||||
|
/// into the pack that we're currently printing.
|
||||||
|
unsigned CurrentPackIndex = std::numeric_limits<unsigned>::max();
|
||||||
|
unsigned CurrentPackMax = std::numeric_limits<unsigned>::max();
|
||||||
|
|
||||||
|
OutputStream &operator+=(StringView R) {
|
||||||
|
size_t Size = R.size();
|
||||||
|
if (Size == 0)
|
||||||
|
return *this;
|
||||||
|
grow(Size);
|
||||||
|
std::memmove(Buffer + CurrentPosition, R.begin(), Size);
|
||||||
|
CurrentPosition += Size;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
OutputStream &operator+=(char C) {
|
||||||
|
grow(1);
|
||||||
|
Buffer[CurrentPosition++] = C;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
OutputStream &operator<<(StringView R) { return (*this += R); }
|
||||||
|
|
||||||
|
OutputStream &operator<<(char C) { return (*this += C); }
|
||||||
|
|
||||||
|
OutputStream &operator<<(long long N) {
|
||||||
|
if (N < 0)
|
||||||
|
writeUnsigned(static_cast<unsigned long long>(-N), true);
|
||||||
|
else
|
||||||
|
writeUnsigned(static_cast<unsigned long long>(N));
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
OutputStream &operator<<(unsigned long long N) {
|
||||||
|
writeUnsigned(N, false);
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
OutputStream &operator<<(long N) {
|
||||||
|
return this->operator<<(static_cast<long long>(N));
|
||||||
|
}
|
||||||
|
|
||||||
|
OutputStream &operator<<(unsigned long N) {
|
||||||
|
return this->operator<<(static_cast<unsigned long long>(N));
|
||||||
|
}
|
||||||
|
|
||||||
|
OutputStream &operator<<(int N) {
|
||||||
|
return this->operator<<(static_cast<long long>(N));
|
||||||
|
}
|
||||||
|
|
||||||
|
OutputStream &operator<<(unsigned int N) {
|
||||||
|
return this->operator<<(static_cast<unsigned long long>(N));
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t getCurrentPosition() const { return CurrentPosition; }
|
||||||
|
void setCurrentPosition(size_t NewPos) { CurrentPosition = NewPos; }
|
||||||
|
|
||||||
|
char back() const {
|
||||||
|
return CurrentPosition ? Buffer[CurrentPosition - 1] : '\0';
|
||||||
|
}
|
||||||
|
|
||||||
|
bool empty() const { return CurrentPosition == 0; }
|
||||||
|
|
||||||
|
char *getBuffer() { return Buffer; }
|
||||||
|
char *getBufferEnd() { return Buffer + CurrentPosition - 1; }
|
||||||
|
size_t getBufferCapacity() { return BufferCapacity; }
|
||||||
|
};
|
||||||
|
|
||||||
|
template <class T> class SwapAndRestore {
|
||||||
|
T &Restore;
|
||||||
|
T OriginalValue;
|
||||||
|
bool ShouldRestore = true;
|
||||||
|
|
||||||
|
public:
|
||||||
|
SwapAndRestore(T &Restore_) : SwapAndRestore(Restore_, Restore_) {}
|
||||||
|
|
||||||
|
SwapAndRestore(T &Restore_, T NewVal)
|
||||||
|
: Restore(Restore_), OriginalValue(Restore) {
|
||||||
|
Restore = std::move(NewVal);
|
||||||
|
}
|
||||||
|
~SwapAndRestore() {
|
||||||
|
if (ShouldRestore)
|
||||||
|
Restore = std::move(OriginalValue);
|
||||||
|
}
|
||||||
|
|
||||||
|
void shouldRestore(bool ShouldRestore_) { ShouldRestore = ShouldRestore_; }
|
||||||
|
|
||||||
|
void restoreNow(bool Force) {
|
||||||
|
if (!Force && !ShouldRestore)
|
||||||
|
return;
|
||||||
|
|
||||||
|
Restore = std::move(OriginalValue);
|
||||||
|
ShouldRestore = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
SwapAndRestore(const SwapAndRestore &) = delete;
|
||||||
|
SwapAndRestore &operator=(const SwapAndRestore &) = delete;
|
||||||
|
};
|
||||||
|
|
||||||
|
inline bool initializeOutputStream(char *Buf, size_t *N, OutputStream &S,
|
||||||
|
size_t InitSize) {
|
||||||
|
size_t BufferSize;
|
||||||
|
if (Buf == nullptr) {
|
||||||
|
Buf = static_cast<char *>(std::malloc(InitSize));
|
||||||
|
if (Buf == nullptr)
|
||||||
|
return false;
|
||||||
|
BufferSize = InitSize;
|
||||||
|
} else
|
||||||
|
BufferSize = *N;
|
||||||
|
|
||||||
|
S.reset(Buf, BufferSize);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
DEMANGLE_NAMESPACE_END
|
||||||
|
|
||||||
|
#endif
|
|
@ -177,7 +177,7 @@ endif()
|
||||||
create_target_directory_groups(common)
|
create_target_directory_groups(common)
|
||||||
|
|
||||||
target_link_libraries(common PUBLIC ${Boost_LIBRARIES} fmt::fmt microprofile Threads::Threads)
|
target_link_libraries(common PUBLIC ${Boost_LIBRARIES} fmt::fmt microprofile Threads::Threads)
|
||||||
target_link_libraries(common PRIVATE lz4::lz4 zstd::zstd demangle)
|
target_link_libraries(common PRIVATE lz4::lz4 zstd::zstd LLVM::Demangle)
|
||||||
|
|
||||||
if (YUZU_USE_PRECOMPILED_HEADERS)
|
if (YUZU_USE_PRECOMPILED_HEADERS)
|
||||||
target_precompile_headers(common PRIVATE precompiled_headers.h)
|
target_precompile_headers(common PRIVATE precompiled_headers.h)
|
||||||
|
|
|
@ -1,13 +1,11 @@
|
||||||
// SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project
|
// SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project
|
||||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
|
#include <llvm/Demangle/Demangle.h>
|
||||||
|
|
||||||
#include "common/demangle.h"
|
#include "common/demangle.h"
|
||||||
#include "common/scope_exit.h"
|
#include "common/scope_exit.h"
|
||||||
|
|
||||||
namespace llvm {
|
|
||||||
char* itaniumDemangle(const char* mangled_name, char* buf, size_t* n, int* status);
|
|
||||||
}
|
|
||||||
|
|
||||||
namespace Common {
|
namespace Common {
|
||||||
|
|
||||||
std::string DemangleSymbol(const std::string& mangled) {
|
std::string DemangleSymbol(const std::string& mangled) {
|
||||||
|
|
Loading…
Reference in a new issue