| /* ****************************************************************************** | |
| * Copyright (c) 2010-2021 Google, Inc. All rights reserved. | |
| * ******************************************************************************/ | |
| /* | |
| * Redistribution and use in source and binary forms, with or without | |
| * modification, are permitted provided that the following conditions are met: | |
| * | |
| * * Redistributions of source code must retain the above copyright notice, | |
| * this list of conditions and the following disclaimer. | |
| * | |
| * * Redistributions in binary form must reproduce the above copyright notice, | |
| * this list of conditions and the following disclaimer in the documentation | |
| * and/or other materials provided with the distribution. | |
| * | |
| * * Neither the name of Google, Inc. nor the names of its contributors may be | |
| * used to endorse or promote products derived from this software without | |
| * specific prior written permission. | |
| * | |
| * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | |
| * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | |
| * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | |
| * ARE DISCLAIMED. IN NO EVENT SHALL VMWARE, INC. OR CONTRIBUTORS BE LIABLE | |
| * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | |
| * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR | |
| * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER | |
| * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | |
| * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY | |
| * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH | |
| * DAMAGE. | |
| */ | |
| /** | |
| **************************************************************************** | |
| \page page_jitopt JIT Optimization | |
| The [experimental-optimize-jit](https://github.com/DynamoRIO/dynamorio/tree/experimental-optimize-jit) branch was developed during a Google Summer of Code project in 2014 to | |
| address [i#1114](https://github.com/DynamoRIO/dynamorio/issues/1114). For a | |
| detailed description of the implementation, see our paper in | |
| [CGO 2015](http://dl.acm.org/citation.cfm?id=2738610). | |
| # Branch Content | |
| The special handling of DGC appears in the 3 files with the largest change | |
| sets: | |
| - [core/jitopt.c](https://github.com/DynamoRIO/dynamorio/blob/experimental-optimize-jit/core/jitopt.c) (experimental counterpart of [core/jit_opt.c](https://github.com/DynamoRIO/dynamorio/blob/master/core/jit_opt.c) on master) | |
| - manages double-mapped pages (needs to be tested on a recent kernel) | |
| - maintains bookkeeping of DGC fragments in a bucket/hashtable | |
| - selectively flushes fragments as requested by JIT writers | |
| - [core/arch/x86/mangle.c](https://github.com/DynamoRIO/dynamorio/blob/experimental-optimize-jit/core/arch/x86/mangle.c) | |
| - instruments JIT writer instrs to selectively flush fragments as necessary | |
| - [core/vmareas.c](https://github.com/DynamoRIO/dynamorio/blob/experimental-optimize-jit/core/vmareas.c): | |
| - integrates JIT code regions into the vmarea accounting structures | |
| - synchronizes double-mappings with any changes to corresponding vmarea | |
| In core/jitopt.c, the bucket/hashtable was an experimental approach that we | |
| found too difficult to maintain, particularly because the remove operation is | |
| too complicated. The goal of this structure was to allow instrumentation in | |
| the code cache to easily lookup overlapping fragments at any specific address. | |
| That aspect of it is very convenient, but it does not perform any better than | |
| a standard red/black tree, which is much easier to implement and maintain. So | |
| the instrumentation for JIT writers should be refactored to read the red/black | |
| tree instead of the bucket/hashtable. | |
| One consideration for refactoring the instrumentation is that the read is racy | |
| (from the code cache), so the race conditions need to (continue to) fail nicely | |
| with a spurious "not found" instead of crashing with a segfault. This was | |
| accomplished in the prototype using a garbage collector that only flushed the | |
| removed hashtable entries after the last incoming pointer had been redirected | |
| The red/black tree has already been committed to master in | |
| [core/jit_opt.c](https://github.com/DynamoRIO/dynamorio/blob/master/core/jit_opt.c). | |
| Part of the bucket/hashtable was implemented in the files `asmtable.[ch]`, which | |
| have not been included in this experimental branch--those references can be | |
| ignored, since all of that functionality is already replaced by the red/black | |
| tree on master. | |
| The optimization may not perform well when the OS is configured to use huge pages | |
| (or any size larger than 4k). If that becomes a problem, hopefully it will be | |
| possible to maintain the 4k units in the JIT optimization's accounting structures, | |
| even though physical pages are larger. This may become tricky where vmareas | |
| interface with the OS, and also in the double-mappings. | |
| # Commit Workflow | |
| The workflow for this branch is to progressively implement features as | |
| individual commits on the | |
| [project-optimize-jit](https://github.com/DynamoRIO/dynamorio/tree/project-optimize-jit) | |
| branch. Code in the experimental file core/jitopt.c will be selectively migrated | |
| into its master-branch counterpart core/jit_opt.c, and the experimental file | |
| core/jitopt.c will eventually be deleted. | |
| [i#3502](https://github.com/DynamoRIO/dynamorio/issues/3502) tracks this work | |
| in the tracker. | |
| # Code Quality | |
| Please keep in mind that the student who wrote all of the code in this branch | |
| had less than 2 years of experience with the C language, and DynamoRIO is the | |
| only C project he had ever worked on (all of his experience was in Java--not | |
| even C++). While the code is functionally correct, it may exhibit some unusual | |
| structure, and certain annotative elements like const may be used incorrectly. | |
| There are also a few fragments of commented code, along with extensive "release | |
| logging", most of which should probably not be committed to master in any form. | |
| If the logging is useful, it should be converted to use the standard DR logging | |
| mechanism, with a more formal provision for logging in release mode if necessary | |
| (since the Octane benchmarks take multiple days to run in a debug build of DR). | |
| **************************************************************************** | |
| */ |