Merge pull request #11116 from lat9nq/clang-shadowing
general: Silence -Wshadow{,-uncaptured-local} warnings
			
			
This commit is contained in:
		@@ -289,7 +289,7 @@ find_package(Boost 1.79.0 REQUIRED context)
 | 
			
		||||
find_package(enet 1.3 MODULE)
 | 
			
		||||
find_package(fmt 9 REQUIRED)
 | 
			
		||||
find_package(inih 52 MODULE COMPONENTS INIReader)
 | 
			
		||||
find_package(LLVM MODULE COMPONENTS Demangle)
 | 
			
		||||
find_package(LLVM 17 MODULE COMPONENTS Demangle)
 | 
			
		||||
find_package(lz4 REQUIRED)
 | 
			
		||||
find_package(nlohmann_json 3.8 REQUIRED)
 | 
			
		||||
find_package(Opus 1.3 MODULE)
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										171
									
								
								externals/demangle/ItaniumDemangle.cpp
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										171
									
								
								externals/demangle/ItaniumDemangle.cpp
									
									
									
									
										vendored
									
									
								
							@@ -20,9 +20,7 @@
 | 
			
		||||
#include <cstdlib>
 | 
			
		||||
#include <cstring>
 | 
			
		||||
#include <functional>
 | 
			
		||||
#include <numeric>
 | 
			
		||||
#include <utility>
 | 
			
		||||
#include <vector>
 | 
			
		||||
 | 
			
		||||
using namespace llvm;
 | 
			
		||||
using namespace llvm::itanium_demangle;
 | 
			
		||||
@@ -81,8 +79,8 @@ struct DumpVisitor {
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  void printStr(const char *S) { fprintf(stderr, "%s", S); }
 | 
			
		||||
  void print(StringView SV) {
 | 
			
		||||
    fprintf(stderr, "\"%.*s\"", (int)SV.size(), SV.begin());
 | 
			
		||||
  void print(std::string_view SV) {
 | 
			
		||||
    fprintf(stderr, "\"%.*s\"", (int)SV.size(), SV.data());
 | 
			
		||||
  }
 | 
			
		||||
  void print(const Node *N) {
 | 
			
		||||
    if (N)
 | 
			
		||||
@@ -90,14 +88,6 @@ struct DumpVisitor {
 | 
			
		||||
    else
 | 
			
		||||
      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) {
 | 
			
		||||
    ++Depth;
 | 
			
		||||
    printStr("{");
 | 
			
		||||
@@ -116,13 +106,11 @@ struct DumpVisitor {
 | 
			
		||||
  // Overload used when T is exactly 'bool', not merely convertible to 'bool'.
 | 
			
		||||
  void print(bool B) { printStr(B ? "true" : "false"); }
 | 
			
		||||
 | 
			
		||||
  template <class T>
 | 
			
		||||
  typename std::enable_if<std::is_unsigned<T>::value>::type print(T N) {
 | 
			
		||||
  template <class T> std::enable_if_t<std::is_unsigned<T>::value> print(T N) {
 | 
			
		||||
    fprintf(stderr, "%llu", (unsigned long long)N);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  template <class T>
 | 
			
		||||
  typename std::enable_if<std::is_signed<T>::value>::type print(T N) {
 | 
			
		||||
  template <class T> std::enable_if_t<std::is_signed<T>::value> print(T N) {
 | 
			
		||||
    fprintf(stderr, "%lld", (long long)N);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
@@ -185,6 +173,50 @@ struct DumpVisitor {
 | 
			
		||||
      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() {
 | 
			
		||||
    printStr("\n");
 | 
			
		||||
@@ -334,36 +366,21 @@ public:
 | 
			
		||||
 | 
			
		||||
using Demangler = itanium_demangle::ManglingParser<DefaultAllocator>;
 | 
			
		||||
 | 
			
		||||
char *llvm::itaniumDemangle(const char *MangledName, char *Buf,
 | 
			
		||||
                            size_t *N, int *Status) {
 | 
			
		||||
  if (MangledName == nullptr || (Buf != nullptr && N == nullptr)) {
 | 
			
		||||
    if (Status)
 | 
			
		||||
      *Status = demangle_invalid_args;
 | 
			
		||||
char *llvm::itaniumDemangle(std::string_view MangledName) {
 | 
			
		||||
  if (MangledName.empty())
 | 
			
		||||
    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();
 | 
			
		||||
  if (!AST)
 | 
			
		||||
    return nullptr;
 | 
			
		||||
 | 
			
		||||
  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());
 | 
			
		||||
    AST->print(S);
 | 
			
		||||
    S += '\0';
 | 
			
		||||
    if (N != nullptr)
 | 
			
		||||
      *N = S.getCurrentPosition();
 | 
			
		||||
    Buf = S.getBuffer();
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  if (Status)
 | 
			
		||||
    *Status = InternalStatus;
 | 
			
		||||
  return InternalStatus == demangle_success ? Buf : nullptr;
 | 
			
		||||
  OutputBuffer OB;
 | 
			
		||||
  assert(Parser.ForwardTemplateRefs.empty());
 | 
			
		||||
  AST->print(OB);
 | 
			
		||||
  OB += '\0';
 | 
			
		||||
  return OB.getBuffer();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ItaniumPartialDemangler::ItaniumPartialDemangler()
 | 
			
		||||
@@ -396,14 +413,12 @@ bool ItaniumPartialDemangler::partialDemangle(const char *MangledName) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static char *printNode(const Node *RootNode, char *Buf, size_t *N) {
 | 
			
		||||
  OutputStream S;
 | 
			
		||||
  if (!initializeOutputStream(Buf, N, S, 128))
 | 
			
		||||
    return nullptr;
 | 
			
		||||
  RootNode->print(S);
 | 
			
		||||
  S += '\0';
 | 
			
		||||
  OutputBuffer OB(Buf, N);
 | 
			
		||||
  RootNode->print(OB);
 | 
			
		||||
  OB += '\0';
 | 
			
		||||
  if (N != nullptr)
 | 
			
		||||
    *N = S.getCurrentPosition();
 | 
			
		||||
  return S.getBuffer();
 | 
			
		||||
    *N = OB.getCurrentPosition();
 | 
			
		||||
  return OB.getBuffer();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
char *ItaniumPartialDemangler::getFunctionBaseName(char *Buf, size_t *N) const {
 | 
			
		||||
@@ -417,8 +432,8 @@ char *ItaniumPartialDemangler::getFunctionBaseName(char *Buf, size_t *N) const {
 | 
			
		||||
    case Node::KAbiTagAttr:
 | 
			
		||||
      Name = static_cast<const AbiTagAttr *>(Name)->Base;
 | 
			
		||||
      continue;
 | 
			
		||||
    case Node::KStdQualifiedName:
 | 
			
		||||
      Name = static_cast<const StdQualifiedName *>(Name)->Child;
 | 
			
		||||
    case Node::KModuleEntity:
 | 
			
		||||
      Name = static_cast<const ModuleEntity *>(Name)->Name;
 | 
			
		||||
      continue;
 | 
			
		||||
    case Node::KNestedName:
 | 
			
		||||
      Name = static_cast<const NestedName *>(Name)->Name;
 | 
			
		||||
@@ -441,9 +456,7 @@ char *ItaniumPartialDemangler::getFunctionDeclContextName(char *Buf,
 | 
			
		||||
    return nullptr;
 | 
			
		||||
  const Node *Name = static_cast<const FunctionEncoding *>(RootNode)->getName();
 | 
			
		||||
 | 
			
		||||
  OutputStream S;
 | 
			
		||||
  if (!initializeOutputStream(Buf, N, S, 128))
 | 
			
		||||
    return nullptr;
 | 
			
		||||
  OutputBuffer OB(Buf, N);
 | 
			
		||||
 | 
			
		||||
 KeepGoingLocalFunction:
 | 
			
		||||
  while (true) {
 | 
			
		||||
@@ -458,27 +471,27 @@ char *ItaniumPartialDemangler::getFunctionDeclContextName(char *Buf,
 | 
			
		||||
    break;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  if (Name->getKind() == Node::KModuleEntity)
 | 
			
		||||
    Name = static_cast<const ModuleEntity *>(Name)->Name;
 | 
			
		||||
 | 
			
		||||
  switch (Name->getKind()) {
 | 
			
		||||
  case Node::KStdQualifiedName:
 | 
			
		||||
    S += "std";
 | 
			
		||||
    break;
 | 
			
		||||
  case Node::KNestedName:
 | 
			
		||||
    static_cast<const NestedName *>(Name)->Qual->print(S);
 | 
			
		||||
    static_cast<const NestedName *>(Name)->Qual->print(OB);
 | 
			
		||||
    break;
 | 
			
		||||
  case Node::KLocalName: {
 | 
			
		||||
    auto *LN = static_cast<const LocalName *>(Name);
 | 
			
		||||
    LN->Encoding->print(S);
 | 
			
		||||
    S += "::";
 | 
			
		||||
    LN->Encoding->print(OB);
 | 
			
		||||
    OB += "::";
 | 
			
		||||
    Name = LN->Entity;
 | 
			
		||||
    goto KeepGoingLocalFunction;
 | 
			
		||||
  }
 | 
			
		||||
  default:
 | 
			
		||||
    break;
 | 
			
		||||
  }
 | 
			
		||||
  S += '\0';
 | 
			
		||||
  OB += '\0';
 | 
			
		||||
  if (N != nullptr)
 | 
			
		||||
    *N = S.getCurrentPosition();
 | 
			
		||||
  return S.getBuffer();
 | 
			
		||||
    *N = OB.getCurrentPosition();
 | 
			
		||||
  return OB.getBuffer();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
char *ItaniumPartialDemangler::getFunctionName(char *Buf, size_t *N) const {
 | 
			
		||||
@@ -494,17 +507,15 @@ char *ItaniumPartialDemangler::getFunctionParameters(char *Buf,
 | 
			
		||||
    return nullptr;
 | 
			
		||||
  NodeArray Params = static_cast<FunctionEncoding *>(RootNode)->getParams();
 | 
			
		||||
 | 
			
		||||
  OutputStream S;
 | 
			
		||||
  if (!initializeOutputStream(Buf, N, S, 128))
 | 
			
		||||
    return nullptr;
 | 
			
		||||
  OutputBuffer OB(Buf, N);
 | 
			
		||||
 | 
			
		||||
  S += '(';
 | 
			
		||||
  Params.printWithComma(S);
 | 
			
		||||
  S += ')';
 | 
			
		||||
  S += '\0';
 | 
			
		||||
  OB += '(';
 | 
			
		||||
  Params.printWithComma(OB);
 | 
			
		||||
  OB += ')';
 | 
			
		||||
  OB += '\0';
 | 
			
		||||
  if (N != nullptr)
 | 
			
		||||
    *N = S.getCurrentPosition();
 | 
			
		||||
  return S.getBuffer();
 | 
			
		||||
    *N = OB.getCurrentPosition();
 | 
			
		||||
  return OB.getBuffer();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
char *ItaniumPartialDemangler::getFunctionReturnType(
 | 
			
		||||
@@ -512,18 +523,16 @@ char *ItaniumPartialDemangler::getFunctionReturnType(
 | 
			
		||||
  if (!isFunction())
 | 
			
		||||
    return nullptr;
 | 
			
		||||
 | 
			
		||||
  OutputStream S;
 | 
			
		||||
  if (!initializeOutputStream(Buf, N, S, 128))
 | 
			
		||||
    return nullptr;
 | 
			
		||||
  OutputBuffer OB(Buf, N);
 | 
			
		||||
 | 
			
		||||
  if (const Node *Ret =
 | 
			
		||||
          static_cast<const FunctionEncoding *>(RootNode)->getReturnType())
 | 
			
		||||
    Ret->print(S);
 | 
			
		||||
    Ret->print(OB);
 | 
			
		||||
 | 
			
		||||
  S += '\0';
 | 
			
		||||
  OB += '\0';
 | 
			
		||||
  if (N != nullptr)
 | 
			
		||||
    *N = S.getCurrentPosition();
 | 
			
		||||
  return S.getBuffer();
 | 
			
		||||
    *N = OB.getCurrentPosition();
 | 
			
		||||
  return OB.getBuffer();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
char *ItaniumPartialDemangler::finishDemangle(char *Buf, size_t *N) const {
 | 
			
		||||
@@ -563,8 +572,8 @@ bool ItaniumPartialDemangler::isCtorOrDtor() const {
 | 
			
		||||
    case Node::KNestedName:
 | 
			
		||||
      N = static_cast<const NestedName *>(N)->Name;
 | 
			
		||||
      break;
 | 
			
		||||
    case Node::KStdQualifiedName:
 | 
			
		||||
      N = static_cast<const StdQualifiedName *>(N)->Child;
 | 
			
		||||
    case Node::KModuleEntity:
 | 
			
		||||
      N = static_cast<const ModuleEntity *>(N)->Name;
 | 
			
		||||
      break;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										37
									
								
								externals/demangle/llvm/Demangle/Demangle.h
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										37
									
								
								externals/demangle/llvm/Demangle/Demangle.h
									
									
									
									
										vendored
									
									
								
							@@ -12,6 +12,7 @@
 | 
			
		||||
 | 
			
		||||
#include <cstddef>
 | 
			
		||||
#include <string>
 | 
			
		||||
#include <string_view>
 | 
			
		||||
 | 
			
		||||
namespace llvm {
 | 
			
		||||
/// This is a llvm local version of __cxa_demangle. Other than the name and
 | 
			
		||||
@@ -29,9 +30,10 @@ enum : int {
 | 
			
		||||
  demangle_success = 0,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
char *itaniumDemangle(const char *mangled_name, char *buf, size_t *n,
 | 
			
		||||
                      int *status);
 | 
			
		||||
 | 
			
		||||
/// Returns a non-NULL pointer to a NUL-terminated C style string
 | 
			
		||||
/// that should be explicitly freed, if successful. Otherwise, may return
 | 
			
		||||
/// nullptr if mangled_name is not a valid mangling or is nullptr.
 | 
			
		||||
char *itaniumDemangle(std::string_view mangled_name);
 | 
			
		||||
 | 
			
		||||
enum MSDemangleFlags {
 | 
			
		||||
  MSDF_None = 0,
 | 
			
		||||
@@ -40,10 +42,34 @@ enum MSDemangleFlags {
 | 
			
		||||
  MSDF_NoCallingConvention = 1 << 2,
 | 
			
		||||
  MSDF_NoReturnType = 1 << 3,
 | 
			
		||||
  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);
 | 
			
		||||
 | 
			
		||||
// 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
 | 
			
		||||
/// (typically an intermediate stage in itaniumDemangle) and querying certain
 | 
			
		||||
/// properties or partially printing the demangled name.
 | 
			
		||||
@@ -59,7 +85,7 @@ struct ItaniumPartialDemangler {
 | 
			
		||||
  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.
 | 
			
		||||
  /// second and third parameters to __cxa_demangle.
 | 
			
		||||
  char *finishDemangle(char *Buf, size_t *N) const;
 | 
			
		||||
 | 
			
		||||
  /// Get the base name of a function. This doesn't include trailing template
 | 
			
		||||
@@ -95,6 +121,7 @@ struct ItaniumPartialDemangler {
 | 
			
		||||
  bool isSpecialName() const;
 | 
			
		||||
 | 
			
		||||
  ~ItaniumPartialDemangler();
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
  void *RootNode;
 | 
			
		||||
  void *Context;
 | 
			
		||||
 
 | 
			
		||||
@@ -13,8 +13,8 @@
 | 
			
		||||
//
 | 
			
		||||
//===----------------------------------------------------------------------===//
 | 
			
		||||
 | 
			
		||||
#ifndef LLVM_DEMANGLE_COMPILER_H
 | 
			
		||||
#define LLVM_DEMANGLE_COMPILER_H
 | 
			
		||||
#ifndef LLVM_DEMANGLE_DEMANGLECONFIG_H
 | 
			
		||||
#define LLVM_DEMANGLE_DEMANGLECONFIG_H
 | 
			
		||||
 | 
			
		||||
#ifndef __has_feature
 | 
			
		||||
#define __has_feature(x) 0
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										3910
									
								
								externals/demangle/llvm/Demangle/ItaniumDemangle.h
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										3910
									
								
								externals/demangle/llvm/Demangle/ItaniumDemangle.h
									
									
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										96
									
								
								externals/demangle/llvm/Demangle/ItaniumNodes.def
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										96
									
								
								externals/demangle/llvm/Demangle/ItaniumNodes.def
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,96 @@
 | 
			
		||||
//===--- 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 -------------------------------------------*- C++ -*-===//
 | 
			
		||||
//
 | 
			
		||||
//===--- StringView.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
 | 
			
		||||
@@ -8,6 +8,9 @@
 | 
			
		||||
//===----------------------------------------------------------------------===//
 | 
			
		||||
//
 | 
			
		||||
// 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.
 | 
			
		||||
//
 | 
			
		||||
//===----------------------------------------------------------------------===//
 | 
			
		||||
 | 
			
		||||
@@ -15,7 +18,6 @@
 | 
			
		||||
#define DEMANGLE_STRINGVIEW_H
 | 
			
		||||
 | 
			
		||||
#include "DemangleConfig.h"
 | 
			
		||||
#include <algorithm>
 | 
			
		||||
#include <cassert>
 | 
			
		||||
#include <cstring>
 | 
			
		||||
 | 
			
		||||
@@ -37,29 +39,23 @@ public:
 | 
			
		||||
  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);
 | 
			
		||||
  StringView substr(size_t Pos, size_t Len = npos) const {
 | 
			
		||||
    assert(Pos <= size());
 | 
			
		||||
    if (Len > size() - Pos)
 | 
			
		||||
      Len = size() - Pos;
 | 
			
		||||
    return StringView(begin() + Pos, Len);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  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()) {
 | 
			
		||||
    if (From < size()) {
 | 
			
		||||
      // Just forward to memchr, which is faster than a hand-rolled loop.
 | 
			
		||||
      if (const void *P = ::memchr(First + FindBegin, C, size() - FindBegin))
 | 
			
		||||
      if (const void *P = ::memchr(First + From, C, size() - From))
 | 
			
		||||
        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();
 | 
			
		||||
@@ -106,7 +102,7 @@ public:
 | 
			
		||||
  bool startsWith(StringView Str) const {
 | 
			
		||||
    if (Str.size() > size())
 | 
			
		||||
      return false;
 | 
			
		||||
    return std::equal(Str.begin(), Str.end(), begin());
 | 
			
		||||
    return std::strncmp(Str.begin(), begin(), Str.size()) == 0;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  const char &operator[](size_t Idx) const { return *(begin() + Idx); }
 | 
			
		||||
@@ -119,7 +115,7 @@ public:
 | 
			
		||||
 | 
			
		||||
inline bool operator==(const StringView &LHS, const StringView &RHS) {
 | 
			
		||||
  return LHS.size() == RHS.size() &&
 | 
			
		||||
         std::equal(LHS.begin(), LHS.end(), RHS.begin());
 | 
			
		||||
         std::strncmp(LHS.begin(), RHS.begin(), LHS.size()) == 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
DEMANGLE_NAMESPACE_END
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										39
									
								
								externals/demangle/llvm/Demangle/StringViewExtras.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										39
									
								
								externals/demangle/llvm/Demangle/StringViewExtras.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,39 @@
 | 
			
		||||
//===--- 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
 | 
			
		||||
							
								
								
									
										208
									
								
								externals/demangle/llvm/Demangle/Utility.h
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										208
									
								
								externals/demangle/llvm/Demangle/Utility.h
									
									
									
									
										vendored
									
									
								
							@@ -1,5 +1,5 @@
 | 
			
		||||
//===--- Utility.h ----------------------------------------------*- C++ -*-===//
 | 
			
		||||
//
 | 
			
		||||
//===--- Utility.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
 | 
			
		||||
@@ -7,70 +7,83 @@
 | 
			
		||||
//
 | 
			
		||||
//===----------------------------------------------------------------------===//
 | 
			
		||||
//
 | 
			
		||||
// Provide some utility classes for use in the demangler(s).
 | 
			
		||||
// Provide some utility classes for use in the demangler.
 | 
			
		||||
// 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
 | 
			
		||||
#define DEMANGLE_UTILITY_H
 | 
			
		||||
 | 
			
		||||
#include "StringView.h"
 | 
			
		||||
#include "DemangleConfig.h"
 | 
			
		||||
 | 
			
		||||
#include <array>
 | 
			
		||||
#include <cassert>
 | 
			
		||||
#include <cstdint>
 | 
			
		||||
#include <cstdlib>
 | 
			
		||||
#include <cstring>
 | 
			
		||||
#include <iterator>
 | 
			
		||||
#include <exception>
 | 
			
		||||
#include <limits>
 | 
			
		||||
#include <string_view>
 | 
			
		||||
 | 
			
		||||
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;
 | 
			
		||||
class OutputBuffer {
 | 
			
		||||
  char *Buffer = nullptr;
 | 
			
		||||
  size_t CurrentPosition = 0;
 | 
			
		||||
  size_t BufferCapacity = 0;
 | 
			
		||||
 | 
			
		||||
  // Ensure there is at least n more positions in buffer.
 | 
			
		||||
  // Ensure there are at least N more positions in the buffer.
 | 
			
		||||
  void grow(size_t N) {
 | 
			
		||||
    if (N + CurrentPosition >= BufferCapacity) {
 | 
			
		||||
    size_t Need = N + CurrentPosition;
 | 
			
		||||
    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;
 | 
			
		||||
      if (BufferCapacity < N + CurrentPosition)
 | 
			
		||||
        BufferCapacity = N + CurrentPosition;
 | 
			
		||||
      if (BufferCapacity < Need)
 | 
			
		||||
        BufferCapacity = Need;
 | 
			
		||||
      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;
 | 
			
		||||
    }
 | 
			
		||||
  OutputBuffer &writeUnsigned(uint64_t N, bool isNeg = false) {
 | 
			
		||||
    std::array<char, 21> Temp;
 | 
			
		||||
    char *TempPtr = Temp.data() + Temp.size();
 | 
			
		||||
 | 
			
		||||
    char Temp[21];
 | 
			
		||||
    char *TempPtr = std::end(Temp);
 | 
			
		||||
 | 
			
		||||
    while (N) {
 | 
			
		||||
      *--TempPtr = '0' + char(N % 10);
 | 
			
		||||
    // Output at least one character.
 | 
			
		||||
    do {
 | 
			
		||||
      *--TempPtr = char('0' + N % 10);
 | 
			
		||||
      N /= 10;
 | 
			
		||||
    }
 | 
			
		||||
    } while (N);
 | 
			
		||||
 | 
			
		||||
    // Add negative sign...
 | 
			
		||||
    // Add negative sign.
 | 
			
		||||
    if (isNeg)
 | 
			
		||||
      *--TempPtr = '-';
 | 
			
		||||
    this->operator<<(StringView(TempPtr, std::end(Temp)));
 | 
			
		||||
 | 
			
		||||
    return operator+=(
 | 
			
		||||
        std::string_view(TempPtr, Temp.data() + Temp.size() - TempPtr));
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
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_;
 | 
			
		||||
  OutputBuffer(char *StartBuf, size_t Size)
 | 
			
		||||
      : Buffer(StartBuf), BufferCapacity(Size) {}
 | 
			
		||||
  OutputBuffer(char *StartBuf, size_t *SizePtr)
 | 
			
		||||
      : OutputBuffer(StartBuf, StartBuf ? *SizePtr : 0) {}
 | 
			
		||||
  OutputBuffer() = default;
 | 
			
		||||
  // Non-copyable
 | 
			
		||||
  OutputBuffer(const OutputBuffer &) = delete;
 | 
			
		||||
  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
 | 
			
		||||
@@ -78,115 +91,116 @@ public:
 | 
			
		||||
  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;
 | 
			
		||||
  /// When zero, we're printing template args and '>' needs to be parenthesized.
 | 
			
		||||
  /// Use a counter so we can simply increment inside parentheses.
 | 
			
		||||
  unsigned GtIsGt = 1;
 | 
			
		||||
 | 
			
		||||
  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);
 | 
			
		||||
      std::memcpy(Buffer + CurrentPosition, &*R.begin(), Size);
 | 
			
		||||
      CurrentPosition += Size;
 | 
			
		||||
    }
 | 
			
		||||
    return *this;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  OutputStream &operator+=(char C) {
 | 
			
		||||
  OutputBuffer &operator+=(char C) {
 | 
			
		||||
    grow(1);
 | 
			
		||||
    Buffer[CurrentPosition++] = C;
 | 
			
		||||
    return *this;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  OutputStream &operator<<(StringView R) { return (*this += R); }
 | 
			
		||||
  OutputBuffer &prepend(std::string_view R) {
 | 
			
		||||
    size_t Size = R.size();
 | 
			
		||||
 | 
			
		||||
  OutputStream &operator<<(char C) { return (*this += C); }
 | 
			
		||||
    grow(Size);
 | 
			
		||||
    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;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  OutputStream &operator<<(unsigned long long N) {
 | 
			
		||||
    writeUnsigned(N, false);
 | 
			
		||||
    return *this;
 | 
			
		||||
  OutputBuffer &operator<<(std::string_view R) { return (*this += R); }
 | 
			
		||||
 | 
			
		||||
  OutputBuffer &operator<<(char C) { return (*this += C); }
 | 
			
		||||
 | 
			
		||||
  OutputBuffer &operator<<(long long N) {
 | 
			
		||||
    return writeUnsigned(static_cast<unsigned long long>(std::abs(N)), N < 0);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  OutputStream &operator<<(long N) {
 | 
			
		||||
  OutputBuffer &operator<<(unsigned long long N) {
 | 
			
		||||
    return writeUnsigned(N, false);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  OutputBuffer &operator<<(long N) {
 | 
			
		||||
    return this->operator<<(static_cast<long long>(N));
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  OutputStream &operator<<(unsigned long N) {
 | 
			
		||||
  OutputBuffer &operator<<(unsigned long N) {
 | 
			
		||||
    return this->operator<<(static_cast<unsigned long long>(N));
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  OutputStream &operator<<(int N) {
 | 
			
		||||
  OutputBuffer &operator<<(int N) {
 | 
			
		||||
    return this->operator<<(static_cast<long long>(N));
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  OutputStream &operator<<(unsigned int N) {
 | 
			
		||||
  OutputBuffer &operator<<(unsigned int 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; }
 | 
			
		||||
  void setCurrentPosition(size_t NewPos) { CurrentPosition = NewPos; }
 | 
			
		||||
 | 
			
		||||
  char back() const {
 | 
			
		||||
    return CurrentPosition ? Buffer[CurrentPosition - 1] : '\0';
 | 
			
		||||
    assert(CurrentPosition);
 | 
			
		||||
    return Buffer[CurrentPosition - 1];
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  bool empty() const { return CurrentPosition == 0; }
 | 
			
		||||
 | 
			
		||||
  char *getBuffer() { return Buffer; }
 | 
			
		||||
  char *getBufferEnd() { return Buffer + CurrentPosition - 1; }
 | 
			
		||||
  size_t getBufferCapacity() { return BufferCapacity; }
 | 
			
		||||
  size_t getBufferCapacity() const { return BufferCapacity; }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template <class T> class SwapAndRestore {
 | 
			
		||||
  T &Restore;
 | 
			
		||||
  T OriginalValue;
 | 
			
		||||
  bool ShouldRestore = true;
 | 
			
		||||
template <class T> class ScopedOverride {
 | 
			
		||||
  T &Loc;
 | 
			
		||||
  T Original;
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
  SwapAndRestore(T &Restore_) : SwapAndRestore(Restore_, Restore_) {}
 | 
			
		||||
  ScopedOverride(T &Loc_) : ScopedOverride(Loc_, Loc_) {}
 | 
			
		||||
 | 
			
		||||
  SwapAndRestore(T &Restore_, T NewVal)
 | 
			
		||||
      : Restore(Restore_), OriginalValue(Restore) {
 | 
			
		||||
    Restore = std::move(NewVal);
 | 
			
		||||
  }
 | 
			
		||||
  ~SwapAndRestore() {
 | 
			
		||||
    if (ShouldRestore)
 | 
			
		||||
      Restore = std::move(OriginalValue);
 | 
			
		||||
  ScopedOverride(T &Loc_, T NewVal) : Loc(Loc_), Original(Loc_) {
 | 
			
		||||
    Loc_ = std::move(NewVal);
 | 
			
		||||
  }
 | 
			
		||||
  ~ScopedOverride() { Loc = std::move(Original); }
 | 
			
		||||
 | 
			
		||||
  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;
 | 
			
		||||
  ScopedOverride(const ScopedOverride &) = delete;
 | 
			
		||||
  ScopedOverride &operator=(const ScopedOverride &) = 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
 | 
			
		||||
 
 | 
			
		||||
@@ -23,7 +23,7 @@ std::string DemangleSymbol(const std::string& mangled) {
 | 
			
		||||
    SCOPE_EXIT({ std::free(demangled); });
 | 
			
		||||
 | 
			
		||||
    if (is_itanium(mangled)) {
 | 
			
		||||
        demangled = llvm::itaniumDemangle(mangled.c_str(), nullptr, nullptr, nullptr);
 | 
			
		||||
        demangled = llvm::itaniumDemangle(mangled.c_str());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (!demangled) {
 | 
			
		||||
 
 | 
			
		||||
@@ -30,8 +30,8 @@ DetachedTasks::~DetachedTasks() {
 | 
			
		||||
void DetachedTasks::AddTask(std::function<void()> task) {
 | 
			
		||||
    std::unique_lock lock{instance->mutex};
 | 
			
		||||
    ++instance->count;
 | 
			
		||||
    std::thread([task{std::move(task)}]() {
 | 
			
		||||
        task();
 | 
			
		||||
    std::thread([task_{std::move(task)}]() {
 | 
			
		||||
        task_();
 | 
			
		||||
        std::unique_lock thread_lock{instance->mutex};
 | 
			
		||||
        --instance->count;
 | 
			
		||||
        std::notify_all_at_thread_exit(instance->cv, std::move(thread_lock));
 | 
			
		||||
 
 | 
			
		||||
@@ -302,12 +302,12 @@ Result KThread::InitializeServiceThread(Core::System& system, KThread* thread,
 | 
			
		||||
                                        std::function<void()>&& func, s32 prio, s32 virt_core,
 | 
			
		||||
                                        KProcess* owner) {
 | 
			
		||||
    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.
 | 
			
		||||
        system.Kernel().CurrentScheduler()->OnThreadStart();
 | 
			
		||||
 | 
			
		||||
        // Run the guest function.
 | 
			
		||||
        func();
 | 
			
		||||
        func_();
 | 
			
		||||
 | 
			
		||||
        // Exit.
 | 
			
		||||
        Svc::ExitThread(system);
 | 
			
		||||
 
 | 
			
		||||
@@ -1089,15 +1089,15 @@ static std::jthread RunHostThreadFunc(KernelCore& kernel, KProcess* process,
 | 
			
		||||
    KThread::Register(kernel, thread);
 | 
			
		||||
 | 
			
		||||
    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.
 | 
			
		||||
            Common::SetCurrentThreadName(thread_name.c_str());
 | 
			
		||||
            Common::SetCurrentThreadName(thread_name_.c_str());
 | 
			
		||||
 | 
			
		||||
            // Set the thread as current.
 | 
			
		||||
            kernel.RegisterHostThread(thread);
 | 
			
		||||
 | 
			
		||||
            // Run the callback.
 | 
			
		||||
            func();
 | 
			
		||||
            func_();
 | 
			
		||||
 | 
			
		||||
            // Close the thread.
 | 
			
		||||
            // This will free the process if it is the last reference.
 | 
			
		||||
 
 | 
			
		||||
@@ -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");
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
    auto async_callback{[callback = std::move(callback)](bool invert_y) {
 | 
			
		||||
        std::thread t{callback, invert_y};
 | 
			
		||||
    auto async_callback{[callback_ = std::move(callback)](bool invert_y) {
 | 
			
		||||
        std::thread t{callback_, invert_y};
 | 
			
		||||
        t.detach();
 | 
			
		||||
    }};
 | 
			
		||||
    renderer_settings.screenshot_bits = data;
 | 
			
		||||
 
 | 
			
		||||
@@ -231,24 +231,25 @@ GraphicsPipeline::GraphicsPipeline(const Device& device, TextureCache& texture_c
 | 
			
		||||
    }
 | 
			
		||||
    const bool in_parallel = thread_worker != nullptr;
 | 
			
		||||
    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,
 | 
			
		||||
               force_context_flush](ShaderContext::Context*) mutable {
 | 
			
		||||
        for (size_t stage = 0; stage < 5; ++stage) {
 | 
			
		||||
            switch (backend) {
 | 
			
		||||
            case Settings::ShaderBackend::GLSL:
 | 
			
		||||
                if (!sources[stage].empty()) {
 | 
			
		||||
                    source_programs[stage] = CreateProgram(sources[stage], Stage(stage));
 | 
			
		||||
                if (!sources_[stage].empty()) {
 | 
			
		||||
                    source_programs[stage] = CreateProgram(sources_[stage], Stage(stage));
 | 
			
		||||
                }
 | 
			
		||||
                break;
 | 
			
		||||
            case Settings::ShaderBackend::GLASM:
 | 
			
		||||
                if (!sources[stage].empty()) {
 | 
			
		||||
                    assembly_programs[stage] = CompileProgram(sources[stage], AssemblyStage(stage));
 | 
			
		||||
                if (!sources_[stage].empty()) {
 | 
			
		||||
                    assembly_programs[stage] =
 | 
			
		||||
                        CompileProgram(sources_[stage], AssemblyStage(stage));
 | 
			
		||||
                }
 | 
			
		||||
                break;
 | 
			
		||||
            case Settings::ShaderBackend::SPIRV:
 | 
			
		||||
                if (!sources_spirv[stage].empty()) {
 | 
			
		||||
                    source_programs[stage] = CreateProgram(sources_spirv[stage], Stage(stage));
 | 
			
		||||
                if (!sources_spirv_[stage].empty()) {
 | 
			
		||||
                    source_programs[stage] = CreateProgram(sources_spirv_[stage], Stage(stage));
 | 
			
		||||
                }
 | 
			
		||||
                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) {
 | 
			
		||||
        ComputePipelineKey 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();
 | 
			
		||||
            auto pipeline{CreateComputePipeline(ctx->pools, key, env, true)};
 | 
			
		||||
            auto pipeline{CreateComputePipeline(ctx->pools, key, env_, true)};
 | 
			
		||||
            std::scoped_lock lock{state.mutex};
 | 
			
		||||
            if (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) {
 | 
			
		||||
        GraphicsPipelineKey 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;
 | 
			
		||||
            for (auto& env : envs) {
 | 
			
		||||
            for (auto& env : envs_) {
 | 
			
		||||
                env_ptrs.push_back(&env);
 | 
			
		||||
            }
 | 
			
		||||
            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 offset =
 | 
			
		||||
            (sub_first_offset + GetQuadsNum(first)) * 6ULL * BytesPerIndex(index_type);
 | 
			
		||||
        scheduler.Record([buffer = *buffer, index_type_, offset](vk::CommandBuffer cmdbuf) {
 | 
			
		||||
            cmdbuf.BindIndexBuffer(buffer, offset, index_type_);
 | 
			
		||||
        scheduler.Record([buffer_ = *buffer, index_type_, offset](vk::CommandBuffer cmdbuf) {
 | 
			
		||||
            cmdbuf.BindIndexBuffer(buffer_, offset, index_type_);
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -528,17 +528,18 @@ void BufferCacheRuntime::BindVertexBuffers(VideoCommon::HostBindings<Buffer>& bi
 | 
			
		||||
        buffer_handles.push_back(handle);
 | 
			
		||||
    }
 | 
			
		||||
    if (device.IsExtExtendedDynamicStateSupported()) {
 | 
			
		||||
        scheduler.Record([bindings = std::move(bindings),
 | 
			
		||||
                          buffer_handles = std::move(buffer_handles)](vk::CommandBuffer cmdbuf) {
 | 
			
		||||
            cmdbuf.BindVertexBuffers2EXT(
 | 
			
		||||
                bindings.min_index, bindings.max_index - bindings.min_index, buffer_handles.data(),
 | 
			
		||||
                bindings.offsets.data(), bindings.sizes.data(), bindings.strides.data());
 | 
			
		||||
        scheduler.Record([bindings_ = std::move(bindings),
 | 
			
		||||
                          buffer_handles_ = std::move(buffer_handles)](vk::CommandBuffer cmdbuf) {
 | 
			
		||||
            cmdbuf.BindVertexBuffers2EXT(bindings_.min_index,
 | 
			
		||||
                                         bindings_.max_index - bindings_.min_index,
 | 
			
		||||
                                         buffer_handles_.data(), bindings_.offsets.data(),
 | 
			
		||||
                                         bindings_.sizes.data(), bindings_.strides.data());
 | 
			
		||||
        });
 | 
			
		||||
    } else {
 | 
			
		||||
        scheduler.Record([bindings = std::move(bindings),
 | 
			
		||||
                          buffer_handles = std::move(buffer_handles)](vk::CommandBuffer cmdbuf) {
 | 
			
		||||
            cmdbuf.BindVertexBuffers(bindings.min_index, bindings.max_index - bindings.min_index,
 | 
			
		||||
                                     buffer_handles.data(), bindings.offsets.data());
 | 
			
		||||
        scheduler.Record([bindings_ = std::move(bindings),
 | 
			
		||||
                          buffer_handles_ = std::move(buffer_handles)](vk::CommandBuffer cmdbuf) {
 | 
			
		||||
            cmdbuf.BindVertexBuffers(bindings_.min_index, bindings_.max_index - bindings_.min_index,
 | 
			
		||||
                                     buffer_handles_.data(), bindings_.offsets.data());
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -573,11 +574,11 @@ void BufferCacheRuntime::BindTransformFeedbackBuffers(VideoCommon::HostBindings<
 | 
			
		||||
    for (u32 index = 0; index < bindings.buffers.size(); ++index) {
 | 
			
		||||
        buffer_handles.push_back(bindings.buffers[index]->Handle());
 | 
			
		||||
    }
 | 
			
		||||
    scheduler.Record([bindings = std::move(bindings),
 | 
			
		||||
                      buffer_handles = std::move(buffer_handles)](vk::CommandBuffer cmdbuf) {
 | 
			
		||||
        cmdbuf.BindTransformFeedbackBuffersEXT(0, static_cast<u32>(buffer_handles.size()),
 | 
			
		||||
                                               buffer_handles.data(), bindings.offsets.data(),
 | 
			
		||||
                                               bindings.sizes.data());
 | 
			
		||||
    scheduler.Record([bindings_ = std::move(bindings),
 | 
			
		||||
                      buffer_handles_ = std::move(buffer_handles)](vk::CommandBuffer cmdbuf) {
 | 
			
		||||
        cmdbuf.BindTransformFeedbackBuffersEXT(0, static_cast<u32>(buffer_handles_.size()),
 | 
			
		||||
                                               buffer_handles_.data(), bindings_.offsets.data(),
 | 
			
		||||
                                               bindings_.sizes.data());
 | 
			
		||||
    });
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -469,9 +469,9 @@ void PipelineCache::LoadDiskResources(u64 title_id, std::stop_token stop_loading
 | 
			
		||||
        ComputePipelineCacheKey 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;
 | 
			
		||||
            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};
 | 
			
		||||
            if (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) {
 | 
			
		||||
            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;
 | 
			
		||||
            boost::container::static_vector<Shader::Environment*, 5> env_ptrs;
 | 
			
		||||
            for (auto& env : envs) {
 | 
			
		||||
            for (auto& env : envs_) {
 | 
			
		||||
                env_ptrs.push_back(&env);
 | 
			
		||||
            }
 | 
			
		||||
            auto pipeline{CreateGraphicsPipeline(pools, key, MakeSpan(env_ptrs),
 | 
			
		||||
@@ -702,8 +702,8 @@ std::unique_ptr<ComputePipeline> PipelineCache::CreateComputePipeline(
 | 
			
		||||
    if (!pipeline || pipeline_cache_filename.empty()) {
 | 
			
		||||
        return pipeline;
 | 
			
		||||
    }
 | 
			
		||||
    serialization_thread.QueueWork([this, key, env = std::move(env)] {
 | 
			
		||||
        SerializePipeline(key, std::array<const GenericEnvironment*, 1>{&env},
 | 
			
		||||
    serialization_thread.QueueWork([this, key, env_ = std::move(env)] {
 | 
			
		||||
        SerializePipeline(key, std::array<const GenericEnvironment*, 1>{&env_},
 | 
			
		||||
                          pipeline_cache_filename, CACHE_VERSION);
 | 
			
		||||
    });
 | 
			
		||||
    return pipeline;
 | 
			
		||||
 
 | 
			
		||||
@@ -98,10 +98,10 @@ HostCounter::HostCounter(QueryCache& cache_, std::shared_ptr<HostCounter> depend
 | 
			
		||||
    : HostCounterBase{std::move(dependency_)}, cache{cache_}, type{type_},
 | 
			
		||||
      query{cache_.AllocateQuery(type_)}, tick{cache_.GetScheduler().CurrentTick()} {
 | 
			
		||||
    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();
 | 
			
		||||
        logical->ResetQueryPool(query.first, query.second, 1);
 | 
			
		||||
        cmdbuf.BeginQuery(query.first, query.second,
 | 
			
		||||
        logical->ResetQueryPool(query_.first, query_.second, 1);
 | 
			
		||||
        cmdbuf.BeginQuery(query_.first, query_.second,
 | 
			
		||||
                          use_precise ? VK_QUERY_CONTROL_PRECISE_BIT : 0);
 | 
			
		||||
    });
 | 
			
		||||
}
 | 
			
		||||
@@ -111,8 +111,9 @@ HostCounter::~HostCounter() {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void HostCounter::EndQuery() {
 | 
			
		||||
    cache.GetScheduler().Record(
 | 
			
		||||
        [query = query](vk::CommandBuffer cmdbuf) { cmdbuf.EndQuery(query.first, query.second); });
 | 
			
		||||
    cache.GetScheduler().Record([query_ = query](vk::CommandBuffer cmdbuf) {
 | 
			
		||||
        cmdbuf.EndQuery(query_.first, query_.second);
 | 
			
		||||
    });
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
u64 HostCounter::BlockingQuery(bool async) const {
 | 
			
		||||
 
 | 
			
		||||
@@ -1412,7 +1412,7 @@ void Image::DownloadMemory(std::span<VkBuffer> buffers_span, std::span<VkDeviceS
 | 
			
		||||
    }
 | 
			
		||||
    scheduler->RequestOutsideRenderPassOperationContext();
 | 
			
		||||
    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{
 | 
			
		||||
            .sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,
 | 
			
		||||
            .pNext = nullptr,
 | 
			
		||||
@@ -1424,7 +1424,7 @@ void Image::DownloadMemory(std::span<VkBuffer> buffers_span, std::span<VkDeviceS
 | 
			
		||||
            .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
 | 
			
		||||
            .image = image,
 | 
			
		||||
            .subresourceRange{
 | 
			
		||||
                .aspectMask = aspect_mask,
 | 
			
		||||
                .aspectMask = aspect_mask_,
 | 
			
		||||
                .baseMipLevel = 0,
 | 
			
		||||
                .levelCount = VK_REMAINING_MIP_LEVELS,
 | 
			
		||||
                .baseArrayLayer = 0,
 | 
			
		||||
@@ -1456,7 +1456,7 @@ void Image::DownloadMemory(std::span<VkBuffer> buffers_span, std::span<VkDeviceS
 | 
			
		||||
            .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
 | 
			
		||||
            .image = image,
 | 
			
		||||
            .subresourceRange{
 | 
			
		||||
                .aspectMask = aspect_mask,
 | 
			
		||||
                .aspectMask = aspect_mask_,
 | 
			
		||||
                .baseMipLevel = 0,
 | 
			
		||||
                .levelCount = VK_REMAINING_MIP_LEVELS,
 | 
			
		||||
                .baseArrayLayer = 0,
 | 
			
		||||
 
 | 
			
		||||
@@ -135,11 +135,11 @@ void RoomJson::Delete() {
 | 
			
		||||
        LOG_ERROR(WebService, "Room must be registered to be deleted");
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
    Common::DetachedTasks::AddTask(
 | 
			
		||||
        [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.
 | 
			
		||||
            Client{host, username, token}.DeleteJson(fmt::format("/lobby/{}", room_id), "", false);
 | 
			
		||||
        });
 | 
			
		||||
    Common::DetachedTasks::AddTask([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.
 | 
			
		||||
        Client{host_, username_, token_}.DeleteJson(fmt::format("/lobby/{}", room_id_), "", false);
 | 
			
		||||
    });
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} // namespace WebService
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user