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

// This file defines the list of keys for CompilerOptionsMap.
// These can be used with CompilerOptionsMap.Get/Set/etc, once that template class has been
// instantiated.
//
// 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.

// TODO: Add type parser.
COMPILER_OPTIONS_KEY (std::string,                 CompilerFilter)
COMPILER_OPTIONS_KEY (Unit,                        PIC)
COMPILER_OPTIONS_KEY (unsigned int,                HugeMethodMaxThreshold)
COMPILER_OPTIONS_KEY (unsigned int,                LargeMethodMaxThreshold)
COMPILER_OPTIONS_KEY (unsigned int,                NumDexMethodsThreshold)
COMPILER_OPTIONS_KEY (unsigned int,                InlineMaxCodeUnitsThreshold)
COMPILER_OPTIONS_KEY (bool,                        GenerateDebugInfo)
COMPILER_OPTIONS_KEY (bool,                        GenerateMiniDebugInfo)
COMPILER_OPTIONS_KEY (bool,                        GenerateBuildID)
COMPILER_OPTIONS_KEY (Unit,                        Debuggable)
COMPILER_OPTIONS_KEY (Unit,                        Baseline)
COMPILER_OPTIONS_KEY (double,                      TopKProfileThreshold)
COMPILER_OPTIONS_KEY (bool,                        AbortOnHardVerifierFailure)
COMPILER_OPTIONS_KEY (bool,                        AbortOnSoftVerifierFailure)
COMPILER_OPTIONS_KEY (bool,                        ResolveStartupConstStrings, false)
COMPILER_OPTIONS_KEY (bool,                        InitializeAppImageClasses, false)
COMPILER_OPTIONS_KEY (std::string,                 DumpInitFailures)
COMPILER_OPTIONS_KEY (std::string,                 DumpCFG)
COMPILER_OPTIONS_KEY (Unit,                        DumpCFGAppend)
// TODO: Add type parser.
COMPILER_OPTIONS_KEY (std::string,                 RegisterAllocationStrategy)
COMPILER_OPTIONS_KEY (ParseStringList<','>,        VerboseMethods)
COMPILER_OPTIONS_KEY (bool,                        DeduplicateCode,            true)
COMPILER_OPTIONS_KEY (Unit,                        CountHotnessInCompiledCode)
COMPILER_OPTIONS_KEY (ProfileMethodsCheck,         CheckProfiledMethods)
COMPILER_OPTIONS_KEY (Unit,                        DumpTimings)
COMPILER_OPTIONS_KEY (Unit,                        DumpPassTimings)
COMPILER_OPTIONS_KEY (Unit,                        DumpStats)
COMPILER_OPTIONS_KEY (unsigned int,                MaxImageBlockSize)

#undef COMPILER_OPTIONS_KEY
