/*
 * 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 (std::vector<int>,               DexFds)
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 (ParseIntList<','>,              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 (int,                            DirtyImageObjectsFd)
DEX2OAT_OPTIONS_KEY (std::string,                    UpdatableBcpPackagesFile)
DEX2OAT_OPTIONS_KEY (int,                            UpdatableBcpPackagesFd)
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
