/*
 * Copyright (C) 2018 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.
 */

#if ASM_DEFINE_INCLUDE_DEPENDENCIES
#include "art_method.h"
#include "imtable.h"
#endif

ASM_DEFINE(ART_METHOD_ACCESS_FLAGS_OFFSET,
           art::ArtMethod::AccessFlagsOffset().Int32Value())
ASM_DEFINE(ART_METHOD_IS_STATIC_FLAG,
           art::kAccStatic)
ASM_DEFINE(ART_METHOD_IMT_MASK,
           art::ImTable::kSizeTruncToPowerOfTwo - 1)
ASM_DEFINE(ART_METHOD_IS_STATIC_FLAG_BIT,
           art::MostSignificantBit(art::kAccStatic))
ASM_DEFINE(ART_METHOD_DECLARING_CLASS_OFFSET,
           art::ArtMethod::DeclaringClassOffset().Int32Value())
ASM_DEFINE(ART_METHOD_JNI_OFFSET_32,
           art::ArtMethod::EntryPointFromJniOffset(art::PointerSize::k32).Int32Value())
ASM_DEFINE(ART_METHOD_JNI_OFFSET_64,
           art::ArtMethod::EntryPointFromJniOffset(art::PointerSize::k64).Int32Value())
ASM_DEFINE(ART_METHOD_DATA_OFFSET_32,
           art::ArtMethod::DataOffset(art::PointerSize::k32).Int32Value())
ASM_DEFINE(ART_METHOD_DATA_OFFSET_64,
           art::ArtMethod::DataOffset(art::PointerSize::k64).Int32Value())
ASM_DEFINE(ART_METHOD_QUICK_CODE_OFFSET_32,
           art::ArtMethod::EntryPointFromQuickCompiledCodeOffset(art::PointerSize::k32).Int32Value())
ASM_DEFINE(ART_METHOD_QUICK_CODE_OFFSET_64,
           art::ArtMethod::EntryPointFromQuickCompiledCodeOffset(art::PointerSize::k64).Int32Value())
ASM_DEFINE(ART_METHOD_METHOD_INDEX_OFFSET,
           art::ArtMethod::MethodIndexOffset().Int32Value())
ASM_DEFINE(ART_METHOD_IMT_INDEX_OFFSET,
           art::ArtMethod::ImtIndexOffset().Int32Value())
ASM_DEFINE(ART_METHOD_HOTNESS_COUNT_OFFSET,
           art::ArtMethod::HotnessCountOffset().Int32Value())
