diff options
author | Vladimir Marko <vmarko@google.com> | 2013-11-14 15:34:17 +0000 |
---|---|---|
committer | Vladimir Marko <vmarko@google.com> | 2013-11-18 12:11:02 +0000 |
commit | 5c96e6b4dc354a7439b211b93462fbe8edea5e57 (patch) | |
tree | b89930ae568d5219e4cb1823586a6e536bebdd9b /compiler/dex/quick/dex_file_to_method_inliner_map.cc | |
parent | ca368cb576cf6a436a32c357fca51fbb3082d7a9 (diff) | |
download | art-5c96e6b4dc354a7439b211b93462fbe8edea5e57.tar.gz art-5c96e6b4dc354a7439b211b93462fbe8edea5e57.tar.bz2 art-5c96e6b4dc354a7439b211b93462fbe8edea5e57.zip |
Rewrite intrinsics detection.
Intrinsic methods should be treated as a special case of
inline methods. They should be detected early and used to
guide other optimizations. This CL rewrites the intrinsics
detection so that it can be moved to any compilation phase.
Change-Id: I4424a6a869bd98b9c478953c9e3bcaf1c6de2b33
Diffstat (limited to 'compiler/dex/quick/dex_file_to_method_inliner_map.cc')
-rw-r--r-- | compiler/dex/quick/dex_file_to_method_inliner_map.cc | 79 |
1 files changed, 79 insertions, 0 deletions
diff --git a/compiler/dex/quick/dex_file_to_method_inliner_map.cc b/compiler/dex/quick/dex_file_to_method_inliner_map.cc new file mode 100644 index 0000000000..38022d2142 --- /dev/null +++ b/compiler/dex/quick/dex_file_to_method_inliner_map.cc @@ -0,0 +1,79 @@ +/* + * Copyright (C) 2013 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include <algorithm> +#include <utility> +#include "thread.h" +#include "thread-inl.h" +#include "base/mutex.h" +#include "base/mutex-inl.h" +#include "base/logging.h" +#include "driver/compiler_driver.h" +#include "dex/quick/arm/arm_dex_file_method_inliner.h" +#include "dex/quick/mips/mips_dex_file_method_inliner.h" +#include "dex/quick/x86/x86_dex_file_method_inliner.h" + +#include "dex_file_to_method_inliner_map.h" + +namespace art { + +DexFileToMethodInlinerMap::DexFileToMethodInlinerMap(const CompilerDriver* compiler) + : compiler_(compiler), + mutex_("inline_helper_mutex") +{ +} + +DexFileToMethodInlinerMap::~DexFileToMethodInlinerMap() { + for (auto& entry : inliners_) { + delete entry.second; + } +} + +const DexFileMethodInliner& DexFileToMethodInlinerMap::GetMethodInliner(const DexFile* dex_file) { + Thread* self = Thread::Current(); + { + ReaderMutexLock lock(self, mutex_); + auto it = inliners_.find(dex_file); + if (it != inliners_.end()) { + return *it->second; + } + } + + WriterMutexLock lock(self, mutex_); + DexFileMethodInliner** inliner = &inliners_[dex_file]; // inserts new entry if not found + if (*inliner) { + return **inliner; + } + switch (compiler_->GetInstructionSet()) { + case kThumb2: + *inliner = new ArmDexFileMethodInliner; + break; + case kX86: + *inliner = new X86DexFileMethodInliner; + break; + case kMips: + *inliner = new MipsDexFileMethodInliner; + break; + default: + LOG(FATAL) << "Unexpected instruction set: " << compiler_->GetInstructionSet(); + } + DCHECK(*inliner != nullptr); + // TODO: per-dex file locking for the intrinsics container filling. + (*inliner)->FindIntrinsics(dex_file); + return **inliner; +} + +} // namespace art |