/*
 * 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::string,                    OatFile)
DEX2OAT_OPTIONS_KEY (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::int32_t>,      CpuSet)
DEX2OAT_OPTIONS_KEY (std::string,                    ImageFilename)
DEX2OAT_OPTIONS_KEY (int,                            ImageFd)
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 (bool,                           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::string,                    UpdatableBcpPackagesFile)
DEX2OAT_OPTIONS_KEY (std::vector<std::string>,       RuntimeOptions)
DEX2OAT_OPTIONS_KEY (std::string,                    CompilationReason)
DEX2OAT_OPTIONS_KEY (Unit,                           CheckLinkageConditions)
DEX2OAT_OPTIONS_KEY (Unit,                           CrashOnLinkageViolation)
DEX2OAT_OPTIONS_KEY (Unit,                           CompileIndividually)
DEX2OAT_OPTIONS_KEY (std::string,                    PublicSdk)
DEX2OAT_OPTIONS_KEY (Unit,                           ForceAllowOjInlines)
DEX2OAT_OPTIONS_KEY (std::string,                    ApexVersions)

#undef DEX2OAT_OPTIONS_KEY
