/*
 * Copyright (C) 2016 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 "multi_oat_relative_patcher.h"

#include "globals.h"
#include "base/bit_utils.h"
#include "base/logging.h"

namespace art {
namespace linker {

MultiOatRelativePatcher::MultiOatRelativePatcher(InstructionSet instruction_set,
                                                 const InstructionSetFeatures* features)
    : method_offset_map_(),
      relative_patcher_(
          linker::RelativePatcher::Create(instruction_set, features, &method_offset_map_)),
      adjustment_(0u),
      instruction_set_(instruction_set),
      start_size_code_alignment_(0u),
      start_size_relative_call_thunks_(0u),
      start_size_misc_thunks_(0u) {
}

void MultiOatRelativePatcher::StartOatFile(uint32_t adjustment) {
  DCHECK_ALIGNED(adjustment, kPageSize);
  adjustment_ = adjustment;

  start_size_code_alignment_ = relative_patcher_->CodeAlignmentSize();
  start_size_relative_call_thunks_ = relative_patcher_->RelativeCallThunksSize();
  start_size_misc_thunks_ = relative_patcher_->MiscThunksSize();
}

uint32_t MultiOatRelativePatcher::CodeAlignmentSize() const {
  DCHECK_GE(relative_patcher_->CodeAlignmentSize(), start_size_code_alignment_);
  return relative_patcher_->CodeAlignmentSize() - start_size_code_alignment_;
}

uint32_t MultiOatRelativePatcher::RelativeCallThunksSize() const {
  DCHECK_GE(relative_patcher_->RelativeCallThunksSize(), start_size_relative_call_thunks_);
  return relative_patcher_->RelativeCallThunksSize() - start_size_relative_call_thunks_;
}

uint32_t MultiOatRelativePatcher::MiscThunksSize() const {
  DCHECK_GE(relative_patcher_->MiscThunksSize(), start_size_misc_thunks_);
  return relative_patcher_->MiscThunksSize() - start_size_misc_thunks_;
}

std::pair<bool, uint32_t> MultiOatRelativePatcher::MethodOffsetMap::FindMethodOffset(
    MethodReference ref) {
  auto it = map.find(ref);
  if (it == map.end()) {
    return std::pair<bool, uint32_t>(false, 0u);
  } else {
    return std::pair<bool, uint32_t>(true, it->second);
  }
}
}  // namespace linker
}  // namespace art
