mirror of
https://github.com/Atmosphere-NX/Atmosphere.git
synced 2025-01-18 09:14:49 +01:00
Minor header fixes to reduce parsing issues with Clang (#1700)
* Work around Clang's incomplete C++20 support for omitting typename * vapours: fix Clang error about missing return in constexpr function * stratosphere: fix call to non-constexpr strlen in constexpr function strlen being constexpr is a non-compliant GCC extension; Clang explicitly rejects it: https://reviews.llvm.org/D23692 * stratosphere: add a bunch of missing override specifiers * stratosphere: work around Clang consteval bug Minimal example: https://godbolt.org/z/MoM64v93M The issue seems to be that Clang does not consider f(x) to be a constant expression if x comes from a template argument that isn't a non-type auto template argument (???) We can work around this by relaxing GetMessageHeaderForCheck (by using constexpr instead of consteval). This produces no functional changes because the result of GetMessageHeaderForCheck() is assigned to a constexpr variable, so the result is guaranteed to be computed at compile-time. * stratosphere: fix missing require clauses in definitions GCC not requiring the require clauses to be repeated for member definitions is actually a compiler bug: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=96830 Clang rejects declarations with missing require clauses. * Fix ALWAYS_INLINE_LAMBDA and parameter list relative order While GCC doesn't seem to care about the position of the always_inline attribute relative to the parameter list, Clang is very picky and requires the attribute to appear after the parameter list (and before a trailing return type) * stratosphere: fix static constexpr member variable with incomplete type GCC accepts this for some reason (because of the lambda?) but Clang correctly rejects this.
This commit is contained in:
parent
09074798cd
commit
496adb0018
@ -548,11 +548,11 @@ namespace ams::kern::board::nintendo::nx {
|
|||||||
|
|
||||||
/* Print the interrupt. */
|
/* Print the interrupt. */
|
||||||
{
|
{
|
||||||
constexpr auto GetBits = [] ALWAYS_INLINE_LAMBDA (u32 value, size_t ofs, size_t count) {
|
constexpr auto GetBits = [](u32 value, size_t ofs, size_t count) ALWAYS_INLINE_LAMBDA {
|
||||||
return (value >> ofs) & ((1u << count) - 1);
|
return (value >> ofs) & ((1u << count) - 1);
|
||||||
};
|
};
|
||||||
|
|
||||||
constexpr auto GetBit = [GetBits] ALWAYS_INLINE_LAMBDA (u32 value, size_t ofs) {
|
constexpr auto GetBit = [GetBits](u32 value, size_t ofs) ALWAYS_INLINE_LAMBDA {
|
||||||
return (value >> ofs) & 1u;
|
return (value >> ofs) & 1u;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -312,7 +312,7 @@ namespace ams::kern::board::nintendo::nx {
|
|||||||
|
|
||||||
size_t KSystemControl::Init::GetApplicationPoolSize() {
|
size_t KSystemControl::Init::GetApplicationPoolSize() {
|
||||||
/* Get the base pool size. */
|
/* Get the base pool size. */
|
||||||
const size_t base_pool_size = [] ALWAYS_INLINE_LAMBDA () -> size_t {
|
const size_t base_pool_size = []() ALWAYS_INLINE_LAMBDA -> size_t {
|
||||||
switch (GetMemoryArrangeForInit()) {
|
switch (GetMemoryArrangeForInit()) {
|
||||||
case smc::MemoryArrangement_4GB:
|
case smc::MemoryArrangement_4GB:
|
||||||
default:
|
default:
|
||||||
@ -336,7 +336,7 @@ namespace ams::kern::board::nintendo::nx {
|
|||||||
|
|
||||||
size_t KSystemControl::Init::GetAppletPoolSize() {
|
size_t KSystemControl::Init::GetAppletPoolSize() {
|
||||||
/* Get the base pool size. */
|
/* Get the base pool size. */
|
||||||
const size_t base_pool_size = [] ALWAYS_INLINE_LAMBDA () -> size_t {
|
const size_t base_pool_size = []() ALWAYS_INLINE_LAMBDA -> size_t {
|
||||||
switch (GetMemoryArrangeForInit()) {
|
switch (GetMemoryArrangeForInit()) {
|
||||||
case smc::MemoryArrangement_4GB:
|
case smc::MemoryArrangement_4GB:
|
||||||
default:
|
default:
|
||||||
@ -490,7 +490,7 @@ namespace ams::kern::board::nintendo::nx {
|
|||||||
|
|
||||||
|
|
||||||
if (AMS_LIKELY(s_initialized_random_generator)) {
|
if (AMS_LIKELY(s_initialized_random_generator)) {
|
||||||
return KSystemControlBase::GenerateUniformRange(min, max, [] ALWAYS_INLINE_LAMBDA () -> u64 { return s_random_generator.GenerateRandomU64(); });
|
return KSystemControlBase::GenerateUniformRange(min, max, []() ALWAYS_INLINE_LAMBDA -> u64 { return s_random_generator.GenerateRandomU64(); });
|
||||||
} else {
|
} else {
|
||||||
return KSystemControlBase::GenerateUniformRange(min, max, GenerateRandomU64FromSmc);
|
return KSystemControlBase::GenerateUniformRange(min, max, GenerateRandomU64FromSmc);
|
||||||
}
|
}
|
||||||
@ -680,4 +680,4 @@ namespace ams::kern::board::nintendo::nx {
|
|||||||
Kernel::GetMemoryManager().Close(KPageTable::GetHeapPhysicalAddress(address), size / PageSize);
|
Kernel::GetMemoryManager().Close(KPageTable::GetHeapPhysicalAddress(address), size / PageSize);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -195,7 +195,7 @@ namespace ams::kern {
|
|||||||
static_assert(KMemoryManager::Pool_Secure == KMemoryManager::Pool_System);
|
static_assert(KMemoryManager::Pool_Secure == KMemoryManager::Pool_System);
|
||||||
|
|
||||||
/* Get Secure pool size. */
|
/* Get Secure pool size. */
|
||||||
const size_t secure_pool_size = [] ALWAYS_INLINE_LAMBDA (auto target_firmware) -> size_t {
|
const size_t secure_pool_size = [](auto target_firmware) ALWAYS_INLINE_LAMBDA -> size_t {
|
||||||
constexpr size_t LegacySecureKernelSize = 8_MB; /* KPageBuffer pages, other small kernel allocations. */
|
constexpr size_t LegacySecureKernelSize = 8_MB; /* KPageBuffer pages, other small kernel allocations. */
|
||||||
constexpr size_t LegacySecureMiscSize = 1_MB; /* Miscellaneous pages for secure process mapping. */
|
constexpr size_t LegacySecureMiscSize = 1_MB; /* Miscellaneous pages for secure process mapping. */
|
||||||
constexpr size_t LegacySecureHeapSize = 24_MB; /* Heap pages for secure process mapping (fs). */
|
constexpr size_t LegacySecureHeapSize = 24_MB; /* Heap pages for secure process mapping (fs). */
|
||||||
@ -274,4 +274,4 @@ namespace ams::kern {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -2398,7 +2398,7 @@ namespace ams::kern {
|
|||||||
size_t cur_size = next_entry.block_size - (GetInteger(cur_addr) & (next_entry.block_size - 1));
|
size_t cur_size = next_entry.block_size - (GetInteger(cur_addr) & (next_entry.block_size - 1));
|
||||||
size_t tot_size = cur_size;
|
size_t tot_size = cur_size;
|
||||||
|
|
||||||
auto PerformCopy = [&] ALWAYS_INLINE_LAMBDA () -> Result {
|
auto PerformCopy = [&]() ALWAYS_INLINE_LAMBDA -> Result {
|
||||||
/* Ensure the address is linear mapped. */
|
/* Ensure the address is linear mapped. */
|
||||||
R_UNLESS(IsLinearMappedPhysicalAddress(cur_addr), svc::ResultInvalidCurrentMemory());
|
R_UNLESS(IsLinearMappedPhysicalAddress(cur_addr), svc::ResultInvalidCurrentMemory());
|
||||||
|
|
||||||
@ -2484,7 +2484,7 @@ namespace ams::kern {
|
|||||||
size_t cur_size = next_entry.block_size - (GetInteger(cur_addr) & (next_entry.block_size - 1));
|
size_t cur_size = next_entry.block_size - (GetInteger(cur_addr) & (next_entry.block_size - 1));
|
||||||
size_t tot_size = cur_size;
|
size_t tot_size = cur_size;
|
||||||
|
|
||||||
auto PerformCopy = [&] ALWAYS_INLINE_LAMBDA () -> Result {
|
auto PerformCopy = [&]() ALWAYS_INLINE_LAMBDA -> Result {
|
||||||
/* Ensure the address is linear mapped. */
|
/* Ensure the address is linear mapped. */
|
||||||
R_UNLESS(IsLinearMappedPhysicalAddress(cur_addr), svc::ResultInvalidCurrentMemory());
|
R_UNLESS(IsLinearMappedPhysicalAddress(cur_addr), svc::ResultInvalidCurrentMemory());
|
||||||
|
|
||||||
@ -2943,7 +2943,7 @@ namespace ams::kern {
|
|||||||
size_t cur_size = next_entry.block_size - (GetInteger(cur_addr) & (next_entry.block_size - 1));
|
size_t cur_size = next_entry.block_size - (GetInteger(cur_addr) & (next_entry.block_size - 1));
|
||||||
size_t tot_size = cur_size;
|
size_t tot_size = cur_size;
|
||||||
|
|
||||||
auto PerformCopy = [&] ALWAYS_INLINE_LAMBDA () -> Result {
|
auto PerformCopy = [&]() ALWAYS_INLINE_LAMBDA -> Result {
|
||||||
/* Ensure the address is linear mapped. */
|
/* Ensure the address is linear mapped. */
|
||||||
R_UNLESS(IsLinearMappedPhysicalAddress(cur_addr), svc::ResultInvalidCurrentMemory());
|
R_UNLESS(IsLinearMappedPhysicalAddress(cur_addr), svc::ResultInvalidCurrentMemory());
|
||||||
|
|
||||||
@ -3023,7 +3023,7 @@ namespace ams::kern {
|
|||||||
size_t cur_size = next_entry.block_size - (GetInteger(cur_addr) & (next_entry.block_size - 1));
|
size_t cur_size = next_entry.block_size - (GetInteger(cur_addr) & (next_entry.block_size - 1));
|
||||||
size_t tot_size = cur_size;
|
size_t tot_size = cur_size;
|
||||||
|
|
||||||
auto PerformCopy = [&] ALWAYS_INLINE_LAMBDA () -> Result {
|
auto PerformCopy = [&]() ALWAYS_INLINE_LAMBDA -> Result {
|
||||||
/* Ensure the address is linear mapped. */
|
/* Ensure the address is linear mapped. */
|
||||||
R_UNLESS(IsLinearMappedPhysicalAddress(cur_addr), svc::ResultInvalidCurrentMemory());
|
R_UNLESS(IsLinearMappedPhysicalAddress(cur_addr), svc::ResultInvalidCurrentMemory());
|
||||||
|
|
||||||
@ -3092,7 +3092,7 @@ namespace ams::kern {
|
|||||||
size_t cur_size = next_entry.block_size - (GetInteger(cur_addr) & (next_entry.block_size - 1));
|
size_t cur_size = next_entry.block_size - (GetInteger(cur_addr) & (next_entry.block_size - 1));
|
||||||
size_t tot_size = cur_size;
|
size_t tot_size = cur_size;
|
||||||
|
|
||||||
auto PerformCopy = [&] ALWAYS_INLINE_LAMBDA () -> Result {
|
auto PerformCopy = [&]() ALWAYS_INLINE_LAMBDA -> Result {
|
||||||
/* Ensure the address is linear mapped. */
|
/* Ensure the address is linear mapped. */
|
||||||
R_UNLESS(IsLinearMappedPhysicalAddress(cur_addr), svc::ResultInvalidCurrentMemory());
|
R_UNLESS(IsLinearMappedPhysicalAddress(cur_addr), svc::ResultInvalidCurrentMemory());
|
||||||
|
|
||||||
@ -3172,7 +3172,7 @@ namespace ams::kern {
|
|||||||
size_t cur_size = next_entry.block_size - (GetInteger(cur_addr) & (next_entry.block_size - 1));
|
size_t cur_size = next_entry.block_size - (GetInteger(cur_addr) & (next_entry.block_size - 1));
|
||||||
size_t tot_size = cur_size;
|
size_t tot_size = cur_size;
|
||||||
|
|
||||||
auto PerformCopy = [&] ALWAYS_INLINE_LAMBDA () -> Result {
|
auto PerformCopy = [&]() ALWAYS_INLINE_LAMBDA -> Result {
|
||||||
/* Ensure the address is linear mapped. */
|
/* Ensure the address is linear mapped. */
|
||||||
R_UNLESS(IsLinearMappedPhysicalAddress(cur_addr), svc::ResultInvalidCurrentMemory());
|
R_UNLESS(IsLinearMappedPhysicalAddress(cur_addr), svc::ResultInvalidCurrentMemory());
|
||||||
|
|
||||||
|
@ -96,7 +96,7 @@ namespace ams::kern {
|
|||||||
s_initialized_random_generator = true;
|
s_initialized_random_generator = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
return KSystemControlBase::GenerateUniformRange(min, max, [] ALWAYS_INLINE_LAMBDA () -> u64 { return s_random_generator.GenerateRandomU64(); });
|
return KSystemControlBase::GenerateUniformRange(min, max, []() ALWAYS_INLINE_LAMBDA -> u64 { return s_random_generator.GenerateRandomU64(); });
|
||||||
}
|
}
|
||||||
|
|
||||||
/* System Initialization. */
|
/* System Initialization. */
|
||||||
@ -194,7 +194,7 @@ namespace ams::kern {
|
|||||||
KScopedInterruptDisable intr_disable;
|
KScopedInterruptDisable intr_disable;
|
||||||
KScopedSpinLock lk(s_random_lock);
|
KScopedSpinLock lk(s_random_lock);
|
||||||
|
|
||||||
return KSystemControlBase::GenerateUniformRange(min, max, [] ALWAYS_INLINE_LAMBDA () -> u64 { return s_random_generator.GenerateRandomU64(); });
|
return KSystemControlBase::GenerateUniformRange(min, max, []() ALWAYS_INLINE_LAMBDA -> u64 { return s_random_generator.GenerateRandomU64(); });
|
||||||
}
|
}
|
||||||
|
|
||||||
u64 KSystemControlBase::GenerateRandomU64() {
|
u64 KSystemControlBase::GenerateRandomU64() {
|
||||||
@ -292,4 +292,4 @@ namespace ams::kern {
|
|||||||
Kernel::GetMemoryManager().Close(KPageTable::GetHeapPhysicalAddress(address), size / PageSize);
|
Kernel::GetMemoryManager().Close(KPageTable::GetHeapPhysicalAddress(address), size / PageSize);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1183,7 +1183,7 @@ namespace ams::kern {
|
|||||||
KScopedSchedulerLock sl;
|
KScopedSchedulerLock sl;
|
||||||
|
|
||||||
/* Determine if this is the first termination request. */
|
/* Determine if this is the first termination request. */
|
||||||
const bool first_request = [&] ALWAYS_INLINE_LAMBDA () -> bool {
|
const bool first_request = [&]() ALWAYS_INLINE_LAMBDA -> bool {
|
||||||
/* Perform an atomic compare-and-swap from false to true. */
|
/* Perform an atomic compare-and-swap from false to true. */
|
||||||
bool expected = false;
|
bool expected = false;
|
||||||
return m_termination_requested.CompareExchangeStrong(expected, true);
|
return m_termination_requested.CompareExchangeStrong(expected, true);
|
||||||
|
@ -48,7 +48,7 @@ namespace ams::kern::svc {
|
|||||||
/* Check whether the address is aligned. */
|
/* Check whether the address is aligned. */
|
||||||
const bool aligned = util::IsAligned(phys_addr, PageSize);
|
const bool aligned = util::IsAligned(phys_addr, PageSize);
|
||||||
|
|
||||||
auto QueryIoMappingFromPageTable = [&] ALWAYS_INLINE_LAMBDA (uint64_t phys_addr, size_t size) -> Result {
|
auto QueryIoMappingFromPageTable = [&](uint64_t phys_addr, size_t size) ALWAYS_INLINE_LAMBDA -> Result {
|
||||||
/* The size must be non-zero. */
|
/* The size must be non-zero. */
|
||||||
R_UNLESS(size > 0, svc::ResultInvalidSize());
|
R_UNLESS(size > 0, svc::ResultInvalidSize());
|
||||||
|
|
||||||
|
@ -210,7 +210,7 @@ namespace ams::kern::svc {
|
|||||||
KResourceLimit *process_resource_limit = resource_limit.IsNotNull() ? resource_limit.GetPointerUnsafe() : std::addressof(Kernel::GetSystemResourceLimit());
|
KResourceLimit *process_resource_limit = resource_limit.IsNotNull() ? resource_limit.GetPointerUnsafe() : std::addressof(Kernel::GetSystemResourceLimit());
|
||||||
|
|
||||||
/* Get the pool for the process. */
|
/* Get the pool for the process. */
|
||||||
const auto pool = [] ALWAYS_INLINE_LAMBDA (u32 flags) -> KMemoryManager::Pool {
|
const auto pool = [](u32 flags) ALWAYS_INLINE_LAMBDA -> KMemoryManager::Pool {
|
||||||
if (GetTargetFirmware() >= TargetFirmware_5_0_0) {
|
if (GetTargetFirmware() >= TargetFirmware_5_0_0) {
|
||||||
switch (flags & ams::svc::CreateProcessFlag_PoolPartitionMask) {
|
switch (flags & ams::svc::CreateProcessFlag_PoolPartitionMask) {
|
||||||
case ams::svc::CreateProcessFlag_PoolPartitionApplication:
|
case ams::svc::CreateProcessFlag_PoolPartitionApplication:
|
||||||
|
@ -62,20 +62,16 @@ namespace ams::settings {
|
|||||||
|
|
||||||
char name[MaxLength];
|
char name[MaxLength];
|
||||||
|
|
||||||
static constexpr LanguageCode Encode(const char *name, size_t name_size) {
|
static constexpr LanguageCode Encode(util::string_view name) {
|
||||||
LanguageCode out{};
|
LanguageCode out{};
|
||||||
for (size_t i = 0; i < MaxLength && i < name_size; i++) {
|
for (size_t i = 0; i < MaxLength && i < name.size(); i++) {
|
||||||
out.name[i] = name[i];
|
out.name[i] = name[i];
|
||||||
}
|
}
|
||||||
return out;
|
return out;
|
||||||
}
|
}
|
||||||
|
|
||||||
static constexpr LanguageCode Encode(const char *name) {
|
|
||||||
return Encode(name, std::strlen(name));
|
|
||||||
}
|
|
||||||
|
|
||||||
template<Language Lang>
|
template<Language Lang>
|
||||||
static constexpr inline LanguageCode EncodeLanguage = [] {
|
static constexpr inline LanguageCode EncodeLanguage() {
|
||||||
if constexpr (false) { /* ... */ }
|
if constexpr (false) { /* ... */ }
|
||||||
#define AMS_MATCH_LANGUAGE(lang, enc) else if constexpr (Lang == Language_##lang) { return LanguageCode::Encode(enc); }
|
#define AMS_MATCH_LANGUAGE(lang, enc) else if constexpr (Lang == Language_##lang) { return LanguageCode::Encode(enc); }
|
||||||
AMS_MATCH_LANGUAGE(Japanese, "ja")
|
AMS_MATCH_LANGUAGE(Japanese, "ja")
|
||||||
@ -98,28 +94,28 @@ namespace ams::settings {
|
|||||||
AMS_MATCH_LANGUAGE(TraditionalChinese, "zh-Hant")
|
AMS_MATCH_LANGUAGE(TraditionalChinese, "zh-Hant")
|
||||||
#undef AMS_MATCH_LANGUAGE
|
#undef AMS_MATCH_LANGUAGE
|
||||||
else { static_assert(Lang != Language_Japanese); }
|
else { static_assert(Lang != Language_Japanese); }
|
||||||
}();
|
}
|
||||||
|
|
||||||
static constexpr inline LanguageCode Encode(const Language language) {
|
static constexpr inline LanguageCode Encode(const Language language) {
|
||||||
constexpr LanguageCode EncodedLanguages[Language_Count] = {
|
constexpr LanguageCode EncodedLanguages[Language_Count] = {
|
||||||
EncodeLanguage<Language_Japanese>,
|
EncodeLanguage<Language_Japanese>(),
|
||||||
EncodeLanguage<Language_AmericanEnglish>,
|
EncodeLanguage<Language_AmericanEnglish>(),
|
||||||
EncodeLanguage<Language_French>,
|
EncodeLanguage<Language_French>(),
|
||||||
EncodeLanguage<Language_German>,
|
EncodeLanguage<Language_German>(),
|
||||||
EncodeLanguage<Language_Italian>,
|
EncodeLanguage<Language_Italian>(),
|
||||||
EncodeLanguage<Language_Spanish>,
|
EncodeLanguage<Language_Spanish>(),
|
||||||
EncodeLanguage<Language_Chinese>,
|
EncodeLanguage<Language_Chinese>(),
|
||||||
EncodeLanguage<Language_Korean>,
|
EncodeLanguage<Language_Korean>(),
|
||||||
EncodeLanguage<Language_Dutch>,
|
EncodeLanguage<Language_Dutch>(),
|
||||||
EncodeLanguage<Language_Portuguese>,
|
EncodeLanguage<Language_Portuguese>(),
|
||||||
EncodeLanguage<Language_Russian>,
|
EncodeLanguage<Language_Russian>(),
|
||||||
EncodeLanguage<Language_Taiwanese>,
|
EncodeLanguage<Language_Taiwanese>(),
|
||||||
EncodeLanguage<Language_BritishEnglish>,
|
EncodeLanguage<Language_BritishEnglish>(),
|
||||||
EncodeLanguage<Language_CanadianFrench>,
|
EncodeLanguage<Language_CanadianFrench>(),
|
||||||
EncodeLanguage<Language_LatinAmericanSpanish>,
|
EncodeLanguage<Language_LatinAmericanSpanish>(),
|
||||||
/* 4.0.0+ */
|
/* 4.0.0+ */
|
||||||
EncodeLanguage<Language_SimplifiedChinese>,
|
EncodeLanguage<Language_SimplifiedChinese>(),
|
||||||
EncodeLanguage<Language_TraditionalChinese>,
|
EncodeLanguage<Language_TraditionalChinese>(),
|
||||||
};
|
};
|
||||||
return EncodedLanguages[language];
|
return EncodedLanguages[language];
|
||||||
}
|
}
|
||||||
|
@ -54,11 +54,11 @@ namespace ams::sf::cmif {
|
|||||||
|
|
||||||
void DisposeImpl();
|
void DisposeImpl();
|
||||||
|
|
||||||
virtual void AddReference() {
|
virtual void AddReference() override {
|
||||||
ServiceObjectImplBase2::AddReferenceImpl();
|
ServiceObjectImplBase2::AddReferenceImpl();
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void Release() {
|
virtual void Release() override {
|
||||||
if (ServiceObjectImplBase2::ReleaseImpl()) {
|
if (ServiceObjectImplBase2::ReleaseImpl()) {
|
||||||
this->DisposeImpl();
|
this->DisposeImpl();
|
||||||
}
|
}
|
||||||
|
@ -43,7 +43,7 @@ namespace ams::sf {
|
|||||||
return lmem::FreeToExpHeap(m_handle, buffer);
|
return lmem::FreeToExpHeap(m_handle, buffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual bool IsEqualImpl(const MemoryResource &resource) const {
|
virtual bool IsEqualImpl(const MemoryResource &resource) const override {
|
||||||
return this == std::addressof(resource);
|
return this == std::addressof(resource);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@ -76,9 +76,9 @@ namespace ams::sf {
|
|||||||
return lmem::FreeToUnitHeap(m_handle, buffer);
|
return lmem::FreeToUnitHeap(m_handle, buffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual bool IsEqualImpl(const MemoryResource &resource) const {
|
virtual bool IsEqualImpl(const MemoryResource &resource) const override {
|
||||||
return this == std::addressof(resource);
|
return this == std::addressof(resource);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -37,9 +37,9 @@ namespace ams::sf {
|
|||||||
return m_standard_allocator->Free(buffer);
|
return m_standard_allocator->Free(buffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual bool IsEqualImpl(const MemoryResource &resource) const {
|
virtual bool IsEqualImpl(const MemoryResource &resource) const override {
|
||||||
return this == std::addressof(resource);
|
return this == std::addressof(resource);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -31,7 +31,7 @@ namespace ams::sf {
|
|||||||
public:
|
public:
|
||||||
class Object;
|
class Object;
|
||||||
using Allocator = StatelessDummyAllocator;
|
using Allocator = StatelessDummyAllocator;
|
||||||
using StatelessAllocator = typename Policy::StatelessAllocator<Object>;
|
using StatelessAllocator = typename Policy::template StatelessAllocator<Object>;
|
||||||
|
|
||||||
class Object final : private ::ams::sf::impl::ServiceObjectImplBase2, public Base {
|
class Object final : private ::ams::sf::impl::ServiceObjectImplBase2, public Base {
|
||||||
NON_COPYABLE(Object);
|
NON_COPYABLE(Object);
|
||||||
|
@ -40,8 +40,8 @@ namespace ams::sm {
|
|||||||
return out;
|
return out;
|
||||||
}
|
}
|
||||||
|
|
||||||
static constexpr ServiceName Encode(const char *name) {
|
static constexpr ServiceName Encode(util::string_view name) {
|
||||||
return Encode(name, std::strlen(name));
|
return Encode(name.data(), name.size());
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -50,7 +50,7 @@ namespace ams::time {
|
|||||||
AMS_ASSERT(rhs.IsValid());
|
AMS_ASSERT(rhs.IsValid());
|
||||||
}
|
}
|
||||||
|
|
||||||
constexpr auto ToUint64 = [] ALWAYS_INLINE_LAMBDA (const time::CalendarTime &time) {
|
constexpr auto ToUint64 = [](const time::CalendarTime &time) ALWAYS_INLINE_LAMBDA {
|
||||||
return (static_cast<u64>(time.year) << 40) |
|
return (static_cast<u64>(time.year) << 40) |
|
||||||
(static_cast<u64>(time.month) << 32) |
|
(static_cast<u64>(time.month) << 32) |
|
||||||
(static_cast<u64>(time.day) << 24) |
|
(static_cast<u64>(time.day) << 24) |
|
||||||
|
@ -472,7 +472,7 @@ namespace ams::tipc::impl {
|
|||||||
using OutRawHolderType = OutRawHolder<CommandMeta::OutDataSize, CommandMeta::OutDataAlign, CommandMeta::OutMessageRawDataIndex>;
|
using OutRawHolderType = OutRawHolder<CommandMeta::OutDataSize, CommandMeta::OutDataAlign, CommandMeta::OutMessageRawDataIndex>;
|
||||||
using OutHandleHolderType = OutHandleHolder<CommandMeta::NumOutMoveHandles, CommandMeta::NumOutCopyHandles, CommandMeta::OutMessageHandleIndex>;
|
using OutHandleHolderType = OutHandleHolder<CommandMeta::NumOutMoveHandles, CommandMeta::NumOutCopyHandles, CommandMeta::OutMessageHandleIndex>;
|
||||||
private:
|
private:
|
||||||
static consteval u64 GetMessageHeaderForCheck(const svc::ipc::MessageBuffer::MessageHeader &header) {
|
static constexpr u64 GetMessageHeaderForCheck(const svc::ipc::MessageBuffer::MessageHeader &header) {
|
||||||
using Value = util::BitPack32::Field<0, BITSIZEOF(util::BitPack32)>;
|
using Value = util::BitPack32::Field<0, BITSIZEOF(util::BitPack32)>;
|
||||||
|
|
||||||
const util::BitPack32 *data = header.GetData();
|
const util::BitPack32 *data = header.GetData();
|
||||||
@ -482,7 +482,7 @@ namespace ams::tipc::impl {
|
|||||||
return static_cast<u64>(lower) | (static_cast<u64>(upper) << BITSIZEOF(u32));
|
return static_cast<u64>(lower) | (static_cast<u64>(upper) << BITSIZEOF(u32));
|
||||||
}
|
}
|
||||||
|
|
||||||
static consteval u32 GetSpecialHeaderForCheck(const svc::ipc::MessageBuffer::SpecialHeader &header) {
|
static constexpr u32 GetSpecialHeaderForCheck(const svc::ipc::MessageBuffer::SpecialHeader &header) {
|
||||||
using Value = util::BitPack32::Field<0, BITSIZEOF(util::BitPack32)>;
|
using Value = util::BitPack32::Field<0, BITSIZEOF(util::BitPack32)>;
|
||||||
|
|
||||||
return header.GetHeader()->Get<Value>();
|
return header.GetHeader()->Get<Value>();
|
||||||
|
@ -167,12 +167,12 @@ namespace ams::tipc {
|
|||||||
return AMS_OFFSETOF(DeferralManagerBase, m_objects_base);
|
return AMS_OFFSETOF(DeferralManagerBase, m_objects_base);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<size_t N>
|
template<size_t N> requires (N > 0)
|
||||||
consteval size_t DeferralManager<N>::GetObjectPointersOffset() {
|
consteval size_t DeferralManager<N>::GetObjectPointersOffset() {
|
||||||
return AMS_OFFSETOF(DeferralManager<N>, m_objects);
|
return AMS_OFFSETOF(DeferralManager<N>, m_objects);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<size_t N>
|
template<size_t N> requires (N > 0)
|
||||||
inline DeferralManager<N>::DeferralManager() : DeferralManagerBase() {
|
inline DeferralManager<N>::DeferralManager() : DeferralManagerBase() {
|
||||||
static_assert(GetObjectPointersOffset() == GetObjectPointersOffsetBase());
|
static_assert(GetObjectPointersOffset() == GetObjectPointersOffsetBase());
|
||||||
static_assert(sizeof(DeferralManager<N>) == sizeof(DeferralManagerBase) + N * sizeof(DeferrableBase *));
|
static_assert(sizeof(DeferralManager<N>) == sizeof(DeferralManagerBase) + N * sizeof(DeferrableBase *));
|
||||||
|
@ -686,7 +686,7 @@ namespace ams::tipc {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Try to reply/receive. */
|
/* Try to reply/receive. */
|
||||||
const Result result = [&] ALWAYS_INLINE_LAMBDA () -> Result {
|
const Result result = [&]() ALWAYS_INLINE_LAMBDA -> Result {
|
||||||
os::MultiWaitHolderType *signaled_holder = nullptr;
|
os::MultiWaitHolderType *signaled_holder = nullptr;
|
||||||
ON_SCOPE_EXIT { AMS_ABORT_UNLESS(signaled_holder == nullptr); };
|
ON_SCOPE_EXIT { AMS_ABORT_UNLESS(signaled_holder == nullptr); };
|
||||||
return m_object_manager->ReplyAndReceive(std::addressof(signaled_holder), out_object, reply_target, std::addressof(m_multi_wait));
|
return m_object_manager->ReplyAndReceive(std::addressof(signaled_holder), out_object, reply_target, std::addressof(m_multi_wait));
|
||||||
@ -747,7 +747,7 @@ namespace ams::tipc {
|
|||||||
using PortManager = PortManagerImpl;
|
using PortManager = PortManagerImpl;
|
||||||
private:
|
private:
|
||||||
PortManager m_port_manager;
|
PortManager m_port_manager;
|
||||||
PortInfo::Allocator m_port_allocator;
|
typename PortInfo::Allocator m_port_allocator;
|
||||||
public:
|
public:
|
||||||
constexpr ServerManagerImpl() : m_port_manager(), m_port_allocator() { /* ... */ }
|
constexpr ServerManagerImpl() : m_port_manager(), m_port_allocator() { /* ... */ }
|
||||||
|
|
||||||
|
@ -196,7 +196,7 @@ namespace ams::htclow::ctrl {
|
|||||||
/* Lock ourselves. */
|
/* Lock ourselves. */
|
||||||
std::scoped_lock lk(m_mutex);
|
std::scoped_lock lk(m_mutex);
|
||||||
|
|
||||||
auto IsSupportedServiceChannel = [] ALWAYS_INLINE_LAMBDA (const impl::ChannelInternalType &channel, const impl::ChannelInternalType *supported, int num_supported) -> bool {
|
auto IsSupportedServiceChannel = [](const impl::ChannelInternalType &channel, const impl::ChannelInternalType *supported, int num_supported) ALWAYS_INLINE_LAMBDA -> bool {
|
||||||
for (auto i = 0; i < num_supported; ++i) {
|
for (auto i = 0; i < num_supported; ++i) {
|
||||||
if (channel.module_id == supported[i].module_id && channel.channel_id == supported[i].channel_id) {
|
if (channel.module_id == supported[i].module_id && channel.channel_id == supported[i].channel_id) {
|
||||||
return true;
|
return true;
|
||||||
|
@ -308,7 +308,7 @@ namespace ams::ncm {
|
|||||||
out_orphaned[i] = true;
|
out_orphaned[i] = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto IsOrphanedContent = [] ALWAYS_INLINE_LAMBDA (const sf::InArray<ContentId> &list, const ncm::ContentId &id) -> util::optional<size_t> {
|
auto IsOrphanedContent = [](const sf::InArray<ContentId> &list, const ncm::ContentId &id) ALWAYS_INLINE_LAMBDA -> util::optional<size_t> {
|
||||||
/* Check if any input content ids match our found content id. */
|
/* Check if any input content ids match our found content id. */
|
||||||
for (size_t i = 0; i < list.GetSize(); i++) {
|
for (size_t i = 0; i < list.GetSize(); i++) {
|
||||||
if (list[i] == id) {
|
if (list[i] == id) {
|
||||||
|
@ -177,7 +177,11 @@ namespace ams {
|
|||||||
static_assert(Value != Base::SuccessValue, "Value != Base::SuccessValue");
|
static_assert(Value != Base::SuccessValue, "Value != Base::SuccessValue");
|
||||||
public:
|
public:
|
||||||
constexpr ALWAYS_INLINE operator Result() const { return MakeResult(Value); }
|
constexpr ALWAYS_INLINE operator Result() const { return MakeResult(Value); }
|
||||||
constexpr ALWAYS_INLINE operator ResultSuccess() const { OnResultAbort(Value); }
|
constexpr ALWAYS_INLINE operator ResultSuccess() const {
|
||||||
|
OnResultAbort(Value);
|
||||||
|
__builtin_unreachable();
|
||||||
|
return ResultSuccess();
|
||||||
|
}
|
||||||
|
|
||||||
constexpr ALWAYS_INLINE bool IsSuccess() const { return false; }
|
constexpr ALWAYS_INLINE bool IsSuccess() const { return false; }
|
||||||
constexpr ALWAYS_INLINE bool IsFailure() const { return !this->IsSuccess(); }
|
constexpr ALWAYS_INLINE bool IsFailure() const { return !this->IsSuccess(); }
|
||||||
|
@ -295,7 +295,7 @@ namespace ams::util {
|
|||||||
private:
|
private:
|
||||||
constexpr explicit ALWAYS_INLINE Iterator(ImplIterator it) : m_impl(it) { /* ... */ }
|
constexpr explicit ALWAYS_INLINE Iterator(ImplIterator it) : m_impl(it) { /* ... */ }
|
||||||
|
|
||||||
constexpr explicit ALWAYS_INLINE Iterator(ImplIterator::pointer p) : m_impl(p) { /* ... */ }
|
constexpr explicit ALWAYS_INLINE Iterator(typename ImplIterator::pointer p) : m_impl(p) { /* ... */ }
|
||||||
|
|
||||||
constexpr ALWAYS_INLINE ImplIterator GetImplIterator() const {
|
constexpr ALWAYS_INLINE ImplIterator GetImplIterator() const {
|
||||||
return m_impl;
|
return m_impl;
|
||||||
|
@ -225,7 +225,7 @@ namespace ams::util {
|
|||||||
template<typename T, typename Derived>
|
template<typename T, typename Derived>
|
||||||
class OptionalBaseImpl {
|
class OptionalBaseImpl {
|
||||||
protected:
|
protected:
|
||||||
using StoredType = std::remove_const<T>::type;
|
using StoredType = std::remove_const_t<T>;
|
||||||
|
|
||||||
template<typename... Args>
|
template<typename... Args>
|
||||||
constexpr void ConstructImpl(Args &&... args) { static_cast<Derived *>(this)->m_payload.Construct(std::forward<Args>(args)...); }
|
constexpr void ConstructImpl(Args &&... args) { static_cast<Derived *>(this)->m_payload.Construct(std::forward<Args>(args)...); }
|
||||||
|
@ -152,7 +152,7 @@ namespace ams::mitm::sysupdater {
|
|||||||
ON_SCOPE_EXIT { std::free(data_buffer); };
|
ON_SCOPE_EXIT { std::free(data_buffer); };
|
||||||
|
|
||||||
/* Declare helper for result validation. */
|
/* Declare helper for result validation. */
|
||||||
auto ValidateResult = [&] ALWAYS_INLINE_LAMBDA (Result result) -> Result {
|
auto ValidateResult = [&](Result result) ALWAYS_INLINE_LAMBDA -> Result {
|
||||||
*out_result = result;
|
*out_result = result;
|
||||||
return result;
|
return result;
|
||||||
};
|
};
|
||||||
|
@ -41,7 +41,7 @@ namespace ams::sm {
|
|||||||
|
|
||||||
Result GetServiceHandle(tipc::OutMoveHandle out_h, ServiceName service) {
|
Result GetServiceHandle(tipc::OutMoveHandle out_h, ServiceName service) {
|
||||||
R_UNLESS(m_initialized, sm::ResultInvalidClient());
|
R_UNLESS(m_initialized, sm::ResultInvalidClient());
|
||||||
return this->RegisterRetryIfDeferred(service, [&] ALWAYS_INLINE_LAMBDA () -> Result {
|
return this->RegisterRetryIfDeferred(service, [&]() ALWAYS_INLINE_LAMBDA -> Result {
|
||||||
return impl::GetServiceHandle(out_h.GetPointer(), m_process_id, service);
|
return impl::GetServiceHandle(out_h.GetPointer(), m_process_id, service);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -66,7 +66,7 @@ namespace ams::sm {
|
|||||||
/* Atmosphere commands. */
|
/* Atmosphere commands. */
|
||||||
Result AtmosphereInstallMitm(tipc::OutMoveHandle srv_h, tipc::OutMoveHandle qry_h, ServiceName service) {
|
Result AtmosphereInstallMitm(tipc::OutMoveHandle srv_h, tipc::OutMoveHandle qry_h, ServiceName service) {
|
||||||
R_UNLESS(m_initialized, sm::ResultInvalidClient());
|
R_UNLESS(m_initialized, sm::ResultInvalidClient());
|
||||||
return this->RegisterRetryIfDeferred(service, [&] ALWAYS_INLINE_LAMBDA () -> Result {
|
return this->RegisterRetryIfDeferred(service, [&]() ALWAYS_INLINE_LAMBDA -> Result {
|
||||||
return impl::InstallMitm(srv_h.GetPointer(), qry_h.GetPointer(), m_process_id, service);
|
return impl::InstallMitm(srv_h.GetPointer(), qry_h.GetPointer(), m_process_id, service);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -88,7 +88,7 @@ namespace ams::sm {
|
|||||||
|
|
||||||
Result AtmosphereWaitMitm(ServiceName service) {
|
Result AtmosphereWaitMitm(ServiceName service) {
|
||||||
R_UNLESS(m_initialized, sm::ResultInvalidClient());
|
R_UNLESS(m_initialized, sm::ResultInvalidClient());
|
||||||
return this->RegisterRetryIfDeferred(service, [&] ALWAYS_INLINE_LAMBDA () -> Result {
|
return this->RegisterRetryIfDeferred(service, [&]() ALWAYS_INLINE_LAMBDA -> Result {
|
||||||
return impl::WaitMitm(service);
|
return impl::WaitMitm(service);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -110,7 +110,7 @@ namespace ams::sm {
|
|||||||
|
|
||||||
Result AtmosphereWaitService(ServiceName service) {
|
Result AtmosphereWaitService(ServiceName service) {
|
||||||
R_UNLESS(m_initialized, sm::ResultInvalidClient());
|
R_UNLESS(m_initialized, sm::ResultInvalidClient());
|
||||||
return this->RegisterRetryIfDeferred(service, [&] ALWAYS_INLINE_LAMBDA () -> Result {
|
return this->RegisterRetryIfDeferred(service, [&]() ALWAYS_INLINE_LAMBDA -> Result {
|
||||||
return impl::WaitService(service);
|
return impl::WaitService(service);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user