/*
 * 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_MEMORY_SHARED_FLAG,
           art::kAccMemorySharedMethod)
ASM_DEFINE(ART_METHOD_IS_MEMORY_SHARED_FLAG_BIT,
           art::MostSignificantBit(art::kAccMemorySharedMethod))
ASM_DEFINE(ART_METHOD_IS_STATIC_FLAG,
           art::kAccStatic)
ASM_DEFINE(ART_METHOD_IS_STATIC_FLAG_BIT,
           art::MostSignificantBit(art::kAccStatic))
ASM_DEFINE(ART_METHOD_NTERP_INVOKE_FAST_PATH_FLAG,
           art::kAccNterpInvokeFastPathFlag)
ASM_DEFINE(ART_METHOD_NTERP_INVOKE_FAST_PATH_FLAG_BIT,
           art::MostSignificantBit(art::kAccNterpInvokeFastPathFlag))
ASM_DEFINE(ART_METHOD_NTERP_ENTRY_POINT_FAST_PATH_FLAG,
           art::kAccNterpEntryPointFastPathFlag)
ASM_DEFINE(ART_METHOD_NTERP_ENTRY_POINT_FAST_PATH_FLAG_BIT,
           art::MostSignificantBit(art::kAccNterpEntryPointFastPathFlag))
ASM_DEFINE(ART_METHOD_IMT_MASK,
           art::ImTable::kSizeTruncToPowerOfTwo - 1)
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())
