bf9611f821697b14bf9e170f503c3f47613b046b |
|
26-Mar-2016 |
Andreas Gampe <agampe@google.com> |
ART: Clean up verifier Clean up verifier post-Quick. Change-Id: I0b05e10dd06edd228fe2068c8afffc4b7d7fdffa
|
98e6ce44c700abd9375fe17f0aa31fea1e1e938b |
|
16-Feb-2016 |
Nicolas Geoffray <ngeoffray@google.com> |
Remove string init map. Partial revert of the String init change. - Make Quick bailout in the presence of String allocation. - Rely on the compiler for knowing when dex registers alias. bug:27173201 Change-Id: I0bf58ba3825c71cef110b53f3a0a6f567cb2ef9a
|
8817760ca9f0590be373f5939cc86941e25d8f18 |
|
17-Feb-2016 |
Mathieu Chartier <mathieuc@google.com> |
Clean up register line Fixed formatting and style. Also added proper null handling for arena deleter. Change-Id: I6a44cb29ca6ad17b35e18dc6be1d12416f211631
|
361e04aaa5d3eca9f978a802ee44b1213f31da58 |
|
16-Feb-2016 |
Mathieu Chartier <mathieuc@google.com> |
Add custom arena deleter for RegisterLine Previously it protected by using sizeof(RegisterLine) but this was not accurate due to register lines being variable sized. Bug: 27156726 Change-Id: Ia4b134b85a2e61993d17bd4f0eff60c89c164dc3
|
de40d478930d0889a2aea5cbf58aa63da24e5dfa |
|
16-Oct-2015 |
Mathieu Chartier <mathieuc@google.com> |
Use arenas for the verifier Improvements are from using arenas for verifier. The things that were moved into arenas are register lines, reg types, and reg type descriptors. Also some minor cleanup. Fixed double space formatting error in string piece. ======================================== Before: ======================================= compile GmsCore 50x on host -j1: real 3m5.510s user 2m48.139s sys 0m11.753s 50 random APKs: real 1m18.157s user 1m8.167s sys 0m8.071s RAM (GmsCore): (threads: 1) arena alloc=0B java alloc=27MB native alloc=64MB free=792KB (threads: 4) arena alloc=0B java alloc=27MB native alloc=64MB free=397KB Perf: ============================= After: ============================= compile GmsCore 50x on host -j1: real 2m31.455s user 2m14.784s sys 0m10.888s 50 random APKs: Speed up from arena allocating: real 1m12.094s user 1m2.325s sys 0m7.872s Speed up from areans + CreateFindClassDefIndex + unordered_map for DexFileVerifier. real 1m8.654s user 0m58.955s sys 0m7.777s RAM (GmsCore): (threads: 1) arena alloc=1049KB java alloc=27MB native alloc=65MB free=538KB (threads: 4) arena alloc=4MB java alloc=27MB native alloc=69MB free=650KB Perf on host key results: _int_malloc: 3.60% -> 1.39% malloc: 1.48% -> 0.65% _int_free: 1.59% -> 0.61% RegTypeCache::FromClass: 1.47% -> 0.86% malloc_consolidate: 0.89% -> 0.63% Real speed up is ~22% on GmsCore, ~14% on the set of 60 APKs. Bug: 10921004 Change-Id: If13d4ab4284a176f93a26a412549b6b1149dfb16
|
a727e372d8f6929cd30b983f6969c7a50fc83bb6 |
|
25-Aug-2015 |
Andreas Gampe <agampe@google.com> |
ART: Balanced locking Change the verifier to check for balanced locking. When balanced locking can't be guaranteed, use a new failure kind to punt to the interpreter. Add smali tests, with JNI code to check the balanced-locking result. Bug: 23502994 Change-Id: Icd7db0be20ef2f69f0ac784de43dcba990035cd8
|
ad238ce884468234509a9367c0ce1055bd1394bf |
|
25-Aug-2015 |
Andreas Gampe <agampe@google.com> |
ART: Add option to retain lock levels in verifier Templatize SetRegisterType to be able to retain lock levels. When sharpening a type, e.g., in a branch after an instanceof, the verifier should remember if the register had been locked before and not implicitly erase that information. Bug: 23502994 Change-Id: Iba62688a536792da0920598fecdbf24a4993ec04
|
f5cdc417be5958eaed2172667178ae87ccc51c56 |
|
18-Aug-2015 |
Andreas Gampe <agampe@google.com> |
ART: (Partially) fix lock aliasing On monitor-exit, we must unlock all the registers which purport to be locked at the current lock depth. These are lock aliases. Bug: 20102779 Bug: 21169615 Bug: 21988678 Bug: 23300986 Change-Id: I6604871fc778d8f0ca9a99f6aad16a99ab62c599
|
e682a0250702c65a668e39eefdd1c49cfea5f388 |
|
12-Aug-2015 |
Andreas Gampe <agampe@google.com> |
ART: Change UninitializedThis tracking in the verifier Only relying on register types is error-prone. For example, we may inadvertently reject correct code when the constructor terminates abnormally. Bug: 20843113 (cherry picked from commit f10b6e109bfb595b6752d1b59db680694ac1684d) (cherry picked from commit af31802e5b74f5b9b8d3aadbaaf48cfde14ff7d1) Change-Id: I8826cd167780df25a6166740f183d216483fa550
|
f10b6e109bfb595b6752d1b59db680694ac1684d |
|
12-Aug-2015 |
Andreas Gampe <agampe@google.com> |
ART: Change UninitializedThis tracking in the verifier Only relying on register types is error-prone. For example, we may inadvertently reject correct code when the constructor terminates abnormally. Bug: 20843113 Change-Id: I8826cd167780df25a6166740f183d216483fa550
|
90443477f9a0061581c420775ce3b7eeae7468bc |
|
17-Jul-2015 |
Mathieu Chartier <mathieuc@google.com> |
Move to newer clang annotations Also enable -Wthread-safety-negative. Changes: Switch to capabilities and negative capabilities. Future work: Use capabilities to implement uninterruptible annotations to work with AssertNoThreadSuspension. Bug: 20072211 Change-Id: I42fcbe0300d98a831c89d1eff3ecd5a7e99ebf33
|
848f70a3d73833fc1bf3032a9ff6812e429661d9 |
|
15-Jan-2014 |
Jeff Hao <jeffhao@google.com> |
Replace String CharArray with internal uint16_t array. Summary of high level changes: - Adds compiler inliner support to identify string init methods - Adds compiler support (quick & optimizing) with new invoke code path that calls method off the thread pointer - Adds thread entrypoints for all string init methods - Adds map to verifier to log when receiver of string init has been copied to other registers. used by compiler and interpreter Change-Id: I797b992a8feb566f9ad73060011ab6f51eb7ce01
|
66cdcbeeedc6e51b4c56da6969ce193b8c520bbc |
|
06-Mar-2015 |
Mathieu Chartier <mathieuc@google.com> |
Fix incompatible class change error for JIT stress mode There was a problem with miranda methods, when we would dequicken to one of these, it wouldn't resolve as virtual during the method lowering resolve. The solution is to try resolving as interface if we fail to resolve as virtual. Fixed a bug in dequickening where unreachable register lines with quick invokes would cause CHECK failuers. In this case we punt to the interpreter (test 435-try-*). Added test regression test. Example failure: java.lang.IncompatibleClassChangeError: The method 'void Main$TheInterface.m()' was expected to be of type virtual but instead was found to be of type interface (declaration of 'java.lang.reflect.ArtMethod' appears in out/host/linux-x86/framework/core-libart-hostdex.jar) at Main.DoStuff(Main.java:37) at Main.main(Main.java:44) Bug: 17950037 (cherry picked from commit 091d238936809f6668ca6b7606c62bc224add430) Change-Id: I90d2bea1cec81a3acac1da875320e1f90510edf4
|
091d238936809f6668ca6b7606c62bc224add430 |
|
06-Mar-2015 |
Mathieu Chartier <mathieuc@google.com> |
Fix incompatible class change error for JIT stress mode There was a problem with miranda methods, when we would dequicken to one of these, it wouldn't resolve as virtual during the method lowering resolve. The solution is to try resolving as interface if we fail to resolve as virtual. Fixed a bug in dequickening where unreachable register lines with quick invokes would cause CHECK failuers. In this case we punt to the interpreter (test 435-try-*). Added test regression test. Example failure: java.lang.IncompatibleClassChangeError: The method 'void Main$TheInterface.m()' was expected to be of type virtual but instead was found to be of type interface (declaration of 'java.lang.reflect.ArtMethod' appears in out/host/linux-x86/framework/core-libart-hostdex.jar) at Main.DoStuff(Main.java:37) at Main.main(Main.java:44) Bug: 17950037 Change-Id: I39c32cc8849bf02032a4f61a7ce57462b7fcac75
|
7e541c91997b7747fa79014a8ea540395e54efc8 |
|
17-Dec-2014 |
Stephen Kyle <stephen.kyle@arm.com> |
ART: Fix verification of constructors. Summary: A constructor must call its superclass constructor. However, if one replaces the invoke-direct superclass.<init>() instruction with a variety of instructions, the verifier would NOT complain that the superclass constructor hadn't been called. Detailed explanation: This was because if we are verifying the return-void insn of a constructor, then we check that the register line doesn't contain a register with an UninitializedThis type. With a method like follows: Class.<init>()V: return-void Then we hit the return-void, see the UninitializedThis, and fail the method. However, with a method like follows: Class.<init>()V: nop return-void Any insn that continues or branches onto a return-void instruction will mark all of the registers as Conflict. This meant that the check in return-void for an UninitializedThis residing the register line would _always_ pass if there were any insns before it - the entire line had been set to Conflict. The fix is to bring the check for an UninitializedThis forward to the point just before we set all registers to Conflict, if we're about to hit a return-void insn in a constructor. It still needs to be done again in the verification of return-void itself, to avoid the solo return-void case. This patch also deals with the case where the only remaining UninitializedThis reference is overwritten, to avoid a method like the following from getting through verification: Class.<init>()V: const/4 v0, 0 return-void Bug: 18800943 Change-Id: I2e317261844d3b6c78e35228669f3da173316570 Fuzzed-With: https://android-review.googlesource.com/#/c/119463/
|
8e1f4f8f848f2dbb36265a019310498a61cd674d |
|
05-Nov-2014 |
Ian Rogers <irogers@google.com> |
Avoid abort in malformed dex code. Don't allow a perceived double monitor-enter on a register to abort libartd. Allow expected verifier errors in the smali tests. Tidy includes in the method verifier. Bug: 17978759 Change-Id: Ic44924c788cd2334f91a047fb41b459b89a1843b
|
db0cccd9a74cb9aa5f3b62f377415f653e3c0ca4 |
|
30-Sep-2014 |
Logan Chien <logan.chien@mediatek.com> |
Code cleanup. Change-Id: I054a946e91a6e6fb20a9dc499e521c8b15a53502
|
7b078e8c04f3e1451dbdd18543c8b9692b5b067e |
|
10-Sep-2014 |
Ian Rogers <irogers@google.com> |
Compile time performance improvements focusing on interpret-only. Reduce virtual method dispatch in the method verifier and make more code inline-able. Add a StringPiece with const char* equality operator to avoid redundant StringPieces and strlens. Remove back link from register line to verifier and pass as argument to reduce size of RegisterLine. Remove instruction length from instruction flags and compute from the instruction, again to reduce size. Add suspend checks to resolve and verify to allow for more easy monitor inflation and reduce contention on Locks::thread_list_suspend_thread_lock_. Change ThrowEarlierClassFailure to throw pre-allocated exception. Avoid calls to Thread::Current() by passing self. Template specialize IsValidClassName. Make ANR reporting with SIGQUIT run using checkpoints rather than suspending all threads. This makes the stack/lock analysis less lock error prone. Extra Barrier assertions and condition variable time out is now returned as a boolean both from Barrier and ConditionVariable::Wait. 2 threaded host x86-64 interpret-only numbers from 341 samples: Before change: Avg 176.137ms 99% CI 3.468ms to 1060.770ms After change: Avg 139.163% 99% CI 3.027ms to 838.257ms Reduction in average compile time after change is 20.9%. Slow-down without change is 26.5%. Bug: 17471626 - Fix bug where RegTypeCache::JavaLangObject/String/Class/Throwable could return unresolved type when class loading is disabled. Bug: 17398101 Change-Id: Id59ce3cc520701c6ecf612f7152498107bc40684
|
d8f69b086baf6717ce949d1c4de90d73b91083b0 |
|
10-Sep-2014 |
Ian Rogers <irogers@google.com> |
Revert "Add read barriers for the roots in the verifier." This reverts commit 7da9586b559290e1c16207c6513ffe485de61655. Bug: 17398101 Change-Id: I1d6110fdf0d3a3c9241c8e7e7f4b85a298f9dd8e
|
bad0267eaab9d6a522d05469ff90501deefdb88b |
|
25-Aug-2014 |
Mathieu Chartier <mathieuc@google.com> |
Add native memory accounting through custom allocator. Added a custom allocator that lets you pass in a special tag which specifices where the allocation came from. This is used when dumping. The performance overhead is low since each allocation only does a atomic add/sub for each allocation/free. The measurements are dumped to traces.txt during SIGQUIT. Example output: I/art (27274): AllocatorTagHeap active=120 max=120 total=168 I/art (27274): AllocatorTagMonitorList active=1572 max=6240 total=11724 I/art (27274): AllocatorTagClassTable active=185208 max=185208 total=268608 I/art (27274): AllocatorTagInternTable active=430368 max=430368 total=436080 I/art (27274): AllocatorTagMaps active=5616 max=6168 total=34392 I/art (27274): AllocatorTagLOS active=1024 max=1536 total=2044 I/art (27274): AllocatorTagSafeMap active=0 max=51936 total=533688 I/art (27274): AllocatorTagLOSMaps active=144 max=1248 total=5760 I/art (27274): AllocatorTagReferenceTable active=10944 max=11840 total=19136 I/art (27274): AllocatorTagHeapBitmap active=32 max=40 total=56 I/art (27274): AllocatorTagHeapBitmapLOS active=8 max=8 total=8 I/art (27274): AllocatorTagVerifier active=0 max=18844 total=1073156 I/art (27274): AllocatorTagModUnionCardSet active=5300 max=5920 total=56020 I/art (27274): AllocatorTagModUnionReferenceArray active=24864 max=24864 total=24864 I/art (27274): AllocatorTagJNILibrarires active=320 max=320 total=320 I/art (27274): AllocatorTagOatFile active=1400 max=1400 total=5852 Change-Id: Ibb470ef2e9c9a24563bb46422d46a55799704d82 (cherry picked from commit 5369c40f75fdcb1be7a7c06db212ce965c83a164)
|
5369c40f75fdcb1be7a7c06db212ce965c83a164 |
|
25-Aug-2014 |
Mathieu Chartier <mathieuc@google.com> |
Add native memory accounting through custom allocator. Added a custom allocator that lets you pass in a special tag which specifices where the allocation came from. This is used when dumping. The performance overhead is low since each allocation only does a atomic add/sub for each allocation/free. The measurements are dumped to traces.txt during SIGQUIT. Example output: I/art (27274): AllocatorTagHeap active=120 max=120 total=168 I/art (27274): AllocatorTagMonitorList active=1572 max=6240 total=11724 I/art (27274): AllocatorTagClassTable active=185208 max=185208 total=268608 I/art (27274): AllocatorTagInternTable active=430368 max=430368 total=436080 I/art (27274): AllocatorTagMaps active=5616 max=6168 total=34392 I/art (27274): AllocatorTagLOS active=1024 max=1536 total=2044 I/art (27274): AllocatorTagSafeMap active=0 max=51936 total=533688 I/art (27274): AllocatorTagLOSMaps active=144 max=1248 total=5760 I/art (27274): AllocatorTagReferenceTable active=10944 max=11840 total=19136 I/art (27274): AllocatorTagHeapBitmap active=32 max=40 total=56 I/art (27274): AllocatorTagHeapBitmapLOS active=8 max=8 total=8 I/art (27274): AllocatorTagVerifier active=0 max=18844 total=1073156 I/art (27274): AllocatorTagModUnionCardSet active=5300 max=5920 total=56020 I/art (27274): AllocatorTagModUnionReferenceArray active=24864 max=24864 total=24864 I/art (27274): AllocatorTagJNILibrarires active=320 max=320 total=320 I/art (27274): AllocatorTagOatFile active=1400 max=1400 total=5852 Bug: 16238192 Change-Id: Ibb470ef2e9c9a24563bb46422d46a55799704d82
|
7da9586b559290e1c16207c6513ffe485de61655 |
|
30-Jul-2014 |
Hiroshi Yamauchi <yamauchi@google.com> |
Add read barriers for the roots in the verifier. Note: Because the roots (the class references in RegType objects) can be updated by the read barriers, a lot of uses of type "const RegType" were replaced with "RegType". Bug: 12687968 Change-Id: I6cf37a87f352938d43fb51560a8d927ada104f50
|
6afd409d9ff5911d7de6967836535e15219ab31f |
|
06-Jun-2014 |
Mathieu Chartier <mathieuc@google.com> |
Fix mismatched new[] delete in verifier. Done in order to please valgrind. Bug: 15432385 Change-Id: Iebb6fe50eb71fc7f4c2f8e7aa93ad6ab226be5a8
|
700a402244a1a423da4f3ba8032459f4b65fa18f |
|
20-May-2014 |
Ian Rogers <irogers@google.com> |
Now we have a proper C++ library, use std::unique_ptr. Also remove the Android.libcxx.mk and other bits of stlport compatibility mechanics. Change-Id: Icdf7188ba3c79cdf5617672c1cfd0a68ae596a61
|
507dfdd147c97bfbadebfd63584d094b6a4e7b47 |
|
16-May-2014 |
Ian Rogers <irogers@google.com> |
Compatibility layer to transition from UniquePtr to std::unique_ptr. Use ART_WITH_STLPORT (enabled for the target) to cause the use of UniquePtr, for the host switch to std::unique_ptr. For now the type remains called UniquePtr. Make dalvik compile with clang on the host, move its build to C++11. Change-Id: I5ba8d2757904bc089ed62047ea03de3c0853fb12
|
d0fbd85a82a266c21d6b72c61d6dc098ec362de7 |
|
25-Sep-2013 |
Ian Rogers <irogers@google.com> |
Reduce memory allocation in verifier. Remove the use of a map PcToRegisterLineTable for efficiency (matches Dalvik). Place the register line register values inside the RegisterLine, saves a secondary allocation and indirection. Avoid the use of a deque in RegisterLine to avoid an allocation. Simplify the SirtRef destructor in non-debug builds. Saves >100ms from the two threaded compile time of ThinkFree on host. Change-Id: I2dacba61dbaf284ca02d4c194413e1da221dcb76
|
673b68360e9d030b250ed23bf33c33381640a220 |
|
31-Jul-2013 |
Jeff Hao <jeffhao@google.com> |
Make verifier allow integral types to be put in integral type arrays. This fixes a problem where the verifier was rejecting when an integer is put into a byte array. This also more closely matches the RI. Also fixes various issues with debugging checks caught by cts. Bug 10097083 Change-Id: Ie816fcdd85d6dc898feffa1e3fea8cfc2c6946ff Conflicts: runtime/verifier/method_verifier.cc (cherry-picked from commit b24b4a7e0c4f9bbea49f9dd95b2600080c8293d9)
|
b24b4a7e0c4f9bbea49f9dd95b2600080c8293d9 |
|
31-Jul-2013 |
Jeff Hao <jeffhao@google.com> |
Make verifier allow integral types to be put in integral type arrays. This fixes a problem where the verifier was rejecting when an integer is put into a byte array. This also more closely matches the RI. Also fixes various issues with debugging checks caught by cts. Bug 10097083 Change-Id: Ie816fcdd85d6dc898feffa1e3fea8cfc2c6946ff
|
834b394ee759ed31c5371d8093d7cd8cd90014a8 |
|
31-Jul-2013 |
Brian Carlstrom <bdc@google.com> |
Merge remote-tracking branch 'goog/dalvik-dev' into merge-art-to-dalvik-dev Change-Id: I323e9e8c29c3e39d50d9aba93121b26266c52a46
|
b8c7859f21f5ae4c9b90f2ef2effc51967299737 |
|
26-Jul-2013 |
Ian Rogers <irogers@google.com> |
Revert "Revert "Remove non-live vregs from GC map on return."" This reverts commit 73dda0bc2adcd6a3a7d75f663a3559f8b527d485. It also fixes the problematic line in the ReferenceMap test. Change-Id: Ic3b62db7c040853a5ddfed589f6e0acff25d82b7
|
73dda0bc2adcd6a3a7d75f663a3559f8b527d485 |
|
25-Jul-2013 |
Ian Rogers <irogers@google.com> |
Revert "Remove non-live vregs from GC map on return." This change causes a test regression on the oat tests, back out until the change also updates the test for the new GC map values. This reverts commit c0d120a0b1389f1f402d13e20b9e4abd9ab7cd95. Change-Id: I48bc951b1dad9a9ae83cccf0b5b68ad60fac052c
|
c0d120a0b1389f1f402d13e20b9e4abd9ab7cd95 |
|
24-Jul-2013 |
Ian Rogers <irogers@google.com> |
Remove non-live vregs from GC map on return. Mark registers going into a return as conflict/bottom so that they aren't considered for GC maps and deoptimization. Bug 4191345. Change-Id: I8af6c21824b6459788852be5417849e8ef999bcb
|
fc0e3219edc9a5bf81b166e82fd5db2796eb6a0d |
|
17-Jul-2013 |
Brian Carlstrom <bdc@google.com> |
Fix multiple inclusion guards to match new pathnames Change-Id: Id7735be1d75bc315733b1773fba45c1deb8ace43
|
7940e44f4517de5e2634a7e07d58d0fb26160513 |
|
12-Jul-2013 |
Brian Carlstrom <bdc@google.com> |
Create separate Android.mk for main build targets The runtime, compiler, dex2oat, and oatdump now are in seperate trees to prevent dependency creep. They can now be individually built without rebuilding the rest of the art projects. dalvikvm and jdwpspy were already this way. Builds in the art directory should behave as before, building everything including tests. Change-Id: Ic6b1151e5ed0f823c3dd301afd2b13eb2d8feb81
|