Home | History | Annotate | Download | only in dex2oat
      1 /*
      2  * Copyright (C) 2017 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 #include "dex2oat_options.h"
     18 
     19 #include <memory>
     20 
     21 #include "cmdline_parser.h"
     22 #include "driver/compiler_options_map-inl.h"
     23 
     24 namespace art {
     25 
     26 template<>
     27 struct CmdlineType<InstructionSet> : CmdlineTypeParser<InstructionSet> {
     28   Result Parse(const std::string& option) {
     29     InstructionSet set = GetInstructionSetFromString(option.c_str());
     30     if (set == InstructionSet::kNone) {
     31       return Result::Failure(std::string("Not a valid instruction set: '") + option + "'");
     32     }
     33     return Result::Success(set);
     34   }
     35 
     36   static const char* Name() { return "InstructionSet"; }
     37 };
     38 
     39 #define COMPILER_OPTIONS_MAP_TYPE Dex2oatArgumentMap
     40 #define COMPILER_OPTIONS_MAP_KEY_TYPE Dex2oatArgumentMapKey
     41 #include "driver/compiler_options_map-storage.h"
     42 
     43 // Specify storage for the Dex2oatOptions keys.
     44 
     45 #define DEX2OAT_OPTIONS_KEY(Type, Name, ...) \
     46   const Dex2oatArgumentMap::Key<Type> Dex2oatArgumentMap::Name {__VA_ARGS__};
     47 #include "dex2oat_options.def"
     48 
     49 #pragma GCC diagnostic push
     50 #pragma GCC diagnostic ignored "-Wframe-larger-than="
     51 
     52 using M = Dex2oatArgumentMap;
     53 using Parser = CmdlineParser<Dex2oatArgumentMap, Dex2oatArgumentMap::Key>;
     54 using Builder = Parser::Builder;
     55 
     56 static void AddInputMappings(Builder& builder) {
     57   builder.
     58       Define("--dex-file=_")
     59           .WithType<std::vector<std::string>>().AppendValues()
     60           .IntoKey(M::DexFiles)
     61       .Define("--dex-location=_")
     62           .WithType<std::vector<std::string>>().AppendValues()
     63           .IntoKey(M::DexLocations)
     64       .Define("--zip-fd=_")
     65           .WithType<int>()
     66           .IntoKey(M::ZipFd)
     67       .Define("--zip-location=_")
     68           .WithType<std::string>()
     69           .IntoKey(M::ZipLocation)
     70       .Define("--boot-image=_")
     71           .WithType<std::string>()
     72           .IntoKey(M::BootImage);
     73 }
     74 
     75 static void AddGeneratedArtifactMappings(Builder& builder) {
     76   builder.
     77       Define("--input-vdex-fd=_")
     78           .WithType<int>()
     79           .IntoKey(M::InputVdexFd)
     80       .Define("--input-vdex=_")
     81           .WithType<std::string>()
     82           .IntoKey(M::InputVdex)
     83       .Define("--output-vdex-fd=_")
     84           .WithType<int>()
     85           .IntoKey(M::OutputVdexFd)
     86       .Define("--output-vdex=_")
     87           .WithType<std::string>()
     88           .IntoKey(M::OutputVdex)
     89       .Define("--dm-fd=_")
     90           .WithType<int>()
     91           .IntoKey(M::DmFd)
     92       .Define("--dm-file=_")
     93           .WithType<std::string>()
     94           .IntoKey(M::DmFile)
     95       .Define("--oat-file=_")
     96           .WithType<std::vector<std::string>>().AppendValues()
     97           .IntoKey(M::OatFiles)
     98       .Define("--oat-symbols=_")
     99           .WithType<std::vector<std::string>>().AppendValues()
    100           .IntoKey(M::OatSymbols)
    101       .Define("--oat-fd=_")
    102           .WithType<int>()
    103           .IntoKey(M::OatFd)
    104       .Define("--oat-location=_")
    105           .WithType<std::string>()
    106           .IntoKey(M::OatLocation);
    107 }
    108 
    109 static void AddImageMappings(Builder& builder) {
    110   builder.
    111       Define("--image=_")
    112           .WithType<std::vector<std::string>>().AppendValues()
    113           .IntoKey(M::ImageFilenames)
    114       .Define("--image-classes=_")
    115           .WithType<std::string>()
    116           .IntoKey(M::ImageClasses)
    117       .Define("--image-classes-zip=_")
    118           .WithType<std::string>()
    119           .IntoKey(M::ImageClassesZip)
    120       .Define("--base=_")
    121           .WithType<std::string>()
    122           .IntoKey(M::Base)
    123       .Define("--app-image-file=_")
    124           .WithType<std::string>()
    125           .IntoKey(M::AppImageFile)
    126       .Define("--app-image-fd=_")
    127           .WithType<int>()
    128           .IntoKey(M::AppImageFileFd)
    129       .Define("--multi-image")
    130           .IntoKey(M::MultiImage)
    131       .Define("--dirty-image-objects=_")
    132           .WithType<std::string>()
    133           .IntoKey(M::DirtyImageObjects)
    134       .Define("--image-format=_")
    135           .WithType<ImageHeader::StorageMode>()
    136           .WithValueMap({{"lz4", ImageHeader::kStorageModeLZ4},
    137                          {"lz4hc", ImageHeader::kStorageModeLZ4HC},
    138                          {"uncompressed", ImageHeader::kStorageModeUncompressed}})
    139           .IntoKey(M::ImageFormat);
    140 }
    141 
    142 static void AddSwapMappings(Builder& builder) {
    143   builder.
    144       Define("--swap-file=_")
    145           .WithType<std::string>()
    146           .IntoKey(M::SwapFile)
    147       .Define("--swap-fd=_")
    148           .WithType<int>()
    149           .IntoKey(M::SwapFileFd)
    150       .Define("--swap-dex-size-threshold=_")
    151           .WithType<unsigned int>()
    152           .IntoKey(M::SwapDexSizeThreshold)
    153       .Define("--swap-dex-count-threshold=_")
    154           .WithType<unsigned int>()
    155           .IntoKey(M::SwapDexCountThreshold);
    156 }
    157 
    158 static void AddCompilerMappings(Builder& builder) {
    159   builder.
    160       Define("--compiled-classes=_")
    161           .WithType<std::string>()
    162           .IntoKey(M::CompiledClasses)
    163       .Define("--compiled-classes-zip=_")
    164           .WithType<std::string>()
    165           .IntoKey(M::CompiledClassesZip)
    166       .Define("--compiled-methods=_")
    167           .WithType<std::string>()
    168           .IntoKey(M::CompiledMethods)
    169       .Define("--compiled-methods-zip=_")
    170           .WithType<std::string>()
    171           .IntoKey(M::CompiledMethodsZip)
    172       .Define("--run-passes=_")
    173           .WithType<std::string>()
    174           .IntoKey(M::Passes)
    175       .Define("--profile-file=_")
    176           .WithType<std::string>()
    177           .IntoKey(M::Profile)
    178       .Define("--profile-file-fd=_")
    179           .WithType<int>()
    180           .IntoKey(M::ProfileFd)
    181       .Define("--no-inline-from=_")
    182           .WithType<std::string>()
    183           .IntoKey(M::NoInlineFrom);
    184 }
    185 
    186 static void AddTargetMappings(Builder& builder) {
    187   builder.
    188       Define("--instruction-set=_")
    189           .WithType<InstructionSet>()
    190           .IntoKey(M::TargetInstructionSet)
    191       .Define("--instruction-set-variant=_")
    192           .WithType<std::string>()
    193           .IntoKey(M::TargetInstructionSetVariant)
    194       .Define("--instruction-set-features=_")
    195           .WithType<std::string>()
    196           .IntoKey(M::TargetInstructionSetFeatures);
    197 }
    198 
    199 static Parser CreateArgumentParser() {
    200   std::unique_ptr<Builder> parser_builder = std::unique_ptr<Builder>(new Builder());
    201 
    202   AddInputMappings(*parser_builder);
    203   AddGeneratedArtifactMappings(*parser_builder);
    204   AddImageMappings(*parser_builder);
    205   AddSwapMappings(*parser_builder);
    206   AddCompilerMappings(*parser_builder);
    207   AddTargetMappings(*parser_builder);
    208 
    209   parser_builder->
    210       Define({"--watch-dog", "--no-watch-dog"})
    211           .WithValues({true, false})
    212           .IntoKey(M::Watchdog)
    213       .Define("--watchdog-timeout=_")
    214           .WithType<int>()
    215           .IntoKey(M::WatchdogTimeout)
    216       .Define("-j_")
    217           .WithType<unsigned int>()
    218           .IntoKey(M::Threads)
    219       .Define("--android-root=_")
    220           .WithType<std::string>()
    221           .IntoKey(M::AndroidRoot)
    222       .Define("--compiler-backend=_")
    223           .WithType<Compiler::Kind>()
    224           .WithValueMap({{"Quick", Compiler::Kind::kQuick},
    225                          {"Optimizing", Compiler::Kind::kOptimizing}})
    226           .IntoKey(M::Backend)
    227       .Define("--host")
    228           .IntoKey(M::Host)
    229       .Define("--avoid-storing-invocation")
    230           .IntoKey(M::AvoidStoringInvocation)
    231       .Define("--very-large-app-threshold=_")
    232           .WithType<unsigned int>()
    233           .IntoKey(M::VeryLargeAppThreshold)
    234       .Define("--force-determinism")
    235           .IntoKey(M::ForceDeterminism)
    236       .Define("--copy-dex-files=_")
    237           .WithType<CopyOption>()
    238           .WithValueMap({{"true", CopyOption::kOnlyIfCompressed},
    239                          {"false", CopyOption::kNever},
    240                          {"always", CopyOption::kAlways}})
    241           .IntoKey(M::CopyDexFiles)
    242       .Define("--classpath-dir=_")
    243           .WithType<std::string>()
    244           .IntoKey(M::ClasspathDir)
    245       .Define("--class-loader-context=_")
    246           .WithType<std::string>()
    247           .IntoKey(M::ClassLoaderContext)
    248       .Define("--stored-class-loader-context=_")
    249           .WithType<std::string>()
    250           .IntoKey(M::StoredClassLoaderContext)
    251       .Define("--compact-dex-level=_")
    252           .WithType<CompactDexLevel>()
    253           .WithValueMap({{"none", CompactDexLevel::kCompactDexLevelNone},
    254                          {"fast", CompactDexLevel::kCompactDexLevelFast}})
    255           .IntoKey(M::CompactDexLevel)
    256       .Define("--runtime-arg _")
    257           .WithType<std::vector<std::string>>().AppendValues()
    258           .IntoKey(M::RuntimeOptions)
    259       .Define("--compilation-reason=_")
    260           .WithType<std::string>()
    261           .IntoKey(M::CompilationReason);
    262 
    263   AddCompilerOptionsArgumentParserOptions<Dex2oatArgumentMap>(*parser_builder);
    264 
    265   parser_builder->IgnoreUnrecognized(false);
    266 
    267   return parser_builder->Build();
    268 }
    269 
    270 std::unique_ptr<Dex2oatArgumentMap> Dex2oatArgumentMap::Parse(int argc,
    271                                                               const char** argv,
    272                                                               std::string* error_msg) {
    273   Parser parser = CreateArgumentParser();
    274   CmdlineResult parse_result = parser.Parse(argv, argc);
    275   if (!parse_result.IsSuccess()) {
    276     *error_msg = parse_result.GetMessage();
    277     return nullptr;
    278   }
    279 
    280   return std::unique_ptr<Dex2oatArgumentMap>(new Dex2oatArgumentMap(parser.ReleaseArgumentsMap()));
    281 }
    282 
    283 #pragma GCC diagnostic pop
    284 }  // namespace art
    285