diff --git a/Utilities/File.cpp b/Utilities/File.cpp index 4463881742..ffbab4fa6c 100644 --- a/Utilities/File.cpp +++ b/Utilities/File.cpp @@ -24,7 +24,7 @@ static std::unique_ptr to_wchar(const std::string& source) const std::size_t buf_size = source.size() + 1; // Safe size - const int size = narrow(buf_size, "to_wchar" HERE); + const int size = narrow(buf_size); // Buffer for max possible output length std::unique_ptr buffer(new wchar_t[buf_size + 8 + 32768]); @@ -55,7 +55,7 @@ static void to_utf8(std::string& out, const wchar_t* source) const std::size_t length = std::wcslen(source); // Safe buffer size for max possible output length (including null terminator) - const int buf_size = narrow(length * 3 + 1, "to_utf8" HERE); + const int buf_size = narrow(length * 3 + 1); // Resize buffer out.resize(buf_size - 1); @@ -1028,7 +1028,7 @@ fs::file::file(const std::string& path, bs_t mode) u64 read(void* buffer, u64 count) override { // TODO (call ReadFile multiple times if count is too big) - const int size = narrow(count, "file::read" HERE); + const int size = narrow(count); DWORD nread; ensure(ReadFile(m_handle, buffer, size, &nread, NULL)); // "file::read" @@ -1039,7 +1039,7 @@ fs::file::file(const std::string& path, bs_t mode) u64 write(const void* buffer, u64 count) override { // TODO (call WriteFile multiple times if count is too big) - const int size = narrow(count, "file::write" HERE); + const int size = narrow(count); DWORD nwritten; ensure(WriteFile(m_handle, buffer, size, &nwritten, NULL)); // "file::write" diff --git a/Utilities/JIT.cpp b/Utilities/JIT.cpp index 898e9dd9df..9125d4985c 100644 --- a/Utilities/JIT.cpp +++ b/Utilities/JIT.cpp @@ -452,7 +452,7 @@ public: name.append(".gz"); z_stream zs{}; - uLong zsz = compressBound(::narrow(obj.getBufferSize(), HERE)) + 256; + uLong zsz = compressBound(::narrow(obj.getBufferSize())) + 256; auto zbuf = std::make_unique(zsz); #ifndef _MSC_VER #pragma GCC diagnostic push diff --git a/Utilities/StrFmt.cpp b/Utilities/StrFmt.cpp index 4b851a1818..97117c446d 100644 --- a/Utilities/StrFmt.cpp +++ b/Utilities/StrFmt.cpp @@ -287,7 +287,7 @@ namespace fmt thread_ctrl::emergency_exit(out); } - void raw_narrow_error(const char* msg, const fmt_type_info* sup, u64 arg) + void raw_narrow_error(const src_loc& loc, const fmt_type_info* sup, u64 arg) { std::string out{"Narrow error"}; @@ -298,10 +298,22 @@ namespace fmt out += ")"; } - if (msg) + if (loc.col != umax) { - out += ": "; - out += msg; + fmt::append(out, "\n(in file %s:%s[:%s]", loc.file, loc.line, loc.col); + } + else + { + fmt::append(out, "\n(in file %s:%s", loc.file, loc.line); + } + + if (loc.func && *loc.func) + { + fmt::append(out, ", in function %s)", loc.func); + } + else + { + out += ')'; } thread_ctrl::emergency_exit(out); diff --git a/Utilities/types.h b/Utilities/types.h index af7c45c7d9..541185dd62 100644 --- a/Utilities/types.h +++ b/Utilities/types.h @@ -779,7 +779,7 @@ namespace fmt { [[noreturn]] void raw_error(const char* msg); [[noreturn]] void raw_verify_error(const src_loc& loc); - [[noreturn]] void raw_narrow_error(const char* msg, const fmt_type_info* sup, u64 arg); + [[noreturn]] void raw_narrow_error(const src_loc& loc, const fmt_type_info* sup, u64 arg); } template @@ -870,13 +870,17 @@ struct narrow_impl> }; template (std::declval()))> -inline To narrow(const From& value, const char* msg = nullptr) +[[nodiscard]] constexpr To narrow(const From& value, + u32 line = __builtin_LINE(), + u32 col = __builtin_COLUMN(), + const char* file = __builtin_FILE(), + const char* func = __builtin_FUNCTION()) { // Narrow check - if (narrow_impl::test(value)) + if (narrow_impl::test(value)) [[unlikely]] { // Pack value as formatting argument - fmt::raw_narrow_error(msg, fmt::get_type_info>(), fmt_unveil::get(value)); + fmt::raw_narrow_error({line, col, file, func}, fmt::get_type_info>(), fmt_unveil::get(value)); } return static_cast(value); @@ -884,15 +888,20 @@ inline To narrow(const From& value, const char* msg = nullptr) // Returns u32 size() for container template (std::declval().size()))> -inline u32 size32(const CT& container, const char* msg = nullptr) +[[nodiscard]] constexpr u32 size32(const CT& container, + u32 line = __builtin_LINE(), + u32 col = __builtin_COLUMN(), + const char* file = __builtin_FILE(), + const char* func = __builtin_FUNCTION()) { - return narrow(container.size(), msg); + return narrow(container.size(), line, col, file, func); } // Returns u32 size for an array template -constexpr u32 size32(const T (&)[Size], const char* msg = nullptr) +[[nodiscard]] constexpr u32 size32(const T (&)[Size]) { + static_assert(Size < UINT32_MAX, "Array is too big for 32-bit"); return static_cast(Size); } diff --git a/rpcs3/Crypto/unedat.cpp b/rpcs3/Crypto/unedat.cpp index ce43b85a1e..513ef7102e 100644 --- a/rpcs3/Crypto/unedat.cpp +++ b/rpcs3/Crypto/unedat.cpp @@ -575,7 +575,7 @@ int validate_npd_hashes(const char* file_name, const u8* klicensee, NPD_HEADER * int title_hash_result = 0; int dev_hash_result = 0; - const s32 file_name_length = ::narrow(std::strlen(file_name), HERE); + const s32 file_name_length = ::narrow(std::strlen(file_name)); const std::size_t buf_len = 0x30 + file_name_length; std::unique_ptr buf(new u8[buf_len]); diff --git a/rpcs3/Crypto/unself.cpp b/rpcs3/Crypto/unself.cpp index b46cb8608e..7807fb253e 100644 --- a/rpcs3/Crypto/unself.cpp +++ b/rpcs3/Crypto/unself.cpp @@ -745,7 +745,7 @@ bool SCEDecrypter::DecryptData() // Calculate the total data size. for (unsigned int i = 0; i < meta_hdr.section_count; i++) { - data_buf_length += ::narrow(meta_shdr[i].data_size, HERE); + data_buf_length += ::narrow(meta_shdr[i].data_size); } // Allocate a buffer to store decrypted data. @@ -799,7 +799,7 @@ bool SCEDecrypter::DecryptData() } // Advance the buffer's offset. - data_buf_offset += ::narrow(meta_shdr[i].data_size, HERE); + data_buf_offset += ::narrow(meta_shdr[i].data_size); } return true; @@ -829,7 +829,7 @@ std::vector SCEDecrypter::MakeFile() strm.zalloc = Z_NULL; strm.zfree = Z_NULL; strm.opaque = Z_NULL; - strm.avail_in = ::narrow(meta_shdr[i].data_size, HERE); + strm.avail_in = ::narrow(meta_shdr[i].data_size); strm.avail_out = BUFSIZE; strm.next_in = data_buf.get()+data_buf_offset; strm.next_out = tempbuf; @@ -874,7 +874,7 @@ std::vector SCEDecrypter::MakeFile() } // Advance the data buffer offset by data size. - data_buf_offset += ::narrow(meta_shdr[i].data_size, HERE); + data_buf_offset += ::narrow(meta_shdr[i].data_size); if (out_f.pos() != out_f.size()) fmt::throw_exception("MakeELF written bytes (%llu) does not equal buffer size (%llu).", out_f.pos(), out_f.size()); @@ -1243,7 +1243,7 @@ bool SELFDecrypter::DecryptData() if (meta_shdr[i].encrypted == 3) { if ((meta_shdr[i].key_idx <= meta_hdr.key_count - 1) && (meta_shdr[i].iv_idx <= meta_hdr.key_count)) - data_buf_length += ::narrow(meta_shdr[i].data_size, HERE); + data_buf_length += ::narrow(meta_shdr[i].data_size); } } @@ -1289,7 +1289,7 @@ bool SELFDecrypter::DecryptData() memcpy(data_buf.get() + data_buf_offset, buf.get(), meta_shdr[i].data_size); // Advance the buffer's offset. - data_buf_offset += ::narrow(meta_shdr[i].data_size, HERE); + data_buf_offset += ::narrow(meta_shdr[i].data_size); } } } diff --git a/rpcs3/Crypto/unself.h b/rpcs3/Crypto/unself.h index 6b06462cb6..9233b18044 100644 --- a/rpcs3/Crypto/unself.h +++ b/rpcs3/Crypto/unself.h @@ -489,7 +489,7 @@ private: } // Advance the data buffer offset by data size. - data_buf_offset += ::narrow(meta_shdr[i].data_size, HERE); + data_buf_offset += ::narrow(meta_shdr[i].data_size); } } diff --git a/rpcs3/Emu/Cell/Modules/StaticHLE.cpp b/rpcs3/Emu/Cell/Modules/StaticHLE.cpp index 6dac041421..8a6df2bb77 100644 --- a/rpcs3/Emu/Cell/Modules/StaticHLE.cpp +++ b/rpcs3/Emu/Cell/Modules/StaticHLE.cpp @@ -82,7 +82,7 @@ bool statichle_handler::load_patterns() for (u32 j = 0; j < 32; j++) dapat.start_pattern[j] = char_to_u8(pattern[0][j * 2], pattern[0][(j * 2) + 1]); - dapat.crc16_length = ::narrow(char_to_u8(pattern[1][0], pattern[1][1]), HERE); + dapat.crc16_length = ::narrow(char_to_u8(pattern[1][0], pattern[1][1])); dapat.crc16 = (char_to_u8(pattern[2][0], pattern[2][1]) << 8) | char_to_u8(pattern[2][2], pattern[2][3]); dapat.total_length = (char_to_u8(pattern[3][0], pattern[3][1]) << 8) | char_to_u8(pattern[3][2], pattern[3][3]); dapat._module = pattern[4]; diff --git a/rpcs3/Emu/Cell/Modules/cellImeJp.cpp b/rpcs3/Emu/Cell/Modules/cellImeJp.cpp index cf23f9419a..b452b433a2 100644 --- a/rpcs3/Emu/Cell/Modules/cellImeJp.cpp +++ b/rpcs3/Emu/Cell/Modules/cellImeJp.cpp @@ -798,10 +798,10 @@ error_code cellImeJpMoveFocusClause(CellImeJpHandle hImeJpHandle, s16 moveType) manager->moveCursor(-1); break; case CELL_IMEJP_FOCUS_TOP: - manager->moveCursor(-1 * ::narrow(manager->input_string.length(), HERE)); + manager->moveCursor(-1 * ::narrow(manager->input_string.length())); break; case CELL_IMEJP_FOCUS_END: - manager->moveCursor(::narrow(manager->input_string.length(), HERE)); + manager->moveCursor(::narrow(manager->input_string.length())); manager->moveCursor(-1); break; default: diff --git a/rpcs3/Emu/Cell/Modules/cellSpurs.cpp b/rpcs3/Emu/Cell/Modules/cellSpurs.cpp index d2cd86e87b..352f64e594 100644 --- a/rpcs3/Emu/Cell/Modules/cellSpurs.cpp +++ b/rpcs3/Emu/Cell/Modules/cellSpurs.cpp @@ -2056,7 +2056,7 @@ s32 _spurs::trace_initialize(ppu_thread& ppu, vm::ptr spurs, vm::ptr< spurs->traceBuffer.set(buffer.addr() | (mode & CELL_SPURS_TRACE_MODE_FLAG_WRAP_BUFFER ? 1 : 0)); spurs->traceMode = mode; - u32 spuTraceDataCount = ::narrow((spurs->traceDataSize / sizeof(CellSpursTracePacket)) / spurs->nSpus, HERE); + u32 spuTraceDataCount = ::narrow((spurs->traceDataSize / sizeof(CellSpursTracePacket)) / spurs->nSpus); for (u32 i = 0, j = 8; i < 6; i++) { spurs->traceStartIndex[i] = j; diff --git a/rpcs3/Emu/Cell/PPUModule.cpp b/rpcs3/Emu/Cell/PPUModule.cpp index 9b9a989ee5..2bb4ba3d5d 100644 --- a/rpcs3/Emu/Cell/PPUModule.cpp +++ b/rpcs3/Emu/Cell/PPUModule.cpp @@ -813,9 +813,9 @@ std::shared_ptr ppu_load_prx(const ppu_prx_object& elf, const std::stri { if (prog.p_memsz) { - const u32 mem_size = ::narrow(prog.p_memsz, "p_memsz" HERE); - const u32 file_size = ::narrow(prog.p_filesz, "p_filesz" HERE); - const u32 init_addr = ::narrow(prog.p_vaddr, "p_vaddr" HERE); + const u32 mem_size = ::narrow(prog.p_memsz); + const u32 file_size = ::narrow(prog.p_filesz); + const u32 init_addr = ::narrow(prog.p_vaddr); // Alloc segment memory const u32 addr = vm::alloc(mem_size, vm::main); @@ -1143,11 +1143,11 @@ void ppu_load_exec(const ppu_exec_object& elf) ppu_loader.notice("** Segment: p_type=0x%x, p_vaddr=0x%llx, p_filesz=0x%llx, p_memsz=0x%llx, flags=0x%x", prog.p_type, prog.p_vaddr, prog.p_filesz, prog.p_memsz, prog.p_flags); ppu_segment _seg; - const u32 addr = _seg.addr = vm::cast(prog.p_vaddr, HERE); - const u32 size = _seg.size = ::narrow(prog.p_memsz, "p_memsz" HERE); + const u32 addr = _seg.addr = vm::cast(prog.p_vaddr); + const u32 size = _seg.size = ::narrow(prog.p_memsz); const u32 type = _seg.type = prog.p_type; const u32 flag = _seg.flags = prog.p_flags; - _seg.filesz = ::narrow(prog.p_filesz, "p_filesz" HERE); + _seg.filesz = ::narrow(prog.p_filesz); // Hash big-endian values sha1_update(&sha, reinterpret_cast(&prog.p_type), sizeof(prog.p_type)); @@ -1280,8 +1280,8 @@ void ppu_load_exec(const ppu_exec_object& elf) case 0x00000007: // TLS { tls_vaddr = vm::cast(prog.p_vaddr, HERE); - tls_fsize = ::narrow(prog.p_filesz, "p_filesz" HERE); - tls_vsize = ::narrow(prog.p_memsz, "p_memsz" HERE); + tls_fsize = ::narrow(prog.p_filesz); + tls_vsize = ::narrow(prog.p_memsz); ppu_loader.notice("TLS info segment found: tls-image=*0x%x, image-size=0x%x, tls-size=0x%x", tls_vaddr, tls_fsize, tls_vsize); break; @@ -1647,10 +1647,10 @@ std::shared_ptr ppu_load_overlay(const ppu_exec_object& elf, const ppu_segment _seg; const u32 addr = _seg.addr = vm::cast(prog.p_vaddr, HERE); - const u32 size = _seg.size = ::narrow(prog.p_memsz, "p_memsz" HERE); + const u32 size = _seg.size = ::narrow(prog.p_memsz); const u32 type = _seg.type = prog.p_type; const u32 flag = _seg.flags = prog.p_flags; - _seg.filesz = ::narrow(prog.p_filesz, "p_filesz" HERE); + _seg.filesz = ::narrow(prog.p_filesz); // Hash big-endian values sha1_update(&sha, reinterpret_cast(&prog.p_type), sizeof(prog.p_type)); diff --git a/rpcs3/Emu/Cell/PPUTranslator.cpp b/rpcs3/Emu/Cell/PPUTranslator.cpp index 050d46cab7..8481a4bdc0 100644 --- a/rpcs3/Emu/Cell/PPUTranslator.cpp +++ b/rpcs3/Emu/Cell/PPUTranslator.cpp @@ -409,7 +409,7 @@ void PPUTranslator::FlushRegisters() Value* PPUTranslator::Solid(Value* value) { - const u32 size = ::narrow(+value->getType()->getPrimitiveSizeInBits(), HERE); + const u32 size = ::narrow(+value->getType()->getPrimitiveSizeInBits()); /* Workarounds (casting bool vectors directly may produce invalid code) */ @@ -586,7 +586,7 @@ llvm::Value* PPUTranslator::GetMemory(llvm::Value* addr, llvm::Type* type) Value* PPUTranslator::ReadMemory(Value* addr, Type* type, bool is_be, u32 align) { - const u32 size = ::narrow(+type->getPrimitiveSizeInBits(), HERE); + const u32 size = ::narrow(+type->getPrimitiveSizeInBits()); if (is_be ^ m_is_be && size > 8) { @@ -603,7 +603,7 @@ Value* PPUTranslator::ReadMemory(Value* addr, Type* type, bool is_be, u32 align) void PPUTranslator::WriteMemory(Value* addr, Value* value, bool is_be, u32 align) { const auto type = value->getType(); - const u32 size = ::narrow(+type->getPrimitiveSizeInBits(), HERE); + const u32 size = ::narrow(+type->getPrimitiveSizeInBits()); if (is_be ^ m_is_be && size > 8) { diff --git a/rpcs3/Emu/Cell/SPURecompiler.cpp b/rpcs3/Emu/Cell/SPURecompiler.cpp index f5344d5234..6b0dab6b61 100644 --- a/rpcs3/Emu/Cell/SPURecompiler.cpp +++ b/rpcs3/Emu/Cell/SPURecompiler.cpp @@ -135,7 +135,7 @@ DECLARE(spu_runtime::tr_all) = [] *raw++ = 0x48; *raw++ = 0x8d; *raw++ = 0x15; - const s32 r32 = ::narrow(reinterpret_cast(g_dispatcher) - reinterpret_cast(raw) - 4, HERE); + const s32 r32 = ::narrow(reinterpret_cast(g_dispatcher) - reinterpret_cast(raw) - 4); std::memcpy(raw, &r32, 4); raw += 4; @@ -812,7 +812,7 @@ spu_function_t spu_runtime::rebuild_ubertrampoline(u32 id_inst) if (w.rel32) { // Patch rel32 linking it to the current location if necessary - const s32 r32 = ::narrow(raw - w.rel32, HERE); + const s32 r32 = ::narrow(raw - w.rel32); std::memcpy(w.rel32 - 4, &r32, 4); } diff --git a/rpcs3/Emu/RSX/Common/BufferUtils.cpp b/rpcs3/Emu/RSX/Common/BufferUtils.cpp index a30fb5fcd7..43bc3e5096 100644 --- a/rpcs3/Emu/RSX/Common/BufferUtils.cpp +++ b/rpcs3/Emu/RSX/Common/BufferUtils.cpp @@ -782,7 +782,7 @@ namespace { T min_index, max_index; u32 written; - u32 remaining = ::size32(src, HERE); + u32 remaining = ::size32(src); if (s_use_sse4_1 && remaining >= 32) { @@ -956,7 +956,7 @@ namespace T min_index = index_limit(); T max_index = 0; u32 written = 0; - u32 length = ::size32(src, HERE); + u32 length = ::size32(src); if (length >= 32 && !skip_restart) { diff --git a/rpcs3/Emu/RSX/Overlays/overlay_perf_metrics.cpp b/rpcs3/Emu/RSX/Overlays/overlay_perf_metrics.cpp index 24010501b0..7ef534d3f8 100644 --- a/rpcs3/Emu/RSX/Overlays/overlay_perf_metrics.cpp +++ b/rpcs3/Emu/RSX/Overlays/overlay_perf_metrics.cpp @@ -701,7 +701,7 @@ namespace rsx auto& verts_graph = compiled_resources.draw_commands.back().verts; const f32 x_stride = w * 1.f / m_datapoint_count; - const u32 tail_index_offset = ::size32(m_datapoints, HERE) - m_datapoint_count; + const u32 tail_index_offset = ::size32(m_datapoints) - m_datapoint_count; for (u32 i = 0; i < m_datapoint_count; ++i) { diff --git a/rpcs3/Emu/RSX/RSXThread.cpp b/rpcs3/Emu/RSX/RSXThread.cpp index 42387ad4d6..87176ce2c2 100644 --- a/rpcs3/Emu/RSX/RSXThread.cpp +++ b/rpcs3/Emu/RSX/RSXThread.cpp @@ -241,7 +241,7 @@ namespace rsx } break; default: - ::narrow(tile->comp, "tile->comp" HERE); + ::narrow(tile->comp); } } @@ -290,7 +290,7 @@ namespace rsx } break; default: - ::narrow(tile->comp, "tile->comp" HERE); + ::narrow(tile->comp); } }