dex_file_to_method_inliner_map.cc revision 5c96e6b4dc354a7439b211b93462fbe8edea5e57
15c96e6b4dc354a7439b211b93462fbe8edea5e57Vladimir Marko/*
25c96e6b4dc354a7439b211b93462fbe8edea5e57Vladimir Marko * Copyright (C) 2013 The Android Open Source Project
35c96e6b4dc354a7439b211b93462fbe8edea5e57Vladimir Marko *
45c96e6b4dc354a7439b211b93462fbe8edea5e57Vladimir Marko * Licensed under the Apache License, Version 2.0 (the "License");
55c96e6b4dc354a7439b211b93462fbe8edea5e57Vladimir Marko * you may not use this file except in compliance with the License.
65c96e6b4dc354a7439b211b93462fbe8edea5e57Vladimir Marko * You may obtain a copy of the License at
75c96e6b4dc354a7439b211b93462fbe8edea5e57Vladimir Marko *
85c96e6b4dc354a7439b211b93462fbe8edea5e57Vladimir Marko *      http://www.apache.org/licenses/LICENSE-2.0
95c96e6b4dc354a7439b211b93462fbe8edea5e57Vladimir Marko *
105c96e6b4dc354a7439b211b93462fbe8edea5e57Vladimir Marko * Unless required by applicable law or agreed to in writing, software
115c96e6b4dc354a7439b211b93462fbe8edea5e57Vladimir Marko * distributed under the License is distributed on an "AS IS" BASIS,
125c96e6b4dc354a7439b211b93462fbe8edea5e57Vladimir Marko * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
135c96e6b4dc354a7439b211b93462fbe8edea5e57Vladimir Marko * See the License for the specific language governing permissions and
145c96e6b4dc354a7439b211b93462fbe8edea5e57Vladimir Marko * limitations under the License.
155c96e6b4dc354a7439b211b93462fbe8edea5e57Vladimir Marko */
165c96e6b4dc354a7439b211b93462fbe8edea5e57Vladimir Marko
175c96e6b4dc354a7439b211b93462fbe8edea5e57Vladimir Marko#include <algorithm>
185c96e6b4dc354a7439b211b93462fbe8edea5e57Vladimir Marko#include <utility>
195c96e6b4dc354a7439b211b93462fbe8edea5e57Vladimir Marko#include "thread.h"
205c96e6b4dc354a7439b211b93462fbe8edea5e57Vladimir Marko#include "thread-inl.h"
215c96e6b4dc354a7439b211b93462fbe8edea5e57Vladimir Marko#include "base/mutex.h"
225c96e6b4dc354a7439b211b93462fbe8edea5e57Vladimir Marko#include "base/mutex-inl.h"
235c96e6b4dc354a7439b211b93462fbe8edea5e57Vladimir Marko#include "base/logging.h"
245c96e6b4dc354a7439b211b93462fbe8edea5e57Vladimir Marko#include "driver/compiler_driver.h"
255c96e6b4dc354a7439b211b93462fbe8edea5e57Vladimir Marko#include "dex/quick/arm/arm_dex_file_method_inliner.h"
265c96e6b4dc354a7439b211b93462fbe8edea5e57Vladimir Marko#include "dex/quick/mips/mips_dex_file_method_inliner.h"
275c96e6b4dc354a7439b211b93462fbe8edea5e57Vladimir Marko#include "dex/quick/x86/x86_dex_file_method_inliner.h"
285c96e6b4dc354a7439b211b93462fbe8edea5e57Vladimir Marko
295c96e6b4dc354a7439b211b93462fbe8edea5e57Vladimir Marko#include "dex_file_to_method_inliner_map.h"
305c96e6b4dc354a7439b211b93462fbe8edea5e57Vladimir Marko
315c96e6b4dc354a7439b211b93462fbe8edea5e57Vladimir Markonamespace art {
325c96e6b4dc354a7439b211b93462fbe8edea5e57Vladimir Marko
335c96e6b4dc354a7439b211b93462fbe8edea5e57Vladimir MarkoDexFileToMethodInlinerMap::DexFileToMethodInlinerMap(const CompilerDriver* compiler)
345c96e6b4dc354a7439b211b93462fbe8edea5e57Vladimir Marko    : compiler_(compiler),
355c96e6b4dc354a7439b211b93462fbe8edea5e57Vladimir Marko      mutex_("inline_helper_mutex")
365c96e6b4dc354a7439b211b93462fbe8edea5e57Vladimir Marko{
375c96e6b4dc354a7439b211b93462fbe8edea5e57Vladimir Marko}
385c96e6b4dc354a7439b211b93462fbe8edea5e57Vladimir Marko
395c96e6b4dc354a7439b211b93462fbe8edea5e57Vladimir MarkoDexFileToMethodInlinerMap::~DexFileToMethodInlinerMap() {
405c96e6b4dc354a7439b211b93462fbe8edea5e57Vladimir Marko  for (auto& entry : inliners_) {
415c96e6b4dc354a7439b211b93462fbe8edea5e57Vladimir Marko    delete entry.second;
425c96e6b4dc354a7439b211b93462fbe8edea5e57Vladimir Marko  }
435c96e6b4dc354a7439b211b93462fbe8edea5e57Vladimir Marko}
445c96e6b4dc354a7439b211b93462fbe8edea5e57Vladimir Marko
455c96e6b4dc354a7439b211b93462fbe8edea5e57Vladimir Markoconst DexFileMethodInliner& DexFileToMethodInlinerMap::GetMethodInliner(const DexFile* dex_file) {
465c96e6b4dc354a7439b211b93462fbe8edea5e57Vladimir Marko  Thread* self = Thread::Current();
475c96e6b4dc354a7439b211b93462fbe8edea5e57Vladimir Marko  {
485c96e6b4dc354a7439b211b93462fbe8edea5e57Vladimir Marko    ReaderMutexLock lock(self, mutex_);
495c96e6b4dc354a7439b211b93462fbe8edea5e57Vladimir Marko    auto it = inliners_.find(dex_file);
505c96e6b4dc354a7439b211b93462fbe8edea5e57Vladimir Marko    if (it != inliners_.end()) {
515c96e6b4dc354a7439b211b93462fbe8edea5e57Vladimir Marko      return *it->second;
525c96e6b4dc354a7439b211b93462fbe8edea5e57Vladimir Marko    }
535c96e6b4dc354a7439b211b93462fbe8edea5e57Vladimir Marko  }
545c96e6b4dc354a7439b211b93462fbe8edea5e57Vladimir Marko
555c96e6b4dc354a7439b211b93462fbe8edea5e57Vladimir Marko  WriterMutexLock lock(self, mutex_);
565c96e6b4dc354a7439b211b93462fbe8edea5e57Vladimir Marko  DexFileMethodInliner** inliner = &inliners_[dex_file];  // inserts new entry if not found
575c96e6b4dc354a7439b211b93462fbe8edea5e57Vladimir Marko  if (*inliner) {
585c96e6b4dc354a7439b211b93462fbe8edea5e57Vladimir Marko    return **inliner;
595c96e6b4dc354a7439b211b93462fbe8edea5e57Vladimir Marko  }
605c96e6b4dc354a7439b211b93462fbe8edea5e57Vladimir Marko  switch (compiler_->GetInstructionSet()) {
615c96e6b4dc354a7439b211b93462fbe8edea5e57Vladimir Marko    case kThumb2:
625c96e6b4dc354a7439b211b93462fbe8edea5e57Vladimir Marko      *inliner = new ArmDexFileMethodInliner;
635c96e6b4dc354a7439b211b93462fbe8edea5e57Vladimir Marko      break;
645c96e6b4dc354a7439b211b93462fbe8edea5e57Vladimir Marko    case kX86:
655c96e6b4dc354a7439b211b93462fbe8edea5e57Vladimir Marko      *inliner = new X86DexFileMethodInliner;
665c96e6b4dc354a7439b211b93462fbe8edea5e57Vladimir Marko      break;
675c96e6b4dc354a7439b211b93462fbe8edea5e57Vladimir Marko    case kMips:
685c96e6b4dc354a7439b211b93462fbe8edea5e57Vladimir Marko      *inliner = new MipsDexFileMethodInliner;
695c96e6b4dc354a7439b211b93462fbe8edea5e57Vladimir Marko      break;
705c96e6b4dc354a7439b211b93462fbe8edea5e57Vladimir Marko    default:
715c96e6b4dc354a7439b211b93462fbe8edea5e57Vladimir Marko      LOG(FATAL) << "Unexpected instruction set: " << compiler_->GetInstructionSet();
725c96e6b4dc354a7439b211b93462fbe8edea5e57Vladimir Marko  }
735c96e6b4dc354a7439b211b93462fbe8edea5e57Vladimir Marko  DCHECK(*inliner != nullptr);
745c96e6b4dc354a7439b211b93462fbe8edea5e57Vladimir Marko  // TODO: per-dex file locking for the intrinsics container filling.
755c96e6b4dc354a7439b211b93462fbe8edea5e57Vladimir Marko  (*inliner)->FindIntrinsics(dex_file);
765c96e6b4dc354a7439b211b93462fbe8edea5e57Vladimir Marko  return **inliner;
775c96e6b4dc354a7439b211b93462fbe8edea5e57Vladimir Marko}
785c96e6b4dc354a7439b211b93462fbe8edea5e57Vladimir Marko
795c96e6b4dc354a7439b211b93462fbe8edea5e57Vladimir Marko}  // namespace art
80