Compare commits
1 Commits
android-14
...
android-11
Author | SHA1 | Date | |
---|---|---|---|
174e71c56b |
2
.gitmodules
vendored
2
.gitmodules
vendored
@ -56,5 +56,5 @@
|
|||||||
path = externals/nx_tzdb/tzdb_to_nx
|
path = externals/nx_tzdb/tzdb_to_nx
|
||||||
url = https://github.com/lat9nq/tzdb_to_nx.git
|
url = https://github.com/lat9nq/tzdb_to_nx.git
|
||||||
[submodule "VulkanMemoryAllocator"]
|
[submodule "VulkanMemoryAllocator"]
|
||||||
path = externals/VulkanMemoryAllocator
|
path = externals/vma/VulkanMemoryAllocator
|
||||||
url = https://github.com/GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator.git
|
url = https://github.com/GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator.git
|
||||||
|
@ -289,11 +289,10 @@ find_package(Boost 1.79.0 REQUIRED context)
|
|||||||
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 52 MODULE COMPONENTS INIReader)
|
find_package(inih 52 MODULE COMPONENTS INIReader)
|
||||||
find_package(LLVM 17 MODULE COMPONENTS Demangle)
|
find_package(LLVM MODULE COMPONENTS Demangle)
|
||||||
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)
|
||||||
find_package(VulkanMemoryAllocator CONFIG)
|
|
||||||
find_package(ZLIB 1.2 REQUIRED)
|
find_package(ZLIB 1.2 REQUIRED)
|
||||||
find_package(zstd 1.5 REQUIRED)
|
find_package(zstd 1.5 REQUIRED)
|
||||||
|
|
||||||
|
6
externals/CMakeLists.txt
vendored
6
externals/CMakeLists.txt
vendored
@ -144,9 +144,9 @@ endif()
|
|||||||
add_subdirectory(nx_tzdb)
|
add_subdirectory(nx_tzdb)
|
||||||
|
|
||||||
# VMA
|
# VMA
|
||||||
if (NOT TARGET GPUOpen::VulkanMemoryAllocator)
|
add_library(vma vma/vma.cpp)
|
||||||
add_subdirectory(VulkanMemoryAllocator)
|
target_include_directories(vma PUBLIC ./vma/VulkanMemoryAllocator/include)
|
||||||
endif()
|
target_link_libraries(vma PRIVATE Vulkan::Headers)
|
||||||
|
|
||||||
if (NOT TARGET LLVM::Demangle)
|
if (NOT TARGET LLVM::Demangle)
|
||||||
add_library(demangle demangle/ItaniumDemangle.cpp)
|
add_library(demangle demangle/ItaniumDemangle.cpp)
|
||||||
|
1
externals/VulkanMemoryAllocator
vendored
1
externals/VulkanMemoryAllocator
vendored
Submodule externals/VulkanMemoryAllocator deleted from 9b0fc3e7b0
169
externals/demangle/ItaniumDemangle.cpp
vendored
169
externals/demangle/ItaniumDemangle.cpp
vendored
@ -20,7 +20,9 @@
|
|||||||
#include <cstdlib>
|
#include <cstdlib>
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
#include <functional>
|
#include <functional>
|
||||||
|
#include <numeric>
|
||||||
#include <utility>
|
#include <utility>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
using namespace llvm;
|
using namespace llvm;
|
||||||
using namespace llvm::itanium_demangle;
|
using namespace llvm::itanium_demangle;
|
||||||
@ -79,8 +81,8 @@ struct DumpVisitor {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void printStr(const char *S) { fprintf(stderr, "%s", S); }
|
void printStr(const char *S) { fprintf(stderr, "%s", S); }
|
||||||
void print(std::string_view SV) {
|
void print(StringView SV) {
|
||||||
fprintf(stderr, "\"%.*s\"", (int)SV.size(), SV.data());
|
fprintf(stderr, "\"%.*s\"", (int)SV.size(), SV.begin());
|
||||||
}
|
}
|
||||||
void print(const Node *N) {
|
void print(const Node *N) {
|
||||||
if (N)
|
if (N)
|
||||||
@ -88,6 +90,14 @@ struct DumpVisitor {
|
|||||||
else
|
else
|
||||||
printStr("<null>");
|
printStr("<null>");
|
||||||
}
|
}
|
||||||
|
void print(NodeOrString NS) {
|
||||||
|
if (NS.isNode())
|
||||||
|
print(NS.asNode());
|
||||||
|
else if (NS.isString())
|
||||||
|
print(NS.asString());
|
||||||
|
else
|
||||||
|
printStr("NodeOrString()");
|
||||||
|
}
|
||||||
void print(NodeArray A) {
|
void print(NodeArray A) {
|
||||||
++Depth;
|
++Depth;
|
||||||
printStr("{");
|
printStr("{");
|
||||||
@ -106,11 +116,13 @@ struct DumpVisitor {
|
|||||||
// Overload used when T is exactly 'bool', not merely convertible to 'bool'.
|
// Overload used when T is exactly 'bool', not merely convertible to 'bool'.
|
||||||
void print(bool B) { printStr(B ? "true" : "false"); }
|
void print(bool B) { printStr(B ? "true" : "false"); }
|
||||||
|
|
||||||
template <class T> std::enable_if_t<std::is_unsigned<T>::value> print(T N) {
|
template <class T>
|
||||||
|
typename std::enable_if<std::is_unsigned<T>::value>::type print(T N) {
|
||||||
fprintf(stderr, "%llu", (unsigned long long)N);
|
fprintf(stderr, "%llu", (unsigned long long)N);
|
||||||
}
|
}
|
||||||
|
|
||||||
template <class T> std::enable_if_t<std::is_signed<T>::value> print(T N) {
|
template <class T>
|
||||||
|
typename std::enable_if<std::is_signed<T>::value>::type print(T N) {
|
||||||
fprintf(stderr, "%lld", (long long)N);
|
fprintf(stderr, "%lld", (long long)N);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -173,50 +185,6 @@ struct DumpVisitor {
|
|||||||
return printStr("TemplateParamKind::Template");
|
return printStr("TemplateParamKind::Template");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
void print(Node::Prec P) {
|
|
||||||
switch (P) {
|
|
||||||
case Node::Prec::Primary:
|
|
||||||
return printStr("Node::Prec::Primary");
|
|
||||||
case Node::Prec::Postfix:
|
|
||||||
return printStr("Node::Prec::Postfix");
|
|
||||||
case Node::Prec::Unary:
|
|
||||||
return printStr("Node::Prec::Unary");
|
|
||||||
case Node::Prec::Cast:
|
|
||||||
return printStr("Node::Prec::Cast");
|
|
||||||
case Node::Prec::PtrMem:
|
|
||||||
return printStr("Node::Prec::PtrMem");
|
|
||||||
case Node::Prec::Multiplicative:
|
|
||||||
return printStr("Node::Prec::Multiplicative");
|
|
||||||
case Node::Prec::Additive:
|
|
||||||
return printStr("Node::Prec::Additive");
|
|
||||||
case Node::Prec::Shift:
|
|
||||||
return printStr("Node::Prec::Shift");
|
|
||||||
case Node::Prec::Spaceship:
|
|
||||||
return printStr("Node::Prec::Spaceship");
|
|
||||||
case Node::Prec::Relational:
|
|
||||||
return printStr("Node::Prec::Relational");
|
|
||||||
case Node::Prec::Equality:
|
|
||||||
return printStr("Node::Prec::Equality");
|
|
||||||
case Node::Prec::And:
|
|
||||||
return printStr("Node::Prec::And");
|
|
||||||
case Node::Prec::Xor:
|
|
||||||
return printStr("Node::Prec::Xor");
|
|
||||||
case Node::Prec::Ior:
|
|
||||||
return printStr("Node::Prec::Ior");
|
|
||||||
case Node::Prec::AndIf:
|
|
||||||
return printStr("Node::Prec::AndIf");
|
|
||||||
case Node::Prec::OrIf:
|
|
||||||
return printStr("Node::Prec::OrIf");
|
|
||||||
case Node::Prec::Conditional:
|
|
||||||
return printStr("Node::Prec::Conditional");
|
|
||||||
case Node::Prec::Assign:
|
|
||||||
return printStr("Node::Prec::Assign");
|
|
||||||
case Node::Prec::Comma:
|
|
||||||
return printStr("Node::Prec::Comma");
|
|
||||||
case Node::Prec::Default:
|
|
||||||
return printStr("Node::Prec::Default");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void newLine() {
|
void newLine() {
|
||||||
printStr("\n");
|
printStr("\n");
|
||||||
@ -366,21 +334,36 @@ public:
|
|||||||
|
|
||||||
using Demangler = itanium_demangle::ManglingParser<DefaultAllocator>;
|
using Demangler = itanium_demangle::ManglingParser<DefaultAllocator>;
|
||||||
|
|
||||||
char *llvm::itaniumDemangle(std::string_view MangledName) {
|
char *llvm::itaniumDemangle(const char *MangledName, char *Buf,
|
||||||
if (MangledName.empty())
|
size_t *N, int *Status) {
|
||||||
|
if (MangledName == nullptr || (Buf != nullptr && N == nullptr)) {
|
||||||
|
if (Status)
|
||||||
|
*Status = demangle_invalid_args;
|
||||||
return nullptr;
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
int InternalStatus = demangle_success;
|
||||||
|
Demangler Parser(MangledName, MangledName + std::strlen(MangledName));
|
||||||
|
OutputStream S;
|
||||||
|
|
||||||
Demangler Parser(MangledName.data(),
|
|
||||||
MangledName.data() + MangledName.length());
|
|
||||||
Node *AST = Parser.parse();
|
Node *AST = Parser.parse();
|
||||||
if (!AST)
|
|
||||||
return nullptr;
|
|
||||||
|
|
||||||
OutputBuffer OB;
|
if (AST == nullptr)
|
||||||
|
InternalStatus = demangle_invalid_mangled_name;
|
||||||
|
else if (!initializeOutputStream(Buf, N, S, 1024))
|
||||||
|
InternalStatus = demangle_memory_alloc_failure;
|
||||||
|
else {
|
||||||
assert(Parser.ForwardTemplateRefs.empty());
|
assert(Parser.ForwardTemplateRefs.empty());
|
||||||
AST->print(OB);
|
AST->print(S);
|
||||||
OB += '\0';
|
S += '\0';
|
||||||
return OB.getBuffer();
|
if (N != nullptr)
|
||||||
|
*N = S.getCurrentPosition();
|
||||||
|
Buf = S.getBuffer();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Status)
|
||||||
|
*Status = InternalStatus;
|
||||||
|
return InternalStatus == demangle_success ? Buf : nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
ItaniumPartialDemangler::ItaniumPartialDemangler()
|
ItaniumPartialDemangler::ItaniumPartialDemangler()
|
||||||
@ -413,12 +396,14 @@ bool ItaniumPartialDemangler::partialDemangle(const char *MangledName) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static char *printNode(const Node *RootNode, char *Buf, size_t *N) {
|
static char *printNode(const Node *RootNode, char *Buf, size_t *N) {
|
||||||
OutputBuffer OB(Buf, N);
|
OutputStream S;
|
||||||
RootNode->print(OB);
|
if (!initializeOutputStream(Buf, N, S, 128))
|
||||||
OB += '\0';
|
return nullptr;
|
||||||
|
RootNode->print(S);
|
||||||
|
S += '\0';
|
||||||
if (N != nullptr)
|
if (N != nullptr)
|
||||||
*N = OB.getCurrentPosition();
|
*N = S.getCurrentPosition();
|
||||||
return OB.getBuffer();
|
return S.getBuffer();
|
||||||
}
|
}
|
||||||
|
|
||||||
char *ItaniumPartialDemangler::getFunctionBaseName(char *Buf, size_t *N) const {
|
char *ItaniumPartialDemangler::getFunctionBaseName(char *Buf, size_t *N) const {
|
||||||
@ -432,8 +417,8 @@ char *ItaniumPartialDemangler::getFunctionBaseName(char *Buf, size_t *N) const {
|
|||||||
case Node::KAbiTagAttr:
|
case Node::KAbiTagAttr:
|
||||||
Name = static_cast<const AbiTagAttr *>(Name)->Base;
|
Name = static_cast<const AbiTagAttr *>(Name)->Base;
|
||||||
continue;
|
continue;
|
||||||
case Node::KModuleEntity:
|
case Node::KStdQualifiedName:
|
||||||
Name = static_cast<const ModuleEntity *>(Name)->Name;
|
Name = static_cast<const StdQualifiedName *>(Name)->Child;
|
||||||
continue;
|
continue;
|
||||||
case Node::KNestedName:
|
case Node::KNestedName:
|
||||||
Name = static_cast<const NestedName *>(Name)->Name;
|
Name = static_cast<const NestedName *>(Name)->Name;
|
||||||
@ -456,7 +441,9 @@ char *ItaniumPartialDemangler::getFunctionDeclContextName(char *Buf,
|
|||||||
return nullptr;
|
return nullptr;
|
||||||
const Node *Name = static_cast<const FunctionEncoding *>(RootNode)->getName();
|
const Node *Name = static_cast<const FunctionEncoding *>(RootNode)->getName();
|
||||||
|
|
||||||
OutputBuffer OB(Buf, N);
|
OutputStream S;
|
||||||
|
if (!initializeOutputStream(Buf, N, S, 128))
|
||||||
|
return nullptr;
|
||||||
|
|
||||||
KeepGoingLocalFunction:
|
KeepGoingLocalFunction:
|
||||||
while (true) {
|
while (true) {
|
||||||
@ -471,27 +458,27 @@ char *ItaniumPartialDemangler::getFunctionDeclContextName(char *Buf,
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Name->getKind() == Node::KModuleEntity)
|
|
||||||
Name = static_cast<const ModuleEntity *>(Name)->Name;
|
|
||||||
|
|
||||||
switch (Name->getKind()) {
|
switch (Name->getKind()) {
|
||||||
|
case Node::KStdQualifiedName:
|
||||||
|
S += "std";
|
||||||
|
break;
|
||||||
case Node::KNestedName:
|
case Node::KNestedName:
|
||||||
static_cast<const NestedName *>(Name)->Qual->print(OB);
|
static_cast<const NestedName *>(Name)->Qual->print(S);
|
||||||
break;
|
break;
|
||||||
case Node::KLocalName: {
|
case Node::KLocalName: {
|
||||||
auto *LN = static_cast<const LocalName *>(Name);
|
auto *LN = static_cast<const LocalName *>(Name);
|
||||||
LN->Encoding->print(OB);
|
LN->Encoding->print(S);
|
||||||
OB += "::";
|
S += "::";
|
||||||
Name = LN->Entity;
|
Name = LN->Entity;
|
||||||
goto KeepGoingLocalFunction;
|
goto KeepGoingLocalFunction;
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
OB += '\0';
|
S += '\0';
|
||||||
if (N != nullptr)
|
if (N != nullptr)
|
||||||
*N = OB.getCurrentPosition();
|
*N = S.getCurrentPosition();
|
||||||
return OB.getBuffer();
|
return S.getBuffer();
|
||||||
}
|
}
|
||||||
|
|
||||||
char *ItaniumPartialDemangler::getFunctionName(char *Buf, size_t *N) const {
|
char *ItaniumPartialDemangler::getFunctionName(char *Buf, size_t *N) const {
|
||||||
@ -507,15 +494,17 @@ char *ItaniumPartialDemangler::getFunctionParameters(char *Buf,
|
|||||||
return nullptr;
|
return nullptr;
|
||||||
NodeArray Params = static_cast<FunctionEncoding *>(RootNode)->getParams();
|
NodeArray Params = static_cast<FunctionEncoding *>(RootNode)->getParams();
|
||||||
|
|
||||||
OutputBuffer OB(Buf, N);
|
OutputStream S;
|
||||||
|
if (!initializeOutputStream(Buf, N, S, 128))
|
||||||
|
return nullptr;
|
||||||
|
|
||||||
OB += '(';
|
S += '(';
|
||||||
Params.printWithComma(OB);
|
Params.printWithComma(S);
|
||||||
OB += ')';
|
S += ')';
|
||||||
OB += '\0';
|
S += '\0';
|
||||||
if (N != nullptr)
|
if (N != nullptr)
|
||||||
*N = OB.getCurrentPosition();
|
*N = S.getCurrentPosition();
|
||||||
return OB.getBuffer();
|
return S.getBuffer();
|
||||||
}
|
}
|
||||||
|
|
||||||
char *ItaniumPartialDemangler::getFunctionReturnType(
|
char *ItaniumPartialDemangler::getFunctionReturnType(
|
||||||
@ -523,16 +512,18 @@ char *ItaniumPartialDemangler::getFunctionReturnType(
|
|||||||
if (!isFunction())
|
if (!isFunction())
|
||||||
return nullptr;
|
return nullptr;
|
||||||
|
|
||||||
OutputBuffer OB(Buf, N);
|
OutputStream S;
|
||||||
|
if (!initializeOutputStream(Buf, N, S, 128))
|
||||||
|
return nullptr;
|
||||||
|
|
||||||
if (const Node *Ret =
|
if (const Node *Ret =
|
||||||
static_cast<const FunctionEncoding *>(RootNode)->getReturnType())
|
static_cast<const FunctionEncoding *>(RootNode)->getReturnType())
|
||||||
Ret->print(OB);
|
Ret->print(S);
|
||||||
|
|
||||||
OB += '\0';
|
S += '\0';
|
||||||
if (N != nullptr)
|
if (N != nullptr)
|
||||||
*N = OB.getCurrentPosition();
|
*N = S.getCurrentPosition();
|
||||||
return OB.getBuffer();
|
return S.getBuffer();
|
||||||
}
|
}
|
||||||
|
|
||||||
char *ItaniumPartialDemangler::finishDemangle(char *Buf, size_t *N) const {
|
char *ItaniumPartialDemangler::finishDemangle(char *Buf, size_t *N) const {
|
||||||
@ -572,8 +563,8 @@ bool ItaniumPartialDemangler::isCtorOrDtor() const {
|
|||||||
case Node::KNestedName:
|
case Node::KNestedName:
|
||||||
N = static_cast<const NestedName *>(N)->Name;
|
N = static_cast<const NestedName *>(N)->Name;
|
||||||
break;
|
break;
|
||||||
case Node::KModuleEntity:
|
case Node::KStdQualifiedName:
|
||||||
N = static_cast<const ModuleEntity *>(N)->Name;
|
N = static_cast<const StdQualifiedName *>(N)->Child;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
37
externals/demangle/llvm/Demangle/Demangle.h
vendored
37
externals/demangle/llvm/Demangle/Demangle.h
vendored
@ -12,7 +12,6 @@
|
|||||||
|
|
||||||
#include <cstddef>
|
#include <cstddef>
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <string_view>
|
|
||||||
|
|
||||||
namespace llvm {
|
namespace llvm {
|
||||||
/// This is a llvm local version of __cxa_demangle. Other than the name and
|
/// This is a llvm local version of __cxa_demangle. Other than the name and
|
||||||
@ -30,10 +29,9 @@ enum : int {
|
|||||||
demangle_success = 0,
|
demangle_success = 0,
|
||||||
};
|
};
|
||||||
|
|
||||||
/// Returns a non-NULL pointer to a NUL-terminated C style string
|
char *itaniumDemangle(const char *mangled_name, char *buf, size_t *n,
|
||||||
/// that should be explicitly freed, if successful. Otherwise, may return
|
int *status);
|
||||||
/// nullptr if mangled_name is not a valid mangling or is nullptr.
|
|
||||||
char *itaniumDemangle(std::string_view mangled_name);
|
|
||||||
|
|
||||||
enum MSDemangleFlags {
|
enum MSDemangleFlags {
|
||||||
MSDF_None = 0,
|
MSDF_None = 0,
|
||||||
@ -42,34 +40,10 @@ enum MSDemangleFlags {
|
|||||||
MSDF_NoCallingConvention = 1 << 2,
|
MSDF_NoCallingConvention = 1 << 2,
|
||||||
MSDF_NoReturnType = 1 << 3,
|
MSDF_NoReturnType = 1 << 3,
|
||||||
MSDF_NoMemberType = 1 << 4,
|
MSDF_NoMemberType = 1 << 4,
|
||||||
MSDF_NoVariableType = 1 << 5,
|
|
||||||
};
|
};
|
||||||
|
char *microsoftDemangle(const char *mangled_name, char *buf, size_t *n,
|
||||||
/// Demangles the Microsoft symbol pointed at by mangled_name and returns it.
|
|
||||||
/// Returns a pointer to the start of a null-terminated demangled string on
|
|
||||||
/// success, or nullptr on error.
|
|
||||||
/// If n_read is non-null and demangling was successful, it receives how many
|
|
||||||
/// bytes of the input string were consumed.
|
|
||||||
/// status receives one of the demangle_ enum entries above if it's not nullptr.
|
|
||||||
/// Flags controls various details of the demangled representation.
|
|
||||||
char *microsoftDemangle(std::string_view mangled_name, size_t *n_read,
|
|
||||||
int *status, MSDemangleFlags Flags = MSDF_None);
|
int *status, MSDemangleFlags Flags = MSDF_None);
|
||||||
|
|
||||||
// Demangles a Rust v0 mangled symbol.
|
|
||||||
char *rustDemangle(std::string_view MangledName);
|
|
||||||
|
|
||||||
// Demangles a D mangled symbol.
|
|
||||||
char *dlangDemangle(std::string_view MangledName);
|
|
||||||
|
|
||||||
/// Attempt to demangle a string using different demangling schemes.
|
|
||||||
/// The function uses heuristics to determine which demangling scheme to use.
|
|
||||||
/// \param MangledName - reference to string to demangle.
|
|
||||||
/// \returns - the demangled string, or a copy of the input string if no
|
|
||||||
/// demangling occurred.
|
|
||||||
std::string demangle(std::string_view MangledName);
|
|
||||||
|
|
||||||
bool nonMicrosoftDemangle(std::string_view MangledName, std::string &Result);
|
|
||||||
|
|
||||||
/// "Partial" demangler. This supports demangling a string into an AST
|
/// "Partial" demangler. This supports demangling a string into an AST
|
||||||
/// (typically an intermediate stage in itaniumDemangle) and querying certain
|
/// (typically an intermediate stage in itaniumDemangle) and querying certain
|
||||||
/// properties or partially printing the demangled name.
|
/// properties or partially printing the demangled name.
|
||||||
@ -85,7 +59,7 @@ struct ItaniumPartialDemangler {
|
|||||||
bool partialDemangle(const char *MangledName);
|
bool partialDemangle(const char *MangledName);
|
||||||
|
|
||||||
/// Just print the entire mangled name into Buf. Buf and N behave like the
|
/// Just print the entire mangled name into Buf. Buf and N behave like the
|
||||||
/// second and third parameters to __cxa_demangle.
|
/// second and third parameters to itaniumDemangle.
|
||||||
char *finishDemangle(char *Buf, size_t *N) const;
|
char *finishDemangle(char *Buf, size_t *N) const;
|
||||||
|
|
||||||
/// Get the base name of a function. This doesn't include trailing template
|
/// Get the base name of a function. This doesn't include trailing template
|
||||||
@ -121,7 +95,6 @@ struct ItaniumPartialDemangler {
|
|||||||
bool isSpecialName() const;
|
bool isSpecialName() const;
|
||||||
|
|
||||||
~ItaniumPartialDemangler();
|
~ItaniumPartialDemangler();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void *RootNode;
|
void *RootNode;
|
||||||
void *Context;
|
void *Context;
|
||||||
|
@ -13,8 +13,8 @@
|
|||||||
//
|
//
|
||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
|
|
||||||
#ifndef LLVM_DEMANGLE_DEMANGLECONFIG_H
|
#ifndef LLVM_DEMANGLE_COMPILER_H
|
||||||
#define LLVM_DEMANGLE_DEMANGLECONFIG_H
|
#define LLVM_DEMANGLE_COMPILER_H
|
||||||
|
|
||||||
#ifndef __has_feature
|
#ifndef __has_feature
|
||||||
#define __has_feature(x) 0
|
#define __has_feature(x) 0
|
||||||
|
3824
externals/demangle/llvm/Demangle/ItaniumDemangle.h
vendored
3824
externals/demangle/llvm/Demangle/ItaniumDemangle.h
vendored
File diff suppressed because it is too large
Load Diff
@ -1,96 +0,0 @@
|
|||||||
//===--- ItaniumNodes.def ------------*- mode:c++;eval:(read-only-mode) -*-===//
|
|
||||||
// Do not edit! See README.txt.
|
|
||||||
// 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
|
|
||||||
//
|
|
||||||
//===----------------------------------------------------------------------===//
|
|
||||||
//
|
|
||||||
// Define the demangler's node names
|
|
||||||
|
|
||||||
#ifndef NODE
|
|
||||||
#error Define NODE to handle nodes
|
|
||||||
#endif
|
|
||||||
|
|
||||||
NODE(NodeArrayNode)
|
|
||||||
NODE(DotSuffix)
|
|
||||||
NODE(VendorExtQualType)
|
|
||||||
NODE(QualType)
|
|
||||||
NODE(ConversionOperatorType)
|
|
||||||
NODE(PostfixQualifiedType)
|
|
||||||
NODE(ElaboratedTypeSpefType)
|
|
||||||
NODE(NameType)
|
|
||||||
NODE(AbiTagAttr)
|
|
||||||
NODE(EnableIfAttr)
|
|
||||||
NODE(ObjCProtoName)
|
|
||||||
NODE(PointerType)
|
|
||||||
NODE(ReferenceType)
|
|
||||||
NODE(PointerToMemberType)
|
|
||||||
NODE(ArrayType)
|
|
||||||
NODE(FunctionType)
|
|
||||||
NODE(NoexceptSpec)
|
|
||||||
NODE(DynamicExceptionSpec)
|
|
||||||
NODE(FunctionEncoding)
|
|
||||||
NODE(LiteralOperator)
|
|
||||||
NODE(SpecialName)
|
|
||||||
NODE(CtorVtableSpecialName)
|
|
||||||
NODE(QualifiedName)
|
|
||||||
NODE(NestedName)
|
|
||||||
NODE(LocalName)
|
|
||||||
NODE(ModuleName)
|
|
||||||
NODE(ModuleEntity)
|
|
||||||
NODE(VectorType)
|
|
||||||
NODE(PixelVectorType)
|
|
||||||
NODE(BinaryFPType)
|
|
||||||
NODE(BitIntType)
|
|
||||||
NODE(SyntheticTemplateParamName)
|
|
||||||
NODE(TypeTemplateParamDecl)
|
|
||||||
NODE(NonTypeTemplateParamDecl)
|
|
||||||
NODE(TemplateTemplateParamDecl)
|
|
||||||
NODE(TemplateParamPackDecl)
|
|
||||||
NODE(ParameterPack)
|
|
||||||
NODE(TemplateArgumentPack)
|
|
||||||
NODE(ParameterPackExpansion)
|
|
||||||
NODE(TemplateArgs)
|
|
||||||
NODE(ForwardTemplateReference)
|
|
||||||
NODE(NameWithTemplateArgs)
|
|
||||||
NODE(GlobalQualifiedName)
|
|
||||||
NODE(ExpandedSpecialSubstitution)
|
|
||||||
NODE(SpecialSubstitution)
|
|
||||||
NODE(CtorDtorName)
|
|
||||||
NODE(DtorName)
|
|
||||||
NODE(UnnamedTypeName)
|
|
||||||
NODE(ClosureTypeName)
|
|
||||||
NODE(StructuredBindingName)
|
|
||||||
NODE(BinaryExpr)
|
|
||||||
NODE(ArraySubscriptExpr)
|
|
||||||
NODE(PostfixExpr)
|
|
||||||
NODE(ConditionalExpr)
|
|
||||||
NODE(MemberExpr)
|
|
||||||
NODE(SubobjectExpr)
|
|
||||||
NODE(EnclosingExpr)
|
|
||||||
NODE(CastExpr)
|
|
||||||
NODE(SizeofParamPackExpr)
|
|
||||||
NODE(CallExpr)
|
|
||||||
NODE(NewExpr)
|
|
||||||
NODE(DeleteExpr)
|
|
||||||
NODE(PrefixExpr)
|
|
||||||
NODE(FunctionParam)
|
|
||||||
NODE(ConversionExpr)
|
|
||||||
NODE(PointerToMemberConversionExpr)
|
|
||||||
NODE(InitListExpr)
|
|
||||||
NODE(FoldExpr)
|
|
||||||
NODE(ThrowExpr)
|
|
||||||
NODE(BoolExpr)
|
|
||||||
NODE(StringLiteral)
|
|
||||||
NODE(LambdaExpr)
|
|
||||||
NODE(EnumLiteral)
|
|
||||||
NODE(IntegerLiteral)
|
|
||||||
NODE(FloatLiteral)
|
|
||||||
NODE(DoubleLiteral)
|
|
||||||
NODE(LongDoubleLiteral)
|
|
||||||
NODE(BracedExpr)
|
|
||||||
NODE(BracedRangeExpr)
|
|
||||||
|
|
||||||
#undef NODE
|
|
32
externals/demangle/llvm/Demangle/StringView.h
vendored
32
externals/demangle/llvm/Demangle/StringView.h
vendored
@ -1,5 +1,5 @@
|
|||||||
//===--- StringView.h ----------------*- mode:c++;eval:(read-only-mode) -*-===//
|
//===--- StringView.h -------------------------------------------*- C++ -*-===//
|
||||||
// Do not edit! See README.txt.
|
//
|
||||||
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
||||||
// See https://llvm.org/LICENSE.txt for license information.
|
// See https://llvm.org/LICENSE.txt for license information.
|
||||||
// SPDX-FileCopyrightText: Part of the LLVM Project
|
// SPDX-FileCopyrightText: Part of the LLVM Project
|
||||||
@ -8,9 +8,6 @@
|
|||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
//
|
//
|
||||||
// FIXME: Use std::string_view instead when we support C++17.
|
// FIXME: Use std::string_view instead when we support C++17.
|
||||||
// There are two copies of this file in the source tree. The one under
|
|
||||||
// libcxxabi is the original and the one under llvm is the copy. Use
|
|
||||||
// cp-to-llvm.sh to update the copy. See README.txt for more details.
|
|
||||||
//
|
//
|
||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
|
|
||||||
@ -18,6 +15,7 @@
|
|||||||
#define DEMANGLE_STRINGVIEW_H
|
#define DEMANGLE_STRINGVIEW_H
|
||||||
|
|
||||||
#include "DemangleConfig.h"
|
#include "DemangleConfig.h"
|
||||||
|
#include <algorithm>
|
||||||
#include <cassert>
|
#include <cassert>
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
|
|
||||||
@ -39,23 +37,29 @@ public:
|
|||||||
StringView(const char *Str) : First(Str), Last(Str + std::strlen(Str)) {}
|
StringView(const char *Str) : First(Str), Last(Str + std::strlen(Str)) {}
|
||||||
StringView() : First(nullptr), Last(nullptr) {}
|
StringView() : First(nullptr), Last(nullptr) {}
|
||||||
|
|
||||||
StringView substr(size_t Pos, size_t Len = npos) const {
|
StringView substr(size_t From) const {
|
||||||
assert(Pos <= size());
|
return StringView(begin() + From, size() - From);
|
||||||
if (Len > size() - Pos)
|
|
||||||
Len = size() - Pos;
|
|
||||||
return StringView(begin() + Pos, Len);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t find(char C, size_t From = 0) const {
|
size_t find(char C, size_t From = 0) const {
|
||||||
|
size_t FindBegin = std::min(From, size());
|
||||||
// Avoid calling memchr with nullptr.
|
// Avoid calling memchr with nullptr.
|
||||||
if (From < size()) {
|
if (FindBegin < size()) {
|
||||||
// Just forward to memchr, which is faster than a hand-rolled loop.
|
// Just forward to memchr, which is faster than a hand-rolled loop.
|
||||||
if (const void *P = ::memchr(First + From, C, size() - From))
|
if (const void *P = ::memchr(First + FindBegin, C, size() - FindBegin))
|
||||||
return size_t(static_cast<const char *>(P) - First);
|
return size_t(static_cast<const char *>(P) - First);
|
||||||
}
|
}
|
||||||
return npos;
|
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 {
|
StringView dropFront(size_t N = 1) const {
|
||||||
if (N >= size())
|
if (N >= size())
|
||||||
N = size();
|
N = size();
|
||||||
@ -102,7 +106,7 @@ public:
|
|||||||
bool startsWith(StringView Str) const {
|
bool startsWith(StringView Str) const {
|
||||||
if (Str.size() > size())
|
if (Str.size() > size())
|
||||||
return false;
|
return false;
|
||||||
return std::strncmp(Str.begin(), begin(), Str.size()) == 0;
|
return std::equal(Str.begin(), Str.end(), begin());
|
||||||
}
|
}
|
||||||
|
|
||||||
const char &operator[](size_t Idx) const { return *(begin() + Idx); }
|
const char &operator[](size_t Idx) const { return *(begin() + Idx); }
|
||||||
@ -115,7 +119,7 @@ public:
|
|||||||
|
|
||||||
inline bool operator==(const StringView &LHS, const StringView &RHS) {
|
inline bool operator==(const StringView &LHS, const StringView &RHS) {
|
||||||
return LHS.size() == RHS.size() &&
|
return LHS.size() == RHS.size() &&
|
||||||
std::strncmp(LHS.begin(), RHS.begin(), LHS.size()) == 0;
|
std::equal(LHS.begin(), LHS.end(), RHS.begin());
|
||||||
}
|
}
|
||||||
|
|
||||||
DEMANGLE_NAMESPACE_END
|
DEMANGLE_NAMESPACE_END
|
||||||
|
@ -1,39 +0,0 @@
|
|||||||
//===--- StringViewExtras.h ----------*- mode:c++;eval:(read-only-mode) -*-===//
|
|
||||||
// Do not edit! See README.txt.
|
|
||||||
// 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
|
|
||||||
//
|
|
||||||
//===----------------------------------------------------------------------===//
|
|
||||||
//
|
|
||||||
// There are two copies of this file in the source tree. The one under
|
|
||||||
// libcxxabi is the original and the one under llvm is the copy. Use
|
|
||||||
// cp-to-llvm.sh to update the copy. See README.txt for more details.
|
|
||||||
//
|
|
||||||
//===----------------------------------------------------------------------===//
|
|
||||||
|
|
||||||
#ifndef DEMANGLE_STRINGVIEW_H
|
|
||||||
#define DEMANGLE_STRINGVIEW_H
|
|
||||||
|
|
||||||
#include "DemangleConfig.h"
|
|
||||||
|
|
||||||
#include <string_view>
|
|
||||||
|
|
||||||
DEMANGLE_NAMESPACE_BEGIN
|
|
||||||
|
|
||||||
inline bool starts_with(std::string_view self, char C) noexcept {
|
|
||||||
return !self.empty() && *self.begin() == C;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline bool starts_with(std::string_view haystack,
|
|
||||||
std::string_view needle) noexcept {
|
|
||||||
if (needle.size() > haystack.size())
|
|
||||||
return false;
|
|
||||||
haystack.remove_suffix(haystack.size() - needle.size());
|
|
||||||
return haystack == needle;
|
|
||||||
}
|
|
||||||
|
|
||||||
DEMANGLE_NAMESPACE_END
|
|
||||||
|
|
||||||
#endif
|
|
204
externals/demangle/llvm/Demangle/Utility.h
vendored
204
externals/demangle/llvm/Demangle/Utility.h
vendored
@ -1,5 +1,5 @@
|
|||||||
//===--- Utility.h -------------------*- mode:c++;eval:(read-only-mode) -*-===//
|
//===--- Utility.h ----------------------------------------------*- C++ -*-===//
|
||||||
// Do not edit! See README.txt.
|
//
|
||||||
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
||||||
// See https://llvm.org/LICENSE.txt for license information.
|
// See https://llvm.org/LICENSE.txt for license information.
|
||||||
// SPDX-FileCopyrightText: Part of the LLVM Project
|
// SPDX-FileCopyrightText: Part of the LLVM Project
|
||||||
@ -7,83 +7,70 @@
|
|||||||
//
|
//
|
||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
//
|
//
|
||||||
// Provide some utility classes for use in the demangler.
|
// Provide some utility classes for use in the demangler(s).
|
||||||
// There are two copies of this file in the source tree. The one in libcxxabi
|
|
||||||
// is the original and the one in llvm is the copy. Use cp-to-llvm.sh to update
|
|
||||||
// the copy. See README.txt for more details.
|
|
||||||
//
|
//
|
||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
|
|
||||||
#ifndef DEMANGLE_UTILITY_H
|
#ifndef DEMANGLE_UTILITY_H
|
||||||
#define DEMANGLE_UTILITY_H
|
#define DEMANGLE_UTILITY_H
|
||||||
|
|
||||||
#include "DemangleConfig.h"
|
#include "StringView.h"
|
||||||
|
|
||||||
#include <array>
|
|
||||||
#include <cassert>
|
|
||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
#include <cstdlib>
|
#include <cstdlib>
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
#include <exception>
|
#include <iterator>
|
||||||
#include <limits>
|
#include <limits>
|
||||||
#include <string_view>
|
|
||||||
|
|
||||||
DEMANGLE_NAMESPACE_BEGIN
|
DEMANGLE_NAMESPACE_BEGIN
|
||||||
|
|
||||||
// Stream that AST nodes write their string representation into after the AST
|
// Stream that AST nodes write their string representation into after the AST
|
||||||
// has been parsed.
|
// has been parsed.
|
||||||
class OutputBuffer {
|
class OutputStream {
|
||||||
char *Buffer = nullptr;
|
char *Buffer;
|
||||||
size_t CurrentPosition = 0;
|
size_t CurrentPosition;
|
||||||
size_t BufferCapacity = 0;
|
size_t BufferCapacity;
|
||||||
|
|
||||||
// Ensure there are at least N more positions in the buffer.
|
// Ensure there is at least n more positions in buffer.
|
||||||
void grow(size_t N) {
|
void grow(size_t N) {
|
||||||
size_t Need = N + CurrentPosition;
|
if (N + CurrentPosition >= BufferCapacity) {
|
||||||
if (Need > BufferCapacity) {
|
|
||||||
// Reduce the number of reallocations, with a bit of hysteresis. The
|
|
||||||
// number here is chosen so the first allocation will more-than-likely not
|
|
||||||
// allocate more than 1K.
|
|
||||||
Need += 1024 - 32;
|
|
||||||
BufferCapacity *= 2;
|
BufferCapacity *= 2;
|
||||||
if (BufferCapacity < Need)
|
if (BufferCapacity < N + CurrentPosition)
|
||||||
BufferCapacity = Need;
|
BufferCapacity = N + CurrentPosition;
|
||||||
Buffer = static_cast<char *>(std::realloc(Buffer, BufferCapacity));
|
Buffer = static_cast<char *>(std::realloc(Buffer, BufferCapacity));
|
||||||
if (Buffer == nullptr)
|
if (Buffer == nullptr)
|
||||||
std::terminate();
|
std::terminate();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
OutputBuffer &writeUnsigned(uint64_t N, bool isNeg = false) {
|
void writeUnsigned(uint64_t N, bool isNeg = false) {
|
||||||
std::array<char, 21> Temp;
|
// Handle special case...
|
||||||
char *TempPtr = Temp.data() + Temp.size();
|
if (N == 0) {
|
||||||
|
*this << '0';
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// Output at least one character.
|
char Temp[21];
|
||||||
do {
|
char *TempPtr = std::end(Temp);
|
||||||
*--TempPtr = char('0' + N % 10);
|
|
||||||
|
while (N) {
|
||||||
|
*--TempPtr = '0' + char(N % 10);
|
||||||
N /= 10;
|
N /= 10;
|
||||||
} while (N);
|
}
|
||||||
|
|
||||||
// Add negative sign.
|
// Add negative sign...
|
||||||
if (isNeg)
|
if (isNeg)
|
||||||
*--TempPtr = '-';
|
*--TempPtr = '-';
|
||||||
|
this->operator<<(StringView(TempPtr, std::end(Temp)));
|
||||||
return operator+=(
|
|
||||||
std::string_view(TempPtr, Temp.data() + Temp.size() - TempPtr));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public:
|
public:
|
||||||
OutputBuffer(char *StartBuf, size_t Size)
|
OutputStream(char *StartBuf, size_t Size)
|
||||||
: Buffer(StartBuf), BufferCapacity(Size) {}
|
: Buffer(StartBuf), CurrentPosition(0), BufferCapacity(Size) {}
|
||||||
OutputBuffer(char *StartBuf, size_t *SizePtr)
|
OutputStream() = default;
|
||||||
: OutputBuffer(StartBuf, StartBuf ? *SizePtr : 0) {}
|
void reset(char *Buffer_, size_t BufferCapacity_) {
|
||||||
OutputBuffer() = default;
|
CurrentPosition = 0;
|
||||||
// Non-copyable
|
Buffer = Buffer_;
|
||||||
OutputBuffer(const OutputBuffer &) = delete;
|
BufferCapacity = BufferCapacity_;
|
||||||
OutputBuffer &operator=(const OutputBuffer &) = delete;
|
|
||||||
|
|
||||||
operator std::string_view() const {
|
|
||||||
return std::string_view(Buffer, CurrentPosition);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// If a ParameterPackExpansion (or similar type) is encountered, the offset
|
/// If a ParameterPackExpansion (or similar type) is encountered, the offset
|
||||||
@ -91,116 +78,115 @@ public:
|
|||||||
unsigned CurrentPackIndex = std::numeric_limits<unsigned>::max();
|
unsigned CurrentPackIndex = std::numeric_limits<unsigned>::max();
|
||||||
unsigned CurrentPackMax = std::numeric_limits<unsigned>::max();
|
unsigned CurrentPackMax = std::numeric_limits<unsigned>::max();
|
||||||
|
|
||||||
/// When zero, we're printing template args and '>' needs to be parenthesized.
|
OutputStream &operator+=(StringView R) {
|
||||||
/// Use a counter so we can simply increment inside parentheses.
|
size_t Size = R.size();
|
||||||
unsigned GtIsGt = 1;
|
if (Size == 0)
|
||||||
|
return *this;
|
||||||
bool isGtInsideTemplateArgs() const { return GtIsGt == 0; }
|
|
||||||
|
|
||||||
void printOpen(char Open = '(') {
|
|
||||||
GtIsGt++;
|
|
||||||
*this += Open;
|
|
||||||
}
|
|
||||||
void printClose(char Close = ')') {
|
|
||||||
GtIsGt--;
|
|
||||||
*this += Close;
|
|
||||||
}
|
|
||||||
|
|
||||||
OutputBuffer &operator+=(std::string_view R) {
|
|
||||||
if (size_t Size = R.size()) {
|
|
||||||
grow(Size);
|
grow(Size);
|
||||||
std::memcpy(Buffer + CurrentPosition, &*R.begin(), Size);
|
std::memmove(Buffer + CurrentPosition, R.begin(), Size);
|
||||||
CurrentPosition += Size;
|
CurrentPosition += Size;
|
||||||
}
|
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
OutputBuffer &operator+=(char C) {
|
OutputStream &operator+=(char C) {
|
||||||
grow(1);
|
grow(1);
|
||||||
Buffer[CurrentPosition++] = C;
|
Buffer[CurrentPosition++] = C;
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
OutputBuffer &prepend(std::string_view R) {
|
OutputStream &operator<<(StringView R) { return (*this += R); }
|
||||||
size_t Size = R.size();
|
|
||||||
|
|
||||||
grow(Size);
|
OutputStream &operator<<(char C) { return (*this += C); }
|
||||||
std::memmove(Buffer + Size, Buffer, CurrentPosition);
|
|
||||||
std::memcpy(Buffer, &*R.begin(), Size);
|
|
||||||
CurrentPosition += Size;
|
|
||||||
|
|
||||||
|
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;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
OutputBuffer &operator<<(std::string_view R) { return (*this += R); }
|
OutputStream &operator<<(unsigned long long N) {
|
||||||
|
writeUnsigned(N, false);
|
||||||
OutputBuffer &operator<<(char C) { return (*this += C); }
|
return *this;
|
||||||
|
|
||||||
OutputBuffer &operator<<(long long N) {
|
|
||||||
return writeUnsigned(static_cast<unsigned long long>(std::abs(N)), N < 0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
OutputBuffer &operator<<(unsigned long long N) {
|
OutputStream &operator<<(long N) {
|
||||||
return writeUnsigned(N, false);
|
|
||||||
}
|
|
||||||
|
|
||||||
OutputBuffer &operator<<(long N) {
|
|
||||||
return this->operator<<(static_cast<long long>(N));
|
return this->operator<<(static_cast<long long>(N));
|
||||||
}
|
}
|
||||||
|
|
||||||
OutputBuffer &operator<<(unsigned long N) {
|
OutputStream &operator<<(unsigned long N) {
|
||||||
return this->operator<<(static_cast<unsigned long long>(N));
|
return this->operator<<(static_cast<unsigned long long>(N));
|
||||||
}
|
}
|
||||||
|
|
||||||
OutputBuffer &operator<<(int N) {
|
OutputStream &operator<<(int N) {
|
||||||
return this->operator<<(static_cast<long long>(N));
|
return this->operator<<(static_cast<long long>(N));
|
||||||
}
|
}
|
||||||
|
|
||||||
OutputBuffer &operator<<(unsigned int N) {
|
OutputStream &operator<<(unsigned int N) {
|
||||||
return this->operator<<(static_cast<unsigned long long>(N));
|
return this->operator<<(static_cast<unsigned long long>(N));
|
||||||
}
|
}
|
||||||
|
|
||||||
void insert(size_t Pos, const char *S, size_t N) {
|
|
||||||
assert(Pos <= CurrentPosition);
|
|
||||||
if (N == 0)
|
|
||||||
return;
|
|
||||||
grow(N);
|
|
||||||
std::memmove(Buffer + Pos + N, Buffer + Pos, CurrentPosition - Pos);
|
|
||||||
std::memcpy(Buffer + Pos, S, N);
|
|
||||||
CurrentPosition += N;
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t getCurrentPosition() const { return CurrentPosition; }
|
size_t getCurrentPosition() const { return CurrentPosition; }
|
||||||
void setCurrentPosition(size_t NewPos) { CurrentPosition = NewPos; }
|
void setCurrentPosition(size_t NewPos) { CurrentPosition = NewPos; }
|
||||||
|
|
||||||
char back() const {
|
char back() const {
|
||||||
assert(CurrentPosition);
|
return CurrentPosition ? Buffer[CurrentPosition - 1] : '\0';
|
||||||
return Buffer[CurrentPosition - 1];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool empty() const { return CurrentPosition == 0; }
|
bool empty() const { return CurrentPosition == 0; }
|
||||||
|
|
||||||
char *getBuffer() { return Buffer; }
|
char *getBuffer() { return Buffer; }
|
||||||
char *getBufferEnd() { return Buffer + CurrentPosition - 1; }
|
char *getBufferEnd() { return Buffer + CurrentPosition - 1; }
|
||||||
size_t getBufferCapacity() const { return BufferCapacity; }
|
size_t getBufferCapacity() { return BufferCapacity; }
|
||||||
};
|
};
|
||||||
|
|
||||||
template <class T> class ScopedOverride {
|
template <class T> class SwapAndRestore {
|
||||||
T &Loc;
|
T &Restore;
|
||||||
T Original;
|
T OriginalValue;
|
||||||
|
bool ShouldRestore = true;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
ScopedOverride(T &Loc_) : ScopedOverride(Loc_, Loc_) {}
|
SwapAndRestore(T &Restore_) : SwapAndRestore(Restore_, Restore_) {}
|
||||||
|
|
||||||
ScopedOverride(T &Loc_, T NewVal) : Loc(Loc_), Original(Loc_) {
|
SwapAndRestore(T &Restore_, T NewVal)
|
||||||
Loc_ = std::move(NewVal);
|
: Restore(Restore_), OriginalValue(Restore) {
|
||||||
|
Restore = std::move(NewVal);
|
||||||
|
}
|
||||||
|
~SwapAndRestore() {
|
||||||
|
if (ShouldRestore)
|
||||||
|
Restore = std::move(OriginalValue);
|
||||||
}
|
}
|
||||||
~ScopedOverride() { Loc = std::move(Original); }
|
|
||||||
|
|
||||||
ScopedOverride(const ScopedOverride &) = delete;
|
void shouldRestore(bool ShouldRestore_) { ShouldRestore = ShouldRestore_; }
|
||||||
ScopedOverride &operator=(const ScopedOverride &) = delete;
|
|
||||||
|
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
|
DEMANGLE_NAMESPACE_END
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
1
externals/vma/VulkanMemoryAllocator
vendored
Submodule
1
externals/vma/VulkanMemoryAllocator
vendored
Submodule
Submodule externals/vma/VulkanMemoryAllocator added at 0aa3989b8f
@ -232,7 +232,7 @@
|
|||||||
|
|
||||||
<!-- ROM loading errors -->
|
<!-- ROM loading errors -->
|
||||||
<string name="loader_error_encrypted">Your ROM is encrypted</string>
|
<string name="loader_error_encrypted">Your ROM is encrypted</string>
|
||||||
<string name="loader_error_encrypted_roms_description"><![CDATA[Please follow the guides to redump your <a href="https://yuzu-emu.org/help/quickstart/#dumping-physical-titles-game-cards">game cartidges</a> or <a href="https://yuzu-emu.org/help/quickstart/#dumping-digital-titles-eshop">installed titles</a>.]]></string>
|
<string name="loader_error_encrypted_roms_description"><![CDATA[Please follow the guides to redump your <a href="https://yuzu-emu.org/help/quickstart/#dumping-cartridge-games">game cartidges</a> or <a href="https://yuzu-emu.org/help/quickstart/#dumping-installed-titles-eshop">installed titles</a>.]]></string>
|
||||||
<string name="loader_error_encrypted_keys_description"><![CDATA[Please ensure your <a href="https://yuzu-emu.org/help/quickstart/#dumping-prodkeys-and-titlekeys">prod.keys</a> file is installed so that games can be decrypted.]]></string>
|
<string name="loader_error_encrypted_keys_description"><![CDATA[Please ensure your <a href="https://yuzu-emu.org/help/quickstart/#dumping-prodkeys-and-titlekeys">prod.keys</a> file is installed so that games can be decrypted.]]></string>
|
||||||
<string name="loader_error_video_core">An error occurred initializing the video core</string>
|
<string name="loader_error_video_core">An error occurred initializing the video core</string>
|
||||||
<string name="loader_error_video_core_description">This is usually caused by an incompatible GPU driver. Installing a custom GPU driver may resolve this problem.</string>
|
<string name="loader_error_video_core_description">This is usually caused by an incompatible GPU driver. Installing a custom GPU driver may resolve this problem.</string>
|
||||||
|
@ -23,7 +23,7 @@ std::string DemangleSymbol(const std::string& mangled) {
|
|||||||
SCOPE_EXIT({ std::free(demangled); });
|
SCOPE_EXIT({ std::free(demangled); });
|
||||||
|
|
||||||
if (is_itanium(mangled)) {
|
if (is_itanium(mangled)) {
|
||||||
demangled = llvm::itaniumDemangle(mangled.c_str());
|
demangled = llvm::itaniumDemangle(mangled.c_str(), nullptr, nullptr, nullptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!demangled) {
|
if (!demangled) {
|
||||||
|
@ -30,8 +30,8 @@ DetachedTasks::~DetachedTasks() {
|
|||||||
void DetachedTasks::AddTask(std::function<void()> task) {
|
void DetachedTasks::AddTask(std::function<void()> task) {
|
||||||
std::unique_lock lock{instance->mutex};
|
std::unique_lock lock{instance->mutex};
|
||||||
++instance->count;
|
++instance->count;
|
||||||
std::thread([task_{std::move(task)}]() {
|
std::thread([task{std::move(task)}]() {
|
||||||
task_();
|
task();
|
||||||
std::unique_lock thread_lock{instance->mutex};
|
std::unique_lock thread_lock{instance->mutex};
|
||||||
--instance->count;
|
--instance->count;
|
||||||
std::notify_all_at_thread_exit(instance->cv, std::move(thread_lock));
|
std::notify_all_at_thread_exit(instance->cv, std::move(thread_lock));
|
||||||
|
@ -3,11 +3,10 @@
|
|||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <optional>
|
|
||||||
#include <string>
|
|
||||||
|
|
||||||
#include "common/common_types.h"
|
#include "common/common_types.h"
|
||||||
|
|
||||||
|
#include <optional>
|
||||||
|
|
||||||
namespace Network {
|
namespace Network {
|
||||||
|
|
||||||
/// Address families
|
/// Address families
|
||||||
|
@ -876,7 +876,7 @@ elseif (APPLE)
|
|||||||
elseif (WIN32)
|
elseif (WIN32)
|
||||||
target_sources(core PRIVATE
|
target_sources(core PRIVATE
|
||||||
hle/service/ssl/ssl_backend_schannel.cpp)
|
hle/service/ssl/ssl_backend_schannel.cpp)
|
||||||
target_link_libraries(core PRIVATE crypt32 secur32)
|
target_link_libraries(core PRIVATE secur32)
|
||||||
else()
|
else()
|
||||||
target_sources(core PRIVATE
|
target_sources(core PRIVATE
|
||||||
hle/service/ssl/ssl_backend_none.cpp)
|
hle/service/ssl/ssl_backend_none.cpp)
|
||||||
|
@ -302,12 +302,12 @@ Result KThread::InitializeServiceThread(Core::System& system, KThread* thread,
|
|||||||
std::function<void()>&& func, s32 prio, s32 virt_core,
|
std::function<void()>&& func, s32 prio, s32 virt_core,
|
||||||
KProcess* owner) {
|
KProcess* owner) {
|
||||||
system.Kernel().GlobalSchedulerContext().AddThread(thread);
|
system.Kernel().GlobalSchedulerContext().AddThread(thread);
|
||||||
std::function<void()> func2{[&system, func_{std::move(func)}] {
|
std::function<void()> func2{[&system, func{std::move(func)}] {
|
||||||
// Similar to UserModeThreadStarter.
|
// Similar to UserModeThreadStarter.
|
||||||
system.Kernel().CurrentScheduler()->OnThreadStart();
|
system.Kernel().CurrentScheduler()->OnThreadStart();
|
||||||
|
|
||||||
// Run the guest function.
|
// Run the guest function.
|
||||||
func_();
|
func();
|
||||||
|
|
||||||
// Exit.
|
// Exit.
|
||||||
Svc::ExitThread(system);
|
Svc::ExitThread(system);
|
||||||
|
@ -1089,15 +1089,15 @@ static std::jthread RunHostThreadFunc(KernelCore& kernel, KProcess* process,
|
|||||||
KThread::Register(kernel, thread);
|
KThread::Register(kernel, thread);
|
||||||
|
|
||||||
return std::jthread(
|
return std::jthread(
|
||||||
[&kernel, thread, thread_name_{std::move(thread_name)}, func_{std::move(func)}] {
|
[&kernel, thread, thread_name{std::move(thread_name)}, func{std::move(func)}] {
|
||||||
// Set the thread name.
|
// Set the thread name.
|
||||||
Common::SetCurrentThreadName(thread_name_.c_str());
|
Common::SetCurrentThreadName(thread_name.c_str());
|
||||||
|
|
||||||
// Set the thread as current.
|
// Set the thread as current.
|
||||||
kernel.RegisterHostThread(thread);
|
kernel.RegisterHostThread(thread);
|
||||||
|
|
||||||
// Run the callback.
|
// Run the callback.
|
||||||
func_();
|
func();
|
||||||
|
|
||||||
// Close the thread.
|
// Close the thread.
|
||||||
// This will free the process if it is the last reference.
|
// This will free the process if it is the last reference.
|
||||||
|
@ -506,7 +506,7 @@ void ISelfController::SetHandlesRequestToDisplay(HLERequestContext& ctx) {
|
|||||||
void ISelfController::SetIdleTimeDetectionExtension(HLERequestContext& ctx) {
|
void ISelfController::SetIdleTimeDetectionExtension(HLERequestContext& ctx) {
|
||||||
IPC::RequestParser rp{ctx};
|
IPC::RequestParser rp{ctx};
|
||||||
idle_time_detection_extension = rp.Pop<u32>();
|
idle_time_detection_extension = rp.Pop<u32>();
|
||||||
LOG_DEBUG(Service_AM, "(STUBBED) called idle_time_detection_extension={}",
|
LOG_WARNING(Service_AM, "(STUBBED) called idle_time_detection_extension={}",
|
||||||
idle_time_detection_extension);
|
idle_time_detection_extension);
|
||||||
|
|
||||||
IPC::ResponseBuilder rb{ctx, 2};
|
IPC::ResponseBuilder rb{ctx, 2};
|
||||||
|
@ -7,7 +7,6 @@
|
|||||||
#include "core/hle/service/kernel_helpers.h"
|
#include "core/hle/service/kernel_helpers.h"
|
||||||
#include "core/hle/service/nifm/nifm.h"
|
#include "core/hle/service/nifm/nifm.h"
|
||||||
#include "core/hle/service/server_manager.h"
|
#include "core/hle/service/server_manager.h"
|
||||||
#include "network/network.h"
|
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
|
@ -4,15 +4,14 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "core/hle/service/service.h"
|
#include "core/hle/service/service.h"
|
||||||
|
#include "network/network.h"
|
||||||
|
#include "network/room.h"
|
||||||
|
#include "network/room_member.h"
|
||||||
|
|
||||||
namespace Core {
|
namespace Core {
|
||||||
class System;
|
class System;
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace Network {
|
|
||||||
class RoomNetwork;
|
|
||||||
}
|
|
||||||
|
|
||||||
namespace Service::NIFM {
|
namespace Service::NIFM {
|
||||||
|
|
||||||
void LoopProcess(Core::System& system);
|
void LoopProcess(Core::System& system);
|
||||||
|
@ -3,15 +3,15 @@
|
|||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include "core/hle/result.h"
|
||||||
|
|
||||||
|
#include "common/common_types.h"
|
||||||
|
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <span>
|
#include <span>
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
#include "common/common_types.h"
|
|
||||||
|
|
||||||
#include "core/hle/result.h"
|
|
||||||
|
|
||||||
namespace Network {
|
namespace Network {
|
||||||
class SocketBase;
|
class SocketBase;
|
||||||
}
|
}
|
||||||
|
@ -1,10 +1,10 @@
|
|||||||
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
|
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
|
||||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
#include "common/logging/log.h"
|
|
||||||
|
|
||||||
#include "core/hle/service/ssl/ssl_backend.h"
|
#include "core/hle/service/ssl/ssl_backend.h"
|
||||||
|
|
||||||
|
#include "common/logging/log.h"
|
||||||
|
|
||||||
namespace Service::SSL {
|
namespace Service::SSL {
|
||||||
|
|
||||||
ResultVal<std::unique_ptr<SSLConnectionBackend>> CreateSSLConnectionBackend() {
|
ResultVal<std::unique_ptr<SSLConnectionBackend>> CreateSSLConnectionBackend() {
|
||||||
|
@ -1,6 +1,14 @@
|
|||||||
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
|
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
|
||||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
|
#include "core/hle/service/ssl/ssl_backend.h"
|
||||||
|
#include "core/internal_network/network.h"
|
||||||
|
#include "core/internal_network/sockets.h"
|
||||||
|
|
||||||
|
#include "common/fs/file.h"
|
||||||
|
#include "common/hex_util.h"
|
||||||
|
#include "common/string_util.h"
|
||||||
|
|
||||||
#include <mutex>
|
#include <mutex>
|
||||||
|
|
||||||
#include <openssl/bio.h>
|
#include <openssl/bio.h>
|
||||||
@ -8,14 +16,6 @@
|
|||||||
#include <openssl/ssl.h>
|
#include <openssl/ssl.h>
|
||||||
#include <openssl/x509.h>
|
#include <openssl/x509.h>
|
||||||
|
|
||||||
#include "common/fs/file.h"
|
|
||||||
#include "common/hex_util.h"
|
|
||||||
#include "common/string_util.h"
|
|
||||||
|
|
||||||
#include "core/hle/service/ssl/ssl_backend.h"
|
|
||||||
#include "core/internal_network/network.h"
|
|
||||||
#include "core/internal_network/sockets.h"
|
|
||||||
|
|
||||||
using namespace Common::FS;
|
using namespace Common::FS;
|
||||||
|
|
||||||
namespace Service::SSL {
|
namespace Service::SSL {
|
||||||
|
@ -1,16 +1,16 @@
|
|||||||
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
|
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
|
||||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
#include <mutex>
|
#include "core/hle/service/ssl/ssl_backend.h"
|
||||||
|
#include "core/internal_network/network.h"
|
||||||
|
#include "core/internal_network/sockets.h"
|
||||||
|
|
||||||
#include "common/error.h"
|
#include "common/error.h"
|
||||||
#include "common/fs/file.h"
|
#include "common/fs/file.h"
|
||||||
#include "common/hex_util.h"
|
#include "common/hex_util.h"
|
||||||
#include "common/string_util.h"
|
#include "common/string_util.h"
|
||||||
|
|
||||||
#include "core/hle/service/ssl/ssl_backend.h"
|
#include <mutex>
|
||||||
#include "core/internal_network/network.h"
|
|
||||||
#include "core/internal_network/sockets.h"
|
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
@ -20,7 +20,6 @@ namespace {
|
|||||||
#define SECURITY_WIN32
|
#define SECURITY_WIN32
|
||||||
#include <schnlsp.h>
|
#include <schnlsp.h>
|
||||||
#include <security.h>
|
#include <security.h>
|
||||||
#include <wincrypt.h>
|
|
||||||
|
|
||||||
std::once_flag one_time_init_flag;
|
std::once_flag one_time_init_flag;
|
||||||
bool one_time_init_success = false;
|
bool one_time_init_success = false;
|
||||||
|
@ -1,22 +1,19 @@
|
|||||||
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
|
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
|
||||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
#include <mutex>
|
|
||||||
|
|
||||||
// SecureTransport has been deprecated in its entirety in favor of
|
|
||||||
// Network.framework, but that does not allow layering TLS on top of an
|
|
||||||
// arbitrary socket.
|
|
||||||
#if defined(__GNUC__) || defined(__clang__)
|
|
||||||
#pragma GCC diagnostic push
|
|
||||||
#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
|
|
||||||
#include <Security/SecureTransport.h>
|
|
||||||
#pragma GCC diagnostic pop
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "core/hle/service/ssl/ssl_backend.h"
|
#include "core/hle/service/ssl/ssl_backend.h"
|
||||||
#include "core/internal_network/network.h"
|
#include "core/internal_network/network.h"
|
||||||
#include "core/internal_network/sockets.h"
|
#include "core/internal_network/sockets.h"
|
||||||
|
|
||||||
|
#include <mutex>
|
||||||
|
|
||||||
|
#include <Security/SecureTransport.h>
|
||||||
|
|
||||||
|
// SecureTransport has been deprecated in its entirety in favor of
|
||||||
|
// Network.framework, but that does not allow layering TLS on top of an
|
||||||
|
// arbitrary socket.
|
||||||
|
#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
|
@ -10,7 +10,6 @@
|
|||||||
#include "core/internal_network/network.h"
|
#include "core/internal_network/network.h"
|
||||||
#include "core/internal_network/network_interface.h"
|
#include "core/internal_network/network_interface.h"
|
||||||
#include "core/internal_network/socket_proxy.h"
|
#include "core/internal_network/socket_proxy.h"
|
||||||
#include "network/network.h"
|
|
||||||
|
|
||||||
#if YUZU_UNIX
|
#if YUZU_UNIX
|
||||||
#include <sys/socket.h>
|
#include <sys/socket.h>
|
||||||
|
@ -10,12 +10,10 @@
|
|||||||
|
|
||||||
#include "common/common_funcs.h"
|
#include "common/common_funcs.h"
|
||||||
#include "core/internal_network/sockets.h"
|
#include "core/internal_network/sockets.h"
|
||||||
#include "network/room_member.h"
|
#include "network/network.h"
|
||||||
|
|
||||||
namespace Network {
|
namespace Network {
|
||||||
|
|
||||||
class RoomNetwork;
|
|
||||||
|
|
||||||
class ProxySocket : public SocketBase {
|
class ProxySocket : public SocketBase {
|
||||||
public:
|
public:
|
||||||
explicit ProxySocket(RoomNetwork& room_network_) noexcept;
|
explicit ProxySocket(RoomNetwork& room_network_) noexcept;
|
||||||
|
@ -15,13 +15,12 @@
|
|||||||
|
|
||||||
#include "common/common_types.h"
|
#include "common/common_types.h"
|
||||||
#include "core/internal_network/network.h"
|
#include "core/internal_network/network.h"
|
||||||
|
#include "network/network.h"
|
||||||
|
|
||||||
// TODO: C++20 Replace std::vector usages with std::span
|
// TODO: C++20 Replace std::vector usages with std::span
|
||||||
|
|
||||||
namespace Network {
|
namespace Network {
|
||||||
|
|
||||||
struct ProxyPacket;
|
|
||||||
|
|
||||||
class SocketBase {
|
class SocketBase {
|
||||||
public:
|
public:
|
||||||
#ifdef YUZU_UNIX
|
#ifdef YUZU_UNIX
|
||||||
|
@ -274,7 +274,6 @@ add_library(video_core STATIC
|
|||||||
vulkan_common/vulkan_wrapper.h
|
vulkan_common/vulkan_wrapper.h
|
||||||
vulkan_common/nsight_aftermath_tracker.cpp
|
vulkan_common/nsight_aftermath_tracker.cpp
|
||||||
vulkan_common/nsight_aftermath_tracker.h
|
vulkan_common/nsight_aftermath_tracker.h
|
||||||
vulkan_common/vma.cpp
|
|
||||||
)
|
)
|
||||||
|
|
||||||
create_target_directory_groups(video_core)
|
create_target_directory_groups(video_core)
|
||||||
@ -292,7 +291,7 @@ target_link_options(video_core PRIVATE ${FFmpeg_LDFLAGS})
|
|||||||
|
|
||||||
add_dependencies(video_core host_shaders)
|
add_dependencies(video_core host_shaders)
|
||||||
target_include_directories(video_core PRIVATE ${HOST_SHADERS_INCLUDE})
|
target_include_directories(video_core PRIVATE ${HOST_SHADERS_INCLUDE})
|
||||||
target_link_libraries(video_core PRIVATE sirit Vulkan::Headers GPUOpen::VulkanMemoryAllocator)
|
target_link_libraries(video_core PRIVATE sirit Vulkan::Headers vma)
|
||||||
|
|
||||||
if (ENABLE_NSIGHT_AFTERMATH)
|
if (ENABLE_NSIGHT_AFTERMATH)
|
||||||
if (NOT DEFINED ENV{NSIGHT_AFTERMATH_SDK})
|
if (NOT DEFINED ENV{NSIGHT_AFTERMATH_SDK})
|
||||||
@ -325,9 +324,6 @@ else()
|
|||||||
|
|
||||||
# xbyak
|
# xbyak
|
||||||
set_source_files_properties(macro/macro_jit_x64.cpp PROPERTIES COMPILE_OPTIONS "-Wno-conversion;-Wno-shadow")
|
set_source_files_properties(macro/macro_jit_x64.cpp PROPERTIES COMPILE_OPTIONS "-Wno-conversion;-Wno-shadow")
|
||||||
|
|
||||||
# VMA
|
|
||||||
set_source_files_properties(vulkan_common/vma.cpp PROPERTIES COMPILE_OPTIONS "-Wno-conversion;-Wno-unused-variable;-Wno-unused-parameter;-Wno-missing-field-initializers")
|
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if (ARCHITECTURE_x86_64)
|
if (ARCHITECTURE_x86_64)
|
||||||
|
@ -38,8 +38,8 @@ void RendererBase::RequestScreenshot(void* data, std::function<void(bool)> callb
|
|||||||
LOG_ERROR(Render, "A screenshot is already requested or in progress, ignoring the request");
|
LOG_ERROR(Render, "A screenshot is already requested or in progress, ignoring the request");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
auto async_callback{[callback_ = std::move(callback)](bool invert_y) {
|
auto async_callback{[callback = std::move(callback)](bool invert_y) {
|
||||||
std::thread t{callback_, invert_y};
|
std::thread t{callback, invert_y};
|
||||||
t.detach();
|
t.detach();
|
||||||
}};
|
}};
|
||||||
renderer_settings.screenshot_bits = data;
|
renderer_settings.screenshot_bits = data;
|
||||||
|
@ -231,25 +231,24 @@ GraphicsPipeline::GraphicsPipeline(const Device& device, TextureCache& texture_c
|
|||||||
}
|
}
|
||||||
const bool in_parallel = thread_worker != nullptr;
|
const bool in_parallel = thread_worker != nullptr;
|
||||||
const auto backend = device.GetShaderBackend();
|
const auto backend = device.GetShaderBackend();
|
||||||
auto func{[this, sources_ = std::move(sources), sources_spirv_ = std::move(sources_spirv),
|
auto func{[this, sources = std::move(sources), sources_spirv = std::move(sources_spirv),
|
||||||
shader_notify, backend, in_parallel,
|
shader_notify, backend, in_parallel,
|
||||||
force_context_flush](ShaderContext::Context*) mutable {
|
force_context_flush](ShaderContext::Context*) mutable {
|
||||||
for (size_t stage = 0; stage < 5; ++stage) {
|
for (size_t stage = 0; stage < 5; ++stage) {
|
||||||
switch (backend) {
|
switch (backend) {
|
||||||
case Settings::ShaderBackend::GLSL:
|
case Settings::ShaderBackend::GLSL:
|
||||||
if (!sources_[stage].empty()) {
|
if (!sources[stage].empty()) {
|
||||||
source_programs[stage] = CreateProgram(sources_[stage], Stage(stage));
|
source_programs[stage] = CreateProgram(sources[stage], Stage(stage));
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case Settings::ShaderBackend::GLASM:
|
case Settings::ShaderBackend::GLASM:
|
||||||
if (!sources_[stage].empty()) {
|
if (!sources[stage].empty()) {
|
||||||
assembly_programs[stage] =
|
assembly_programs[stage] = CompileProgram(sources[stage], AssemblyStage(stage));
|
||||||
CompileProgram(sources_[stage], AssemblyStage(stage));
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case Settings::ShaderBackend::SPIRV:
|
case Settings::ShaderBackend::SPIRV:
|
||||||
if (!sources_spirv_[stage].empty()) {
|
if (!sources_spirv[stage].empty()) {
|
||||||
source_programs[stage] = CreateProgram(sources_spirv_[stage], Stage(stage));
|
source_programs[stage] = CreateProgram(sources_spirv[stage], Stage(stage));
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -288,9 +288,9 @@ void ShaderCache::LoadDiskResources(u64 title_id, std::stop_token stop_loading,
|
|||||||
const auto load_compute{[&](std::ifstream& file, FileEnvironment env) {
|
const auto load_compute{[&](std::ifstream& file, FileEnvironment env) {
|
||||||
ComputePipelineKey key;
|
ComputePipelineKey key;
|
||||||
file.read(reinterpret_cast<char*>(&key), sizeof(key));
|
file.read(reinterpret_cast<char*>(&key), sizeof(key));
|
||||||
queue_work([this, key, env_ = std::move(env), &state, &callback](Context* ctx) mutable {
|
queue_work([this, key, env = std::move(env), &state, &callback](Context* ctx) mutable {
|
||||||
ctx->pools.ReleaseContents();
|
ctx->pools.ReleaseContents();
|
||||||
auto pipeline{CreateComputePipeline(ctx->pools, key, env_, true)};
|
auto pipeline{CreateComputePipeline(ctx->pools, key, env, true)};
|
||||||
std::scoped_lock lock{state.mutex};
|
std::scoped_lock lock{state.mutex};
|
||||||
if (pipeline) {
|
if (pipeline) {
|
||||||
compute_cache.emplace(key, std::move(pipeline));
|
compute_cache.emplace(key, std::move(pipeline));
|
||||||
@ -305,9 +305,9 @@ void ShaderCache::LoadDiskResources(u64 title_id, std::stop_token stop_loading,
|
|||||||
const auto load_graphics{[&](std::ifstream& file, std::vector<FileEnvironment> envs) {
|
const auto load_graphics{[&](std::ifstream& file, std::vector<FileEnvironment> envs) {
|
||||||
GraphicsPipelineKey key;
|
GraphicsPipelineKey key;
|
||||||
file.read(reinterpret_cast<char*>(&key), sizeof(key));
|
file.read(reinterpret_cast<char*>(&key), sizeof(key));
|
||||||
queue_work([this, key, envs_ = std::move(envs), &state, &callback](Context* ctx) mutable {
|
queue_work([this, key, envs = std::move(envs), &state, &callback](Context* ctx) mutable {
|
||||||
boost::container::static_vector<Shader::Environment*, 5> env_ptrs;
|
boost::container::static_vector<Shader::Environment*, 5> env_ptrs;
|
||||||
for (auto& env : envs_) {
|
for (auto& env : envs) {
|
||||||
env_ptrs.push_back(&env);
|
env_ptrs.push_back(&env);
|
||||||
}
|
}
|
||||||
ctx->pools.ReleaseContents();
|
ctx->pools.ReleaseContents();
|
||||||
|
@ -206,8 +206,8 @@ public:
|
|||||||
const size_t sub_first_offset = static_cast<size_t>(first % 4) * GetQuadsNum(num_indices);
|
const size_t sub_first_offset = static_cast<size_t>(first % 4) * GetQuadsNum(num_indices);
|
||||||
const size_t offset =
|
const size_t offset =
|
||||||
(sub_first_offset + GetQuadsNum(first)) * 6ULL * BytesPerIndex(index_type);
|
(sub_first_offset + GetQuadsNum(first)) * 6ULL * BytesPerIndex(index_type);
|
||||||
scheduler.Record([buffer_ = *buffer, index_type_, offset](vk::CommandBuffer cmdbuf) {
|
scheduler.Record([buffer = *buffer, index_type_, offset](vk::CommandBuffer cmdbuf) {
|
||||||
cmdbuf.BindIndexBuffer(buffer_, offset, index_type_);
|
cmdbuf.BindIndexBuffer(buffer, offset, index_type_);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -528,18 +528,17 @@ void BufferCacheRuntime::BindVertexBuffers(VideoCommon::HostBindings<Buffer>& bi
|
|||||||
buffer_handles.push_back(handle);
|
buffer_handles.push_back(handle);
|
||||||
}
|
}
|
||||||
if (device.IsExtExtendedDynamicStateSupported()) {
|
if (device.IsExtExtendedDynamicStateSupported()) {
|
||||||
scheduler.Record([bindings_ = std::move(bindings),
|
scheduler.Record([bindings = std::move(bindings),
|
||||||
buffer_handles_ = std::move(buffer_handles)](vk::CommandBuffer cmdbuf) {
|
buffer_handles = std::move(buffer_handles)](vk::CommandBuffer cmdbuf) {
|
||||||
cmdbuf.BindVertexBuffers2EXT(bindings_.min_index,
|
cmdbuf.BindVertexBuffers2EXT(
|
||||||
bindings_.max_index - bindings_.min_index,
|
bindings.min_index, bindings.max_index - bindings.min_index, buffer_handles.data(),
|
||||||
buffer_handles_.data(), bindings_.offsets.data(),
|
bindings.offsets.data(), bindings.sizes.data(), bindings.strides.data());
|
||||||
bindings_.sizes.data(), bindings_.strides.data());
|
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
scheduler.Record([bindings_ = std::move(bindings),
|
scheduler.Record([bindings = std::move(bindings),
|
||||||
buffer_handles_ = std::move(buffer_handles)](vk::CommandBuffer cmdbuf) {
|
buffer_handles = std::move(buffer_handles)](vk::CommandBuffer cmdbuf) {
|
||||||
cmdbuf.BindVertexBuffers(bindings_.min_index, bindings_.max_index - bindings_.min_index,
|
cmdbuf.BindVertexBuffers(bindings.min_index, bindings.max_index - bindings.min_index,
|
||||||
buffer_handles_.data(), bindings_.offsets.data());
|
buffer_handles.data(), bindings.offsets.data());
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -574,11 +573,11 @@ void BufferCacheRuntime::BindTransformFeedbackBuffers(VideoCommon::HostBindings<
|
|||||||
for (u32 index = 0; index < bindings.buffers.size(); ++index) {
|
for (u32 index = 0; index < bindings.buffers.size(); ++index) {
|
||||||
buffer_handles.push_back(bindings.buffers[index]->Handle());
|
buffer_handles.push_back(bindings.buffers[index]->Handle());
|
||||||
}
|
}
|
||||||
scheduler.Record([bindings_ = std::move(bindings),
|
scheduler.Record([bindings = std::move(bindings),
|
||||||
buffer_handles_ = std::move(buffer_handles)](vk::CommandBuffer cmdbuf) {
|
buffer_handles = std::move(buffer_handles)](vk::CommandBuffer cmdbuf) {
|
||||||
cmdbuf.BindTransformFeedbackBuffersEXT(0, static_cast<u32>(buffer_handles_.size()),
|
cmdbuf.BindTransformFeedbackBuffersEXT(0, static_cast<u32>(buffer_handles.size()),
|
||||||
buffer_handles_.data(), bindings_.offsets.data(),
|
buffer_handles.data(), bindings.offsets.data(),
|
||||||
bindings_.sizes.data());
|
bindings.sizes.data());
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -469,9 +469,9 @@ void PipelineCache::LoadDiskResources(u64 title_id, std::stop_token stop_loading
|
|||||||
ComputePipelineCacheKey key;
|
ComputePipelineCacheKey key;
|
||||||
file.read(reinterpret_cast<char*>(&key), sizeof(key));
|
file.read(reinterpret_cast<char*>(&key), sizeof(key));
|
||||||
|
|
||||||
workers.QueueWork([this, key, env_ = std::move(env), &state, &callback]() mutable {
|
workers.QueueWork([this, key, env = std::move(env), &state, &callback]() mutable {
|
||||||
ShaderPools pools;
|
ShaderPools pools;
|
||||||
auto pipeline{CreateComputePipeline(pools, key, env_, state.statistics.get(), false)};
|
auto pipeline{CreateComputePipeline(pools, key, env, state.statistics.get(), false)};
|
||||||
std::scoped_lock lock{state.mutex};
|
std::scoped_lock lock{state.mutex};
|
||||||
if (pipeline) {
|
if (pipeline) {
|
||||||
compute_cache.emplace(key, std::move(pipeline));
|
compute_cache.emplace(key, std::move(pipeline));
|
||||||
@ -500,10 +500,10 @@ void PipelineCache::LoadDiskResources(u64 title_id, std::stop_token stop_loading
|
|||||||
(key.state.dynamic_vertex_input != 0) != dynamic_features.has_dynamic_vertex_input) {
|
(key.state.dynamic_vertex_input != 0) != dynamic_features.has_dynamic_vertex_input) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
workers.QueueWork([this, key, envs_ = std::move(envs), &state, &callback]() mutable {
|
workers.QueueWork([this, key, envs = std::move(envs), &state, &callback]() mutable {
|
||||||
ShaderPools pools;
|
ShaderPools pools;
|
||||||
boost::container::static_vector<Shader::Environment*, 5> env_ptrs;
|
boost::container::static_vector<Shader::Environment*, 5> env_ptrs;
|
||||||
for (auto& env : envs_) {
|
for (auto& env : envs) {
|
||||||
env_ptrs.push_back(&env);
|
env_ptrs.push_back(&env);
|
||||||
}
|
}
|
||||||
auto pipeline{CreateGraphicsPipeline(pools, key, MakeSpan(env_ptrs),
|
auto pipeline{CreateGraphicsPipeline(pools, key, MakeSpan(env_ptrs),
|
||||||
@ -702,8 +702,8 @@ std::unique_ptr<ComputePipeline> PipelineCache::CreateComputePipeline(
|
|||||||
if (!pipeline || pipeline_cache_filename.empty()) {
|
if (!pipeline || pipeline_cache_filename.empty()) {
|
||||||
return pipeline;
|
return pipeline;
|
||||||
}
|
}
|
||||||
serialization_thread.QueueWork([this, key, env_ = std::move(env)] {
|
serialization_thread.QueueWork([this, key, env = std::move(env)] {
|
||||||
SerializePipeline(key, std::array<const GenericEnvironment*, 1>{&env_},
|
SerializePipeline(key, std::array<const GenericEnvironment*, 1>{&env},
|
||||||
pipeline_cache_filename, CACHE_VERSION);
|
pipeline_cache_filename, CACHE_VERSION);
|
||||||
});
|
});
|
||||||
return pipeline;
|
return pipeline;
|
||||||
|
@ -98,10 +98,10 @@ HostCounter::HostCounter(QueryCache& cache_, std::shared_ptr<HostCounter> depend
|
|||||||
: HostCounterBase{std::move(dependency_)}, cache{cache_}, type{type_},
|
: HostCounterBase{std::move(dependency_)}, cache{cache_}, type{type_},
|
||||||
query{cache_.AllocateQuery(type_)}, tick{cache_.GetScheduler().CurrentTick()} {
|
query{cache_.AllocateQuery(type_)}, tick{cache_.GetScheduler().CurrentTick()} {
|
||||||
const vk::Device* logical = &cache.GetDevice().GetLogical();
|
const vk::Device* logical = &cache.GetDevice().GetLogical();
|
||||||
cache.GetScheduler().Record([logical, query_ = query](vk::CommandBuffer cmdbuf) {
|
cache.GetScheduler().Record([logical, query = query](vk::CommandBuffer cmdbuf) {
|
||||||
const bool use_precise = Settings::IsGPULevelHigh();
|
const bool use_precise = Settings::IsGPULevelHigh();
|
||||||
logical->ResetQueryPool(query_.first, query_.second, 1);
|
logical->ResetQueryPool(query.first, query.second, 1);
|
||||||
cmdbuf.BeginQuery(query_.first, query_.second,
|
cmdbuf.BeginQuery(query.first, query.second,
|
||||||
use_precise ? VK_QUERY_CONTROL_PRECISE_BIT : 0);
|
use_precise ? VK_QUERY_CONTROL_PRECISE_BIT : 0);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -111,9 +111,8 @@ HostCounter::~HostCounter() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void HostCounter::EndQuery() {
|
void HostCounter::EndQuery() {
|
||||||
cache.GetScheduler().Record([query_ = query](vk::CommandBuffer cmdbuf) {
|
cache.GetScheduler().Record(
|
||||||
cmdbuf.EndQuery(query_.first, query_.second);
|
[query = query](vk::CommandBuffer cmdbuf) { cmdbuf.EndQuery(query.first, query.second); });
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
u64 HostCounter::BlockingQuery(bool async) const {
|
u64 HostCounter::BlockingQuery(bool async) const {
|
||||||
|
@ -1412,7 +1412,7 @@ void Image::DownloadMemory(std::span<VkBuffer> buffers_span, std::span<VkDeviceS
|
|||||||
}
|
}
|
||||||
scheduler->RequestOutsideRenderPassOperationContext();
|
scheduler->RequestOutsideRenderPassOperationContext();
|
||||||
scheduler->Record([buffers = std::move(buffers_vector), image = *original_image,
|
scheduler->Record([buffers = std::move(buffers_vector), image = *original_image,
|
||||||
aspect_mask_ = aspect_mask, vk_copies](vk::CommandBuffer cmdbuf) {
|
aspect_mask = aspect_mask, vk_copies](vk::CommandBuffer cmdbuf) {
|
||||||
const VkImageMemoryBarrier read_barrier{
|
const VkImageMemoryBarrier read_barrier{
|
||||||
.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,
|
.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,
|
||||||
.pNext = nullptr,
|
.pNext = nullptr,
|
||||||
@ -1424,7 +1424,7 @@ void Image::DownloadMemory(std::span<VkBuffer> buffers_span, std::span<VkDeviceS
|
|||||||
.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
|
.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
|
||||||
.image = image,
|
.image = image,
|
||||||
.subresourceRange{
|
.subresourceRange{
|
||||||
.aspectMask = aspect_mask_,
|
.aspectMask = aspect_mask,
|
||||||
.baseMipLevel = 0,
|
.baseMipLevel = 0,
|
||||||
.levelCount = VK_REMAINING_MIP_LEVELS,
|
.levelCount = VK_REMAINING_MIP_LEVELS,
|
||||||
.baseArrayLayer = 0,
|
.baseArrayLayer = 0,
|
||||||
@ -1456,7 +1456,7 @@ void Image::DownloadMemory(std::span<VkBuffer> buffers_span, std::span<VkDeviceS
|
|||||||
.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
|
.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
|
||||||
.image = image,
|
.image = image,
|
||||||
.subresourceRange{
|
.subresourceRange{
|
||||||
.aspectMask = aspect_mask_,
|
.aspectMask = aspect_mask,
|
||||||
.baseMipLevel = 0,
|
.baseMipLevel = 0,
|
||||||
.levelCount = VK_REMAINING_MIP_LEVELS,
|
.levelCount = VK_REMAINING_MIP_LEVELS,
|
||||||
.baseArrayLayer = 0,
|
.baseArrayLayer = 0,
|
||||||
|
@ -135,10 +135,10 @@ void RoomJson::Delete() {
|
|||||||
LOG_ERROR(WebService, "Room must be registered to be deleted");
|
LOG_ERROR(WebService, "Room must be registered to be deleted");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
Common::DetachedTasks::AddTask([host_{this->host}, username_{this->username},
|
Common::DetachedTasks::AddTask(
|
||||||
token_{this->token}, room_id_{this->room_id}]() {
|
[host{this->host}, username{this->username}, token{this->token}, room_id{this->room_id}]() {
|
||||||
// create a new client here because the this->client might be destroyed.
|
// create a new client here because the this->client might be destroyed.
|
||||||
Client{host_, username_, token_}.DeleteJson(fmt::format("/lobby/{}", room_id_), "", false);
|
Client{host, username, token}.DeleteJson(fmt::format("/lobby/{}", room_id), "", false);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user