// Copyright (c) 2016, the R8 project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
package com.android.tools.r8.dex;

import com.android.tools.r8.cf.CfVersion;

public class Constants {

  public static final byte[] DEX_FILE_MAGIC_PREFIX = {'d', 'e', 'x', '\n'};
  public static final byte DEX_FILE_MAGIC_SUFFIX = '\0';

  public static final byte[] VDEX_FILE_MAGIC_PREFIX = {'v', 'd', 'e', 'x'};
  public static final int VDEX_FILE_VERSION_LENGTH = 4;

  /** Supported vdex file versions */
  public static final int MIN_VDEX_VERSION = 10;
  public static final int MAX_VDEX_VERSION = 11;

  // We apply Java 6 class file constraints on DEX files.
  public static final CfVersion CORRESPONDING_CLASS_FILE_VERSION = CfVersion.V1_6;

  public static final int DEX_MAGIC_SIZE = 8;

  public static final int MAGIC_OFFSET = 0;
  public static final int CHECKSUM_OFFSET = MAGIC_OFFSET + DEX_MAGIC_SIZE;
  public static final int SIGNATURE_OFFSET = CHECKSUM_OFFSET + 4;
  public static final int FILE_SIZE_OFFSET = SIGNATURE_OFFSET + 20;
  public static final int HEADER_SIZE_OFFSET = FILE_SIZE_OFFSET + 4;
  public static final int ENDIAN_TAG_OFFSET = HEADER_SIZE_OFFSET + 4;
  public static final int LINK_SIZE_OFFSET = ENDIAN_TAG_OFFSET + 4;
  public static final int LINK_OFF_OFFSET = LINK_SIZE_OFFSET + 4;
  public static final int MAP_OFF_OFFSET = LINK_OFF_OFFSET + 4;
  public static final int STRING_IDS_SIZE_OFFSET = MAP_OFF_OFFSET + 4;
  public static final int STRING_IDS_OFF_OFFSET = STRING_IDS_SIZE_OFFSET + 4;
  public static final int TYPE_IDS_SIZE_OFFSET = STRING_IDS_OFF_OFFSET + 4;
  public static final int TYPE_IDS_OFF_OFFSET = TYPE_IDS_SIZE_OFFSET + 4;
  public static final int PROTO_IDS_SIZE_OFFSET = TYPE_IDS_OFF_OFFSET + 4;
  public static final int PROTO_IDS_OFF_OFFSET = PROTO_IDS_SIZE_OFFSET + 4;
  public static final int FIELD_IDS_SIZE_OFFSET = PROTO_IDS_OFF_OFFSET + 4;
  public static final int FIELD_IDS_OFF_OFFSET = FIELD_IDS_SIZE_OFFSET + 4;
  public static final int METHOD_IDS_SIZE_OFFSET = FIELD_IDS_OFF_OFFSET + 4;
  public static final int METHOD_IDS_OFF_OFFSET = METHOD_IDS_SIZE_OFFSET + 4;
  public static final int CLASS_DEFS_SIZE_OFFSET = METHOD_IDS_OFF_OFFSET + 4;
  public static final int CLASS_DEFS_OFF_OFFSET = CLASS_DEFS_SIZE_OFFSET + 4;
  public static final int DATA_SIZE_OFFSET = CLASS_DEFS_OFF_OFFSET + 4;
  public static final int DATA_OFF_OFFSET = DATA_SIZE_OFFSET + 4;
  public static final int HEADER_OFF_OFFSET = DATA_OFF_OFFSET + 4;

  public static final int ENDIAN_CONSTANT = 0x12345678;
  public static final int REVERSE_ENDIAN_CONSTANT = 0x78563412;

  public static final int TYPE_HEADER_ITEM = 0x0;
  public static final int TYPE_HEADER_ITEM_SIZE = 0x70;
  public static final int TYPE_HEADER_ITEM_SIZE_V41 = 0x74;
  public static final int TYPE_STRING_ID_ITEM = 0x0001;
  public static final int TYPE_STRING_ID_ITEM_SIZE = 0x04;
  public static final int TYPE_TYPE_ID_ITEM = 0x0002;
  public static final int TYPE_TYPE_ID_ITEM_SIZE = 0x04;
  public static final int TYPE_PROTO_ID_ITEM = 0x0003;
  public static final int TYPE_PROTO_ID_ITEM_SIZE = 0x0c;
  public static final int TYPE_FIELD_ID_ITEM = 0x0004;
  public static final int TYPE_FIELD_ID_ITEM_SIZE = 0x08;
  public static final int TYPE_METHOD_ID_ITEM = 0x0005;
  public static final int TYPE_METHOD_ID_ITEM_SIZE = 0x08;
  public static final int TYPE_CLASS_DEF_ITEM = 0x0006;
  public static final int TYPE_CLASS_DEF_ITEM_SIZE = 0x20;
  public static final int TYPE_CALL_SITE_ID_ITEM = 0x0007;
  public static final int TYPE_CALL_SITE_ID_ITEM_SIZE = 0x04;
  public static final int TYPE_METHOD_HANDLE_ITEM = 0x0008;
  public static final int TYPE_METHOD_HANDLE_ITEM_SIZE = 0x0008;
  public static final int TYPE_MAP_LIST = 0x1000;
  public static final int TYPE_MAP_LIST_ITEM_SIZE = 0x0c;
  public static final int TYPE_TYPE_LIST = 0x1001;
  public static final int TYPE_ANNOTATION_SET_REF_LIST = 0x1002;
  public static final int TYPE_ANNOTATION_SET_ITEM = 0x1003;
  public static final int TYPE_CLASS_DATA_ITEM = 0x2000;
  public static final int TYPE_CODE_ITEM = 0x2001;
  public static final int TYPE_STRING_DATA_ITEM = 0x2002;
  public static final int TYPE_DEBUG_INFO_ITEM = 0x2003;
  public static final int TYPE_ANNOTATION_ITEM = 0x2004;
  public static final int TYPE_ENCODED_ARRAY_ITEM = 0x2005;
  public static final int TYPE_ANNOTATIONS_DIRECTORY_ITEM = 0x2006;

  public static final int DBG_START_LOCAL = 0x03;
  public static final int DBG_START_LOCAL_EXTENDED = 0x04;
  public static final int DBG_END_LOCAL = 0x05;
  public static final int DBG_RESTART_LOCAL = 0x06;
  public static final int DBG_SET_FILE = 0x09;
  public static final int DBG_END_SEQUENCE = 0x00;
  public static final int DBG_ADVANCE_PC = 0x01;
  public static final int DBG_ADVANCE_LINE = 0x02;
  public static final int DBG_SET_PROLOGUE_END = 0x07;
  public static final int DBG_SET_EPILOGUE_BEGIN = 0x08;
  public static final int DBG_FIRST_SPECIAL = 0x0a;
  public static final int DBG_LAST_SPECIAL = 0xff;
  public static final int DBG_LINE_BASE = -4;
  public static final int DBG_LINE_RANGE = 15;
  public static final int DBG_ADDRESS_RANGE = 16;

  public static final int VDEX_MAGIC_SIZE = 8;
  public static final int VDEX_MAGIC_OFFSET = 0;
  public static final int VDEX_HEADER_SIZE = 24;
  public static final int VDEX_NUMBER_OF_DEX_FILES_OFFSET = VDEX_MAGIC_SIZE;
  public static final int VDEX_CHECKSUM_SECTION_OFFSET = VDEX_HEADER_SIZE;
  public static final int VDEX_DEX_CHECKSUM_SIZE = 4;

  public static final int NO_OFFSET = 0;
  public static final int NO_INDEX = -1;

  public static final int S4BIT_SIGN_MASK = 1 << 3;
  public static final int S4BIT_MIN = -(1 << 3);
  public static final int S4BIT_MAX = (1 << 3) - 1;
  public static final int S8BIT_MIN = -(1 << 7);
  public static final int S8BIT_MAX = (1 << 7) - 1;

  public static final int U4BIT_MAX = (1 << 4) - 1;
  public static final int U8BIT_MAX = (1 << 8) - 1;
  public static final int U16BIT_MAX = (1 << 16) - 1;
  public static final long U32BIT_MAX = (1L << 32) - 1;
  public static final int ACC_PUBLIC = 0x1;
  public static final int ACC_PRIVATE = 0x2;
  public static final int ACC_PROTECTED = 0x4;
  public static final int ACC_STATIC = 0x8;
  public static final int ACC_FINAL = 0x10;
  public static final int ACC_SUPER = 0x20;
  public static final int ACC_SYNCHRONIZED = 0x20;
  public static final int ACC_VOLATILE = 0x40;
  public static final int ACC_BRIDGE = 0x40;
  public static final int ACC_TRANSIENT = 0x80;
  public static final int ACC_VARARGS = 0x80;
  public static final int ACC_NATIVE = 0x100;
  public static final int ACC_INTERFACE = 0x200;
  public static final int ACC_ABSTRACT = 0x400;
  public static final int ACC_STRICT = 0x800;
  public static final int ACC_SYNTHETIC = 0x1000;
  public static final int ACC_ANNOTATION = 0x2000;
  public static final int ACC_ENUM = 0x4000;
  public static final int ACC_CONSTRUCTOR = 0x10000;
  public static final int ACC_RECORD = 0x10000;
  public static final int ACC_DECLARED_SYNCHRONIZED = 0x20000;

  public static final String JAVA_LANG_OBJECT_NAME = "java/lang/Object";
  public static final String INSTANCE_INITIALIZER_NAME = "<init>";
  public static final String CLASS_INITIALIZER_NAME = "<clinit>";
  public static final String TEMPORARY_INSTANCE_INITIALIZER_PREFIX = "$r8$constructor";
  public static final String SYNTHETIC_INSTANCE_INITIALIZER_PREFIX = "$r8$init$synthetic";

  public static final int MAX_NON_JUMBO_INDEX = U16BIT_MAX;

  public static final int KILOBYTE = 1 << 10;
}
