/*
 * Copyright 2011-2012, 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.
 */

#ifndef _FRAMEWORKS_COMPILE_SLANG_SLANG_VERSION_H_  // NOLINT
#define _FRAMEWORKS_COMPILE_SLANG_SLANG_VERSION_H_

#include <climits>

#define RS_DEVELOPMENT_API UINT_MAX

// API levels used by the standard Android SDK.
// MR -> Maintenance Release
// HC -> Honeycomb
// ICS -> Ice Cream Sandwich
// JB -> Jelly Bean
// KK -> KitKat
// M -> Marshmallow
enum SlangTargetAPI {
  SLANG_MINIMUM_TARGET_API = 11,
  SLANG_HC_TARGET_API = 11,
  SLANG_HC_MR1_TARGET_API = 12,
  SLANG_HC_MR2_TARGET_API = 13,
  SLANG_ICS_TARGET_API = 14,
  SLANG_ICS_MR1_TARGET_API = 15,
  SLANG_JB_TARGET_API = 16,
  SLANG_JB_MR1_TARGET_API = 17,
  SLANG_JB_MR2_TARGET_API = 18,
  SLANG_KK_TARGET_API = 19,
  SLANG_L_TARGET_API = 21,
  SLANG_M_TARGET_API = 23,
  SLANG_N_TARGET_API = 24,
  SLANG_N_MR1_TARGET_API = 25,
  SLANG_O_TARGET_API = 26,
  SLANG_MAXIMUM_TARGET_API = RS_VERSION,
  SLANG_DEVELOPMENT_TARGET_API = RS_DEVELOPMENT_API
};
// Note that RS_VERSION is defined at build time (see Android.mk for details).

// API levels where particular features exist.
// . Open (feature appears at a particular level and continues to exist):
//     SLANG_FEAT_FOO_API
// . Closed (feature exists only through a particular range of API levels):
//     SLANG_FEAT_BAR_API_MIN, SLANG_FEAT_BAR_API_MAX
enum SlangFeatureAPI {
  SLANG_FEATURE_GENERAL_REDUCTION_API = SLANG_N_TARGET_API,
  SLANG_FEATURE_GENERAL_REDUCTION_HALTER_API = SLANG_DEVELOPMENT_TARGET_API,
  SLANG_FEATURE_SINGLE_SOURCE_API = SLANG_N_TARGET_API,
};

// SlangVersion refers to the released compiler version, for which
// certain behaviors could change.
//
// The SlangVersion is recorded in the generated bitcode.  A bitcode
// consumer (for example: runtime, driver, bcc) is expected to use
// this version number as follows:
//
//   If version number is at least $VERSION, then I can assume that
//   $PROPERTY holds.
//
// However, a bitcode consumer is not obligated to act on this
// information (for example, the consumer may be too old to know about
// that version number).  So slang must not change its behavior for
// $VERSION in such a way that a backend needs to know about $VERSION
// in order to behave properly.
//
// For example:
//
//   If version number is at least N_STRUCT_EXPLICIT_PADDING, then I
//   can assume that no field of any struct is followed by implicit
//   padding.
//
//   bcc can take advantage of this (by turning off analyses and
//   transformations that are needed because of implicit padding), but
//   slang must still generate code that works properly with a bcc
//   that is too old to know about the N_STRUCT_EXPLICIT_PADDING
//   guarantee.
//
// Note that we CANNOT say
//
//   If version number is at least $VERSION_LO but lower than
//   $VERSION_HI, then I can assume that $PROPERTY holds.
//
// because a bitcode consumer might know about $VERSION_LO (where it
// could start taking advantage of $PROPERTY) without knowing about
// $VERSION_HI (where it would have to stop taking advantage of
// $PROPERTY).
namespace SlangVersion {
enum {
  LEGACY = 0,
  ICS = 1400,
  JB = 1600,
  JB_MR1 = 1700,
  JB_MR2 = 1800,
  KK = 1900,
  KK_P1 = 1901,
  L = 2100,
  M = 2300,
  M_RS_OBJECT = 2310,
  N = 2400,
  N_STRUCT_EXPLICIT_PADDING = 2410,
  CURRENT = N_STRUCT_EXPLICIT_PADDING
};
}  // namespace SlangVersion

#endif  // _FRAMEWORKS_COMPILE_SLANG_SLANG_VERSION_H_  NOLINT
