/*
 * 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.
 */

// Includes every single offset file in art.
// Useful for processing every single offset together.

// Usage:
// #define DEFINE_INCLUDE_DEPENDENCIES
// #include "offsets_all.def"
// to automatically include each def file's header dependencies.
//
// Afterwards,
// #define DEFINE_EXPR(define_name, field_type, expr) ...
// #include "offsets_all.def"
// to process each offset however one wants.
#if defined(DEFINE_INCLUDE_DEPENDENCIES)
#define DEFINE_EXPR(define_name, field_type, expr)
#endif

#if !defined(DEFINE_EXPR)
#error "Either DEFINE_INCLUDE_DEPENDENCIES or DEFINE_EXPR must be defined"
#endif

#include "constant_reference.def"
#include "offset_runtime.def"
// TODO: rest of THREAD_ offsets (depends on __SIZEOF__POINTER__).
#include "offset_thread.def"
// TODO: SHADOW_FRAME depends on __SIZEOF__POINTER__
// #include "offset_shadow_frame.def"
#include "offset_codeitem.def"
// TODO: MIRROR_OBJECT_HEADER_SIZE (depends on #ifdef read barrier)
// TODO: MIRROR_CLASS offsets (see above)
#include "offset_mirror_object.def"
#include "constant_class.def"
// TODO: MIRROR_*_ARRAY offsets (depends on header size)
// TODO: MIRROR_STRING offsets (depends on header size)
#include "offset_dexcache.def"
#include "constant_dexcache.def"
#include "constant_heap.def"
#include "constant_lockword.def"
#include "constant_globals.def"
#include "constant_rosalloc.def"
#include "constant_thread.def"
#include "constant_jit.def"

// TODO: MIRROR_OBJECT_HEADER_SIZE #ifdef depends on read barriers
// TODO: Array offsets (depends on MIRROR_OBJECT_HEADER_SIZE)

#if defined(DEFINE_INCLUDE_DEPENDENCIES)
#undef DEFINE_EXPR
#undef DEFINE_INCLUDE_DEPENDENCIES
#endif


