summaryrefslogtreecommitdiff
path: root/Source/Core/Common/CodeBlock.h
AgeCommit message (Collapse)Author
2024-07-23Cached Interpreter 2.0mitaclaw
It now supports variable-sized data payloads and memory range freeing. It's a little faster, too.
2024-04-22JitArm64: Increase farcode & nearcode cache sizeJosJuice
This is a JitArm64 version of 219610d8a0e5a2c12d074314c6f2e62a4b43d7e4. Due to limitations on how far you can jump with a single AArch64 branch instruction, going above the former limit of 128 MiB of code (counting nearcode and farcode combined) requires a bit of restructuring. With the restructuring in place, the limit now is 256 MiB. See the new large comment in Jit.h for a description of the new memory layout.
2023-10-31Jit64: Recompile asm routines on cache clearJosJuice
This is needed so that the checks added in the previous commit will be reevaluated if the value of m_enable_dcache changes. JitArm64 was already recompiling its asm routines on cache clear by necessity. It doesn't have the same setup as Jit64 where the asm routines are in a separate region, so clearing the JitArm64 cache results in the asm routines being cleared too.
2022-02-12Common/CodeBlock: Call ResetCodePtr when decreasing region_sizeJosJuice
Fixes https://bugs.dolphin-emu.org/issues/12827. A description of what was going wrong: JitArm64::Init first calls CodeBlock::AllocCodeSpace, after which CodeBlock and Arm64Emitter consider us to have 96 MB of code space available. JitArm64::Init then calls AddChildCodeSpace, which is supposed to take 64 MiB of that space and give it to m_far_code. CodeBlock's view of how much space there is gets updated from 96 MiB to 32 MiB, but due to the missing call, Arm64Emitter keeps thinking that it has 96 MiB of space available. The last thing JitArm64::Init does is to call ResetFreeMemoryRanges. This function asks Arm64Emitter how much code space is available and stores a range of that size in m_free_ranges_near, meaning that m_free_ranges_near ends up being backed by both nearcode and farcode! This is a ticking time bomb; as soon as we grab memory from m_free_ranges_near which is backed by farcode, we're in trouble. The crash I ran into in my testing was caused by fastmem code being allocated in farcode (our backpatch handler only handles accesses made from nearcode), but you may as well get errors caused by code intended for nearcode overwriting code intended for farcode or vice versa. So why did NBA Live 2005 crash when most games had no problems, and why was the bug bisected to the commit that increased the size of far code from 16 MiB to 64 MiB? Well, as long as we're only using the first 32 MiB of the big 96 MiB range, everything works. What happens with NBA Live 2005 (I have not investigated exactly through what mechanism this happens) is that at some point the range in m_free_ranges_near gets split into two ranges, one which is backed by nearcode and one which is backed by farcode. Dolphin prefers to select the biggest range available (we don't want to pick a tiny 1 KiB range that may not be able to fit the whole block we're about to emit, after all), and after increasing the size of farcode to 64 MiB, farcode is bigger than nearcode.
2021-07-05treewide: convert GPLv2+ license info to SPDX tagsPierre Bourdon
SPDX standardizes how source code conveys its copyright and licensing information. See https://spdx.github.io/spdx-spec/1-rationale/ . SPDX tags are adopted in many large projects, including things like the Linux kernel.
2020-08-24x64Emitter: Check end of allocated space when emitting code.Admiral H. Curtiss
2018-08-15Fix spelling in assert macroBreadFish64
2018-05-17Common/CodeBlock: Namespace code under the Common namespaceLioncash
Brings more common code under the Common namespace.
2018-03-14Assert: Uppercase assertion macrosLioncash
Macros should be all upper-cased. This is also kind of a wart that's been sticking out for quite a while now (we avoid prefixing underscores).
2017-08-22Remove NonCopyableJosJuice
The class NonCopyable is, like the name says, supposed to disallow copying. But should it allow moving? For a long time, NonCopyable used to not allow moving. (It declared a deleted copy constructor and assigment operator without declaring a move constructor and assignment operator, making the compiler implicitly delete the move constructor and assignment operator.) That's fine if the classes that inherit from NonCopyable don't need to be movable or if writing the move constructor and assignment operator by hand is fine, but that's not the case for all classes, as I discovered when I was working on the DirectoryBlob PR. Because of that, I decided to make NonCopyable movable in c7602cc, allowing me to use NonCopyable in DirectoryBlob.h. That was however an unfortunate decision, because some of the classes that inherit from NonCopyable have incorrect behavior when moved by default- generated move constructors and assignment operators, and do not explicitly delete the move constructors and assignment operators, relying on NonCopyable being non-movable. So what can we do about this? There are four solutions that I can think of: 1. Make NonCopyable non-movable and tell DirectoryBlob to suck it. 2. Keep allowing moving NonCopyable, and expect that classes that don't support moving will delete the move constructor and assignment operator manually. Not only is this inconsistent (having classes disallow copying one way and disallow moving another way), but deleting the move constructor and assignment operator manually is too easy to forget compared to how tricky the resulting problems are. 3. Have one "MovableNonCopyable" and one "NonMovableNonCopyable". It works, but it feels rather silly... 4. Don't have a NonCopyable class at all. Considering that deleting the copy constructor and assignment operator only takes two lines of code, I don't see much of a reason to keep NonCopyable. I suppose that there was more of a point in having NonCopyable back in the pre-C++11 days, when it wasn't possible to use "= delete". I decided to go with the fourth one (like the commit title says). The implementation of the commit is fairly straight-forward, though I would like to point out that I skipped adding "= delete" lines for classes whose only reason for being uncopyable is that they contain uncopyable classes like File::IOFile and std::unique_ptr, because the compiler makes such classes uncopyable automatically.
2017-05-20Remove code for only allocating low memoryJosJuice
This is unnecessary when we have position-independent code.
2017-03-21ConstantPool: Externalize memory allocationMerryMage
2017-03-21CodeBlock: Add support for multiple childrenMerryMage
2017-03-20EmuCodeBlock: Use ConstantPoolMerryMage
2017-01-08CodeBlock: Const correctness for IsInSpaceLioncash
2017-01-07CodeBlock: Get rid of implicit sign-conversion in AllocCodeSpaceLioncash
Size is internally stored as a size_t, so having an int parameter would cause implicit sign-conversion from a signed value to an unsigned value to occur.
2016-08-19Merge pull request #3386 from lioncash/memoryJosJuice
Common: Namespace MemoryUtil
2016-08-07Common: namespace MemoryUtilLioncash
2016-08-06CodeBlock: In-class initialize variablesLioncash
2016-06-24Reformat all the things. Have fun with merge conflicts.Pierre Bourdon
2016-01-21More asterisksmathieui
2015-09-26Common: Move asserts to their own headerLioncash
2015-09-26Common: Move NonCopyable to its own headerLioncash
2015-09-12VertexLoaderX64: fix 2GB warningsTillmann Karras
Unlike the CPU JIT, the vertex loader JIT already emits position-independent code, so all we need to do is disable the warning.
2015-08-12Add support for a CodeBlock holding a child.Ryan Houdek
This is required to make sure two code spaces are relatively close to one another. In this case I need the AArch64 JIT codespace and its farcode space to be within 128MB of one another for branches.
2015-07-15CodeBlock: Add a shared IsAlmostFull functiondegasus
This function shall keep care about the low watermark of code space. If we ran out of space, the JITs shall clear their block cache.
2015-06-14Revert "x64: build a Position-Independent Executable (PIE)"Matthew Parlane
2015-06-04Jit: Make IsInCodeSpace() constLioncash
2015-06-03MemoryUtil: get executable pages near static dataTillmann Karras
and clean up a bit.
2015-05-25Set copyright year to when a file was createdTillmann Karras
2015-05-25Update license headers to GPLv2+Tillmann Karras
2014-04-09Remove dumb CodeBlock duplication in the emitters.Ryan Houdek
Fixes issue 6990. This uses a bit of templating to remove the duplicate code that is the CodeBlocks in each emitter headers. No actual functionality change in this.