├── .github ├── issue_template.md └── pull_request_template.md ├── .gitignore ├── CODE_OF_CONDUCT.md ├── CONTRIBUTING.md ├── LICENSE ├── README.md ├── SECURITY.md ├── deprecate_32_bit ├── Deprecate_32-bit_Proposal_JEP.md └── webrev │ ├── doc │ ├── building.html │ ├── building.html-.html │ ├── building.html.cdiff.html │ ├── building.html.frames.html │ ├── building.html.frames.prev_next.html │ ├── building.html.html │ ├── building.html.lhs.html │ ├── building.html.patch │ ├── building.html.rhs.html │ ├── building.html.sdiff.html │ ├── building.html.udiff.html │ ├── building.md │ ├── building.md-.html │ ├── building.md.cdiff.html │ ├── building.md.frames.html │ ├── building.md.frames.prev_next.html │ ├── building.md.html │ ├── building.md.lhs.html │ ├── building.md.patch │ ├── building.md.rhs.html │ ├── building.md.sdiff.html │ └── building.md.udiff.html │ ├── index.html │ ├── jdk.patch │ ├── make │ └── autoconf │ │ ├── platform.m4 │ │ ├── platform.m4-.html │ │ ├── platform.m4.cdiff.html │ │ ├── platform.m4.frames.html │ │ ├── platform.m4.frames.prev_next.html │ │ ├── platform.m4.html │ │ ├── platform.m4.lhs.html │ │ ├── platform.m4.patch │ │ ├── platform.m4.rhs.html │ │ ├── platform.m4.sdiff.html │ │ └── platform.m4.udiff.html │ ├── nanoduke.ico │ ├── navigation.html │ ├── navigation.js │ └── style.css ├── ergonomics_profiles ├── JVMLS Ergonomics Profile 2023.pdf └── readme.md ├── jdbc_auth_plugin ├── README.md └── jdbc-auth-design.png ├── remove_win32_bit └── jep.md └── stack_allocation ├── Stack_Allocation_JEP.md └── webrev ├── Initial stack allocation prototype.patch ├── index.html ├── nanoduke.ico ├── navigation.html ├── navigation.js ├── src ├── hotspot │ └── share │ │ ├── code │ │ ├── debugInfo.cpp │ │ ├── debugInfo.cpp-.html │ │ ├── debugInfo.cpp.cdiff.html │ │ ├── debugInfo.cpp.frames.html │ │ ├── debugInfo.cpp.frames.prev_next.html │ │ ├── debugInfo.cpp.html │ │ ├── debugInfo.cpp.lhs.html │ │ ├── debugInfo.cpp.patch │ │ ├── debugInfo.cpp.rhs.html │ │ ├── debugInfo.cpp.sdiff.html │ │ ├── debugInfo.cpp.udiff.html │ │ ├── debugInfo.hpp │ │ ├── debugInfo.hpp-.html │ │ ├── debugInfo.hpp.cdiff.html │ │ ├── debugInfo.hpp.frames.html │ │ ├── debugInfo.hpp.frames.prev_next.html │ │ ├── debugInfo.hpp.html │ │ ├── debugInfo.hpp.lhs.html │ │ ├── debugInfo.hpp.patch │ │ ├── debugInfo.hpp.rhs.html │ │ ├── debugInfo.hpp.sdiff.html │ │ └── debugInfo.hpp.udiff.html │ │ ├── compiler │ │ ├── compilerDefinitions.cpp │ │ ├── compilerDefinitions.cpp-.html │ │ ├── compilerDefinitions.cpp.cdiff.html │ │ ├── compilerDefinitions.cpp.frames.html │ │ ├── compilerDefinitions.cpp.frames.prev_next.html │ │ ├── compilerDefinitions.cpp.html │ │ ├── compilerDefinitions.cpp.lhs.html │ │ ├── compilerDefinitions.cpp.patch │ │ ├── compilerDefinitions.cpp.rhs.html │ │ ├── compilerDefinitions.cpp.sdiff.html │ │ ├── compilerDefinitions.cpp.udiff.html │ │ ├── compilerDirectives.hpp │ │ ├── compilerDirectives.hpp-.html │ │ ├── compilerDirectives.hpp.cdiff.html │ │ ├── compilerDirectives.hpp.frames.html │ │ ├── compilerDirectives.hpp.frames.prev_next.html │ │ ├── compilerDirectives.hpp.html │ │ ├── compilerDirectives.hpp.lhs.html │ │ ├── compilerDirectives.hpp.patch │ │ ├── compilerDirectives.hpp.rhs.html │ │ ├── compilerDirectives.hpp.sdiff.html │ │ ├── compilerDirectives.hpp.udiff.html │ │ ├── oopMap.cpp │ │ ├── oopMap.cpp-.html │ │ ├── oopMap.cpp.cdiff.html │ │ ├── oopMap.cpp.frames.html │ │ ├── oopMap.cpp.frames.prev_next.html │ │ ├── oopMap.cpp.html │ │ ├── oopMap.cpp.lhs.html │ │ ├── oopMap.cpp.patch │ │ ├── oopMap.cpp.rhs.html │ │ ├── oopMap.cpp.sdiff.html │ │ ├── oopMap.cpp.udiff.html │ │ ├── oopMap.hpp │ │ ├── oopMap.hpp-.html │ │ ├── oopMap.hpp.cdiff.html │ │ ├── oopMap.hpp.frames.html │ │ ├── oopMap.hpp.frames.prev_next.html │ │ ├── oopMap.hpp.html │ │ ├── oopMap.hpp.lhs.html │ │ ├── oopMap.hpp.patch │ │ ├── oopMap.hpp.rhs.html │ │ ├── oopMap.hpp.sdiff.html │ │ └── oopMap.hpp.udiff.html │ │ ├── gc │ │ ├── g1 │ │ │ └── c2 │ │ │ │ ├── g1BarrierSetC2.cpp │ │ │ │ ├── g1BarrierSetC2.cpp-.html │ │ │ │ ├── g1BarrierSetC2.cpp.cdiff.html │ │ │ │ ├── g1BarrierSetC2.cpp.frames.html │ │ │ │ ├── g1BarrierSetC2.cpp.frames.prev_next.html │ │ │ │ ├── g1BarrierSetC2.cpp.html │ │ │ │ ├── g1BarrierSetC2.cpp.lhs.html │ │ │ │ ├── g1BarrierSetC2.cpp.patch │ │ │ │ ├── g1BarrierSetC2.cpp.rhs.html │ │ │ │ ├── g1BarrierSetC2.cpp.sdiff.html │ │ │ │ ├── g1BarrierSetC2.cpp.udiff.html │ │ │ │ ├── g1BarrierSetC2.hpp │ │ │ │ ├── g1BarrierSetC2.hpp-.html │ │ │ │ ├── g1BarrierSetC2.hpp.cdiff.html │ │ │ │ ├── g1BarrierSetC2.hpp.frames.html │ │ │ │ ├── g1BarrierSetC2.hpp.frames.prev_next.html │ │ │ │ ├── g1BarrierSetC2.hpp.html │ │ │ │ ├── g1BarrierSetC2.hpp.lhs.html │ │ │ │ ├── g1BarrierSetC2.hpp.patch │ │ │ │ ├── g1BarrierSetC2.hpp.rhs.html │ │ │ │ ├── g1BarrierSetC2.hpp.sdiff.html │ │ │ │ └── g1BarrierSetC2.hpp.udiff.html │ │ ├── parallel │ │ │ ├── psParallelCompact.inline.hpp │ │ │ ├── psParallelCompact.inline.hpp-.html │ │ │ ├── psParallelCompact.inline.hpp.cdiff.html │ │ │ ├── psParallelCompact.inline.hpp.frames.html │ │ │ ├── psParallelCompact.inline.hpp.frames.prev_next.html │ │ │ ├── psParallelCompact.inline.hpp.html │ │ │ ├── psParallelCompact.inline.hpp.lhs.html │ │ │ ├── psParallelCompact.inline.hpp.patch │ │ │ ├── psParallelCompact.inline.hpp.rhs.html │ │ │ ├── psParallelCompact.inline.hpp.sdiff.html │ │ │ └── psParallelCompact.inline.hpp.udiff.html │ │ └── shared │ │ │ ├── c2 │ │ │ ├── barrierSetC2.hpp │ │ │ ├── barrierSetC2.hpp-.html │ │ │ ├── barrierSetC2.hpp.cdiff.html │ │ │ ├── barrierSetC2.hpp.frames.html │ │ │ ├── barrierSetC2.hpp.frames.prev_next.html │ │ │ ├── barrierSetC2.hpp.html │ │ │ ├── barrierSetC2.hpp.lhs.html │ │ │ ├── barrierSetC2.hpp.patch │ │ │ ├── barrierSetC2.hpp.rhs.html │ │ │ ├── barrierSetC2.hpp.sdiff.html │ │ │ ├── barrierSetC2.hpp.udiff.html │ │ │ ├── cardTableBarrierSetC2.cpp │ │ │ ├── cardTableBarrierSetC2.cpp-.html │ │ │ ├── cardTableBarrierSetC2.cpp.cdiff.html │ │ │ ├── cardTableBarrierSetC2.cpp.frames.html │ │ │ ├── cardTableBarrierSetC2.cpp.frames.prev_next.html │ │ │ ├── cardTableBarrierSetC2.cpp.html │ │ │ ├── cardTableBarrierSetC2.cpp.lhs.html │ │ │ ├── cardTableBarrierSetC2.cpp.patch │ │ │ ├── cardTableBarrierSetC2.cpp.rhs.html │ │ │ ├── cardTableBarrierSetC2.cpp.sdiff.html │ │ │ ├── cardTableBarrierSetC2.cpp.udiff.html │ │ │ ├── cardTableBarrierSetC2.hpp │ │ │ ├── cardTableBarrierSetC2.hpp-.html │ │ │ ├── cardTableBarrierSetC2.hpp.cdiff.html │ │ │ ├── cardTableBarrierSetC2.hpp.frames.html │ │ │ ├── cardTableBarrierSetC2.hpp.frames.prev_next.html │ │ │ ├── cardTableBarrierSetC2.hpp.html │ │ │ ├── cardTableBarrierSetC2.hpp.lhs.html │ │ │ ├── cardTableBarrierSetC2.hpp.patch │ │ │ ├── cardTableBarrierSetC2.hpp.rhs.html │ │ │ ├── cardTableBarrierSetC2.hpp.sdiff.html │ │ │ └── cardTableBarrierSetC2.hpp.udiff.html │ │ │ ├── cardTable.hpp │ │ │ ├── cardTable.hpp-.html │ │ │ ├── cardTable.hpp.cdiff.html │ │ │ ├── cardTable.hpp.frames.html │ │ │ ├── cardTable.hpp.frames.prev_next.html │ │ │ ├── cardTable.hpp.html │ │ │ ├── cardTable.hpp.lhs.html │ │ │ ├── cardTable.hpp.patch │ │ │ ├── cardTable.hpp.rhs.html │ │ │ ├── cardTable.hpp.sdiff.html │ │ │ └── cardTable.hpp.udiff.html │ │ ├── memory │ │ ├── iterator.cpp │ │ ├── iterator.cpp-.html │ │ ├── iterator.cpp.cdiff.html │ │ ├── iterator.cpp.frames.html │ │ ├── iterator.cpp.frames.prev_next.html │ │ ├── iterator.cpp.html │ │ ├── iterator.cpp.lhs.html │ │ ├── iterator.cpp.patch │ │ ├── iterator.cpp.rhs.html │ │ ├── iterator.cpp.sdiff.html │ │ └── iterator.cpp.udiff.html │ │ ├── opto │ │ ├── block.cpp │ │ ├── block.cpp-.html │ │ ├── block.cpp.cdiff.html │ │ ├── block.cpp.frames.html │ │ ├── block.cpp.frames.prev_next.html │ │ ├── block.cpp.html │ │ ├── block.cpp.lhs.html │ │ ├── block.cpp.patch │ │ ├── block.cpp.rhs.html │ │ ├── block.cpp.sdiff.html │ │ ├── block.cpp.udiff.html │ │ ├── buildOopMap.cpp │ │ ├── buildOopMap.cpp-.html │ │ ├── buildOopMap.cpp.cdiff.html │ │ ├── buildOopMap.cpp.frames.html │ │ ├── buildOopMap.cpp.frames.prev_next.html │ │ ├── buildOopMap.cpp.html │ │ ├── buildOopMap.cpp.lhs.html │ │ ├── buildOopMap.cpp.patch │ │ ├── buildOopMap.cpp.rhs.html │ │ ├── buildOopMap.cpp.sdiff.html │ │ ├── buildOopMap.cpp.udiff.html │ │ ├── c2_globals.hpp │ │ ├── c2_globals.hpp-.html │ │ ├── c2_globals.hpp.cdiff.html │ │ ├── c2_globals.hpp.frames.html │ │ ├── c2_globals.hpp.frames.prev_next.html │ │ ├── c2_globals.hpp.html │ │ ├── c2_globals.hpp.lhs.html │ │ ├── c2_globals.hpp.patch │ │ ├── c2_globals.hpp.rhs.html │ │ ├── c2_globals.hpp.sdiff.html │ │ ├── c2_globals.hpp.udiff.html │ │ ├── callnode.cpp │ │ ├── callnode.cpp-.html │ │ ├── callnode.cpp.cdiff.html │ │ ├── callnode.cpp.frames.html │ │ ├── callnode.cpp.frames.prev_next.html │ │ ├── callnode.cpp.html │ │ ├── callnode.cpp.lhs.html │ │ ├── callnode.cpp.patch │ │ ├── callnode.cpp.rhs.html │ │ ├── callnode.cpp.sdiff.html │ │ ├── callnode.cpp.udiff.html │ │ ├── callnode.hpp │ │ ├── callnode.hpp-.html │ │ ├── callnode.hpp.cdiff.html │ │ ├── callnode.hpp.frames.html │ │ ├── callnode.hpp.frames.prev_next.html │ │ ├── callnode.hpp.html │ │ ├── callnode.hpp.lhs.html │ │ ├── callnode.hpp.patch │ │ ├── callnode.hpp.rhs.html │ │ ├── callnode.hpp.sdiff.html │ │ ├── callnode.hpp.udiff.html │ │ ├── compile.cpp │ │ ├── compile.cpp-.html │ │ ├── compile.cpp.cdiff.html │ │ ├── compile.cpp.frames.html │ │ ├── compile.cpp.frames.prev_next.html │ │ ├── compile.cpp.html │ │ ├── compile.cpp.lhs.html │ │ ├── compile.cpp.patch │ │ ├── compile.cpp.rhs.html │ │ ├── compile.cpp.sdiff.html │ │ ├── compile.cpp.udiff.html │ │ ├── compile.hpp │ │ ├── compile.hpp-.html │ │ ├── compile.hpp.cdiff.html │ │ ├── compile.hpp.frames.html │ │ ├── compile.hpp.frames.prev_next.html │ │ ├── compile.hpp.html │ │ ├── compile.hpp.lhs.html │ │ ├── compile.hpp.patch │ │ ├── compile.hpp.rhs.html │ │ ├── compile.hpp.sdiff.html │ │ ├── compile.hpp.udiff.html │ │ ├── escape.cpp │ │ ├── escape.cpp-.html │ │ ├── escape.cpp.cdiff.html │ │ ├── escape.cpp.frames.html │ │ ├── escape.cpp.frames.prev_next.html │ │ ├── escape.cpp.html │ │ ├── escape.cpp.lhs.html │ │ ├── escape.cpp.patch │ │ ├── escape.cpp.rhs.html │ │ ├── escape.cpp.sdiff.html │ │ ├── escape.cpp.udiff.html │ │ ├── escape.hpp │ │ ├── escape.hpp-.html │ │ ├── escape.hpp.cdiff.html │ │ ├── escape.hpp.frames.html │ │ ├── escape.hpp.frames.prev_next.html │ │ ├── escape.hpp.html │ │ ├── escape.hpp.lhs.html │ │ ├── escape.hpp.patch │ │ ├── escape.hpp.rhs.html │ │ ├── escape.hpp.sdiff.html │ │ ├── escape.hpp.udiff.html │ │ ├── idealKit.cpp │ │ ├── idealKit.cpp-.html │ │ ├── idealKit.cpp.cdiff.html │ │ ├── idealKit.cpp.frames.html │ │ ├── idealKit.cpp.frames.prev_next.html │ │ ├── idealKit.cpp.html │ │ ├── idealKit.cpp.lhs.html │ │ ├── idealKit.cpp.patch │ │ ├── idealKit.cpp.rhs.html │ │ ├── idealKit.cpp.sdiff.html │ │ ├── idealKit.cpp.udiff.html │ │ ├── idealKit.hpp │ │ ├── idealKit.hpp-.html │ │ ├── idealKit.hpp.cdiff.html │ │ ├── idealKit.hpp.frames.html │ │ ├── idealKit.hpp.frames.prev_next.html │ │ ├── idealKit.hpp.html │ │ ├── idealKit.hpp.lhs.html │ │ ├── idealKit.hpp.patch │ │ ├── idealKit.hpp.rhs.html │ │ ├── idealKit.hpp.sdiff.html │ │ ├── idealKit.hpp.udiff.html │ │ ├── loopnode.cpp │ │ ├── loopnode.cpp-.html │ │ ├── loopnode.cpp.cdiff.html │ │ ├── loopnode.cpp.frames.html │ │ ├── loopnode.cpp.frames.prev_next.html │ │ ├── loopnode.cpp.html │ │ ├── loopnode.cpp.lhs.html │ │ ├── loopnode.cpp.patch │ │ ├── loopnode.cpp.rhs.html │ │ ├── loopnode.cpp.sdiff.html │ │ ├── loopnode.cpp.udiff.html │ │ ├── machnode.hpp │ │ ├── machnode.hpp-.html │ │ ├── machnode.hpp.cdiff.html │ │ ├── machnode.hpp.frames.html │ │ ├── machnode.hpp.frames.prev_next.html │ │ ├── machnode.hpp.html │ │ ├── machnode.hpp.lhs.html │ │ ├── machnode.hpp.patch │ │ ├── machnode.hpp.rhs.html │ │ ├── machnode.hpp.sdiff.html │ │ ├── machnode.hpp.udiff.html │ │ ├── macro.cpp │ │ ├── macro.cpp-.html │ │ ├── macro.cpp.cdiff.html │ │ ├── macro.cpp.frames.html │ │ ├── macro.cpp.frames.prev_next.html │ │ ├── macro.cpp.html │ │ ├── macro.cpp.lhs.html │ │ ├── macro.cpp.patch │ │ ├── macro.cpp.rhs.html │ │ ├── macro.cpp.sdiff.html │ │ ├── macro.cpp.udiff.html │ │ ├── macro.hpp │ │ ├── macro.hpp-.html │ │ ├── macro.hpp.cdiff.html │ │ ├── macro.hpp.frames.html │ │ ├── macro.hpp.frames.prev_next.html │ │ ├── macro.hpp.html │ │ ├── macro.hpp.lhs.html │ │ ├── macro.hpp.patch │ │ ├── macro.hpp.rhs.html │ │ ├── macro.hpp.sdiff.html │ │ ├── macro.hpp.udiff.html │ │ ├── memnode.cpp │ │ ├── memnode.cpp-.html │ │ ├── memnode.cpp.cdiff.html │ │ ├── memnode.cpp.frames.html │ │ ├── memnode.cpp.frames.prev_next.html │ │ ├── memnode.cpp.html │ │ ├── memnode.cpp.lhs.html │ │ ├── memnode.cpp.patch │ │ ├── memnode.cpp.rhs.html │ │ ├── memnode.cpp.sdiff.html │ │ ├── memnode.cpp.udiff.html │ │ ├── output.cpp │ │ ├── output.cpp-.html │ │ ├── output.cpp.cdiff.html │ │ ├── output.cpp.frames.html │ │ ├── output.cpp.frames.prev_next.html │ │ ├── output.cpp.html │ │ ├── output.cpp.lhs.html │ │ ├── output.cpp.patch │ │ ├── output.cpp.rhs.html │ │ ├── output.cpp.sdiff.html │ │ └── output.cpp.udiff.html │ │ └── runtime │ │ ├── deoptimization.cpp │ │ ├── deoptimization.cpp-.html │ │ ├── deoptimization.cpp.cdiff.html │ │ ├── deoptimization.cpp.frames.html │ │ ├── deoptimization.cpp.frames.prev_next.html │ │ ├── deoptimization.cpp.html │ │ ├── deoptimization.cpp.lhs.html │ │ ├── deoptimization.cpp.patch │ │ ├── deoptimization.cpp.rhs.html │ │ ├── deoptimization.cpp.sdiff.html │ │ ├── deoptimization.cpp.udiff.html │ │ ├── deoptimization.hpp │ │ ├── deoptimization.hpp-.html │ │ ├── deoptimization.hpp.cdiff.html │ │ ├── deoptimization.hpp.frames.html │ │ ├── deoptimization.hpp.frames.prev_next.html │ │ ├── deoptimization.hpp.html │ │ ├── deoptimization.hpp.lhs.html │ │ ├── deoptimization.hpp.patch │ │ ├── deoptimization.hpp.rhs.html │ │ ├── deoptimization.hpp.sdiff.html │ │ ├── deoptimization.hpp.udiff.html │ │ ├── vframe_hp.cpp │ │ ├── vframe_hp.cpp-.html │ │ ├── vframe_hp.cpp.cdiff.html │ │ ├── vframe_hp.cpp.frames.html │ │ ├── vframe_hp.cpp.frames.prev_next.html │ │ ├── vframe_hp.cpp.html │ │ ├── vframe_hp.cpp.lhs.html │ │ ├── vframe_hp.cpp.patch │ │ ├── vframe_hp.cpp.rhs.html │ │ ├── vframe_hp.cpp.sdiff.html │ │ ├── vframe_hp.cpp.udiff.html │ │ ├── vframe_hp.hpp │ │ ├── vframe_hp.hpp-.html │ │ ├── vframe_hp.hpp.cdiff.html │ │ ├── vframe_hp.hpp.frames.html │ │ ├── vframe_hp.hpp.frames.prev_next.html │ │ ├── vframe_hp.hpp.html │ │ ├── vframe_hp.hpp.lhs.html │ │ ├── vframe_hp.hpp.patch │ │ ├── vframe_hp.hpp.rhs.html │ │ ├── vframe_hp.hpp.sdiff.html │ │ └── vframe_hp.hpp.udiff.html └── java.base │ └── share │ └── classes │ └── java │ └── util │ ├── ArrayList.java │ ├── ArrayList.java-.html │ ├── ArrayList.java.cdiff.html │ ├── ArrayList.java.frames.html │ ├── ArrayList.java.frames.prev_next.html │ ├── ArrayList.java.html │ ├── ArrayList.java.lhs.html │ ├── ArrayList.java.patch │ ├── ArrayList.java.rhs.html │ ├── ArrayList.java.sdiff.html │ ├── ArrayList.java.udiff.html │ └── regex │ ├── Matcher.java │ ├── Matcher.java-.html │ ├── Matcher.java.cdiff.html │ ├── Matcher.java.frames.html │ ├── Matcher.java.frames.prev_next.html │ ├── Matcher.java.html │ ├── Matcher.java.lhs.html │ ├── Matcher.java.patch │ ├── Matcher.java.rhs.html │ ├── Matcher.java.sdiff.html │ └── Matcher.java.udiff.html └── style.css /.github/issue_template.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Proposal issue 3 | about: Use this template for creating proposals. 4 | title: "[DATE]: [PROPOSAL]" 5 | labels: needs triage 6 | assignees: karianna 7 | --- -------------------------------------------------------------------------------- /.github/pull_request_template.md: -------------------------------------------------------------------------------- 1 | Reviewers, please check our [Contributing Guide](../CONTRIBUTING.md) has been followed 2 | before accepting this PR. -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # IDES 2 | .idea/* 3 | .vscode/ 4 | -------------------------------------------------------------------------------- /CODE_OF_CONDUCT.md: -------------------------------------------------------------------------------- 1 | # Microsoft Open Source Code of Conduct 2 | 3 | This project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/). 4 | 5 | Resources: 6 | 7 | - [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/) 8 | - [Microsoft Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) 9 | - Contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with questions or concerns 10 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | Contributing to OpenJDK Proposals 2 | ===== 3 | 4 | # Proposals 5 | Please contact the javaplatformteam@microsoft.com before submitting a PR. 6 | 7 | # Code of Conduct 8 | Please see our [Code of Conduct](CODE_OF_CONDUCT.md). 9 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Please see https://openjdk.java.net/legal/gplv2+ce.html -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # OpenJDK Proposals 2 | A place for Microsoft's Java Engineering Group to put [OpenJDK](https://openjdk.java.net) 3 | JDK Enhancement Proposals, and patches in case we don't have an author space at OpenJDK itself. 4 | 5 | ## Proposals 6 | 7 | 1. [Stack Allocation](./stack_allocation/Stack_Allocation_JEP.md) [(webrev)](https://microsoft.github.io/openjdk-proposals/stack_allocation/webrev/) 8 | 1. [Deprecate the Windows x86-32 port](./deprecate_32_bit/Deprecate_32-bit_Proposal_JEP.md) [(webrev)](https://microsoft.github.io/openjdk-proposals/deprecate_32_bit/webrev/) 9 | 1. [Ergonomics Profiles](./ergonomics_profiles/readme.md) 10 | 11 | ## Notes 12 | Files will be held here on a temporary basis. 13 | 14 | The [LICENSE](LICENSE) matches that of the OpenJDK project. 15 | 16 | Our [Code of Conduct](CODE_OF_CONDUCT.md). 17 | -------------------------------------------------------------------------------- /SECURITY.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | ## Security 4 | 5 | Microsoft takes the security of our software products and services seriously, which includes all source code repositories managed through our GitHub organizations, which include [Microsoft](https://github.com/Microsoft), [Azure](https://github.com/Azure), [DotNet](https://github.com/dotnet), [AspNet](https://github.com/aspnet), [Xamarin](https://github.com/xamarin), and [our GitHub organizations](https://opensource.microsoft.com/). 6 | 7 | If you believe you have found a security vulnerability in any Microsoft-owned repository that meets [Microsoft's definition of a security vulnerability](https://docs.microsoft.com/en-us/previous-versions/tn-archive/cc751383(v=technet.10)), please report it to us as described below. 8 | 9 | ## Reporting Security Issues 10 | 11 | **Please do not report security vulnerabilities through public GitHub issues.** 12 | 13 | Instead, please report them to the Microsoft Security Response Center (MSRC) at [https://msrc.microsoft.com/create-report](https://msrc.microsoft.com/create-report). 14 | 15 | If you prefer to submit without logging in, send email to [secure@microsoft.com](mailto:secure@microsoft.com). If possible, encrypt your message with our PGP key; please download it from the [Microsoft Security Response Center PGP Key page](https://www.microsoft.com/en-us/msrc/pgp-key-msrc). 16 | 17 | You should receive a response within 24 hours. If for some reason you do not, please follow up via email to ensure we received your original message. Additional information can be found at [microsoft.com/msrc](https://www.microsoft.com/msrc). 18 | 19 | Please include the requested information listed below (as much as you can provide) to help us better understand the nature and scope of the possible issue: 20 | 21 | * Type of issue (e.g. buffer overflow, SQL injection, cross-site scripting, etc.) 22 | * Full paths of source file(s) related to the manifestation of the issue 23 | * The location of the affected source code (tag/branch/commit or direct URL) 24 | * Any special configuration required to reproduce the issue 25 | * Step-by-step instructions to reproduce the issue 26 | * Proof-of-concept or exploit code (if possible) 27 | * Impact of the issue, including how an attacker might exploit the issue 28 | 29 | This information will help us triage your report more quickly. 30 | 31 | If you are reporting for a bug bounty, more complete reports can contribute to a higher bounty award. Please visit our [Microsoft Bug Bounty Program](https://microsoft.com/msrc/bounty) page for more details about our active programs. 32 | 33 | ## Preferred Languages 34 | 35 | We prefer all communications to be in English. 36 | 37 | ## Policy 38 | 39 | Microsoft follows the principle of [Coordinated Vulnerability Disclosure](https://www.microsoft.com/en-us/msrc/cvd). 40 | 41 | -------------------------------------------------------------------------------- /deprecate_32_bit/webrev/doc/building.html.cdiff.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Cdiff doc/building.html 6 | 7 | 8 | 9 |
< prev index next >

doc/building.html

10 | Print this page 11 |
12 |
13 | *** 319,10 ***
14 | --- 319,11 ---
15 |   GB of RAM. (The more cores to use, the more memory you need.) At least 6
16 |   GB of free disk space is required.</p>
17 |   <p>Even for 32-bit builds, it is recommended to use a 64-bit build
18 |   machine, and instead create a 32-bit target using
19 |   <code>--with-target-bits=32</code>.</p>
20 | + <p>Note: The Windows x86 port is deprecated.</p>
21 |   <h3 id="building-on-aarch64">Building on aarch64</h3>
22 |   <p>At a minimum, a machine with 8 cores is advisable, as well as 8 GB of
23 |   RAM. (The more cores to use, the more memory you need.) At least 6 GB of
24 |   free disk space is required.</p>
25 |   <p>If you do not have access to sufficiently powerful hardware, it is
26 | 
27 |
28 |
29 | *** 395,10 ***
30 | --- 396,11 ---
31 |   than <code>C:\git\jdk\Makefile</code>. This rule also applies to input
32 |   to the build system, e.g. in arguments to <code>configure</code>. So,
33 |   use <code>--with-msvcr-dll=/cygdrive/c/msvcr100.dll</code> rather than
34 |   <code>--with-msvcr-dll=c:\msvcr100.dll</code>. For details on this
35 |   conversion, see the section on <a href="#fixpath">Fixpath</a>.</p>
36 | + <p>Note: The Windows x86 port is deprecated.</p>
37 |   <h4 id="cygwin">Cygwin</h4>
38 |   <p>A functioning <a href="http://www.cygwin.com/">Cygwin</a> environment
39 |   is required for building the JDK on Windows. If you have a 64-bit OS, we
40 |   strongly recommend using the 64-bit version of Cygwin.</p>
41 |   <p><strong>Note:</strong> Cygwin has a model of continuously updating
42 | 
43 |
< prev index next >
44 | -------------------------------------------------------------------------------- /deprecate_32_bit/webrev/doc/building.html.frames.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Frames doc/building.html 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /deprecate_32_bit/webrev/doc/building.html.frames.prev_next.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Frames doc/building.html 6 | 7 | 8 |
< prev index next >
9 | -------------------------------------------------------------------------------- /deprecate_32_bit/webrev/doc/building.html.patch: -------------------------------------------------------------------------------- 1 | diff a/doc/building.html b/doc/building.html 2 | --- a/doc/building.html 3 | +++ b/doc/building.html 4 | @@ -319,10 +319,11 @@ 5 | GB of RAM. (The more cores to use, the more memory you need.) At least 6 6 | GB of free disk space is required.

7 |

Even for 32-bit builds, it is recommended to use a 64-bit build 8 | machine, and instead create a 32-bit target using 9 | --with-target-bits=32.

10 | +

Note: The Windows x86 port is deprecated.

11 |

Building on aarch64

12 |

At a minimum, a machine with 8 cores is advisable, as well as 8 GB of 13 | RAM. (The more cores to use, the more memory you need.) At least 6 GB of 14 | free disk space is required.

15 |

If you do not have access to sufficiently powerful hardware, it is 16 | @@ -395,10 +396,11 @@ 17 | than C:\git\jdk\Makefile. This rule also applies to input 18 | to the build system, e.g. in arguments to configure. So, 19 | use --with-msvcr-dll=/cygdrive/c/msvcr100.dll rather than 20 | --with-msvcr-dll=c:\msvcr100.dll. For details on this 21 | conversion, see the section on Fixpath.

22 | +

Note: The Windows x86 port is deprecated.

23 |

Cygwin

24 |

A functioning Cygwin environment 25 | is required for building the JDK on Windows. If you have a 64-bit OS, we 26 | strongly recommend using the 64-bit version of Cygwin.

27 |

Note: Cygwin has a model of continuously updating 28 | -------------------------------------------------------------------------------- /deprecate_32_bit/webrev/doc/building.html.udiff.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Udiff doc/building.html 6 | 7 | 8 | 9 |

< prev index next >

doc/building.html

10 | Print this page 11 |
12 |
13 | @@ -319,10 +319,11 @@
14 |   GB of RAM. (The more cores to use, the more memory you need.) At least 6
15 |   GB of free disk space is required.</p>
16 |   <p>Even for 32-bit builds, it is recommended to use a 64-bit build
17 |   machine, and instead create a 32-bit target using
18 |   <code>--with-target-bits=32</code>.</p>
19 | + <p>Note: The Windows x86 port is deprecated.</p>
20 |   <h3 id="building-on-aarch64">Building on aarch64</h3>
21 |   <p>At a minimum, a machine with 8 cores is advisable, as well as 8 GB of
22 |   RAM. (The more cores to use, the more memory you need.) At least 6 GB of
23 |   free disk space is required.</p>
24 |   <p>If you do not have access to sufficiently powerful hardware, it is
25 | 
26 |
27 |
28 | @@ -395,10 +396,11 @@
29 |   than <code>C:\git\jdk\Makefile</code>. This rule also applies to input
30 |   to the build system, e.g. in arguments to <code>configure</code>. So,
31 |   use <code>--with-msvcr-dll=/cygdrive/c/msvcr100.dll</code> rather than
32 |   <code>--with-msvcr-dll=c:\msvcr100.dll</code>. For details on this
33 |   conversion, see the section on <a href="#fixpath">Fixpath</a>.</p>
34 | + <p>Note: The Windows x86 port is deprecated.</p>
35 |   <h4 id="cygwin">Cygwin</h4>
36 |   <p>A functioning <a href="http://www.cygwin.com/">Cygwin</a> environment
37 |   is required for building the JDK on Windows. If you have a 64-bit OS, we
38 |   strongly recommend using the 64-bit version of Cygwin.</p>
39 |   <p><strong>Note:</strong> Cygwin has a model of continuously updating
40 | 
41 |
< prev index next >
42 | -------------------------------------------------------------------------------- /deprecate_32_bit/webrev/doc/building.md.cdiff.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Cdiff doc/building.md 6 | 7 | 8 | 9 |
< prev index next >

doc/building.md

10 | Print this page 11 |
12 |
13 | *** 124,10 ***
14 | --- 124,12 ---
15 |   space is required.
16 |   
17 |   Even for 32-bit builds, it is recommended to use a 64-bit build machine, and
18 |   instead create a 32-bit target using `--with-target-bits=32`.
19 |   
20 | + Note: The Widows x86 port is deprecated.
21 | + 
22 |   ### Building on aarch64
23 |   
24 |   At a minimum, a machine with 8 cores is advisable, as well as 8 GB of RAM.
25 |   (The more cores to use, the more memory you need.) At least 6 GB of free disk
26 |   space is required.
27 | 
28 |
29 |
30 | *** 197,10 ***
31 | --- 199,12 ---
32 |   rule also applies to input to the build system, e.g. in arguments to
33 |   `configure`. So, use `--with-msvcr-dll=/cygdrive/c/msvcr100.dll` rather than
34 |   `--with-msvcr-dll=c:\msvcr100.dll`. For details on this conversion, see the section
35 |   on [Fixpath](#fixpath).
36 |   
37 | + Note: The Widows x86 port is deprecated.
38 | + 
39 |   #### Cygwin
40 |   
41 |   A functioning [Cygwin](http://www.cygwin.com/) environment is required for
42 |   building the JDK on Windows. If you have a 64-bit OS, we strongly recommend
43 |   using the 64-bit version of Cygwin.
44 | 
45 |
< prev index next >
46 | -------------------------------------------------------------------------------- /deprecate_32_bit/webrev/doc/building.md.frames.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Frames doc/building.md 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /deprecate_32_bit/webrev/doc/building.md.frames.prev_next.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Frames doc/building.md 6 | 7 | 8 |
< prev index next >
9 | -------------------------------------------------------------------------------- /deprecate_32_bit/webrev/doc/building.md.patch: -------------------------------------------------------------------------------- 1 | diff a/doc/building.md b/doc/building.md 2 | --- a/doc/building.md 3 | +++ b/doc/building.md 4 | @@ -124,10 +124,12 @@ 5 | space is required. 6 | 7 | Even for 32-bit builds, it is recommended to use a 64-bit build machine, and 8 | instead create a 32-bit target using `--with-target-bits=32`. 9 | 10 | +Note: The Widows x86 port is deprecated. 11 | + 12 | ### Building on aarch64 13 | 14 | At a minimum, a machine with 8 cores is advisable, as well as 8 GB of RAM. 15 | (The more cores to use, the more memory you need.) At least 6 GB of free disk 16 | space is required. 17 | @@ -197,10 +199,12 @@ 18 | rule also applies to input to the build system, e.g. in arguments to 19 | `configure`. So, use `--with-msvcr-dll=/cygdrive/c/msvcr100.dll` rather than 20 | `--with-msvcr-dll=c:\msvcr100.dll`. For details on this conversion, see the section 21 | on [Fixpath](#fixpath). 22 | 23 | +Note: The Widows x86 port is deprecated. 24 | + 25 | #### Cygwin 26 | 27 | A functioning [Cygwin](http://www.cygwin.com/) environment is required for 28 | building the JDK on Windows. If you have a 64-bit OS, we strongly recommend 29 | using the 64-bit version of Cygwin. 30 | -------------------------------------------------------------------------------- /deprecate_32_bit/webrev/doc/building.md.udiff.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Udiff doc/building.md 6 | 7 | 8 | 9 |
< prev index next >

doc/building.md

10 | Print this page 11 |
12 |
13 | @@ -124,10 +124,12 @@
14 |   space is required.
15 |   
16 |   Even for 32-bit builds, it is recommended to use a 64-bit build machine, and
17 |   instead create a 32-bit target using `--with-target-bits=32`.
18 |   
19 | + Note: The Widows x86 port is deprecated.
20 | + 
21 |   ### Building on aarch64
22 |   
23 |   At a minimum, a machine with 8 cores is advisable, as well as 8 GB of RAM.
24 |   (The more cores to use, the more memory you need.) At least 6 GB of free disk
25 |   space is required.
26 | 
27 |
28 |
29 | @@ -197,10 +199,12 @@
30 |   rule also applies to input to the build system, e.g. in arguments to
31 |   `configure`. So, use `--with-msvcr-dll=/cygdrive/c/msvcr100.dll` rather than
32 |   `--with-msvcr-dll=c:\msvcr100.dll`. For details on this conversion, see the section
33 |   on [Fixpath](#fixpath).
34 |   
35 | + Note: The Widows x86 port is deprecated.
36 | + 
37 |   #### Cygwin
38 |   
39 |   A functioning [Cygwin](http://www.cygwin.com/) environment is required for
40 |   building the JDK on Windows. If you have a 64-bit OS, we strongly recommend
41 |   using the 64-bit version of Cygwin.
42 | 
43 |
< prev index next >
44 | -------------------------------------------------------------------------------- /deprecate_32_bit/webrev/make/autoconf/platform.m4.cdiff.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Cdiff make/autoconf/platform.m4 6 | 7 | 8 | 9 |
< prev index next >

make/autoconf/platform.m4

10 | Print this page 11 |
12 |
13 | *** 654,10 ***
14 | --- 654,26 ---
15 |     PLATFORM_EXTRACT_TARGET_AND_BUILD
16 |     PLATFORM_SETUP_TARGET_CPU_BITS
17 |     PLATFORM_SET_MODULE_TARGET_OS_VALUES
18 |     PLATFORM_SET_RELEASE_FILE_OS_VALUES
19 |     PLATFORM_SETUP_LEGACY_VARS
20 | +   PLATFORM_CHECK_DEPRECATION
21 | + ])
22 | + 
23 | + AC_DEFUN_ONCE([PLATFORM_CHECK_DEPRECATION],
24 | + [
25 | +   AC_ARG_ENABLE(deprecated-ports, [AS_HELP_STRING([--enable-deprecated-ports@<:@=yes/no@:>@],
26 | +        [Suppress the error when configuring for a deprecated port @<:@no@:>@])])
27 | +   AC_REQUIRE([PLATFORM_EXTRACT_TARGET_AND_BUILD])
28 | +   if test "x$OPENJDK_TARGET_OS" = xwindows && test "x$OPENJDK_TARGET_CPU_ARCH" = xx86; then
29 | +     if test "x$enable_deprecated_ports" = "xyes"; then
30 | +       AC_MSG_WARN([The Windows x86-32 port is deprecated and may be removed in a future release.])
31 | +     else
32 | +       AC_MSG_ERROR(m4_normalize([The Windows x86-32 port is deprecated and may be removed in a future release.
33 | +         Use --enable-deprecated-ports=yes to suppress this error.]))
34 | +     fi
35 | +   fi
36 |   ])
37 |   
38 |   AC_DEFUN_ONCE([PLATFORM_SETUP_OPENJDK_BUILD_OS_VERSION],
39 |   [
40 |     ###############################################################################
41 | 
42 |
< prev index next >
43 | -------------------------------------------------------------------------------- /deprecate_32_bit/webrev/make/autoconf/platform.m4.frames.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Frames make/autoconf/platform.m4 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /deprecate_32_bit/webrev/make/autoconf/platform.m4.frames.prev_next.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Frames make/autoconf/platform.m4 6 | 7 | 8 |
< prev index next >
9 | -------------------------------------------------------------------------------- /deprecate_32_bit/webrev/make/autoconf/platform.m4.patch: -------------------------------------------------------------------------------- 1 | diff a/make/autoconf/platform.m4 b/make/autoconf/platform.m4 2 | --- a/make/autoconf/platform.m4 3 | +++ b/make/autoconf/platform.m4 4 | @@ -654,10 +654,26 @@ 5 | PLATFORM_EXTRACT_TARGET_AND_BUILD 6 | PLATFORM_SETUP_TARGET_CPU_BITS 7 | PLATFORM_SET_MODULE_TARGET_OS_VALUES 8 | PLATFORM_SET_RELEASE_FILE_OS_VALUES 9 | PLATFORM_SETUP_LEGACY_VARS 10 | + PLATFORM_CHECK_DEPRECATION 11 | +]) 12 | + 13 | +AC_DEFUN_ONCE([PLATFORM_CHECK_DEPRECATION], 14 | +[ 15 | + AC_ARG_ENABLE(deprecated-ports, [AS_HELP_STRING([--enable-deprecated-ports@<:@=yes/no@:>@], 16 | + [Suppress the error when configuring for a deprecated port @<:@no@:>@])]) 17 | + AC_REQUIRE([PLATFORM_EXTRACT_TARGET_AND_BUILD]) 18 | + if test "x$OPENJDK_TARGET_OS" = xwindows && test "x$OPENJDK_TARGET_CPU_ARCH" = xx86; then 19 | + if test "x$enable_deprecated_ports" = "xyes"; then 20 | + AC_MSG_WARN([The Windows x86-32 port is deprecated and may be removed in a future release.]) 21 | + else 22 | + AC_MSG_ERROR(m4_normalize([The Windows x86-32 port is deprecated and may be removed in a future release. 23 | + Use --enable-deprecated-ports=yes to suppress this error.])) 24 | + fi 25 | + fi 26 | ]) 27 | 28 | AC_DEFUN_ONCE([PLATFORM_SETUP_OPENJDK_BUILD_OS_VERSION], 29 | [ 30 | ############################################################################### 31 | -------------------------------------------------------------------------------- /deprecate_32_bit/webrev/make/autoconf/platform.m4.udiff.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Udiff make/autoconf/platform.m4 6 | 7 | 8 | 9 |
< prev index next >

make/autoconf/platform.m4

10 | Print this page 11 |
12 |
13 | @@ -654,10 +654,26 @@
14 |     PLATFORM_EXTRACT_TARGET_AND_BUILD
15 |     PLATFORM_SETUP_TARGET_CPU_BITS
16 |     PLATFORM_SET_MODULE_TARGET_OS_VALUES
17 |     PLATFORM_SET_RELEASE_FILE_OS_VALUES
18 |     PLATFORM_SETUP_LEGACY_VARS
19 | +   PLATFORM_CHECK_DEPRECATION
20 | + ])
21 | + 
22 | + AC_DEFUN_ONCE([PLATFORM_CHECK_DEPRECATION],
23 | + [
24 | +   AC_ARG_ENABLE(deprecated-ports, [AS_HELP_STRING([--enable-deprecated-ports@<:@=yes/no@:>@],
25 | +        [Suppress the error when configuring for a deprecated port @<:@no@:>@])])
26 | +   AC_REQUIRE([PLATFORM_EXTRACT_TARGET_AND_BUILD])
27 | +   if test "x$OPENJDK_TARGET_OS" = xwindows && test "x$OPENJDK_TARGET_CPU_ARCH" = xx86; then
28 | +     if test "x$enable_deprecated_ports" = "xyes"; then
29 | +       AC_MSG_WARN([The Windows x86-32 port is deprecated and may be removed in a future release.])
30 | +     else
31 | +       AC_MSG_ERROR(m4_normalize([The Windows x86-32 port is deprecated and may be removed in a future release.
32 | +         Use --enable-deprecated-ports=yes to suppress this error.]))
33 | +     fi
34 | +   fi
35 |   ])
36 |   
37 |   AC_DEFUN_ONCE([PLATFORM_SETUP_OPENJDK_BUILD_OS_VERSION],
38 |   [
39 |     ###############################################################################
40 | 
41 |
< prev index next >
42 | -------------------------------------------------------------------------------- /deprecate_32_bit/webrev/nanoduke.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/openjdk-proposals/b8c7737a46e63b8709ce93812a96a5c6dffa8fea/deprecate_32_bit/webrev/nanoduke.ico -------------------------------------------------------------------------------- /deprecate_32_bit/webrev/style.css: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2019, Oracle and/or its affiliates. All rights reserved. 3 | * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 | * 5 | * This code is free software; you can redistribute it and/or modify it 6 | * under the terms of the GNU General Public License version 2 only, as 7 | * published by the Free Software Foundation. 8 | * 9 | * This code is distributed in the hope that it will be useful, but WITHOUT 10 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11 | * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 12 | * version 2 for more details (a copy is included in the LICENSE file that 13 | * accompanied this code). 14 | * 15 | * You should have received a copy of the GNU General Public License version 16 | * 2 along with this work; if not, write to the Free Software Foundation, 17 | * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 18 | * 19 | * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 20 | * or visit www.oracle.com if you need additional information or have any 21 | * questions. 22 | */ 23 | 24 | body { 25 | background-color: #eeeeee; 26 | } 27 | 28 | span.line-old-header { 29 | color: red; 30 | font-size: large; 31 | font-weight: bold; 32 | } 33 | 34 | span.line-new-header { 35 | color: green; 36 | font-size: large; 37 | font-weight: bold; 38 | } 39 | 40 | span.line-added { 41 | color: blue; 42 | font-weight: bold; 43 | } 44 | 45 | span.line-modified { 46 | color: blue; 47 | } 48 | 49 | span.line-removed { 50 | color: brown; 51 | } 52 | 53 | span.udiff-line-added { 54 | color: blue; 55 | } 56 | 57 | span.udiff-line-modified-added { 58 | color: blue; 59 | } 60 | 61 | span.udiff-line-removed { 62 | color: brown; 63 | } 64 | 65 | span.udiff-line-modified-removed { 66 | color: brown; 67 | } 68 | 69 | span.file-modified { 70 | font-weight: bold; 71 | } 72 | 73 | span.file-renamed { 74 | font-style: italic; 75 | } 76 | 77 | span.file-added { 78 | color: green; 79 | font-weight: bold; 80 | } 81 | 82 | span.file-removed { 83 | color: red; 84 | font-weight: bold; 85 | } 86 | 87 | hr { 88 | border: none 0; 89 | border-top: 1px solid #aaa; 90 | height: 1px; 91 | } 92 | 93 | table.navigation { 94 | width: 100%; 95 | border: 0; 96 | align: center; 97 | } 98 | 99 | td.button { 100 | padding-left: 5px; 101 | padding-right: 5px; 102 | background-color: #eee; 103 | text-align: center; 104 | border: 1px #444 outset; 105 | cursor: pointer; 106 | } 107 | 108 | td.button a { 109 | font-weight: bold; 110 | color: black 111 | } 112 | 113 | td.button:hover { 114 | background: #ffcc99; 115 | } 116 | 117 | div.summary { 118 | font-size: .8em; 119 | border-bottom: 1px solid #aaa; 120 | padding-left: 1em; 121 | padding-right: 1em; 122 | } 123 | 124 | h2.summary { 125 | margin-bottom: 0.3em; 126 | } 127 | 128 | table.summary { 129 | white-space: nowrap; 130 | } 131 | 132 | table.summary th { 133 | vertical-align: top; 134 | text-align: right; 135 | } 136 | 137 | span.stat { 138 | font-size: .7em; 139 | } 140 | 141 | p.version { 142 | font-size: small; 143 | } 144 | -------------------------------------------------------------------------------- /ergonomics_profiles/JVMLS Ergonomics Profile 2023.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/openjdk-proposals/b8c7737a46e63b8709ce93812a96a5c6dffa8fea/ergonomics_profiles/JVMLS Ergonomics Profile 2023.pdf -------------------------------------------------------------------------------- /jdbc_auth_plugin/jdbc-auth-design.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/openjdk-proposals/b8c7737a46e63b8709ce93812a96a5c6dffa8fea/jdbc_auth_plugin/jdbc-auth-design.png -------------------------------------------------------------------------------- /remove_win32_bit/jep.md: -------------------------------------------------------------------------------- 1 | # JEP NNN: Remove the Windows 32-bit x86 Port 2 | 3 | _Author_ Bruno Borges & George Adams 4 | 5 | _Owner_ Bruno Borges 6 | 7 | _Type_ Feature 8 | 9 | _Scope_ Implementation 10 | 11 | _Status_ Draft 12 | 13 | _Release_ 23 14 | 15 | _Component_ hotspot / other 16 | 17 | _Discussion_ jdk dash dev at openjdk dot org 18 | 19 | _Effort_ ? 20 | 21 | _Duration_ ? 22 | 23 | _Reviewed by_ Magnus Ihse Bursie 24 | 25 | _Endorsed by_ Magnus Ihse Bursie 26 | 27 | _Created_ 28 | 29 | _Updated_ 30 | 31 | _Issue_ 32 | 33 | Summary 34 | ------- 35 | 36 | Remove the source code and build support for the Windows 32-bit x86 port. This port was deprecated for removal in JDK 21 with the express intent to remove it in a future release. 37 | 38 | Goals 39 | ----- 40 | 41 | - Remove all code paths that apply only to Windows 32-bit x86. 42 | - Cease all testing and development efforts targeting the Windows 32-bit x86 platform. 43 | - Simplify the JDK's build and test infrastructure. 44 | 45 | Non-Goals 46 | --------- 47 | 48 | - It is not a goal to remove or change 32-bit support for any platforms other than Windows. 49 | - It is not a goal to remove either code or support for Windows 32-bit in previous releases. 50 | 51 | Motivation 52 | ---------- 53 | 54 | - Allow contributors in the OpenJDK Community to accelerate the development of new features and enhancements that will move the platform forward. 55 | - The implementation of [JEP 436 (Virtual Threads)](https://openjdk.org/jeps/436) for Windows x86-32 falls back to the use of kernel threads and therefore does not bring the expected benefits of Project Loom. 56 | - Windows 10, the last Windows operating system to support 32-bit operation, will reach End of Life in [October 2025](https://learn.microsoft.com/lifecycle/products/windows-10-home-and-pro). 57 | 58 | Description 59 | ----------- 60 | 61 | - Find and remove all code paths in the code base that apply only to Windows 32-bit. 62 | - Modify the JDK build system to remove support for compiling on Windows 32-bit platforms, and halt testing activities for this architecture. 63 | - Update the JDK documentation to reflect the removal of Windows 32-bit support, and publicize this change so as to ensure a smooth transition for users and developers. 64 | 65 | Risks and Assumptions 66 | --------------------- 67 | 68 | Some users may still rely on 32-bit Java applications on Windows. This change requires Java applications running on 32-bit Windows to migrate to a 64-bit JDK and Windows environment, or else remain on legacy versions of the JDK, prior to JDK 23, which still include 32-bit support. Transition guidance and support by distributions and vendors of JDK binaries will be critical. 69 | -------------------------------------------------------------------------------- /stack_allocation/webrev/nanoduke.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/openjdk-proposals/b8c7737a46e63b8709ce93812a96a5c6dffa8fea/stack_allocation/webrev/nanoduke.ico -------------------------------------------------------------------------------- /stack_allocation/webrev/src/hotspot/share/code/debugInfo.cpp.frames.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Frames src/hotspot/share/code/debugInfo.cpp 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /stack_allocation/webrev/src/hotspot/share/code/debugInfo.cpp.frames.prev_next.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Frames src/hotspot/share/code/debugInfo.cpp 6 | 7 | 8 |
< prev index next >
9 | -------------------------------------------------------------------------------- /stack_allocation/webrev/src/hotspot/share/code/debugInfo.hpp.frames.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Frames src/hotspot/share/code/debugInfo.hpp 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /stack_allocation/webrev/src/hotspot/share/code/debugInfo.hpp.frames.prev_next.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Frames src/hotspot/share/code/debugInfo.hpp 6 | 7 | 8 |
< prev index next >
9 | -------------------------------------------------------------------------------- /stack_allocation/webrev/src/hotspot/share/code/debugInfo.hpp.patch: -------------------------------------------------------------------------------- 1 | diff a/src/hotspot/share/code/debugInfo.hpp b/src/hotspot/share/code/debugInfo.hpp 2 | --- a/src/hotspot/share/code/debugInfo.hpp 3 | +++ b/src/hotspot/share/code/debugInfo.hpp 4 | @@ -143,12 +143,14 @@ 5 | bool is_visited() const { return _visited; } 6 | 7 | void set_value(oop value); 8 | void set_visited(bool visited) { _visited = false; } 9 | 10 | + virtual bool is_stack_object() { return false; } 11 | + 12 | // Serialization of debugging information 13 | - void read_object(DebugInfoReadStream* stream); 14 | + virtual void read_object(DebugInfoReadStream* stream); 15 | void write_on(DebugInfoWriteStream* stream); 16 | 17 | // Printing 18 | void print_on(outputStream* st) const; 19 | void print_fields_on(outputStream* st) const; 20 | @@ -183,10 +185,29 @@ 21 | 22 | // Printing 23 | void print_on(outputStream* st) const; 24 | }; 25 | 26 | +class StackObjectValue: public ObjectValue { 27 | +private: 28 | + Location _location; 29 | + ConstantIntValue *_field_length; 30 | +public: 31 | + StackObjectValue(int id, ScopeValue* klass, Location location, ConstantIntValue *field_length); 32 | + StackObjectValue(int id) : ObjectValue(id), _location(), _field_length(NULL) { } 33 | + 34 | + Location get_stack_location() { return _location; } 35 | + ConstantIntValue* get_field_length() { return _field_length; } 36 | + 37 | + bool is_stack_object(){ return true; } 38 | + 39 | + // Serialization of debugging information 40 | + void read_object(DebugInfoReadStream* stream); 41 | + void write_on(DebugInfoWriteStream* stream); 42 | +}; 43 | + 44 | + 45 | class ConstantLongValue: public ScopeValue { 46 | private: 47 | jlong _value; 48 | public: 49 | ConstantLongValue(jlong value) { _value = value; } 50 | @@ -302,11 +323,11 @@ 51 | Method* o = (Method*)(code()->metadata_at(read_int())); 52 | // is_metadata() is a faster check than is_metaspace_object() 53 | assert(o == NULL || o->is_metadata(), "meta data only"); 54 | return o; 55 | } 56 | - ScopeValue* read_object_value(bool is_auto_box); 57 | + ScopeValue* read_object_value(int type); 58 | ScopeValue* get_cached_object(); 59 | // BCI encoding is mostly unsigned, but -1 is a distinguished value 60 | int read_bci() { return read_int() + InvocationEntryBci; } 61 | }; 62 | 63 | -------------------------------------------------------------------------------- /stack_allocation/webrev/src/hotspot/share/compiler/compilerDefinitions.cpp.cdiff.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Cdiff src/hotspot/share/compiler/compilerDefinitions.cpp 6 | 7 | 8 | 9 |
< prev index next >

src/hotspot/share/compiler/compilerDefinitions.cpp

10 | Print this page 11 |
12 |
13 | *** 520,10 ***
14 | --- 520,19 ---
15 |     }
16 |     if (FLAG_IS_DEFAULT(LoopStripMiningIterShortLoop)) {
17 |       // blind guess
18 |       LoopStripMiningIterShortLoop = LoopStripMiningIter / 10;
19 |     }
20 | +   if (UseStackAllocation) {
21 | +     if (!(UseSerialGC || UseParallelGC || UseG1GC)) {
22 | +       vm_exit_during_initialization("UseStackAllocation is not supported with selected GC", GCConfig::hs_err_name());
23 | +       FLAG_SET_DEFAULT(UseStackAllocation, false);
24 | +       FLAG_SET_ERGO(UseStackAllocationRuntime, false);
25 | +     } else {
26 | +       FLAG_SET_ERGO(UseStackAllocationRuntime, true);
27 | +     }
28 | +   }
29 |   #endif // COMPILER2
30 |   }
31 |   
32 |   static CompLevel highest_compile_level() {
33 |     return TieredCompilation ? MIN2((CompLevel) TieredStopAtLevel, CompLevel_highest_tier) : CompLevel_highest_tier;
34 | 
35 |
< prev index next >
36 | -------------------------------------------------------------------------------- /stack_allocation/webrev/src/hotspot/share/compiler/compilerDefinitions.cpp.frames.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Frames src/hotspot/share/compiler/compilerDefinitions.cpp 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /stack_allocation/webrev/src/hotspot/share/compiler/compilerDefinitions.cpp.frames.prev_next.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Frames src/hotspot/share/compiler/compilerDefinitions.cpp 6 | 7 | 8 |
< prev index next >
9 | -------------------------------------------------------------------------------- /stack_allocation/webrev/src/hotspot/share/compiler/compilerDefinitions.cpp.patch: -------------------------------------------------------------------------------- 1 | diff a/src/hotspot/share/compiler/compilerDefinitions.cpp b/src/hotspot/share/compiler/compilerDefinitions.cpp 2 | --- a/src/hotspot/share/compiler/compilerDefinitions.cpp 3 | +++ b/src/hotspot/share/compiler/compilerDefinitions.cpp 4 | @@ -520,10 +520,19 @@ 5 | } 6 | if (FLAG_IS_DEFAULT(LoopStripMiningIterShortLoop)) { 7 | // blind guess 8 | LoopStripMiningIterShortLoop = LoopStripMiningIter / 10; 9 | } 10 | + if (UseStackAllocation) { 11 | + if (!(UseSerialGC || UseParallelGC || UseG1GC)) { 12 | + vm_exit_during_initialization("UseStackAllocation is not supported with selected GC", GCConfig::hs_err_name()); 13 | + FLAG_SET_DEFAULT(UseStackAllocation, false); 14 | + FLAG_SET_ERGO(UseStackAllocationRuntime, false); 15 | + } else { 16 | + FLAG_SET_ERGO(UseStackAllocationRuntime, true); 17 | + } 18 | + } 19 | #endif // COMPILER2 20 | } 21 | 22 | static CompLevel highest_compile_level() { 23 | return TieredCompilation ? MIN2((CompLevel) TieredStopAtLevel, CompLevel_highest_tier) : CompLevel_highest_tier; 24 | -------------------------------------------------------------------------------- /stack_allocation/webrev/src/hotspot/share/compiler/compilerDefinitions.cpp.udiff.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Udiff src/hotspot/share/compiler/compilerDefinitions.cpp 6 | 7 | 8 | 9 |
< prev index next >

src/hotspot/share/compiler/compilerDefinitions.cpp

10 | Print this page 11 |
12 |
13 | @@ -520,10 +520,19 @@
14 |     }
15 |     if (FLAG_IS_DEFAULT(LoopStripMiningIterShortLoop)) {
16 |       // blind guess
17 |       LoopStripMiningIterShortLoop = LoopStripMiningIter / 10;
18 |     }
19 | +   if (UseStackAllocation) {
20 | +     if (!(UseSerialGC || UseParallelGC || UseG1GC)) {
21 | +       vm_exit_during_initialization("UseStackAllocation is not supported with selected GC", GCConfig::hs_err_name());
22 | +       FLAG_SET_DEFAULT(UseStackAllocation, false);
23 | +       FLAG_SET_ERGO(UseStackAllocationRuntime, false);
24 | +     } else {
25 | +       FLAG_SET_ERGO(UseStackAllocationRuntime, true);
26 | +     }
27 | +   }
28 |   #endif // COMPILER2
29 |   }
30 |   
31 |   static CompLevel highest_compile_level() {
32 |     return TieredCompilation ? MIN2((CompLevel) TieredStopAtLevel, CompLevel_highest_tier) : CompLevel_highest_tier;
33 | 
34 |
< prev index next >
35 | -------------------------------------------------------------------------------- /stack_allocation/webrev/src/hotspot/share/compiler/compilerDirectives.hpp.cdiff.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Cdiff src/hotspot/share/compiler/compilerDirectives.hpp 6 | 7 | 8 | 9 |
< prev index next >

src/hotspot/share/compiler/compilerDirectives.hpp

10 | Print this page 11 |
12 |
13 | *** 67,11 ***
14 |   NOT_PRODUCT(cflags(IGVPrintLevel,       intx, PrintIdealGraphLevel, IGVPrintLevel)) \
15 |       cflags(TraceSpilling,           bool, TraceSpilling, TraceSpilling) \
16 |       cflags(Vectorize,               bool, false, Vectorize) \
17 |       cflags(VectorizeDebug,          uintx, 0, VectorizeDebug) \
18 |       cflags(CloneMapDebug,           bool, false, CloneMapDebug) \
19 | !     cflags(MaxNodeLimit,            intx, MaxNodeLimit, MaxNodeLimit)
20 |   #else
21 |     #define compilerdirectives_c2_flags(cflags)
22 |   #endif
23 |   
24 |   class CompilerDirectives;
25 | --- 67,15 ---
26 |   NOT_PRODUCT(cflags(IGVPrintLevel,       intx, PrintIdealGraphLevel, IGVPrintLevel)) \
27 |       cflags(TraceSpilling,           bool, TraceSpilling, TraceSpilling) \
28 |       cflags(Vectorize,               bool, false, Vectorize) \
29 |       cflags(VectorizeDebug,          uintx, 0, VectorizeDebug) \
30 |       cflags(CloneMapDebug,           bool, false, CloneMapDebug) \
31 | !     cflags(MaxNodeLimit,            intx, MaxNodeLimit, MaxNodeLimit) \
32 | + NOT_PRODUCT(cflags(PrintEscapeAnalysis,       bool, PrintEscapeAnalysis, PrintEscapeAnalysis)) \
33 | + NOT_PRODUCT(cflags(PrintEliminateAllocations, bool, PrintEliminateAllocations, PrintEliminateAllocations)) \
34 | +     cflags(UseStackAllocation,                bool, UseStackAllocation, UseStackAllocation) \
35 | + NOT_PRODUCT(cflags(PrintStackAllocation,      bool, PrintStackAllocation, PrintStackAllocation))
36 |   #else
37 |     #define compilerdirectives_c2_flags(cflags)
38 |   #endif
39 |   
40 |   class CompilerDirectives;
41 | 
42 |
< prev index next >
43 | -------------------------------------------------------------------------------- /stack_allocation/webrev/src/hotspot/share/compiler/compilerDirectives.hpp.frames.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Frames src/hotspot/share/compiler/compilerDirectives.hpp 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /stack_allocation/webrev/src/hotspot/share/compiler/compilerDirectives.hpp.frames.prev_next.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Frames src/hotspot/share/compiler/compilerDirectives.hpp 6 | 7 | 8 |
< prev index next >
9 | -------------------------------------------------------------------------------- /stack_allocation/webrev/src/hotspot/share/compiler/compilerDirectives.hpp.patch: -------------------------------------------------------------------------------- 1 | diff a/src/hotspot/share/compiler/compilerDirectives.hpp b/src/hotspot/share/compiler/compilerDirectives.hpp 2 | --- a/src/hotspot/share/compiler/compilerDirectives.hpp 3 | +++ b/src/hotspot/share/compiler/compilerDirectives.hpp 4 | @@ -67,11 +67,15 @@ 5 | NOT_PRODUCT(cflags(IGVPrintLevel, intx, PrintIdealGraphLevel, IGVPrintLevel)) \ 6 | cflags(TraceSpilling, bool, TraceSpilling, TraceSpilling) \ 7 | cflags(Vectorize, bool, false, Vectorize) \ 8 | cflags(VectorizeDebug, uintx, 0, VectorizeDebug) \ 9 | cflags(CloneMapDebug, bool, false, CloneMapDebug) \ 10 | - cflags(MaxNodeLimit, intx, MaxNodeLimit, MaxNodeLimit) 11 | + cflags(MaxNodeLimit, intx, MaxNodeLimit, MaxNodeLimit) \ 12 | +NOT_PRODUCT(cflags(PrintEscapeAnalysis, bool, PrintEscapeAnalysis, PrintEscapeAnalysis)) \ 13 | +NOT_PRODUCT(cflags(PrintEliminateAllocations, bool, PrintEliminateAllocations, PrintEliminateAllocations)) \ 14 | + cflags(UseStackAllocation, bool, UseStackAllocation, UseStackAllocation) \ 15 | +NOT_PRODUCT(cflags(PrintStackAllocation, bool, PrintStackAllocation, PrintStackAllocation)) 16 | #else 17 | #define compilerdirectives_c2_flags(cflags) 18 | #endif 19 | 20 | class CompilerDirectives; 21 | -------------------------------------------------------------------------------- /stack_allocation/webrev/src/hotspot/share/compiler/compilerDirectives.hpp.udiff.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Udiff src/hotspot/share/compiler/compilerDirectives.hpp 6 | 7 | 8 | 9 |
< prev index next >

src/hotspot/share/compiler/compilerDirectives.hpp

10 | Print this page 11 |
12 |
13 | @@ -67,11 +67,15 @@
14 |   NOT_PRODUCT(cflags(IGVPrintLevel,       intx, PrintIdealGraphLevel, IGVPrintLevel)) \
15 |       cflags(TraceSpilling,           bool, TraceSpilling, TraceSpilling) \
16 |       cflags(Vectorize,               bool, false, Vectorize) \
17 |       cflags(VectorizeDebug,          uintx, 0, VectorizeDebug) \
18 |       cflags(CloneMapDebug,           bool, false, CloneMapDebug) \
19 | -     cflags(MaxNodeLimit,            intx, MaxNodeLimit, MaxNodeLimit)
20 | +     cflags(MaxNodeLimit,            intx, MaxNodeLimit, MaxNodeLimit) \
21 | + NOT_PRODUCT(cflags(PrintEscapeAnalysis,       bool, PrintEscapeAnalysis, PrintEscapeAnalysis)) \
22 | + NOT_PRODUCT(cflags(PrintEliminateAllocations, bool, PrintEliminateAllocations, PrintEliminateAllocations)) \
23 | +     cflags(UseStackAllocation,                bool, UseStackAllocation, UseStackAllocation) \
24 | + NOT_PRODUCT(cflags(PrintStackAllocation,      bool, PrintStackAllocation, PrintStackAllocation))
25 |   #else
26 |     #define compilerdirectives_c2_flags(cflags)
27 |   #endif
28 |   
29 |   class CompilerDirectives;
30 | 
31 |
< prev index next >
32 | -------------------------------------------------------------------------------- /stack_allocation/webrev/src/hotspot/share/compiler/oopMap.cpp.frames.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Frames src/hotspot/share/compiler/oopMap.cpp 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /stack_allocation/webrev/src/hotspot/share/compiler/oopMap.cpp.frames.prev_next.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Frames src/hotspot/share/compiler/oopMap.cpp 6 | 7 | 8 |
< prev index next >
9 | -------------------------------------------------------------------------------- /stack_allocation/webrev/src/hotspot/share/compiler/oopMap.hpp.cdiff.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Cdiff src/hotspot/share/compiler/oopMap.hpp 6 | 7 | 8 | 9 |
< prev index next >

src/hotspot/share/compiler/oopMap.hpp

10 | Print this page 11 |
12 |
13 | *** 197,15 ***
14 | --- 197,20 ---
15 |   };
16 |   
17 |   
18 |   class OopMapSet : public ResourceObj {
19 |     friend class VMStructs;
20 | +   friend class OopClosureWalker;
21 |    private:
22 |     GrowableArray<OopMap*> _list;
23 |   
24 |     void add(OopMap* value) { _list.append(value); }
25 |   
26 | +   static void stack_oop_do(oop *p, OopClosure* oop_fn,
27 | +                       GrowableArray<oop> *stack_oops,
28 | +                       intptr_t *stack_base, intptr_t *stack_top);
29 | + 
30 |    public:
31 |     OopMapSet();
32 |   
33 |     // returns the number of OopMaps in this OopMapSet
34 |     int size() const            { return _list.length(); }
35 | 
36 |
< prev index next >
37 | -------------------------------------------------------------------------------- /stack_allocation/webrev/src/hotspot/share/compiler/oopMap.hpp.frames.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Frames src/hotspot/share/compiler/oopMap.hpp 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /stack_allocation/webrev/src/hotspot/share/compiler/oopMap.hpp.frames.prev_next.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Frames src/hotspot/share/compiler/oopMap.hpp 6 | 7 | 8 |
< prev index next >
9 | -------------------------------------------------------------------------------- /stack_allocation/webrev/src/hotspot/share/compiler/oopMap.hpp.patch: -------------------------------------------------------------------------------- 1 | diff a/src/hotspot/share/compiler/oopMap.hpp b/src/hotspot/share/compiler/oopMap.hpp 2 | --- a/src/hotspot/share/compiler/oopMap.hpp 3 | +++ b/src/hotspot/share/compiler/oopMap.hpp 4 | @@ -197,15 +197,20 @@ 5 | }; 6 | 7 | 8 | class OopMapSet : public ResourceObj { 9 | friend class VMStructs; 10 | + friend class OopClosureWalker; 11 | private: 12 | GrowableArray _list; 13 | 14 | void add(OopMap* value) { _list.append(value); } 15 | 16 | + static void stack_oop_do(oop *p, OopClosure* oop_fn, 17 | + GrowableArray *stack_oops, 18 | + intptr_t *stack_base, intptr_t *stack_top); 19 | + 20 | public: 21 | OopMapSet(); 22 | 23 | // returns the number of OopMaps in this OopMapSet 24 | int size() const { return _list.length(); } 25 | -------------------------------------------------------------------------------- /stack_allocation/webrev/src/hotspot/share/compiler/oopMap.hpp.udiff.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Udiff src/hotspot/share/compiler/oopMap.hpp 6 | 7 | 8 | 9 |
< prev index next >

src/hotspot/share/compiler/oopMap.hpp

10 | Print this page 11 |
12 |
13 | @@ -197,15 +197,20 @@
14 |   };
15 |   
16 |   
17 |   class OopMapSet : public ResourceObj {
18 |     friend class VMStructs;
19 | +   friend class OopClosureWalker;
20 |    private:
21 |     GrowableArray<OopMap*> _list;
22 |   
23 |     void add(OopMap* value) { _list.append(value); }
24 |   
25 | +   static void stack_oop_do(oop *p, OopClosure* oop_fn,
26 | +                       GrowableArray<oop> *stack_oops,
27 | +                       intptr_t *stack_base, intptr_t *stack_top);
28 | + 
29 |    public:
30 |     OopMapSet();
31 |   
32 |     // returns the number of OopMaps in this OopMapSet
33 |     int size() const            { return _list.length(); }
34 | 
35 |
< prev index next >
36 | -------------------------------------------------------------------------------- /stack_allocation/webrev/src/hotspot/share/gc/g1/c2/g1BarrierSetC2.cpp.frames.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Frames src/hotspot/share/gc/g1/c2/g1BarrierSetC2.cpp 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /stack_allocation/webrev/src/hotspot/share/gc/g1/c2/g1BarrierSetC2.cpp.frames.prev_next.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Frames src/hotspot/share/gc/g1/c2/g1BarrierSetC2.cpp 6 | 7 | 8 |
< prev index next >
9 | -------------------------------------------------------------------------------- /stack_allocation/webrev/src/hotspot/share/gc/g1/c2/g1BarrierSetC2.hpp.cdiff.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Cdiff src/hotspot/share/gc/g1/c2/g1BarrierSetC2.hpp 6 | 7 | 8 | 9 |
< prev index next >

src/hotspot/share/gc/g1/c2/g1BarrierSetC2.hpp

10 | Print this page 11 |
12 |
13 | *** 86,10 ***
14 | --- 86,12 ---
15 |   
16 |    public:
17 |     virtual bool is_gc_barrier_node(Node* node) const;
18 |     virtual void eliminate_gc_barrier(PhaseMacroExpand* macro, Node* node) const;
19 |     virtual Node* step_over_gc_barrier(Node* c) const;
20 | +   virtual bool process_barrier_node(Node* cast_node, PhaseIterGVN& igvn) const;
21 | + 
22 |   
23 |   #ifdef ASSERT
24 |     virtual void verify_gc_barriers(Compile* compile, CompilePhase phase) const;
25 |   #endif
26 |   
27 | 
28 |
< prev index next >
29 | -------------------------------------------------------------------------------- /stack_allocation/webrev/src/hotspot/share/gc/g1/c2/g1BarrierSetC2.hpp.frames.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Frames src/hotspot/share/gc/g1/c2/g1BarrierSetC2.hpp 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /stack_allocation/webrev/src/hotspot/share/gc/g1/c2/g1BarrierSetC2.hpp.frames.prev_next.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Frames src/hotspot/share/gc/g1/c2/g1BarrierSetC2.hpp 6 | 7 | 8 |
< prev index next >
9 | -------------------------------------------------------------------------------- /stack_allocation/webrev/src/hotspot/share/gc/g1/c2/g1BarrierSetC2.hpp.patch: -------------------------------------------------------------------------------- 1 | diff a/src/hotspot/share/gc/g1/c2/g1BarrierSetC2.hpp b/src/hotspot/share/gc/g1/c2/g1BarrierSetC2.hpp 2 | --- a/src/hotspot/share/gc/g1/c2/g1BarrierSetC2.hpp 3 | +++ b/src/hotspot/share/gc/g1/c2/g1BarrierSetC2.hpp 4 | @@ -86,10 +86,12 @@ 5 | 6 | public: 7 | virtual bool is_gc_barrier_node(Node* node) const; 8 | virtual void eliminate_gc_barrier(PhaseMacroExpand* macro, Node* node) const; 9 | virtual Node* step_over_gc_barrier(Node* c) const; 10 | + virtual bool process_barrier_node(Node* cast_node, PhaseIterGVN& igvn) const; 11 | + 12 | 13 | #ifdef ASSERT 14 | virtual void verify_gc_barriers(Compile* compile, CompilePhase phase) const; 15 | #endif 16 | 17 | -------------------------------------------------------------------------------- /stack_allocation/webrev/src/hotspot/share/gc/g1/c2/g1BarrierSetC2.hpp.udiff.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Udiff src/hotspot/share/gc/g1/c2/g1BarrierSetC2.hpp 6 | 7 | 8 | 9 |
< prev index next >

src/hotspot/share/gc/g1/c2/g1BarrierSetC2.hpp

10 | Print this page 11 |
12 |
13 | @@ -86,10 +86,12 @@
14 |   
15 |    public:
16 |     virtual bool is_gc_barrier_node(Node* node) const;
17 |     virtual void eliminate_gc_barrier(PhaseMacroExpand* macro, Node* node) const;
18 |     virtual Node* step_over_gc_barrier(Node* c) const;
19 | +   virtual bool process_barrier_node(Node* cast_node, PhaseIterGVN& igvn) const;
20 | + 
21 |   
22 |   #ifdef ASSERT
23 |     virtual void verify_gc_barriers(Compile* compile, CompilePhase phase) const;
24 |   #endif
25 |   
26 | 
27 |
< prev index next >
28 | -------------------------------------------------------------------------------- /stack_allocation/webrev/src/hotspot/share/gc/parallel/psParallelCompact.inline.hpp.cdiff.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Cdiff src/hotspot/share/gc/parallel/psParallelCompact.inline.hpp 6 | 7 | 8 | 9 |
< prev index next >

src/hotspot/share/gc/parallel/psParallelCompact.inline.hpp

10 | Print this page 11 |
12 |
13 | *** 112,15 ***
14 |       oop obj = CompressedOops::decode_not_null(heap_oop);
15 |       assert(ParallelScavengeHeap::heap()->is_in(obj), "should be in heap");
16 |   
17 |       oop new_obj = (oop)summary_data().calc_new_pointer(obj, cm);
18 |       assert(new_obj != NULL,                    // is forwarding ptr?
19 | !            "should be forwarded");
20 |       // Just always do the update unconditionally?
21 |       if (new_obj != NULL) {
22 |         assert(ParallelScavengeHeap::heap()->is_in_reserved(new_obj),
23 | !              "should be in object space");
24 |         RawAccess<IS_NOT_NULL>::oop_store(p, new_obj);
25 |       }
26 |     }
27 |   }
28 |   
29 | --- 112,15 ---
30 |       oop obj = CompressedOops::decode_not_null(heap_oop);
31 |       assert(ParallelScavengeHeap::heap()->is_in(obj), "should be in heap");
32 |   
33 |       oop new_obj = (oop)summary_data().calc_new_pointer(obj, cm);
34 |       assert(new_obj != NULL,                    // is forwarding ptr?
35 | !           "should be forwarded");
36 |       // Just always do the update unconditionally?
37 |       if (new_obj != NULL) {
38 |         assert(ParallelScavengeHeap::heap()->is_in_reserved(new_obj),
39 | !             "should be in object space");
40 |         RawAccess<IS_NOT_NULL>::oop_store(p, new_obj);
41 |       }
42 |     }
43 |   }
44 |   
45 | 
46 |
< prev index next >
47 | -------------------------------------------------------------------------------- /stack_allocation/webrev/src/hotspot/share/gc/parallel/psParallelCompact.inline.hpp.frames.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Frames src/hotspot/share/gc/parallel/psParallelCompact.inline.hpp 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /stack_allocation/webrev/src/hotspot/share/gc/parallel/psParallelCompact.inline.hpp.frames.prev_next.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Frames src/hotspot/share/gc/parallel/psParallelCompact.inline.hpp 6 | 7 | 8 |
< prev index next >
9 | -------------------------------------------------------------------------------- /stack_allocation/webrev/src/hotspot/share/gc/parallel/psParallelCompact.inline.hpp.patch: -------------------------------------------------------------------------------- 1 | diff a/src/hotspot/share/gc/parallel/psParallelCompact.inline.hpp b/src/hotspot/share/gc/parallel/psParallelCompact.inline.hpp 2 | --- a/src/hotspot/share/gc/parallel/psParallelCompact.inline.hpp 3 | +++ b/src/hotspot/share/gc/parallel/psParallelCompact.inline.hpp 4 | @@ -112,15 +112,15 @@ 5 | oop obj = CompressedOops::decode_not_null(heap_oop); 6 | assert(ParallelScavengeHeap::heap()->is_in(obj), "should be in heap"); 7 | 8 | oop new_obj = (oop)summary_data().calc_new_pointer(obj, cm); 9 | assert(new_obj != NULL, // is forwarding ptr? 10 | - "should be forwarded"); 11 | + "should be forwarded"); 12 | // Just always do the update unconditionally? 13 | if (new_obj != NULL) { 14 | assert(ParallelScavengeHeap::heap()->is_in_reserved(new_obj), 15 | - "should be in object space"); 16 | + "should be in object space"); 17 | RawAccess::oop_store(p, new_obj); 18 | } 19 | } 20 | } 21 | 22 | -------------------------------------------------------------------------------- /stack_allocation/webrev/src/hotspot/share/gc/parallel/psParallelCompact.inline.hpp.udiff.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Udiff src/hotspot/share/gc/parallel/psParallelCompact.inline.hpp 6 | 7 | 8 | 9 |
< prev index next >

src/hotspot/share/gc/parallel/psParallelCompact.inline.hpp

10 | Print this page 11 |
12 |
13 | @@ -112,15 +112,15 @@
14 |       oop obj = CompressedOops::decode_not_null(heap_oop);
15 |       assert(ParallelScavengeHeap::heap()->is_in(obj), "should be in heap");
16 |   
17 |       oop new_obj = (oop)summary_data().calc_new_pointer(obj, cm);
18 |       assert(new_obj != NULL,                    // is forwarding ptr?
19 | -            "should be forwarded");
20 | +           "should be forwarded");
21 |       // Just always do the update unconditionally?
22 |       if (new_obj != NULL) {
23 |         assert(ParallelScavengeHeap::heap()->is_in_reserved(new_obj),
24 | -              "should be in object space");
25 | +             "should be in object space");
26 |         RawAccess<IS_NOT_NULL>::oop_store(p, new_obj);
27 |       }
28 |     }
29 |   }
30 |   
31 | 
32 |
< prev index next >
33 | -------------------------------------------------------------------------------- /stack_allocation/webrev/src/hotspot/share/gc/shared/c2/barrierSetC2.hpp.cdiff.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Cdiff src/hotspot/share/gc/shared/c2/barrierSetC2.hpp 6 | 7 | 8 | 9 |
< prev index next >

src/hotspot/share/gc/shared/c2/barrierSetC2.hpp

10 | Print this page 11 |
12 |
13 | *** 271,10 ***
14 | --- 271,11 ---
15 |     // This could for example comprise macro nodes to be expanded during macro expansion.
16 |     virtual void* create_barrier_state(Arena* comp_arena) const { return NULL; }
17 |     // If the BarrierSetC2 state has barrier nodes in its compilation
18 |     // unit state to be expanded later, then now is the time to do so.
19 |     virtual bool expand_barriers(Compile* C, PhaseIterGVN& igvn) const { return false; }
20 | +   virtual bool process_barrier_node(Node* cast_node, PhaseIterGVN& igvn) const { return false; }
21 |     virtual bool optimize_loops(PhaseIdealLoop* phase, LoopOptsMode mode, VectorSet& visited, Node_Stack& nstack, Node_List& worklist) const { return false; }
22 |     virtual bool strip_mined_loops_expanded(LoopOptsMode mode) const { return false; }
23 |     virtual bool is_gc_specific_loop_opts_pass(LoopOptsMode mode) const { return false; }
24 |   
25 |     enum CompilePhase {
26 | 
27 |
< prev index next >
28 | -------------------------------------------------------------------------------- /stack_allocation/webrev/src/hotspot/share/gc/shared/c2/barrierSetC2.hpp.frames.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Frames src/hotspot/share/gc/shared/c2/barrierSetC2.hpp 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /stack_allocation/webrev/src/hotspot/share/gc/shared/c2/barrierSetC2.hpp.frames.prev_next.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Frames src/hotspot/share/gc/shared/c2/barrierSetC2.hpp 6 | 7 | 8 |
< prev index next >
9 | -------------------------------------------------------------------------------- /stack_allocation/webrev/src/hotspot/share/gc/shared/c2/barrierSetC2.hpp.patch: -------------------------------------------------------------------------------- 1 | diff a/src/hotspot/share/gc/shared/c2/barrierSetC2.hpp b/src/hotspot/share/gc/shared/c2/barrierSetC2.hpp 2 | --- a/src/hotspot/share/gc/shared/c2/barrierSetC2.hpp 3 | +++ b/src/hotspot/share/gc/shared/c2/barrierSetC2.hpp 4 | @@ -271,10 +271,11 @@ 5 | // This could for example comprise macro nodes to be expanded during macro expansion. 6 | virtual void* create_barrier_state(Arena* comp_arena) const { return NULL; } 7 | // If the BarrierSetC2 state has barrier nodes in its compilation 8 | // unit state to be expanded later, then now is the time to do so. 9 | virtual bool expand_barriers(Compile* C, PhaseIterGVN& igvn) const { return false; } 10 | + virtual bool process_barrier_node(Node* cast_node, PhaseIterGVN& igvn) const { return false; } 11 | virtual bool optimize_loops(PhaseIdealLoop* phase, LoopOptsMode mode, VectorSet& visited, Node_Stack& nstack, Node_List& worklist) const { return false; } 12 | virtual bool strip_mined_loops_expanded(LoopOptsMode mode) const { return false; } 13 | virtual bool is_gc_specific_loop_opts_pass(LoopOptsMode mode) const { return false; } 14 | 15 | enum CompilePhase { 16 | -------------------------------------------------------------------------------- /stack_allocation/webrev/src/hotspot/share/gc/shared/c2/barrierSetC2.hpp.udiff.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Udiff src/hotspot/share/gc/shared/c2/barrierSetC2.hpp 6 | 7 | 8 | 9 |
< prev index next >

src/hotspot/share/gc/shared/c2/barrierSetC2.hpp

10 | Print this page 11 |
12 |
13 | @@ -271,10 +271,11 @@
14 |     // This could for example comprise macro nodes to be expanded during macro expansion.
15 |     virtual void* create_barrier_state(Arena* comp_arena) const { return NULL; }
16 |     // If the BarrierSetC2 state has barrier nodes in its compilation
17 |     // unit state to be expanded later, then now is the time to do so.
18 |     virtual bool expand_barriers(Compile* C, PhaseIterGVN& igvn) const { return false; }
19 | +   virtual bool process_barrier_node(Node* cast_node, PhaseIterGVN& igvn) const { return false; }
20 |     virtual bool optimize_loops(PhaseIdealLoop* phase, LoopOptsMode mode, VectorSet& visited, Node_Stack& nstack, Node_List& worklist) const { return false; }
21 |     virtual bool strip_mined_loops_expanded(LoopOptsMode mode) const { return false; }
22 |     virtual bool is_gc_specific_loop_opts_pass(LoopOptsMode mode) const { return false; }
23 |   
24 |     enum CompilePhase {
25 | 
26 |
< prev index next >
27 | -------------------------------------------------------------------------------- /stack_allocation/webrev/src/hotspot/share/gc/shared/c2/cardTableBarrierSetC2.cpp.frames.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Frames src/hotspot/share/gc/shared/c2/cardTableBarrierSetC2.cpp 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /stack_allocation/webrev/src/hotspot/share/gc/shared/c2/cardTableBarrierSetC2.cpp.frames.prev_next.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Frames src/hotspot/share/gc/shared/c2/cardTableBarrierSetC2.cpp 6 | 7 | 8 |
< prev index next >
9 | -------------------------------------------------------------------------------- /stack_allocation/webrev/src/hotspot/share/gc/shared/c2/cardTableBarrierSetC2.hpp-.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Old src/hotspot/share/gc/shared/c2/cardTableBarrierSetC2.hpp 6 | 7 | 8 | 9 |
10 |  1 /*
11 |  2  * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved.
12 |  3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
13 |  4  *
14 |  5  * This code is free software; you can redistribute it and/or modify it
15 |  6  * under the terms of the GNU General Public License version 2 only, as
16 |  7  * published by the Free Software Foundation.
17 |  8  *
18 |  9  * This code is distributed in the hope that it will be useful, but WITHOUT
19 | 10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
20 | 11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
21 | 12  * version 2 for more details (a copy is included in the LICENSE file that
22 | 13  * accompanied this code).
23 | 14  *
24 | 15  * You should have received a copy of the GNU General Public License version
25 | 16  * 2 along with this work; if not, write to the Free Software Foundation,
26 | 17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
27 | 18  *
28 | 19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
29 | 20  * or visit www.oracle.com if you need additional information or have any
30 | 21  * questions.
31 | 22  *
32 | 23  */
33 | 24 
34 | 25 #ifndef SHARE_GC_SHARED_C2_CARDTABLEBARRIERSETC2_HPP
35 | 26 #define SHARE_GC_SHARED_C2_CARDTABLEBARRIERSETC2_HPP
36 | 27 
37 | 28 #include "gc/shared/c2/modRefBarrierSetC2.hpp"
38 | 29 
39 | 30 class CardTableBarrierSetC2: public ModRefBarrierSetC2 {
40 | 31 protected:
41 | 32   virtual void post_barrier(GraphKit* kit,
42 | 33                             Node* ctl,
43 | 34                             Node* store,
44 | 35                             Node* obj,
45 | 36                             Node* adr,
46 | 37                             uint adr_idx,
47 | 38                             Node* val,
48 | 39                             BasicType bt,
49 | 40                             bool use_precise) const;
50 | 41 
51 | 42   Node* byte_map_base_node(GraphKit* kit) const;
52 | 43 
53 | 44 public:
54 | 45   virtual void clone(GraphKit* kit, Node* src, Node* dst, Node* size, bool is_array) const;
55 | 46   virtual bool is_gc_barrier_node(Node* node) const;
56 | 47   virtual void eliminate_gc_barrier(PhaseMacroExpand* macro, Node* node) const;
57 | 48   virtual bool array_copy_requires_gc_barriers(bool tightly_coupled_alloc, BasicType type, bool is_clone, ArrayCopyPhase phase) const;
58 | 49 
59 | 50   bool use_ReduceInitialCardMarks() const;
60 | 51 };
61 | 52 
62 | 53 #endif // SHARE_GC_SHARED_C2_CARDTABLEBARRIERSETC2_HPP
63 |     
64 | 65 | -------------------------------------------------------------------------------- /stack_allocation/webrev/src/hotspot/share/gc/shared/c2/cardTableBarrierSetC2.hpp.frames.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Frames src/hotspot/share/gc/shared/c2/cardTableBarrierSetC2.hpp 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /stack_allocation/webrev/src/hotspot/share/gc/shared/c2/cardTableBarrierSetC2.hpp.frames.prev_next.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Frames src/hotspot/share/gc/shared/c2/cardTableBarrierSetC2.hpp 6 | 7 | 8 |
< prev index next >
9 | -------------------------------------------------------------------------------- /stack_allocation/webrev/src/hotspot/share/gc/shared/c2/cardTableBarrierSetC2.hpp.patch: -------------------------------------------------------------------------------- 1 | diff a/src/hotspot/share/gc/shared/c2/cardTableBarrierSetC2.hpp b/src/hotspot/share/gc/shared/c2/cardTableBarrierSetC2.hpp 2 | --- a/src/hotspot/share/gc/shared/c2/cardTableBarrierSetC2.hpp 3 | +++ b/src/hotspot/share/gc/shared/c2/cardTableBarrierSetC2.hpp 4 | @@ -24,10 +24,28 @@ 5 | 6 | #ifndef SHARE_GC_SHARED_C2_CARDTABLEBARRIERSETC2_HPP 7 | #define SHARE_GC_SHARED_C2_CARDTABLEBARRIERSETC2_HPP 8 | 9 | #include "gc/shared/c2/modRefBarrierSetC2.hpp" 10 | +#include "utilities/growableArray.hpp" 11 | + 12 | +class CastP2XNode; 13 | + 14 | +class BarrierSetC2State : public ResourceObj { 15 | +private: 16 | + GrowableArray* _enqueue_barriers; 17 | + 18 | +public: 19 | + BarrierSetC2State(Arena* comp_arena); 20 | + 21 | + int enqueue_barriers_count() const; 22 | + CastP2XNode* enqueue_barrier(int idx) const; 23 | + void add_enqueue_barrier(CastP2XNode* n); 24 | + void remove_enqueue_barrier(CastP2XNode* n); 25 | + bool is_a_barrier(CastP2XNode* n); 26 | +}; 27 | + 28 | 29 | class CardTableBarrierSetC2: public ModRefBarrierSetC2 { 30 | protected: 31 | virtual void post_barrier(GraphKit* kit, 32 | Node* ctl, 33 | @@ -44,10 +62,19 @@ 34 | public: 35 | virtual void clone(GraphKit* kit, Node* src, Node* dst, Node* size, bool is_array) const; 36 | virtual bool is_gc_barrier_node(Node* node) const; 37 | virtual void eliminate_gc_barrier(PhaseMacroExpand* macro, Node* node) const; 38 | virtual bool array_copy_requires_gc_barriers(bool tightly_coupled_alloc, BasicType type, bool is_clone, ArrayCopyPhase phase) const; 39 | + virtual bool process_barrier_node(Node* cast_node, PhaseIterGVN& igvn) const; 40 | + virtual Node* step_over_gc_barrier(Node* c) const; 41 | 42 | bool use_ReduceInitialCardMarks() const; 43 | + 44 | + BarrierSetC2State* state() const; 45 | + 46 | + virtual void register_potential_barrier_node(Node* node) const; 47 | + virtual void unregister_potential_barrier_node(Node* node) const; 48 | + virtual bool expand_barriers(Compile* C, PhaseIterGVN& igvn) const; 49 | + virtual void* create_barrier_state(Arena* comp_arena) const; 50 | }; 51 | 52 | #endif // SHARE_GC_SHARED_C2_CARDTABLEBARRIERSETC2_HPP 53 | -------------------------------------------------------------------------------- /stack_allocation/webrev/src/hotspot/share/gc/shared/cardTable.hpp.cdiff.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Cdiff src/hotspot/share/gc/shared/cardTable.hpp 6 | 7 | 8 | 9 |
< prev index next >

src/hotspot/share/gc/shared/cardTable.hpp

10 | Print this page 11 |
12 |
13 | *** 246,10 ***
14 | --- 246,12 ---
15 |     // This would be the 0th element of _byte_map, if the heap started at 0x0.
16 |     // But since the heap starts at some higher address, this points to somewhere
17 |     // before the beginning of the actual _byte_map.
18 |     CardValue* byte_map_base() const { return _byte_map_base; }
19 |     bool scanned_concurrently() const { return _scanned_concurrently; }
20 | +   size_t byte_map_top_offset() const { return uintptr_t(_whole_heap.end()); }
21 | +   size_t byte_map_bottom_offset() const { return uintptr_t(_whole_heap.start()); }
22 |   
23 |     virtual bool is_in_young(oop obj) const = 0;
24 |   
25 |     // Print a description of the memory for the card table
26 |     virtual void print_on(outputStream* st) const;
27 | 
28 |
< prev index next >
29 | -------------------------------------------------------------------------------- /stack_allocation/webrev/src/hotspot/share/gc/shared/cardTable.hpp.frames.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Frames src/hotspot/share/gc/shared/cardTable.hpp 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /stack_allocation/webrev/src/hotspot/share/gc/shared/cardTable.hpp.frames.prev_next.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Frames src/hotspot/share/gc/shared/cardTable.hpp 6 | 7 | 8 |
< prev index next >
9 | -------------------------------------------------------------------------------- /stack_allocation/webrev/src/hotspot/share/gc/shared/cardTable.hpp.patch: -------------------------------------------------------------------------------- 1 | diff a/src/hotspot/share/gc/shared/cardTable.hpp b/src/hotspot/share/gc/shared/cardTable.hpp 2 | --- a/src/hotspot/share/gc/shared/cardTable.hpp 3 | +++ b/src/hotspot/share/gc/shared/cardTable.hpp 4 | @@ -246,10 +246,12 @@ 5 | // This would be the 0th element of _byte_map, if the heap started at 0x0. 6 | // But since the heap starts at some higher address, this points to somewhere 7 | // before the beginning of the actual _byte_map. 8 | CardValue* byte_map_base() const { return _byte_map_base; } 9 | bool scanned_concurrently() const { return _scanned_concurrently; } 10 | + size_t byte_map_top_offset() const { return uintptr_t(_whole_heap.end()); } 11 | + size_t byte_map_bottom_offset() const { return uintptr_t(_whole_heap.start()); } 12 | 13 | virtual bool is_in_young(oop obj) const = 0; 14 | 15 | // Print a description of the memory for the card table 16 | virtual void print_on(outputStream* st) const; 17 | -------------------------------------------------------------------------------- /stack_allocation/webrev/src/hotspot/share/gc/shared/cardTable.hpp.udiff.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Udiff src/hotspot/share/gc/shared/cardTable.hpp 6 | 7 | 8 | 9 |
< prev index next >

src/hotspot/share/gc/shared/cardTable.hpp

10 | Print this page 11 |
12 |
13 | @@ -246,10 +246,12 @@
14 |     // This would be the 0th element of _byte_map, if the heap started at 0x0.
15 |     // But since the heap starts at some higher address, this points to somewhere
16 |     // before the beginning of the actual _byte_map.
17 |     CardValue* byte_map_base() const { return _byte_map_base; }
18 |     bool scanned_concurrently() const { return _scanned_concurrently; }
19 | +   size_t byte_map_top_offset() const { return uintptr_t(_whole_heap.end()); }
20 | +   size_t byte_map_bottom_offset() const { return uintptr_t(_whole_heap.start()); }
21 |   
22 |     virtual bool is_in_young(oop obj) const = 0;
23 |   
24 |     // Print a description of the memory for the card table
25 |     virtual void print_on(outputStream* st) const;
26 | 
27 |
< prev index next >
28 | -------------------------------------------------------------------------------- /stack_allocation/webrev/src/hotspot/share/memory/iterator.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 1997, 2018, Oracle and/or its affiliates. All rights reserved. 3 | * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 | * 5 | * This code is free software; you can redistribute it and/or modify it 6 | * under the terms of the GNU General Public License version 2 only, as 7 | * published by the Free Software Foundation. 8 | * 9 | * This code is distributed in the hope that it will be useful, but WITHOUT 10 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11 | * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 12 | * version 2 for more details (a copy is included in the LICENSE file that 13 | * accompanied this code). 14 | * 15 | * You should have received a copy of the GNU General Public License version 16 | * 2 along with this work; if not, write to the Free Software Foundation, 17 | * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 18 | * 19 | * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 20 | * or visit www.oracle.com if you need additional information or have any 21 | * questions. 22 | * 23 | */ 24 | 25 | #include "precompiled.hpp" 26 | #include "code/nmethod.hpp" 27 | #include "memory/iterator.inline.hpp" 28 | #include "oops/oop.inline.hpp" 29 | #include "runtime/fieldDescriptor.inline.hpp" 30 | #include "utilities/debug.hpp" 31 | #include "utilities/globalDefinitions.hpp" 32 | 33 | DoNothingClosure do_nothing_cl; 34 | 35 | void CLDToOopClosure::do_cld(ClassLoaderData* cld) { 36 | cld->oops_do(_oop_closure, _cld_claim); 37 | } 38 | 39 | void ObjectToOopClosure::do_object(oop obj) { 40 | obj->oop_iterate(_cl); 41 | } 42 | 43 | void VoidClosure::do_void() { 44 | ShouldNotCallThis(); 45 | } 46 | 47 | void CodeBlobToOopClosure::do_nmethod(nmethod* nm) { 48 | nm->oops_do(_cl); 49 | if (_fix_relocations) { 50 | nm->fix_oop_relocations(); 51 | } 52 | } 53 | 54 | void CodeBlobToOopClosure::do_code_blob(CodeBlob* cb) { 55 | nmethod* nm = cb->as_nmethod_or_null(); 56 | if (nm != NULL) { 57 | do_nmethod(nm); 58 | } 59 | } 60 | 61 | void MarkingCodeBlobClosure::do_code_blob(CodeBlob* cb) { 62 | nmethod* nm = cb->as_nmethod_or_null(); 63 | if (nm != NULL && nm->oops_do_try_claim()) { 64 | do_nmethod(nm); 65 | } 66 | } 67 | -------------------------------------------------------------------------------- /stack_allocation/webrev/src/hotspot/share/memory/iterator.cpp-.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Old src/hotspot/share/memory/iterator.cpp 6 | 7 | 8 | 9 |
10 |  1 /*
11 |  2  * Copyright (c) 1997, 2018, Oracle and/or its affiliates. All rights reserved.
12 |  3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
13 |  4  *
14 |  5  * This code is free software; you can redistribute it and/or modify it
15 |  6  * under the terms of the GNU General Public License version 2 only, as
16 |  7  * published by the Free Software Foundation.
17 |  8  *
18 |  9  * This code is distributed in the hope that it will be useful, but WITHOUT
19 | 10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
20 | 11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
21 | 12  * version 2 for more details (a copy is included in the LICENSE file that
22 | 13  * accompanied this code).
23 | 14  *
24 | 15  * You should have received a copy of the GNU General Public License version
25 | 16  * 2 along with this work; if not, write to the Free Software Foundation,
26 | 17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
27 | 18  *
28 | 19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
29 | 20  * or visit www.oracle.com if you need additional information or have any
30 | 21  * questions.
31 | 22  *
32 | 23  */
33 | 24 
34 | 25 #include "precompiled.hpp"
35 | 26 #include "code/nmethod.hpp"
36 | 27 #include "memory/iterator.inline.hpp"
37 | 28 #include "oops/oop.inline.hpp"
38 | 29 #include "utilities/debug.hpp"
39 | 30 #include "utilities/globalDefinitions.hpp"
40 | 31 
41 | 32 DoNothingClosure do_nothing_cl;
42 | 33 
43 | 34 void CLDToOopClosure::do_cld(ClassLoaderData* cld) {
44 | 35   cld->oops_do(_oop_closure, _cld_claim);
45 | 36 }
46 | 37 
47 | 38 void ObjectToOopClosure::do_object(oop obj) {
48 | 39   obj->oop_iterate(_cl);
49 | 40 }
50 | 41 
51 | 42 void VoidClosure::do_void() {
52 | 43   ShouldNotCallThis();
53 | 44 }
54 | 45 
55 | 46 void CodeBlobToOopClosure::do_nmethod(nmethod* nm) {
56 | 47   nm->oops_do(_cl);
57 | 48   if (_fix_relocations) {
58 | 49     nm->fix_oop_relocations();
59 | 50   }
60 | 51 }
61 | 52 
62 | 53 void CodeBlobToOopClosure::do_code_blob(CodeBlob* cb) {
63 | 54   nmethod* nm = cb->as_nmethod_or_null();
64 | 55   if (nm != NULL) {
65 | 56     do_nmethod(nm);
66 | 57   }
67 | 58 }
68 | 59 
69 | 60 void MarkingCodeBlobClosure::do_code_blob(CodeBlob* cb) {
70 | 61   nmethod* nm = cb->as_nmethod_or_null();
71 | 62   if (nm != NULL && nm->oops_do_try_claim()) {
72 | 63     do_nmethod(nm);
73 | 64   }
74 | 65 }
75 |     
76 | 77 | -------------------------------------------------------------------------------- /stack_allocation/webrev/src/hotspot/share/memory/iterator.cpp.cdiff.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Cdiff src/hotspot/share/memory/iterator.cpp 6 | 7 | 8 | 9 |
< prev index next >

src/hotspot/share/memory/iterator.cpp

10 | Print this page 11 |
12 |
13 | *** 24,10 ***
14 | --- 24,11 ---
15 |   
16 |   #include "precompiled.hpp"
17 |   #include "code/nmethod.hpp"
18 |   #include "memory/iterator.inline.hpp"
19 |   #include "oops/oop.inline.hpp"
20 | + #include "runtime/fieldDescriptor.inline.hpp"
21 |   #include "utilities/debug.hpp"
22 |   #include "utilities/globalDefinitions.hpp"
23 |   
24 |   DoNothingClosure do_nothing_cl;
25 |   
26 | 
27 |
< prev index next >
28 | -------------------------------------------------------------------------------- /stack_allocation/webrev/src/hotspot/share/memory/iterator.cpp.frames.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Frames src/hotspot/share/memory/iterator.cpp 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /stack_allocation/webrev/src/hotspot/share/memory/iterator.cpp.frames.prev_next.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Frames src/hotspot/share/memory/iterator.cpp 6 | 7 | 8 |
< prev index next >
9 | -------------------------------------------------------------------------------- /stack_allocation/webrev/src/hotspot/share/memory/iterator.cpp.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | New src/hotspot/share/memory/iterator.cpp 6 | 7 | 8 | 9 |
10 |  1 /*
11 |  2  * Copyright (c) 1997, 2018, Oracle and/or its affiliates. All rights reserved.
12 |  3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
13 |  4  *
14 |  5  * This code is free software; you can redistribute it and/or modify it
15 |  6  * under the terms of the GNU General Public License version 2 only, as
16 |  7  * published by the Free Software Foundation.
17 |  8  *
18 |  9  * This code is distributed in the hope that it will be useful, but WITHOUT
19 | 10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
20 | 11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
21 | 12  * version 2 for more details (a copy is included in the LICENSE file that
22 | 13  * accompanied this code).
23 | 14  *
24 | 15  * You should have received a copy of the GNU General Public License version
25 | 16  * 2 along with this work; if not, write to the Free Software Foundation,
26 | 17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
27 | 18  *
28 | 19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
29 | 20  * or visit www.oracle.com if you need additional information or have any
30 | 21  * questions.
31 | 22  *
32 | 23  */
33 | 24 
34 | 25 #include "precompiled.hpp"
35 | 26 #include "code/nmethod.hpp"
36 | 27 #include "memory/iterator.inline.hpp"
37 | 28 #include "oops/oop.inline.hpp"
38 | 29 #include "runtime/fieldDescriptor.inline.hpp"
39 | 30 #include "utilities/debug.hpp"
40 | 31 #include "utilities/globalDefinitions.hpp"
41 | 32 
42 | 33 DoNothingClosure do_nothing_cl;
43 | 34 
44 | 35 void CLDToOopClosure::do_cld(ClassLoaderData* cld) {
45 | 36   cld->oops_do(_oop_closure, _cld_claim);
46 | 37 }
47 | 38 
48 | 39 void ObjectToOopClosure::do_object(oop obj) {
49 | 40   obj->oop_iterate(_cl);
50 | 41 }
51 | 42 
52 | 43 void VoidClosure::do_void() {
53 | 44   ShouldNotCallThis();
54 | 45 }
55 | 46 
56 | 47 void CodeBlobToOopClosure::do_nmethod(nmethod* nm) {
57 | 48   nm->oops_do(_cl);
58 | 49   if (_fix_relocations) {
59 | 50     nm->fix_oop_relocations();
60 | 51   }
61 | 52 }
62 | 53 
63 | 54 void CodeBlobToOopClosure::do_code_blob(CodeBlob* cb) {
64 | 55   nmethod* nm = cb->as_nmethod_or_null();
65 | 56   if (nm != NULL) {
66 | 57     do_nmethod(nm);
67 | 58   }
68 | 59 }
69 | 60 
70 | 61 void MarkingCodeBlobClosure::do_code_blob(CodeBlob* cb) {
71 | 62   nmethod* nm = cb->as_nmethod_or_null();
72 | 63   if (nm != NULL && nm->oops_do_try_claim()) {
73 | 64     do_nmethod(nm);
74 | 65   }
75 | 66 }
76 |     
77 | 78 | -------------------------------------------------------------------------------- /stack_allocation/webrev/src/hotspot/share/memory/iterator.cpp.patch: -------------------------------------------------------------------------------- 1 | diff a/src/hotspot/share/memory/iterator.cpp b/src/hotspot/share/memory/iterator.cpp 2 | --- a/src/hotspot/share/memory/iterator.cpp 3 | +++ b/src/hotspot/share/memory/iterator.cpp 4 | @@ -24,10 +24,11 @@ 5 | 6 | #include "precompiled.hpp" 7 | #include "code/nmethod.hpp" 8 | #include "memory/iterator.inline.hpp" 9 | #include "oops/oop.inline.hpp" 10 | +#include "runtime/fieldDescriptor.inline.hpp" 11 | #include "utilities/debug.hpp" 12 | #include "utilities/globalDefinitions.hpp" 13 | 14 | DoNothingClosure do_nothing_cl; 15 | 16 | -------------------------------------------------------------------------------- /stack_allocation/webrev/src/hotspot/share/memory/iterator.cpp.udiff.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Udiff src/hotspot/share/memory/iterator.cpp 6 | 7 | 8 | 9 |
< prev index next >

src/hotspot/share/memory/iterator.cpp

10 | Print this page 11 |
12 |
13 | @@ -24,10 +24,11 @@
14 |   
15 |   #include "precompiled.hpp"
16 |   #include "code/nmethod.hpp"
17 |   #include "memory/iterator.inline.hpp"
18 |   #include "oops/oop.inline.hpp"
19 | + #include "runtime/fieldDescriptor.inline.hpp"
20 |   #include "utilities/debug.hpp"
21 |   #include "utilities/globalDefinitions.hpp"
22 |   
23 |   DoNothingClosure do_nothing_cl;
24 |   
25 | 
26 |
< prev index next >
27 | -------------------------------------------------------------------------------- /stack_allocation/webrev/src/hotspot/share/opto/block.cpp.cdiff.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Cdiff src/hotspot/share/opto/block.cpp 6 | 7 | 8 | 9 |
< prev index next >

src/hotspot/share/opto/block.cpp

10 | Print this page 11 |
12 |
13 | *** 175,11 ***
14 |     }
15 |   
16 |     // Ideal nodes are allowable in empty blocks: skip them  Only MachNodes
17 |     // turn directly into code, because only MachNodes have non-trivial
18 |     // emit() functions.
19 | !   while ((end_idx > 0) && !get_node(end_idx)->is_Mach()) {
20 |       end_idx--;
21 |     }
22 |   
23 |     // No room for any interesting instructions?
24 |     if (end_idx == 0) {
25 | --- 175,11 ---
26 |     }
27 |   
28 |     // Ideal nodes are allowable in empty blocks: skip them  Only MachNodes
29 |     // turn directly into code, because only MachNodes have non-trivial
30 |     // emit() functions.
31 | !   while ((end_idx > 0) && !(get_node(end_idx)->is_Mach() || get_node(end_idx)->is_BoxLock())) {
32 |       end_idx--;
33 |     }
34 |   
35 |     // No room for any interesting instructions?
36 |     if (end_idx == 0) {
37 | 
38 |
< prev index next >
39 | -------------------------------------------------------------------------------- /stack_allocation/webrev/src/hotspot/share/opto/block.cpp.frames.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Frames src/hotspot/share/opto/block.cpp 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /stack_allocation/webrev/src/hotspot/share/opto/block.cpp.frames.prev_next.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Frames src/hotspot/share/opto/block.cpp 6 | 7 | 8 |
< prev index next >
9 | -------------------------------------------------------------------------------- /stack_allocation/webrev/src/hotspot/share/opto/block.cpp.patch: -------------------------------------------------------------------------------- 1 | diff a/src/hotspot/share/opto/block.cpp b/src/hotspot/share/opto/block.cpp 2 | --- a/src/hotspot/share/opto/block.cpp 3 | +++ b/src/hotspot/share/opto/block.cpp 4 | @@ -175,11 +175,11 @@ 5 | } 6 | 7 | // Ideal nodes are allowable in empty blocks: skip them Only MachNodes 8 | // turn directly into code, because only MachNodes have non-trivial 9 | // emit() functions. 10 | - while ((end_idx > 0) && !get_node(end_idx)->is_Mach()) { 11 | + while ((end_idx > 0) && !(get_node(end_idx)->is_Mach() || get_node(end_idx)->is_BoxLock())) { 12 | end_idx--; 13 | } 14 | 15 | // No room for any interesting instructions? 16 | if (end_idx == 0) { 17 | -------------------------------------------------------------------------------- /stack_allocation/webrev/src/hotspot/share/opto/block.cpp.udiff.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Udiff src/hotspot/share/opto/block.cpp 6 | 7 | 8 | 9 |
< prev index next >

src/hotspot/share/opto/block.cpp

10 | Print this page 11 |
12 |
13 | @@ -175,11 +175,11 @@
14 |     }
15 |   
16 |     // Ideal nodes are allowable in empty blocks: skip them  Only MachNodes
17 |     // turn directly into code, because only MachNodes have non-trivial
18 |     // emit() functions.
19 | -   while ((end_idx > 0) && !get_node(end_idx)->is_Mach()) {
20 | +   while ((end_idx > 0) && !(get_node(end_idx)->is_Mach() || get_node(end_idx)->is_BoxLock())) {
21 |       end_idx--;
22 |     }
23 |   
24 |     // No room for any interesting instructions?
25 |     if (end_idx == 0) {
26 | 
27 |
< prev index next >
28 | -------------------------------------------------------------------------------- /stack_allocation/webrev/src/hotspot/share/opto/buildOopMap.cpp.cdiff.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Cdiff src/hotspot/share/opto/buildOopMap.cpp 6 | 7 | 8 | 9 |
< prev index next >

src/hotspot/share/opto/buildOopMap.cpp

10 | Print this page 11 |
12 |
13 | *** 239,11 ***
14 |       Node *def = _defs[reg];     // Get reaching def
15 |       assert( def, "since live better have reaching def" );
16 |   
17 |       // Classify the reaching def as oop, derived, callee-save, dead, or other
18 |       const Type *t = def->bottom_type();
19 | !     if( t->isa_oop_ptr() ) {    // Oop or derived?
20 |         assert( !OptoReg::is_valid(_callees[reg]), "oop can't be callee save" );
21 |   #ifdef _LP64
22 |         // 64-bit pointers record oop-ishness on 2 aligned adjacent registers.
23 |         // Make sure both are record from the same reaching def, but do not
24 |         // put both into the oopmap.
25 | --- 239,12 ---
26 |       Node *def = _defs[reg];     // Get reaching def
27 |       assert( def, "since live better have reaching def" );
28 |   
29 |       // Classify the reaching def as oop, derived, callee-save, dead, or other
30 |       const Type *t = def->bottom_type();
31 | !     if( t->isa_oop_ptr() || // Oop or derived?
32 | +        (C->do_stack_allocation() && t->isa_rawptr() && def->is_BoxLock())) {  // consider stack oops too
33 |         assert( !OptoReg::is_valid(_callees[reg]), "oop can't be callee save" );
34 |   #ifdef _LP64
35 |         // 64-bit pointers record oop-ishness on 2 aligned adjacent registers.
36 |         // Make sure both are record from the same reaching def, but do not
37 |         // put both into the oopmap.
38 | 
39 |
< prev index next >
40 | -------------------------------------------------------------------------------- /stack_allocation/webrev/src/hotspot/share/opto/buildOopMap.cpp.frames.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Frames src/hotspot/share/opto/buildOopMap.cpp 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /stack_allocation/webrev/src/hotspot/share/opto/buildOopMap.cpp.frames.prev_next.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Frames src/hotspot/share/opto/buildOopMap.cpp 6 | 7 | 8 |
< prev index next >
9 | -------------------------------------------------------------------------------- /stack_allocation/webrev/src/hotspot/share/opto/buildOopMap.cpp.patch: -------------------------------------------------------------------------------- 1 | diff a/src/hotspot/share/opto/buildOopMap.cpp b/src/hotspot/share/opto/buildOopMap.cpp 2 | --- a/src/hotspot/share/opto/buildOopMap.cpp 3 | +++ b/src/hotspot/share/opto/buildOopMap.cpp 4 | @@ -239,11 +239,12 @@ 5 | Node *def = _defs[reg]; // Get reaching def 6 | assert( def, "since live better have reaching def" ); 7 | 8 | // Classify the reaching def as oop, derived, callee-save, dead, or other 9 | const Type *t = def->bottom_type(); 10 | - if( t->isa_oop_ptr() ) { // Oop or derived? 11 | + if( t->isa_oop_ptr() || // Oop or derived? 12 | + (C->do_stack_allocation() && t->isa_rawptr() && def->is_BoxLock())) { // consider stack oops too 13 | assert( !OptoReg::is_valid(_callees[reg]), "oop can't be callee save" ); 14 | #ifdef _LP64 15 | // 64-bit pointers record oop-ishness on 2 aligned adjacent registers. 16 | // Make sure both are record from the same reaching def, but do not 17 | // put both into the oopmap. 18 | -------------------------------------------------------------------------------- /stack_allocation/webrev/src/hotspot/share/opto/buildOopMap.cpp.udiff.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Udiff src/hotspot/share/opto/buildOopMap.cpp 6 | 7 | 8 | 9 |
< prev index next >

src/hotspot/share/opto/buildOopMap.cpp

10 | Print this page 11 |
12 |
13 | @@ -239,11 +239,12 @@
14 |       Node *def = _defs[reg];     // Get reaching def
15 |       assert( def, "since live better have reaching def" );
16 |   
17 |       // Classify the reaching def as oop, derived, callee-save, dead, or other
18 |       const Type *t = def->bottom_type();
19 | -     if( t->isa_oop_ptr() ) {    // Oop or derived?
20 | +     if( t->isa_oop_ptr() || // Oop or derived?
21 | +        (C->do_stack_allocation() && t->isa_rawptr() && def->is_BoxLock())) {  // consider stack oops too
22 |         assert( !OptoReg::is_valid(_callees[reg]), "oop can't be callee save" );
23 |   #ifdef _LP64
24 |         // 64-bit pointers record oop-ishness on 2 aligned adjacent registers.
25 |         // Make sure both are record from the same reaching def, but do not
26 |         // put both into the oopmap.
27 | 
28 |
< prev index next >
29 | -------------------------------------------------------------------------------- /stack_allocation/webrev/src/hotspot/share/opto/c2_globals.hpp.cdiff.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Cdiff src/hotspot/share/opto/c2_globals.hpp 6 | 7 | 8 | 9 |
< prev index next >

src/hotspot/share/opto/c2_globals.hpp

10 | Print this page 11 |
12 |
13 | *** 532,10 ***
14 | --- 532,19 ---
15 |                                                                               \
16 |     product(intx, EliminateAllocationArraySizeLimit, 64,                      \
17 |             "Array size (number of elements) limit for scalar replacement")   \
18 |             range(0, max_jint)                                                \
19 |                                                                               \
20 | +   experimental(bool, UseStackAllocation, false,                             \
21 | +           "Leverage stack allocation to reduce heap pressure")              \
22 | +                                                                             \
23 | +   experimental(bool, UseStackAllocationRuntime, false,                      \
24 | +           "Enable the stack allocation runtime code in oopmap")             \
25 | +                                                                             \
26 | +   notproduct(bool, PrintStackAllocation, false,                             \
27 | +           "Print stack allocation debug information")                       \
28 | +                                                                             \
29 |     product(bool, OptimizePtrCompare, true,                                   \
30 |             "Use escape analysis to optimize pointers compare")               \
31 |                                                                               \
32 |     notproduct(bool, PrintOptimizePtrCompare, false,                          \
33 |             "Print information about optimized pointers compare")             \
34 | 
35 |
< prev index next >
36 | -------------------------------------------------------------------------------- /stack_allocation/webrev/src/hotspot/share/opto/c2_globals.hpp.frames.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Frames src/hotspot/share/opto/c2_globals.hpp 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /stack_allocation/webrev/src/hotspot/share/opto/c2_globals.hpp.frames.prev_next.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Frames src/hotspot/share/opto/c2_globals.hpp 6 | 7 | 8 |
< prev index next >
9 | -------------------------------------------------------------------------------- /stack_allocation/webrev/src/hotspot/share/opto/c2_globals.hpp.patch: -------------------------------------------------------------------------------- 1 | diff a/src/hotspot/share/opto/c2_globals.hpp b/src/hotspot/share/opto/c2_globals.hpp 2 | --- a/src/hotspot/share/opto/c2_globals.hpp 3 | +++ b/src/hotspot/share/opto/c2_globals.hpp 4 | @@ -532,10 +532,19 @@ 5 | \ 6 | product(intx, EliminateAllocationArraySizeLimit, 64, \ 7 | "Array size (number of elements) limit for scalar replacement") \ 8 | range(0, max_jint) \ 9 | \ 10 | + experimental(bool, UseStackAllocation, false, \ 11 | + "Leverage stack allocation to reduce heap pressure") \ 12 | + \ 13 | + experimental(bool, UseStackAllocationRuntime, false, \ 14 | + "Enable the stack allocation runtime code in oopmap") \ 15 | + \ 16 | + notproduct(bool, PrintStackAllocation, false, \ 17 | + "Print stack allocation debug information") \ 18 | + \ 19 | product(bool, OptimizePtrCompare, true, \ 20 | "Use escape analysis to optimize pointers compare") \ 21 | \ 22 | notproduct(bool, PrintOptimizePtrCompare, false, \ 23 | "Print information about optimized pointers compare") \ 24 | -------------------------------------------------------------------------------- /stack_allocation/webrev/src/hotspot/share/opto/c2_globals.hpp.udiff.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Udiff src/hotspot/share/opto/c2_globals.hpp 6 | 7 | 8 | 9 |
< prev index next >

src/hotspot/share/opto/c2_globals.hpp

10 | Print this page 11 |
12 |
13 | @@ -532,10 +532,19 @@
14 |                                                                               \
15 |     product(intx, EliminateAllocationArraySizeLimit, 64,                      \
16 |             "Array size (number of elements) limit for scalar replacement")   \
17 |             range(0, max_jint)                                                \
18 |                                                                               \
19 | +   experimental(bool, UseStackAllocation, false,                             \
20 | +           "Leverage stack allocation to reduce heap pressure")              \
21 | +                                                                             \
22 | +   experimental(bool, UseStackAllocationRuntime, false,                      \
23 | +           "Enable the stack allocation runtime code in oopmap")             \
24 | +                                                                             \
25 | +   notproduct(bool, PrintStackAllocation, false,                             \
26 | +           "Print stack allocation debug information")                       \
27 | +                                                                             \
28 |     product(bool, OptimizePtrCompare, true,                                   \
29 |             "Use escape analysis to optimize pointers compare")               \
30 |                                                                               \
31 |     notproduct(bool, PrintOptimizePtrCompare, false,                          \
32 |             "Print information about optimized pointers compare")             \
33 | 
34 |
< prev index next >
35 | -------------------------------------------------------------------------------- /stack_allocation/webrev/src/hotspot/share/opto/callnode.cpp.frames.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Frames src/hotspot/share/opto/callnode.cpp 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /stack_allocation/webrev/src/hotspot/share/opto/callnode.cpp.frames.prev_next.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Frames src/hotspot/share/opto/callnode.cpp 6 | 7 | 8 |
< prev index next >
9 | -------------------------------------------------------------------------------- /stack_allocation/webrev/src/hotspot/share/opto/callnode.hpp.frames.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Frames src/hotspot/share/opto/callnode.hpp 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /stack_allocation/webrev/src/hotspot/share/opto/callnode.hpp.frames.prev_next.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Frames src/hotspot/share/opto/callnode.hpp 6 | 7 | 8 |
< prev index next >
9 | -------------------------------------------------------------------------------- /stack_allocation/webrev/src/hotspot/share/opto/callnode.hpp.patch: -------------------------------------------------------------------------------- 1 | diff a/src/hotspot/share/opto/callnode.hpp b/src/hotspot/share/opto/callnode.hpp 2 | --- a/src/hotspot/share/opto/callnode.hpp 3 | +++ b/src/hotspot/share/opto/callnode.hpp 4 | @@ -492,10 +492,11 @@ 5 | class SafePointScalarObjectNode: public TypeNode { 6 | uint _first_index; // First input edge relative index of a SafePoint node where 7 | // states of the scalarized object fields are collected. 8 | // It is relative to the last (youngest) jvms->_scloff. 9 | uint _n_fields; // Number of non-static fields of the scalarized object. 10 | + bool _is_stack_allocated; 11 | DEBUG_ONLY(AllocateNode* _alloc;) 12 | 13 | virtual uint hash() const ; // { return NO_HASH; } 14 | virtual bool cmp( const Node &n ) const; 15 | 16 | @@ -517,10 +518,13 @@ 17 | assert(jvms != NULL, "missed JVMS"); 18 | return jvms->scloff() + _first_index; 19 | } 20 | uint n_fields() const { return _n_fields; } 21 | 22 | + void set_stack_allocated(bool v) { _is_stack_allocated = true; } 23 | + bool stack_allocated() { return _is_stack_allocated; } 24 | + 25 | #ifdef ASSERT 26 | AllocateNode* alloc() const { return _alloc; } 27 | #endif 28 | 29 | virtual uint size_of() const { return sizeof(*this); } 30 | @@ -637,10 +641,11 @@ 31 | void extract_projections(CallProjections* projs, bool separate_io_proj, bool do_asserts = true); 32 | 33 | virtual uint match_edge(uint idx) const; 34 | 35 | bool is_call_to_arraycopystub() const; 36 | + bool is_call_to_osr_migration_end() const; 37 | 38 | #ifndef PRODUCT 39 | virtual void dump_req(outputStream *st = tty) const; 40 | virtual void dump_spec(outputStream *st) const; 41 | #endif 42 | @@ -839,10 +844,13 @@ 43 | InitialTest, // slow-path test (may be constant) 44 | ALength, // array length (or TOP if none) 45 | ParmLimit 46 | }; 47 | 48 | + // Maximum object size considered for stack allocation 49 | + static const int StackAllocSizeLimit = 0x100; 50 | + 51 | static const TypeFunc* alloc_type(const Type* t) { 52 | const Type** fields = TypeTuple::fields(ParmLimit - TypeFunc::Parms); 53 | fields[AllocSize] = TypeInt::POS; 54 | fields[KlassNode] = TypeInstPtr::NOTNULL; 55 | fields[InitialTest] = TypeInt::BOOL; 56 | @@ -860,10 +868,12 @@ 57 | } 58 | 59 | // Result of Escape Analysis 60 | bool _is_scalar_replaceable; 61 | bool _is_non_escaping; 62 | + bool _is_stack_allocateable; 63 | + bool _is_referenced_stack_allocation; 64 | // True when MemBar for new is redundant with MemBar at initialzer exit 65 | bool _is_allocation_MemBar_redundant; 66 | 67 | virtual uint size_of() const; // Size is bigger 68 | AllocateNode(Compile* C, const TypeFunc *atype, Node *ctrl, Node *mem, Node *abio, 69 | -------------------------------------------------------------------------------- /stack_allocation/webrev/src/hotspot/share/opto/compile.cpp.cdiff.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Cdiff src/hotspot/share/opto/compile.cpp 6 | 7 | 8 | 9 |
< prev index next >

src/hotspot/share/opto/compile.cpp

10 | Print this page 11 |
12 |
13 | *** 902,10 ***
14 | --- 902,12 ---
15 |     env()->set_oop_recorder(new OopRecorder(env()->arena()));
16 |     env()->set_debug_info(new DebugInformationRecorder(env()->oop_recorder()));
17 |     env()->set_dependencies(new Dependencies(env()));
18 |   
19 |     _fixed_slots = 0;
20 | +   _stack_allocated_slots = 0;
21 | +   set_fail_stack_allocation_with_references(false);
22 |     set_has_split_ifs(false);
23 |     set_has_loops(has_method() && method()->has_loops()); // first approximation
24 |     set_has_stringbuilder(false);
25 |     set_has_boxed_value(false);
26 |     _trap_can_recompile = false;  // no traps emitted yet
27 | 
28 |
< prev index next >
29 | -------------------------------------------------------------------------------- /stack_allocation/webrev/src/hotspot/share/opto/compile.cpp.frames.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Frames src/hotspot/share/opto/compile.cpp 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /stack_allocation/webrev/src/hotspot/share/opto/compile.cpp.frames.prev_next.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Frames src/hotspot/share/opto/compile.cpp 6 | 7 | 8 |
< prev index next >
9 | -------------------------------------------------------------------------------- /stack_allocation/webrev/src/hotspot/share/opto/compile.cpp.patch: -------------------------------------------------------------------------------- 1 | diff a/src/hotspot/share/opto/compile.cpp b/src/hotspot/share/opto/compile.cpp 2 | --- a/src/hotspot/share/opto/compile.cpp 3 | +++ b/src/hotspot/share/opto/compile.cpp 4 | @@ -902,10 +902,12 @@ 5 | env()->set_oop_recorder(new OopRecorder(env()->arena())); 6 | env()->set_debug_info(new DebugInformationRecorder(env()->oop_recorder())); 7 | env()->set_dependencies(new Dependencies(env())); 8 | 9 | _fixed_slots = 0; 10 | + _stack_allocated_slots = 0; 11 | + set_fail_stack_allocation_with_references(false); 12 | set_has_split_ifs(false); 13 | set_has_loops(has_method() && method()->has_loops()); // first approximation 14 | set_has_stringbuilder(false); 15 | set_has_boxed_value(false); 16 | _trap_can_recompile = false; // no traps emitted yet 17 | -------------------------------------------------------------------------------- /stack_allocation/webrev/src/hotspot/share/opto/compile.cpp.udiff.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Udiff src/hotspot/share/opto/compile.cpp 6 | 7 | 8 | 9 |
< prev index next >

src/hotspot/share/opto/compile.cpp

10 | Print this page 11 |
12 |
13 | @@ -902,10 +902,12 @@
14 |     env()->set_oop_recorder(new OopRecorder(env()->arena()));
15 |     env()->set_debug_info(new DebugInformationRecorder(env()->oop_recorder()));
16 |     env()->set_dependencies(new Dependencies(env()));
17 |   
18 |     _fixed_slots = 0;
19 | +   _stack_allocated_slots = 0;
20 | +   set_fail_stack_allocation_with_references(false);
21 |     set_has_split_ifs(false);
22 |     set_has_loops(has_method() && method()->has_loops()); // first approximation
23 |     set_has_stringbuilder(false);
24 |     set_has_boxed_value(false);
25 |     _trap_can_recompile = false;  // no traps emitted yet
26 | 
27 |
< prev index next >
28 | -------------------------------------------------------------------------------- /stack_allocation/webrev/src/hotspot/share/opto/compile.hpp.frames.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Frames src/hotspot/share/opto/compile.hpp 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /stack_allocation/webrev/src/hotspot/share/opto/compile.hpp.frames.prev_next.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Frames src/hotspot/share/opto/compile.hpp 6 | 7 | 8 |
< prev index next >
9 | -------------------------------------------------------------------------------- /stack_allocation/webrev/src/hotspot/share/opto/escape.cpp.frames.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Frames src/hotspot/share/opto/escape.cpp 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /stack_allocation/webrev/src/hotspot/share/opto/escape.cpp.frames.prev_next.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Frames src/hotspot/share/opto/escape.cpp 6 | 7 | 8 |
< prev index next >
9 | -------------------------------------------------------------------------------- /stack_allocation/webrev/src/hotspot/share/opto/escape.hpp.frames.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Frames src/hotspot/share/opto/escape.hpp 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /stack_allocation/webrev/src/hotspot/share/opto/escape.hpp.frames.prev_next.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Frames src/hotspot/share/opto/escape.hpp 6 | 7 | 8 |
< prev index next >
9 | -------------------------------------------------------------------------------- /stack_allocation/webrev/src/hotspot/share/opto/escape.hpp.patch: -------------------------------------------------------------------------------- 1 | diff a/src/hotspot/share/opto/escape.hpp b/src/hotspot/share/opto/escape.hpp 2 | --- a/src/hotspot/share/opto/escape.hpp 3 | +++ b/src/hotspot/share/opto/escape.hpp 4 | @@ -331,10 +331,12 @@ 5 | // is still being collected. If false, 6 | // no new nodes will be processed. 7 | 8 | bool _verify; // verify graph 9 | 10 | + bool _has_locks; // Used by stack allocation 11 | + 12 | JavaObjectNode* null_obj; 13 | Node* _pcmp_neq; // ConI(#CC_GT) 14 | Node* _pcmp_eq; // ConI(#CC_EQ) 15 | 16 | Compile* _compile; // Compile object for current compilation 17 | @@ -598,12 +600,42 @@ 18 | } 19 | 20 | void add_to_congraph_unsafe_access(Node* n, uint opcode, Unique_Node_List* delayed_worklist); 21 | bool add_final_edges_unsafe_access(Node* n, uint opcode); 22 | 23 | + // Helpers for stack allocation 24 | + 25 | + // If an allocation is dominated by a loop, check to see if the lifetime of two instances 26 | + // may overlap. If they do this allocate is not eligible for stack allocation 27 | + bool allocation_lifetime_overlap(AllocateNode *alloc, PhiNode *phi); 28 | + // Stack allocation has limited support for compressed references at the moment. 29 | + // This helper checks if an oop may be compressed at some point in the graph. 30 | + bool oop_may_be_compressed(Node* alloc_result); 31 | + // Check if the alloc node is eligible for stack allocation 32 | + bool eligible_for_stack_allocation(PointsToNode* ptn); 33 | + // Check if the alloc has uses that make it ineligible for stack allocation 34 | + bool all_uses_eligible_for_stack_allocation(PointsToNode *ptn); 35 | + // Verify object chains for stack allocated objects. Heap objects cannot point to stack allocated objects. 36 | + bool verify_stack_allocated_object_chains(GrowableArray &non_escaped_worklist, int non_escaped_length); 37 | +#ifndef PRODUCT 38 | + void print_stack_allocated_candidates(GrowableArray &non_escaped_worklist, int non_escaped_length); 39 | +#endif 40 | + 41 | #ifndef PRODUCT 42 | void dump(GrowableArray& ptnodes_worklist); 43 | + 44 | + bool print_escape_analysis() { 45 | + return PrintEscapeAnalysis || _compile->directive()->PrintEscapeAnalysisOption; 46 | + } 47 | + 48 | + bool print_eliminate_allocations() { 49 | + return PrintEliminateAllocations || _compile->directive()->PrintEliminateAllocationsOption; 50 | + } 51 | + 52 | + bool print_stack_allocation() { 53 | + return PrintStackAllocation || _compile->directive()->PrintStackAllocationOption; 54 | + } 55 | #endif 56 | }; 57 | 58 | inline PointsToNode::PointsToNode(ConnectionGraph *CG, Node* n, EscapeState es, NodeType type): 59 | _edges(CG->_compile->comp_arena(), 2, 0, NULL), 60 | -------------------------------------------------------------------------------- /stack_allocation/webrev/src/hotspot/share/opto/idealKit.cpp.frames.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Frames src/hotspot/share/opto/idealKit.cpp 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /stack_allocation/webrev/src/hotspot/share/opto/idealKit.cpp.frames.prev_next.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Frames src/hotspot/share/opto/idealKit.cpp 6 | 7 | 8 |
< prev index next >
9 | -------------------------------------------------------------------------------- /stack_allocation/webrev/src/hotspot/share/opto/idealKit.cpp.patch: -------------------------------------------------------------------------------- 1 | diff a/src/hotspot/share/opto/idealKit.cpp b/src/hotspot/share/opto/idealKit.cpp 2 | --- a/src/hotspot/share/opto/idealKit.cpp 3 | +++ b/src/hotspot/share/opto/idealKit.cpp 4 | @@ -62,10 +62,34 @@ 5 | set_all_memory(gkit->merged_memory()); 6 | set_i_o(gkit->i_o()); 7 | set_ctrl(gkit->control()); 8 | } 9 | 10 | +//-------------------------------uif_then------------------------------------- 11 | +// Create: unsigned if(left relop right) 12 | +// / \ 13 | +// iffalse iftrue 14 | +// Push the iffalse cvstate onto the stack. The iftrue becomes the current cvstate. 15 | +void IdealKit::uif_then(Node* left, BoolTest::mask relop, 16 | + Node* right, float prob, float cnt, bool push_new_state) { 17 | + assert((state() & (BlockS|LoopS|IfThenS|ElseS)), "bad state for new If"); 18 | + Node* bol; 19 | + if (left->bottom_type()->isa_ptr() == NULL) { 20 | + if (left->bottom_type()->isa_int() != NULL) { 21 | + bol = Bool(CmpU(left, right), relop); 22 | + } else { 23 | + assert(left->bottom_type()->isa_long() != NULL, "what else?"); 24 | + bol = Bool(CmpUL(left, right), relop); 25 | + } 26 | + 27 | + } else { 28 | + bol = Bool(CmpP(left, right), relop); 29 | + } 30 | + 31 | + if_then_common(bol, prob, cnt, push_new_state); 32 | +} 33 | + 34 | //-------------------------------if_then------------------------------------- 35 | // Create: if(left relop right) 36 | // / \ 37 | // iffalse iftrue 38 | // Push the iffalse cvstate onto the stack. The iftrue becomes the current cvstate. 39 | @@ -82,10 +106,17 @@ 40 | } 41 | 42 | } else { 43 | bol = Bool(CmpP(left, right), relop); 44 | } 45 | + 46 | + if_then_common(bol, prob, cnt, push_new_state); 47 | +} 48 | + 49 | +// Common helper to create the If nodes for if_then and uif_then 50 | +void IdealKit::if_then_common(Node* bol, float prob, float cnt, 51 | + bool push_new_state) { 52 | // Delay gvn.tranform on if-nodes until construction is finished 53 | // to prevent a constant bool input from discarding a control output. 54 | IfNode* iff = delay_transform(new IfNode(ctrl(), bol, prob, cnt))->as_If(); 55 | Node* then = IfTrue(iff); 56 | Node* elsen = IfFalse(iff); 57 | -------------------------------------------------------------------------------- /stack_allocation/webrev/src/hotspot/share/opto/idealKit.hpp.frames.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Frames src/hotspot/share/opto/idealKit.hpp 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /stack_allocation/webrev/src/hotspot/share/opto/idealKit.hpp.frames.prev_next.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Frames src/hotspot/share/opto/idealKit.hpp 6 | 7 | 8 |
< prev index next >
9 | -------------------------------------------------------------------------------- /stack_allocation/webrev/src/hotspot/share/opto/idealKit.hpp.patch: -------------------------------------------------------------------------------- 1 | diff a/src/hotspot/share/opto/idealKit.hpp b/src/hotspot/share/opto/idealKit.hpp 2 | --- a/src/hotspot/share/opto/idealKit.hpp 3 | +++ b/src/hotspot/share/opto/idealKit.hpp 4 | @@ -125,10 +125,14 @@ 5 | Node* promote_to_phi(Node* n, Node* reg);// Promote "n" to a phi on region "reg" 6 | bool was_promoted_to_phi(Node* n, Node* reg) { 7 | return (n->is_Phi() && n->in(0) == reg); 8 | } 9 | void declare(IdealVariable* v) { v->set_id(_var_ct++); } 10 | + 11 | + void if_then_common(Node* bol, float prob = PROB_FAIR, float cnt = COUNT_UNKNOWN, 12 | + bool push_new_state = true); 13 | + 14 | // This declares the position where vars are kept in the cvstate 15 | // For some degree of consistency we use the TypeFunc enum to 16 | // soak up spots in the inputs even though we only use early Control 17 | // and Memory slots. (So far.) 18 | static const uint first_var; // = TypeFunc::Parms + 1; 19 | @@ -161,10 +165,13 @@ 20 | Node* value(IdealVariable& v) { return _cvstate->in(first_var + v.id()); } 21 | void dead(IdealVariable& v) { set(v, (Node*)NULL); } 22 | void if_then(Node* left, BoolTest::mask relop, Node* right, 23 | float prob = PROB_FAIR, float cnt = COUNT_UNKNOWN, 24 | bool push_new_state = true); 25 | + void uif_then(Node* left, BoolTest::mask relop, Node* right, 26 | + float prob = PROB_FAIR, float cnt = COUNT_UNKNOWN, 27 | + bool push_new_state = true); 28 | void else_(); 29 | void end_if(); 30 | void loop(GraphKit* gkit, int nargs, IdealVariable& iv, Node* init, BoolTest::mask cmp, Node* limit, 31 | float prob = PROB_LIKELY(0.9), float cnt = COUNT_UNKNOWN); 32 | void end_loop(); 33 | @@ -180,20 +187,23 @@ 34 | Node* ConI(jint k) { return (Node*)gvn().intcon(k); } 35 | Node* makecon(const Type *t) const { return _gvn.makecon(t); } 36 | 37 | Node* AddI(Node* l, Node* r) { return transform(new AddINode(l, r)); } 38 | Node* SubI(Node* l, Node* r) { return transform(new SubINode(l, r)); } 39 | + Node* SubL(Node* l, Node* r) { return transform(new SubLNode(l, r)); } 40 | Node* AndI(Node* l, Node* r) { return transform(new AndINode(l, r)); } 41 | Node* OrI(Node* l, Node* r) { return transform(new OrINode(l, r)); } 42 | Node* MaxI(Node* l, Node* r) { return transform(new MaxINode(l, r)); } 43 | Node* LShiftI(Node* l, Node* r) { return transform(new LShiftINode(l, r)); } 44 | Node* CmpI(Node* l, Node* r) { return transform(new CmpINode(l, r)); } 45 | + Node* CmpU(Node* l, Node* r) { return transform(new CmpUNode(l, r)); } 46 | Node* Bool(Node* cmp, BoolTest::mask relop) { return transform(new BoolNode(cmp, relop)); } 47 | void increment(IdealVariable& v, Node* j) { set(v, AddI(value(v), j)); } 48 | void decrement(IdealVariable& v, Node* j) { set(v, SubI(value(v), j)); } 49 | 50 | Node* CmpL(Node* l, Node* r) { return transform(new CmpLNode(l, r)); } 51 | + Node* CmpUL(Node* l, Node* r) { return transform(new CmpULNode(l, r)); } 52 | 53 | // TLS 54 | Node* thread() { return gvn().transform(new ThreadLocalNode()); } 55 | 56 | // Pointers 57 | -------------------------------------------------------------------------------- /stack_allocation/webrev/src/hotspot/share/opto/loopnode.cpp.cdiff.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Cdiff src/hotspot/share/opto/loopnode.cpp 6 | 7 | 8 | 9 |
< prev index next >

src/hotspot/share/opto/loopnode.cpp

10 | Print this page 11 |
12 |
13 | *** 3889,11 ***
14 |                 (n->in(0)->Opcode() == Op_IfFalse &&
15 |                  (1.0 - iff->as_If()->_prob) >= 0.01) ||
16 |                 (iff->as_If()->_prob >= 0.01) )
17 |               innermost->_has_call = 1;
18 |           }
19 | !       } else if( n->is_Allocate() && n->as_Allocate()->_is_scalar_replaceable ) {
20 |           // Disable loop optimizations if the loop has a scalar replaceable
21 |           // allocation. This disabling may cause a potential performance lost
22 |           // if the allocation is not eliminated for some reason.
23 |           innermost->_allow_optimizations = false;
24 |           innermost->_has_call = 1; // = true
25 | --- 3889,11 ---
26 |                 (n->in(0)->Opcode() == Op_IfFalse &&
27 |                  (1.0 - iff->as_If()->_prob) >= 0.01) ||
28 |                 (iff->as_If()->_prob >= 0.01) )
29 |               innermost->_has_call = 1;
30 |           }
31 | !       } else if( n->is_Allocate() && (n->as_Allocate()->_is_scalar_replaceable || n->as_Allocate()->_is_stack_allocateable) ) {
32 |           // Disable loop optimizations if the loop has a scalar replaceable
33 |           // allocation. This disabling may cause a potential performance lost
34 |           // if the allocation is not eliminated for some reason.
35 |           innermost->_allow_optimizations = false;
36 |           innermost->_has_call = 1; // = true
37 | 
38 |
< prev index next >
39 | -------------------------------------------------------------------------------- /stack_allocation/webrev/src/hotspot/share/opto/loopnode.cpp.frames.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Frames src/hotspot/share/opto/loopnode.cpp 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /stack_allocation/webrev/src/hotspot/share/opto/loopnode.cpp.frames.prev_next.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Frames src/hotspot/share/opto/loopnode.cpp 6 | 7 | 8 |
< prev index next >
9 | -------------------------------------------------------------------------------- /stack_allocation/webrev/src/hotspot/share/opto/loopnode.cpp.patch: -------------------------------------------------------------------------------- 1 | diff a/src/hotspot/share/opto/loopnode.cpp b/src/hotspot/share/opto/loopnode.cpp 2 | --- a/src/hotspot/share/opto/loopnode.cpp 3 | +++ b/src/hotspot/share/opto/loopnode.cpp 4 | @@ -3889,11 +3889,11 @@ 5 | (n->in(0)->Opcode() == Op_IfFalse && 6 | (1.0 - iff->as_If()->_prob) >= 0.01) || 7 | (iff->as_If()->_prob >= 0.01) ) 8 | innermost->_has_call = 1; 9 | } 10 | - } else if( n->is_Allocate() && n->as_Allocate()->_is_scalar_replaceable ) { 11 | + } else if( n->is_Allocate() && (n->as_Allocate()->_is_scalar_replaceable || n->as_Allocate()->_is_stack_allocateable) ) { 12 | // Disable loop optimizations if the loop has a scalar replaceable 13 | // allocation. This disabling may cause a potential performance lost 14 | // if the allocation is not eliminated for some reason. 15 | innermost->_allow_optimizations = false; 16 | innermost->_has_call = 1; // = true 17 | -------------------------------------------------------------------------------- /stack_allocation/webrev/src/hotspot/share/opto/loopnode.cpp.udiff.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Udiff src/hotspot/share/opto/loopnode.cpp 6 | 7 | 8 | 9 |
< prev index next >

src/hotspot/share/opto/loopnode.cpp

10 | Print this page 11 |
12 |
13 | @@ -3889,11 +3889,11 @@
14 |                 (n->in(0)->Opcode() == Op_IfFalse &&
15 |                  (1.0 - iff->as_If()->_prob) >= 0.01) ||
16 |                 (iff->as_If()->_prob >= 0.01) )
17 |               innermost->_has_call = 1;
18 |           }
19 | -       } else if( n->is_Allocate() && n->as_Allocate()->_is_scalar_replaceable ) {
20 | +       } else if( n->is_Allocate() && (n->as_Allocate()->_is_scalar_replaceable || n->as_Allocate()->_is_stack_allocateable) ) {
21 |           // Disable loop optimizations if the loop has a scalar replaceable
22 |           // allocation. This disabling may cause a potential performance lost
23 |           // if the allocation is not eliminated for some reason.
24 |           innermost->_allow_optimizations = false;
25 |           innermost->_has_call = 1; // = true
26 | 
27 |
< prev index next >
28 | -------------------------------------------------------------------------------- /stack_allocation/webrev/src/hotspot/share/opto/machnode.hpp.cdiff.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Cdiff src/hotspot/share/opto/machnode.hpp 6 | 7 | 8 | 9 |
< prev index next >

src/hotspot/share/opto/machnode.hpp

10 | Print this page 11 |
12 |
13 | *** 844,11 ***
14 |       return in(_jvmadj + jvms->locoff() + idx);
15 |     }
16 |     Node *stack(const JVMState* jvms, uint idx) const {
17 |       assert(verify_jvms(jvms), "jvms must match");
18 |       return in(_jvmadj + jvms->stkoff() + idx);
19 | !  }
20 |     Node *monitor_obj(const JVMState* jvms, uint idx) const {
21 |       assert(verify_jvms(jvms), "jvms must match");
22 |       return in(_jvmadj + jvms->monitor_obj_offset(idx));
23 |     }
24 |     Node *monitor_box(const JVMState* jvms, uint idx) const {
25 | --- 844,15 ---
26 |       return in(_jvmadj + jvms->locoff() + idx);
27 |     }
28 |     Node *stack(const JVMState* jvms, uint idx) const {
29 |       assert(verify_jvms(jvms), "jvms must match");
30 |       return in(_jvmadj + jvms->stkoff() + idx);
31 | !   }
32 | +   Node *scalar(const JVMState* jvms, uint idx) const {
33 | +     assert(verify_jvms(jvms), "jvms must match");
34 | +     return in(_jvmadj + jvms->scloff() + idx);
35 | +   }
36 |     Node *monitor_obj(const JVMState* jvms, uint idx) const {
37 |       assert(verify_jvms(jvms), "jvms must match");
38 |       return in(_jvmadj + jvms->monitor_obj_offset(idx));
39 |     }
40 |     Node *monitor_box(const JVMState* jvms, uint idx) const {
41 | 
42 |
< prev index next >
43 | -------------------------------------------------------------------------------- /stack_allocation/webrev/src/hotspot/share/opto/machnode.hpp.frames.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Frames src/hotspot/share/opto/machnode.hpp 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /stack_allocation/webrev/src/hotspot/share/opto/machnode.hpp.frames.prev_next.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Frames src/hotspot/share/opto/machnode.hpp 6 | 7 | 8 |
< prev index next >
9 | -------------------------------------------------------------------------------- /stack_allocation/webrev/src/hotspot/share/opto/machnode.hpp.patch: -------------------------------------------------------------------------------- 1 | diff a/src/hotspot/share/opto/machnode.hpp b/src/hotspot/share/opto/machnode.hpp 2 | --- a/src/hotspot/share/opto/machnode.hpp 3 | +++ b/src/hotspot/share/opto/machnode.hpp 4 | @@ -844,11 +844,15 @@ 5 | return in(_jvmadj + jvms->locoff() + idx); 6 | } 7 | Node *stack(const JVMState* jvms, uint idx) const { 8 | assert(verify_jvms(jvms), "jvms must match"); 9 | return in(_jvmadj + jvms->stkoff() + idx); 10 | - } 11 | + } 12 | + Node *scalar(const JVMState* jvms, uint idx) const { 13 | + assert(verify_jvms(jvms), "jvms must match"); 14 | + return in(_jvmadj + jvms->scloff() + idx); 15 | + } 16 | Node *monitor_obj(const JVMState* jvms, uint idx) const { 17 | assert(verify_jvms(jvms), "jvms must match"); 18 | return in(_jvmadj + jvms->monitor_obj_offset(idx)); 19 | } 20 | Node *monitor_box(const JVMState* jvms, uint idx) const { 21 | -------------------------------------------------------------------------------- /stack_allocation/webrev/src/hotspot/share/opto/machnode.hpp.udiff.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Udiff src/hotspot/share/opto/machnode.hpp 6 | 7 | 8 | 9 |
< prev index next >

src/hotspot/share/opto/machnode.hpp

10 | Print this page 11 |
12 |
13 | @@ -844,11 +844,15 @@
14 |       return in(_jvmadj + jvms->locoff() + idx);
15 |     }
16 |     Node *stack(const JVMState* jvms, uint idx) const {
17 |       assert(verify_jvms(jvms), "jvms must match");
18 |       return in(_jvmadj + jvms->stkoff() + idx);
19 | -  }
20 | +   }
21 | +   Node *scalar(const JVMState* jvms, uint idx) const {
22 | +     assert(verify_jvms(jvms), "jvms must match");
23 | +     return in(_jvmadj + jvms->scloff() + idx);
24 | +   }
25 |     Node *monitor_obj(const JVMState* jvms, uint idx) const {
26 |       assert(verify_jvms(jvms), "jvms must match");
27 |       return in(_jvmadj + jvms->monitor_obj_offset(idx));
28 |     }
29 |     Node *monitor_box(const JVMState* jvms, uint idx) const {
30 | 
31 |
< prev index next >
32 | -------------------------------------------------------------------------------- /stack_allocation/webrev/src/hotspot/share/opto/macro.cpp.frames.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Frames src/hotspot/share/opto/macro.cpp 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /stack_allocation/webrev/src/hotspot/share/opto/macro.cpp.frames.prev_next.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Frames src/hotspot/share/opto/macro.cpp 6 | 7 | 8 |
< prev index next >
9 | -------------------------------------------------------------------------------- /stack_allocation/webrev/src/hotspot/share/opto/macro.hpp.frames.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Frames src/hotspot/share/opto/macro.hpp 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /stack_allocation/webrev/src/hotspot/share/opto/macro.hpp.frames.prev_next.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Frames src/hotspot/share/opto/macro.hpp 6 | 7 | 8 |
< prev index next >
9 | -------------------------------------------------------------------------------- /stack_allocation/webrev/src/hotspot/share/opto/memnode.cpp.frames.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Frames src/hotspot/share/opto/memnode.cpp 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /stack_allocation/webrev/src/hotspot/share/opto/memnode.cpp.frames.prev_next.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Frames src/hotspot/share/opto/memnode.cpp 6 | 7 | 8 |
< prev index next >
9 | -------------------------------------------------------------------------------- /stack_allocation/webrev/src/hotspot/share/opto/memnode.cpp.patch: -------------------------------------------------------------------------------- 1 | diff a/src/hotspot/share/opto/memnode.cpp b/src/hotspot/share/opto/memnode.cpp 2 | --- a/src/hotspot/share/opto/memnode.cpp 3 | +++ b/src/hotspot/share/opto/memnode.cpp 4 | @@ -186,11 +186,14 @@ 5 | result = proj_in->in(TypeFunc::Memory); 6 | } else { 7 | assert(false, "unexpected projection"); 8 | } 9 | } else if (result->is_ClearArray()) { 10 | - if (!is_instance || !ClearArrayNode::step_through(&result, instance_id, phase)) { 11 | + intptr_t offset; 12 | + AllocateNode* alloc = AllocateNode::Ideal_allocation(result->in(3), phase, offset); 13 | + 14 | + if (!is_instance || (alloc == NULL) || !ClearArrayNode::step_through(&result, instance_id, phase)) { 15 | // Can not bypass initialization of the instance 16 | // we are looking for. 17 | break; 18 | } 19 | // Otherwise skip it (the call updated 'result' value). 20 | @@ -706,11 +709,14 @@ 21 | break; 22 | } 23 | mem = mem->in(0)->in(TypeFunc::Memory); 24 | continue; // (a) advance through independent MemBar memory 25 | } else if (mem->is_ClearArray()) { 26 | - if (ClearArrayNode::step_through(&mem, (uint)addr_t->instance_id(), phase)) { 27 | + intptr_t offset; 28 | + AllocateNode* alloc = AllocateNode::Ideal_allocation(mem->in(3), phase, offset); 29 | + 30 | + if ((alloc != NULL) && ClearArrayNode::step_through(&mem, (uint)addr_t->instance_id(), phase)) { 31 | // (the call updated 'mem' value) 32 | continue; // (a) advance through independent allocation memory 33 | } else { 34 | // Can not bypass initialization of the instance 35 | // we are looking for. 36 | -------------------------------------------------------------------------------- /stack_allocation/webrev/src/hotspot/share/opto/memnode.cpp.udiff.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Udiff src/hotspot/share/opto/memnode.cpp 6 | 7 | 8 | 9 |
< prev index next >

src/hotspot/share/opto/memnode.cpp

10 | Print this page 11 |
12 |
13 | @@ -186,11 +186,14 @@
14 |           result = proj_in->in(TypeFunc::Memory);
15 |         } else {
16 |           assert(false, "unexpected projection");
17 |         }
18 |       } else if (result->is_ClearArray()) {
19 | -       if (!is_instance || !ClearArrayNode::step_through(&result, instance_id, phase)) {
20 | +       intptr_t offset;
21 | +       AllocateNode* alloc = AllocateNode::Ideal_allocation(result->in(3), phase, offset);
22 | + 
23 | +       if (!is_instance || (alloc == NULL) || !ClearArrayNode::step_through(&result, instance_id, phase)) {
24 |           // Can not bypass initialization of the instance
25 |           // we are looking for.
26 |           break;
27 |         }
28 |         // Otherwise skip it (the call updated 'result' value).
29 | 
30 |
31 |
32 | @@ -706,11 +709,14 @@
33 |             break;
34 |           }
35 |           mem = mem->in(0)->in(TypeFunc::Memory);
36 |           continue;           // (a) advance through independent MemBar memory
37 |         } else if (mem->is_ClearArray()) {
38 | -         if (ClearArrayNode::step_through(&mem, (uint)addr_t->instance_id(), phase)) {
39 | +         intptr_t offset;
40 | +         AllocateNode* alloc = AllocateNode::Ideal_allocation(mem->in(3), phase, offset);
41 | + 
42 | +         if ((alloc != NULL) && ClearArrayNode::step_through(&mem, (uint)addr_t->instance_id(), phase)) {
43 |             // (the call updated 'mem' value)
44 |             continue;         // (a) advance through independent allocation memory
45 |           } else {
46 |             // Can not bypass initialization of the instance
47 |             // we are looking for.
48 | 
49 |
< prev index next >
50 | -------------------------------------------------------------------------------- /stack_allocation/webrev/src/hotspot/share/opto/output.cpp.frames.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Frames src/hotspot/share/opto/output.cpp 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /stack_allocation/webrev/src/hotspot/share/opto/output.cpp.frames.prev_next.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Frames src/hotspot/share/opto/output.cpp 6 | 7 | 8 |
< prev index next >
9 | -------------------------------------------------------------------------------- /stack_allocation/webrev/src/hotspot/share/runtime/deoptimization.cpp.frames.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Frames src/hotspot/share/runtime/deoptimization.cpp 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /stack_allocation/webrev/src/hotspot/share/runtime/deoptimization.cpp.frames.prev_next.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Frames src/hotspot/share/runtime/deoptimization.cpp 6 | 7 | 8 |
< prev index next >
9 | -------------------------------------------------------------------------------- /stack_allocation/webrev/src/hotspot/share/runtime/deoptimization.hpp.frames.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Frames src/hotspot/share/runtime/deoptimization.hpp 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /stack_allocation/webrev/src/hotspot/share/runtime/deoptimization.hpp.frames.prev_next.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Frames src/hotspot/share/runtime/deoptimization.hpp 6 | 7 | 8 |
< prev index next >
9 | -------------------------------------------------------------------------------- /stack_allocation/webrev/src/hotspot/share/runtime/deoptimization.hpp.patch: -------------------------------------------------------------------------------- 1 | diff a/src/hotspot/share/runtime/deoptimization.hpp b/src/hotspot/share/runtime/deoptimization.hpp 2 | --- a/src/hotspot/share/runtime/deoptimization.hpp 3 | +++ b/src/hotspot/share/runtime/deoptimization.hpp 4 | @@ -168,12 +168,19 @@ 5 | #if COMPILER2_OR_JVMCI 6 | public: 7 | 8 | // Support for restoring non-escaping objects 9 | static bool realloc_objects(JavaThread* thread, frame* fr, RegisterMap* reg_map, GrowableArray* objects, TRAPS); 10 | - static void reassign_type_array_elements(frame* fr, RegisterMap* reg_map, ObjectValue* sv, typeArrayOop obj, BasicType type); 11 | - static void reassign_object_array_elements(frame* fr, RegisterMap* reg_map, ObjectValue* sv, objArrayOop obj); 12 | + static void reassign_stack_allocated_fields(frame *fr, GrowableArray* objects, ObjectValue *sv, Handle obj, Klass* k); 13 | + static void reassign_stack_allocated_type_array_elements(oop orig, oop newly_allocated, Klass *k); 14 | + static void reassign_stack_allocated_object_array_elements(oop orig, oop newly_allocated, intptr_t *sp_base, intptr_t *sp_top, GrowableArray* objects); 15 | + static void reassign_scalar_replaced_fields(frame *fr, RegisterMap *reg_map, GrowableArray* objects, ObjectValue *sv, Handle obj, Klass* k, bool skip_internal); 16 | + static void reassign_scalar_replaced_type_array_elements(frame* fr, RegisterMap* reg_map, ObjectValue* sv, typeArrayOop obj, BasicType type); 17 | + static void reassign_scalar_replaced_object_array_elements(frame* fr, RegisterMap* reg_map, GrowableArray* objects, ObjectValue* sv, objArrayOop obj); 18 | + static ScopeValue *get_scope_value(frame* fr, RegisterMap* reg_map, ScopeValue* sv, GrowableArray* objects); 19 | + static ScopeValue *match_object_to_stack_oop(intptr_t *oop_ptr, intptr_t *sp_base, GrowableArray* objects); 20 | + static void reassign_scalar_replaced_fields_by_klass(InstanceKlass* klass, frame* fr, RegisterMap* reg_map, GrowableArray* objects, ObjectValue* sv, int svIndex, oop obj, bool skip_internal); 21 | static void reassign_fields(frame* fr, RegisterMap* reg_map, GrowableArray* objects, bool realloc_failures, bool skip_internal); 22 | static void relock_objects(GrowableArray* monitors, JavaThread* thread, bool realloc_failures); 23 | static void pop_frames_failed_reallocs(JavaThread* thread, vframeArray* array); 24 | NOT_PRODUCT(static void print_objects(GrowableArray* objects, bool realloc_failures);) 25 | #endif // COMPILER2_OR_JVMCI 26 | -------------------------------------------------------------------------------- /stack_allocation/webrev/src/hotspot/share/runtime/vframe_hp.cpp.frames.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Frames src/hotspot/share/runtime/vframe_hp.cpp 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /stack_allocation/webrev/src/hotspot/share/runtime/vframe_hp.cpp.frames.prev_next.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Frames src/hotspot/share/runtime/vframe_hp.cpp 6 | 7 | 8 |
< prev index next >
9 | -------------------------------------------------------------------------------- /stack_allocation/webrev/src/hotspot/share/runtime/vframe_hp.hpp.cdiff.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Cdiff src/hotspot/share/runtime/vframe_hp.hpp 6 | 7 | 8 | 9 |
< prev index next >

src/hotspot/share/runtime/vframe_hp.hpp

10 | Print this page 11 |
12 |
13 | *** 76,17 ***
14 | --- 76,21 ---
15 |     compiledVFrame* at_scope(int decode_offset, int vframe_id);
16 |   
17 |     // Returns SynchronizationEntryBCI or bci() (used for synchronization)
18 |     int raw_bci() const;
19 |   
20 | +   // Used by stack allocation to match a stack oop to a described stack allocated object
21 | +   ScopeValue *match_object_to_stack_oop(intptr_t *oop_ptr, intptr_t *sp_base, GrowableArray<ScopeValue*>* objects) const;
22 | + 
23 |    protected:
24 |     ScopeDesc* _scope;
25 |     int _vframe_id;
26 |   
27 |     //StackValue resolve(ScopeValue* sv) const;
28 |     BasicLock* resolve_monitor_lock(Location location) const;
29 |     StackValue *create_stack_value(ScopeValue *sv) const;
30 | +   ScopeValue *get_scope_value(GrowableArray<ScopeValue*>*  scv_list, int index, GrowableArray<ScopeValue*>* objects) const;
31 |   
32 |    private:
33 |     compiledVFrame(const frame* fr, const RegisterMap* reg_map, JavaThread* thread, ScopeDesc* scope, int vframe_id);
34 |   
35 |   #ifndef PRODUCT
36 | 
37 |
< prev index next >
38 | -------------------------------------------------------------------------------- /stack_allocation/webrev/src/hotspot/share/runtime/vframe_hp.hpp.frames.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Frames src/hotspot/share/runtime/vframe_hp.hpp 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /stack_allocation/webrev/src/hotspot/share/runtime/vframe_hp.hpp.frames.prev_next.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Frames src/hotspot/share/runtime/vframe_hp.hpp 6 | 7 | 8 |
< prev index next >
9 | -------------------------------------------------------------------------------- /stack_allocation/webrev/src/hotspot/share/runtime/vframe_hp.hpp.patch: -------------------------------------------------------------------------------- 1 | diff a/src/hotspot/share/runtime/vframe_hp.hpp b/src/hotspot/share/runtime/vframe_hp.hpp 2 | --- a/src/hotspot/share/runtime/vframe_hp.hpp 3 | +++ b/src/hotspot/share/runtime/vframe_hp.hpp 4 | @@ -76,17 +76,21 @@ 5 | compiledVFrame* at_scope(int decode_offset, int vframe_id); 6 | 7 | // Returns SynchronizationEntryBCI or bci() (used for synchronization) 8 | int raw_bci() const; 9 | 10 | + // Used by stack allocation to match a stack oop to a described stack allocated object 11 | + ScopeValue *match_object_to_stack_oop(intptr_t *oop_ptr, intptr_t *sp_base, GrowableArray* objects) const; 12 | + 13 | protected: 14 | ScopeDesc* _scope; 15 | int _vframe_id; 16 | 17 | //StackValue resolve(ScopeValue* sv) const; 18 | BasicLock* resolve_monitor_lock(Location location) const; 19 | StackValue *create_stack_value(ScopeValue *sv) const; 20 | + ScopeValue *get_scope_value(GrowableArray* scv_list, int index, GrowableArray* objects) const; 21 | 22 | private: 23 | compiledVFrame(const frame* fr, const RegisterMap* reg_map, JavaThread* thread, ScopeDesc* scope, int vframe_id); 24 | 25 | #ifndef PRODUCT 26 | -------------------------------------------------------------------------------- /stack_allocation/webrev/src/hotspot/share/runtime/vframe_hp.hpp.udiff.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Udiff src/hotspot/share/runtime/vframe_hp.hpp 6 | 7 | 8 | 9 |
< prev index next >

src/hotspot/share/runtime/vframe_hp.hpp

10 | Print this page 11 |
12 |
13 | @@ -76,17 +76,21 @@
14 |     compiledVFrame* at_scope(int decode_offset, int vframe_id);
15 |   
16 |     // Returns SynchronizationEntryBCI or bci() (used for synchronization)
17 |     int raw_bci() const;
18 |   
19 | +   // Used by stack allocation to match a stack oop to a described stack allocated object
20 | +   ScopeValue *match_object_to_stack_oop(intptr_t *oop_ptr, intptr_t *sp_base, GrowableArray<ScopeValue*>* objects) const;
21 | + 
22 |    protected:
23 |     ScopeDesc* _scope;
24 |     int _vframe_id;
25 |   
26 |     //StackValue resolve(ScopeValue* sv) const;
27 |     BasicLock* resolve_monitor_lock(Location location) const;
28 |     StackValue *create_stack_value(ScopeValue *sv) const;
29 | +   ScopeValue *get_scope_value(GrowableArray<ScopeValue*>*  scv_list, int index, GrowableArray<ScopeValue*>* objects) const;
30 |   
31 |    private:
32 |     compiledVFrame(const frame* fr, const RegisterMap* reg_map, JavaThread* thread, ScopeDesc* scope, int vframe_id);
33 |   
34 |   #ifndef PRODUCT
35 | 
36 |
< prev index next >
37 | -------------------------------------------------------------------------------- /stack_allocation/webrev/src/java.base/share/classes/java/util/ArrayList.java.cdiff.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Cdiff src/java.base/share/classes/java/util/ArrayList.java 6 | 7 | 8 | 9 |
< prev index next >

src/java.base/share/classes/java/util/ArrayList.java

10 | Print this page 11 |
12 |
13 | *** 233,12 ***
14 |               int newCapacity = ArraysSupport.newLength(oldCapacity,
15 |                       minCapacity - oldCapacity, /* minimum growth */
16 |                       oldCapacity >> 1           /* preferred growth */);
17 |               return elementData = Arrays.copyOf(elementData, newCapacity);
18 |           } else {
19 | !             return elementData = new Object[Math.max(DEFAULT_CAPACITY, minCapacity)];
20 | !         }
21 |       }
22 |   
23 |       private Object[] grow() {
24 |           return grow(size + 1);
25 |       }
26 | --- 233,15 ---
27 |               int newCapacity = ArraysSupport.newLength(oldCapacity,
28 |                       minCapacity - oldCapacity, /* minimum growth */
29 |                       oldCapacity >> 1           /* preferred growth */);
30 |               return elementData = Arrays.copyOf(elementData, newCapacity);
31 |           } else {
32 | !             if (DEFAULT_CAPACITY > minCapacity) {
33 | !                 return elementData = new Object[DEFAULT_CAPACITY];
34 | +             }
35 | +             return elementData = new Object[minCapacity];
36 | +          }
37 |       }
38 |   
39 |       private Object[] grow() {
40 |           return grow(size + 1);
41 |       }
42 | 
43 |
< prev index next >
44 | -------------------------------------------------------------------------------- /stack_allocation/webrev/src/java.base/share/classes/java/util/ArrayList.java.frames.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Frames src/java.base/share/classes/java/util/ArrayList.java 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /stack_allocation/webrev/src/java.base/share/classes/java/util/ArrayList.java.frames.prev_next.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Frames src/java.base/share/classes/java/util/ArrayList.java 6 | 7 | 8 |
< prev index next >
9 | -------------------------------------------------------------------------------- /stack_allocation/webrev/src/java.base/share/classes/java/util/ArrayList.java.patch: -------------------------------------------------------------------------------- 1 | diff a/src/java.base/share/classes/java/util/ArrayList.java b/src/java.base/share/classes/java/util/ArrayList.java 2 | --- a/src/java.base/share/classes/java/util/ArrayList.java 3 | +++ b/src/java.base/share/classes/java/util/ArrayList.java 4 | @@ -233,12 +233,15 @@ 5 | int newCapacity = ArraysSupport.newLength(oldCapacity, 6 | minCapacity - oldCapacity, /* minimum growth */ 7 | oldCapacity >> 1 /* preferred growth */); 8 | return elementData = Arrays.copyOf(elementData, newCapacity); 9 | } else { 10 | - return elementData = new Object[Math.max(DEFAULT_CAPACITY, minCapacity)]; 11 | - } 12 | + if (DEFAULT_CAPACITY > minCapacity) { 13 | + return elementData = new Object[DEFAULT_CAPACITY]; 14 | + } 15 | + return elementData = new Object[minCapacity]; 16 | + } 17 | } 18 | 19 | private Object[] grow() { 20 | return grow(size + 1); 21 | } 22 | -------------------------------------------------------------------------------- /stack_allocation/webrev/src/java.base/share/classes/java/util/ArrayList.java.udiff.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Udiff src/java.base/share/classes/java/util/ArrayList.java 6 | 7 | 8 | 9 |
< prev index next >

src/java.base/share/classes/java/util/ArrayList.java

10 | Print this page 11 |
12 |
13 | @@ -233,12 +233,15 @@
14 |               int newCapacity = ArraysSupport.newLength(oldCapacity,
15 |                       minCapacity - oldCapacity, /* minimum growth */
16 |                       oldCapacity >> 1           /* preferred growth */);
17 |               return elementData = Arrays.copyOf(elementData, newCapacity);
18 |           } else {
19 | -             return elementData = new Object[Math.max(DEFAULT_CAPACITY, minCapacity)];
20 | -         }
21 | +             if (DEFAULT_CAPACITY > minCapacity) {
22 | +                 return elementData = new Object[DEFAULT_CAPACITY];
23 | +             }
24 | +             return elementData = new Object[minCapacity];
25 | +          }
26 |       }
27 |   
28 |       private Object[] grow() {
29 |           return grow(size + 1);
30 |       }
31 | 
32 |
< prev index next >
33 | -------------------------------------------------------------------------------- /stack_allocation/webrev/src/java.base/share/classes/java/util/regex/Matcher.java.cdiff.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Cdiff src/java.base/share/classes/java/util/regex/Matcher.java 6 | 7 | 8 | 9 |
< prev index next >

src/java.base/share/classes/java/util/regex/Matcher.java

10 | Print this page 11 |
12 |
13 | *** 242,12 ***
14 |       Matcher(Pattern parent, CharSequence text) {
15 |           this.parentPattern = parent;
16 |           this.text = text;
17 |   
18 |           // Allocate state storage
19 | !         int parentGroupCount = Math.max(parent.capturingGroupCount, 10);
20 | !         groups = new int[parentGroupCount * 2];
21 |           locals = new int[parent.localCount];
22 |           localsPos = new IntHashSet[parent.localTCNCount];
23 |   
24 |           // Put fields into initial states
25 |           reset();
26 | --- 242,15 ---
27 |       Matcher(Pattern parent, CharSequence text) {
28 |           this.parentPattern = parent;
29 |           this.text = text;
30 |   
31 |           // Allocate state storage
32 | !         if (parent.capturingGroupCount > 10) {
33 | !             groups = new int[parent.capturingGroupCount * 2];
34 | +         } else {
35 | +             groups = new int[20];
36 | +         }
37 |           locals = new int[parent.localCount];
38 |           localsPos = new IntHashSet[parent.localTCNCount];
39 |   
40 |           // Put fields into initial states
41 |           reset();
42 | 
43 |
< prev index next >
44 | -------------------------------------------------------------------------------- /stack_allocation/webrev/src/java.base/share/classes/java/util/regex/Matcher.java.frames.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Frames src/java.base/share/classes/java/util/regex/Matcher.java 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /stack_allocation/webrev/src/java.base/share/classes/java/util/regex/Matcher.java.frames.prev_next.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Frames src/java.base/share/classes/java/util/regex/Matcher.java 6 | 7 | 8 |
< prev index next >
9 | -------------------------------------------------------------------------------- /stack_allocation/webrev/src/java.base/share/classes/java/util/regex/Matcher.java.patch: -------------------------------------------------------------------------------- 1 | diff a/src/java.base/share/classes/java/util/regex/Matcher.java b/src/java.base/share/classes/java/util/regex/Matcher.java 2 | --- a/src/java.base/share/classes/java/util/regex/Matcher.java 3 | +++ b/src/java.base/share/classes/java/util/regex/Matcher.java 4 | @@ -242,12 +242,15 @@ 5 | Matcher(Pattern parent, CharSequence text) { 6 | this.parentPattern = parent; 7 | this.text = text; 8 | 9 | // Allocate state storage 10 | - int parentGroupCount = Math.max(parent.capturingGroupCount, 10); 11 | - groups = new int[parentGroupCount * 2]; 12 | + if (parent.capturingGroupCount > 10) { 13 | + groups = new int[parent.capturingGroupCount * 2]; 14 | + } else { 15 | + groups = new int[20]; 16 | + } 17 | locals = new int[parent.localCount]; 18 | localsPos = new IntHashSet[parent.localTCNCount]; 19 | 20 | // Put fields into initial states 21 | reset(); 22 | -------------------------------------------------------------------------------- /stack_allocation/webrev/src/java.base/share/classes/java/util/regex/Matcher.java.udiff.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Udiff src/java.base/share/classes/java/util/regex/Matcher.java 6 | 7 | 8 | 9 |
< prev index next >

src/java.base/share/classes/java/util/regex/Matcher.java

10 | Print this page 11 |
12 |
13 | @@ -242,12 +242,15 @@
14 |       Matcher(Pattern parent, CharSequence text) {
15 |           this.parentPattern = parent;
16 |           this.text = text;
17 |   
18 |           // Allocate state storage
19 | -         int parentGroupCount = Math.max(parent.capturingGroupCount, 10);
20 | -         groups = new int[parentGroupCount * 2];
21 | +         if (parent.capturingGroupCount > 10) {
22 | +             groups = new int[parent.capturingGroupCount * 2];
23 | +         } else {
24 | +             groups = new int[20];
25 | +         }
26 |           locals = new int[parent.localCount];
27 |           localsPos = new IntHashSet[parent.localTCNCount];
28 |   
29 |           // Put fields into initial states
30 |           reset();
31 | 
32 |
< prev index next >
33 | -------------------------------------------------------------------------------- /stack_allocation/webrev/style.css: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2019, Oracle and/or its affiliates. All rights reserved. 3 | * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 | * 5 | * This code is free software; you can redistribute it and/or modify it 6 | * under the terms of the GNU General Public License version 2 only, as 7 | * published by the Free Software Foundation. 8 | * 9 | * This code is distributed in the hope that it will be useful, but WITHOUT 10 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11 | * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 12 | * version 2 for more details (a copy is included in the LICENSE file that 13 | * accompanied this code). 14 | * 15 | * You should have received a copy of the GNU General Public License version 16 | * 2 along with this work; if not, write to the Free Software Foundation, 17 | * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 18 | * 19 | * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 20 | * or visit www.oracle.com if you need additional information or have any 21 | * questions. 22 | */ 23 | 24 | body { 25 | background-color: #eeeeee; 26 | } 27 | 28 | span.line-old-header { 29 | color: red; 30 | font-size: large; 31 | font-weight: bold; 32 | } 33 | 34 | span.line-new-header { 35 | color: green; 36 | font-size: large; 37 | font-weight: bold; 38 | } 39 | 40 | span.line-added { 41 | color: blue; 42 | font-weight: bold; 43 | } 44 | 45 | span.line-modified { 46 | color: blue; 47 | } 48 | 49 | span.line-removed { 50 | color: brown; 51 | } 52 | 53 | span.udiff-line-added { 54 | color: blue; 55 | } 56 | 57 | span.udiff-line-modified-added { 58 | color: blue; 59 | } 60 | 61 | span.udiff-line-removed { 62 | color: brown; 63 | } 64 | 65 | span.udiff-line-modified-removed { 66 | color: brown; 67 | } 68 | 69 | span.file-modified { 70 | font-weight: bold; 71 | } 72 | 73 | span.file-renamed { 74 | font-style: italic; 75 | } 76 | 77 | span.file-added { 78 | color: green; 79 | font-weight: bold; 80 | } 81 | 82 | span.file-removed { 83 | color: red; 84 | font-weight: bold; 85 | } 86 | 87 | hr { 88 | border: none 0; 89 | border-top: 1px solid #aaa; 90 | height: 1px; 91 | } 92 | 93 | table.navigation { 94 | width: 100%; 95 | border: 0; 96 | align: center; 97 | } 98 | 99 | td.button { 100 | padding-left: 5px; 101 | padding-right: 5px; 102 | background-color: #eee; 103 | text-align: center; 104 | border: 1px #444 outset; 105 | cursor: pointer; 106 | } 107 | 108 | td.button a { 109 | font-weight: bold; 110 | color: black 111 | } 112 | 113 | td.button:hover { 114 | background: #ffcc99; 115 | } 116 | 117 | div.summary { 118 | font-size: .8em; 119 | border-bottom: 1px solid #aaa; 120 | padding-left: 1em; 121 | padding-right: 1em; 122 | } 123 | 124 | h2.summary { 125 | margin-bottom: 0.3em; 126 | } 127 | 128 | table.summary { 129 | white-space: nowrap; 130 | } 131 | 132 | table.summary th { 133 | vertical-align: top; 134 | text-align: right; 135 | } 136 | 137 | span.stat { 138 | font-size: .7em; 139 | } 140 | 141 | p.version { 142 | font-size: small; 143 | } 144 | --------------------------------------------------------------------------------