/*
 * Copyright (C) 2017 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 DEX2OAT_OPTIONS_KEY
#error "Please #define DEX2OAT_OPTIONS_KEY before #including this file"
#define DEX2OAT_OPTIONS_KEY(...)  // Don't display errors in this file in IDEs.
#endif

// This file defines the list of keys for Dex2oatOptions.
// These can be used with Dex2oatOptions.Get/Set/etc, for example:
//         Dex2oatOptions opt; bool* dex2oat_enabled = opt.Get(Dex2oatOptions::Dex2Oat);
//
// Column Descriptions:
//                   <<Type>>             <<Key Name>>                  <<Default Value>>
//
// Default values are only used by Map::GetOrDefault(K<T>).
// If a default value is omitted here, T{} is used as the default value, which is
// almost-always the value of the type as if it was memset to all 0.
//
// Please keep the columns aligned if possible when adding new rows.
//

// Parse-able keys from the command line.
DEX2OAT_OPTIONS_KEY (CompactDexLevel,                CompactDexLevel)
DEX2OAT_OPTIONS_KEY (std::vector<std::string>,       DexFiles)
DEX2OAT_OPTIONS_KEY (std::vector<std::string>,       DexLocations)
DEX2OAT_OPTIONS_KEY (int,                            ZipFd)
DEX2OAT_OPTIONS_KEY (std::string,                    ZipLocation)
DEX2OAT_OPTIONS_KEY (int,                            InputVdexFd)
DEX2OAT_OPTIONS_KEY (std::string,                    InputVdex)
DEX2OAT_OPTIONS_KEY (int,                            OutputVdexFd)
DEX2OAT_OPTIONS_KEY (std::string,                    OutputVdex)
DEX2OAT_OPTIONS_KEY (int,                            DmFd)
DEX2OAT_OPTIONS_KEY (std::string,                    DmFile)
DEX2OAT_OPTIONS_KEY (std::vector<std::string>,       OatFiles)
DEX2OAT_OPTIONS_KEY (std::vector<std::string>,       OatSymbols)
DEX2OAT_OPTIONS_KEY (Unit,                           Strip)
DEX2OAT_OPTIONS_KEY (int,                            OatFd)
DEX2OAT_OPTIONS_KEY (std::string,                    OatLocation)
DEX2OAT_OPTIONS_KEY (bool,                           Watchdog)
DEX2OAT_OPTIONS_KEY (int,                            WatchdogTimeout)
DEX2OAT_OPTIONS_KEY (unsigned int,                   Threads)
DEX2OAT_OPTIONS_KEY (std::vector<std::string>,       ImageFilenames)
DEX2OAT_OPTIONS_KEY (ImageHeader::StorageMode,       ImageFormat)
DEX2OAT_OPTIONS_KEY (std::string,                    Passes)
DEX2OAT_OPTIONS_KEY (std::string,                    Base)  // TODO: Hex string parsing.
DEX2OAT_OPTIONS_KEY (std::string,                    BootImage)
DEX2OAT_OPTIONS_KEY (std::string,                    AndroidRoot)
DEX2OAT_OPTIONS_KEY (InstructionSet,                 TargetInstructionSet)
DEX2OAT_OPTIONS_KEY (std::string,                    TargetInstructionSetVariant)
DEX2OAT_OPTIONS_KEY (std::string,                    TargetInstructionSetFeatures)
DEX2OAT_OPTIONS_KEY (Compiler::Kind,                 Backend)
DEX2OAT_OPTIONS_KEY (std::string,                    Profile)
DEX2OAT_OPTIONS_KEY (int,                            ProfileFd)
DEX2OAT_OPTIONS_KEY (Unit,                           Host)
DEX2OAT_OPTIONS_KEY (Unit,                           DumpTiming)
DEX2OAT_OPTIONS_KEY (Unit,                           DumpPasses)
DEX2OAT_OPTIONS_KEY (Unit,                           DumpStats)
DEX2OAT_OPTIONS_KEY (linker::CopyOption,             CopyDexFiles)
DEX2OAT_OPTIONS_KEY (Unit,                           AvoidStoringInvocation)
DEX2OAT_OPTIONS_KEY (std::string,                    SwapFile)
DEX2OAT_OPTIONS_KEY (int,                            SwapFileFd)
DEX2OAT_OPTIONS_KEY (unsigned int,                   SwapDexSizeThreshold)
DEX2OAT_OPTIONS_KEY (unsigned int,                   SwapDexCountThreshold)
DEX2OAT_OPTIONS_KEY (unsigned int,                   VeryLargeAppThreshold)
DEX2OAT_OPTIONS_KEY (std::string,                    AppImageFile)
DEX2OAT_OPTIONS_KEY (int,                            AppImageFileFd)
DEX2OAT_OPTIONS_KEY (Unit,                           MultiImage)
DEX2OAT_OPTIONS_KEY (std::string,                    NoInlineFrom)
DEX2OAT_OPTIONS_KEY (Unit,                           ForceDeterminism)
DEX2OAT_OPTIONS_KEY (std::string,                    ClasspathDir)
DEX2OAT_OPTIONS_KEY (std::string,                    InvocationFile)
DEX2OAT_OPTIONS_KEY (std::string,                    ClassLoaderContext)
DEX2OAT_OPTIONS_KEY (std::string,                    ClassLoaderContextFds)
DEX2OAT_OPTIONS_KEY (std::string,                    StoredClassLoaderContext)
DEX2OAT_OPTIONS_KEY (std::string,                    DirtyImageObjects)
DEX2OAT_OPTIONS_KEY (std::vector<std::string>,       RuntimeOptions)
DEX2OAT_OPTIONS_KEY (std::string,                    CompilationReason)

#undef DEX2OAT_OPTIONS_KEY
