diff options
author | Jeff Hao <jeffhao@google.com> | 2014-01-15 13:49:50 -0800 |
---|---|---|
committer | Jeff Hao <jeffhao@google.com> | 2015-04-27 18:54:52 -0700 |
commit | 848f70a3d73833fc1bf3032a9ff6812e429661d9 (patch) | |
tree | b0349b3a40aab5a915af491b100659a5ca9fbbf6 /runtime/thread.cc | |
parent | d14438f0c5071962be7fab572b54687d32d9d087 (diff) | |
download | art-848f70a3d73833fc1bf3032a9ff6812e429661d9.tar.gz art-848f70a3d73833fc1bf3032a9ff6812e429661d9.tar.bz2 art-848f70a3d73833fc1bf3032a9ff6812e429661d9.zip |
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
Diffstat (limited to 'runtime/thread.cc')
-rw-r--r-- | runtime/thread.cc | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/runtime/thread.cc b/runtime/thread.cc index 9f7c303af..c8aad1b78 100644 --- a/runtime/thread.cc +++ b/runtime/thread.cc @@ -105,6 +105,43 @@ void Thread::InitTlsEntryPoints() { &tlsPtr_.quick_entrypoints); } +void Thread::InitStringEntryPoints() { + ScopedObjectAccess soa(this); + QuickEntryPoints* qpoints = &tlsPtr_.quick_entrypoints; + qpoints->pNewEmptyString = reinterpret_cast<void(*)()>( + soa.DecodeMethod(WellKnownClasses::java_lang_StringFactory_newEmptyString)); + qpoints->pNewStringFromBytes_B = reinterpret_cast<void(*)()>( + soa.DecodeMethod(WellKnownClasses::java_lang_StringFactory_newStringFromBytes_B)); + qpoints->pNewStringFromBytes_BI = reinterpret_cast<void(*)()>( + soa.DecodeMethod(WellKnownClasses::java_lang_StringFactory_newStringFromBytes_BI)); + qpoints->pNewStringFromBytes_BII = reinterpret_cast<void(*)()>( + soa.DecodeMethod(WellKnownClasses::java_lang_StringFactory_newStringFromBytes_BII)); + qpoints->pNewStringFromBytes_BIII = reinterpret_cast<void(*)()>( + soa.DecodeMethod(WellKnownClasses::java_lang_StringFactory_newStringFromBytes_BIII)); + qpoints->pNewStringFromBytes_BIIString = reinterpret_cast<void(*)()>( + soa.DecodeMethod(WellKnownClasses::java_lang_StringFactory_newStringFromBytes_BIIString)); + qpoints->pNewStringFromBytes_BString = reinterpret_cast<void(*)()>( + soa.DecodeMethod(WellKnownClasses::java_lang_StringFactory_newStringFromBytes_BString)); + qpoints->pNewStringFromBytes_BIICharset = reinterpret_cast<void(*)()>( + soa.DecodeMethod(WellKnownClasses::java_lang_StringFactory_newStringFromBytes_BIICharset)); + qpoints->pNewStringFromBytes_BCharset = reinterpret_cast<void(*)()>( + soa.DecodeMethod(WellKnownClasses::java_lang_StringFactory_newStringFromBytes_BCharset)); + qpoints->pNewStringFromChars_C = reinterpret_cast<void(*)()>( + soa.DecodeMethod(WellKnownClasses::java_lang_StringFactory_newStringFromChars_C)); + qpoints->pNewStringFromChars_CII = reinterpret_cast<void(*)()>( + soa.DecodeMethod(WellKnownClasses::java_lang_StringFactory_newStringFromChars_CII)); + qpoints->pNewStringFromChars_IIC = reinterpret_cast<void(*)()>( + soa.DecodeMethod(WellKnownClasses::java_lang_StringFactory_newStringFromChars_IIC)); + qpoints->pNewStringFromCodePoints = reinterpret_cast<void(*)()>( + soa.DecodeMethod(WellKnownClasses::java_lang_StringFactory_newStringFromCodePoints)); + qpoints->pNewStringFromString = reinterpret_cast<void(*)()>( + soa.DecodeMethod(WellKnownClasses::java_lang_StringFactory_newStringFromString)); + qpoints->pNewStringFromStringBuffer = reinterpret_cast<void(*)()>( + soa.DecodeMethod(WellKnownClasses::java_lang_StringFactory_newStringFromStringBuffer)); + qpoints->pNewStringFromStringBuilder = reinterpret_cast<void(*)()>( + soa.DecodeMethod(WellKnownClasses::java_lang_StringFactory_newStringFromStringBuilder)); +} + void Thread::ResetQuickAllocEntryPointsForThread() { ResetQuickAllocEntryPoints(&tlsPtr_.quick_entrypoints); } @@ -163,6 +200,7 @@ void* Thread::CreateCallback(void* arg) { } { ScopedObjectAccess soa(self); + self->InitStringEntryPoints(); // Copy peer into self, deleting global reference when done. CHECK(self->tlsPtr_.jpeer != nullptr); @@ -409,6 +447,8 @@ Thread* Thread::Attach(const char* thread_name, bool as_daemon, jobject thread_g } } + self->InitStringEntryPoints(); + CHECK_NE(self->GetState(), kRunnable); self->SetState(kNative); @@ -1930,6 +1970,9 @@ void Thread::DumpThreadOffset(std::ostream& os, uint32_t offset) { QUICK_ENTRY_POINT_INFO(pAllocObjectWithAccessCheck) QUICK_ENTRY_POINT_INFO(pCheckAndAllocArray) QUICK_ENTRY_POINT_INFO(pCheckAndAllocArrayWithAccessCheck) + QUICK_ENTRY_POINT_INFO(pAllocStringFromBytes) + QUICK_ENTRY_POINT_INFO(pAllocStringFromChars) + QUICK_ENTRY_POINT_INFO(pAllocStringFromString) QUICK_ENTRY_POINT_INFO(pInstanceofNonTrivial) QUICK_ENTRY_POINT_INFO(pCheckCast) QUICK_ENTRY_POINT_INFO(pInitializeStaticStorage) @@ -2013,6 +2056,22 @@ void Thread::DumpThreadOffset(std::ostream& os, uint32_t offset) { QUICK_ENTRY_POINT_INFO(pDeoptimize) QUICK_ENTRY_POINT_INFO(pA64Load) QUICK_ENTRY_POINT_INFO(pA64Store) + QUICK_ENTRY_POINT_INFO(pNewEmptyString) + QUICK_ENTRY_POINT_INFO(pNewStringFromBytes_B) + QUICK_ENTRY_POINT_INFO(pNewStringFromBytes_BI) + QUICK_ENTRY_POINT_INFO(pNewStringFromBytes_BII) + QUICK_ENTRY_POINT_INFO(pNewStringFromBytes_BIII) + QUICK_ENTRY_POINT_INFO(pNewStringFromBytes_BIIString) + QUICK_ENTRY_POINT_INFO(pNewStringFromBytes_BString) + QUICK_ENTRY_POINT_INFO(pNewStringFromBytes_BIICharset) + QUICK_ENTRY_POINT_INFO(pNewStringFromBytes_BCharset) + QUICK_ENTRY_POINT_INFO(pNewStringFromChars_C) + QUICK_ENTRY_POINT_INFO(pNewStringFromChars_CII) + QUICK_ENTRY_POINT_INFO(pNewStringFromChars_IIC) + QUICK_ENTRY_POINT_INFO(pNewStringFromCodePoints) + QUICK_ENTRY_POINT_INFO(pNewStringFromString) + QUICK_ENTRY_POINT_INFO(pNewStringFromStringBuffer) + QUICK_ENTRY_POINT_INFO(pNewStringFromStringBuilder) #undef QUICK_ENTRY_POINT_INFO os << offset; |