dex2oat.cc revision 147eb41b53729ec8d5c188d1cac90964a51afb8a
1/*
2 * Copyright (C) 2011 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 <stdio.h>
18#include <stdlib.h>
19#include <sys/stat.h>
20#include <valgrind.h>
21
22#include <fstream>
23#include <iostream>
24#include <sstream>
25#include <string>
26#include <vector>
27
28#if defined(__linux__) && defined(__arm__)
29#include <sys/personality.h>
30#include <sys/utsname.h>
31#endif
32
33#include "base/stl_util.h"
34#include "base/stringpiece.h"
35#include "base/timing_logger.h"
36#include "base/unix_file/fd_file.h"
37#include "class_linker.h"
38#include "compiler.h"
39#include "compiler_callbacks.h"
40#include "dex_file-inl.h"
41#include "dex/pass_driver_me_opts.h"
42#include "dex/verification_results.h"
43#include "driver/compiler_callbacks_impl.h"
44#include "driver/compiler_driver.h"
45#include "driver/compiler_options.h"
46#include "elf_fixup.h"
47#include "elf_stripper.h"
48#include "gc/space/image_space.h"
49#include "gc/space/space-inl.h"
50#include "image_writer.h"
51#include "leb128.h"
52#include "mirror/art_method-inl.h"
53#include "mirror/class-inl.h"
54#include "mirror/class_loader.h"
55#include "mirror/object-inl.h"
56#include "mirror/object_array-inl.h"
57#include "oat_writer.h"
58#include "object_utils.h"
59#include "os.h"
60#include "runtime.h"
61#include "ScopedLocalRef.h"
62#include "scoped_thread_state_change.h"
63#include "utils.h"
64#include "vector_output_stream.h"
65#include "well_known_classes.h"
66#include "zip_archive.h"
67
68namespace art {
69
70static int original_argc;
71static char** original_argv;
72
73static std::string CommandLine() {
74  std::vector<std::string> command;
75  for (int i = 0; i < original_argc; ++i) {
76    command.push_back(original_argv[i]);
77  }
78  return Join(command, ' ');
79}
80
81static void UsageErrorV(const char* fmt, va_list ap) {
82  std::string error;
83  StringAppendV(&error, fmt, ap);
84  LOG(ERROR) << error;
85}
86
87static void UsageError(const char* fmt, ...) {
88  va_list ap;
89  va_start(ap, fmt);
90  UsageErrorV(fmt, ap);
91  va_end(ap);
92}
93
94static void Usage(const char* fmt, ...) {
95  va_list ap;
96  va_start(ap, fmt);
97  UsageErrorV(fmt, ap);
98  va_end(ap);
99
100  UsageError("Command: %s", CommandLine().c_str());
101
102  UsageError("Usage: dex2oat [options]...");
103  UsageError("");
104  UsageError("  --dex-file=<dex-file>: specifies a .dex file to compile.");
105  UsageError("      Example: --dex-file=/system/framework/core.jar");
106  UsageError("");
107  UsageError("  --zip-fd=<file-descriptor>: specifies a file descriptor of a zip file");
108  UsageError("      containing a classes.dex file to compile.");
109  UsageError("      Example: --zip-fd=5");
110  UsageError("");
111  UsageError("  --zip-location=<zip-location>: specifies a symbolic name for the file");
112  UsageError("      corresponding to the file descriptor specified by --zip-fd.");
113  UsageError("      Example: --zip-location=/system/app/Calculator.apk");
114  UsageError("");
115  UsageError("  --oat-file=<file.oat>: specifies the oat output destination via a filename.");
116  UsageError("      Example: --oat-file=/system/framework/boot.oat");
117  UsageError("");
118  UsageError("  --oat-fd=<number>: specifies the oat output destination via a file descriptor.");
119  UsageError("      Example: --oat-fd=6");
120  UsageError("");
121  UsageError("  --oat-location=<oat-name>: specifies a symbolic name for the file corresponding");
122  UsageError("      to the file descriptor specified by --oat-fd.");
123  UsageError("      Example: --oat-location=/data/dalvik-cache/system@app@Calculator.apk.oat");
124  UsageError("");
125  UsageError("  --oat-symbols=<file.oat>: specifies the oat output destination with full symbols.");
126  UsageError("      Example: --oat-symbols=/symbols/system/framework/boot.oat");
127  UsageError("");
128  UsageError("  --bitcode=<file.bc>: specifies the optional bitcode filename.");
129  UsageError("      Example: --bitcode=/system/framework/boot.bc");
130  UsageError("");
131  UsageError("  --image=<file.art>: specifies the output image filename.");
132  UsageError("      Example: --image=/system/framework/boot.art");
133  UsageError("");
134  UsageError("  --image-classes=<classname-file>: specifies classes to include in an image.");
135  UsageError("      Example: --image=frameworks/base/preloaded-classes");
136  UsageError("");
137  UsageError("  --base=<hex-address>: specifies the base address when creating a boot image.");
138  UsageError("      Example: --base=0x50000000");
139  UsageError("");
140  UsageError("  --boot-image=<file.art>: provide the image file for the boot class path.");
141  UsageError("      Example: --boot-image=/system/framework/boot.art");
142  UsageError("      Default: $ANDROID_ROOT/system/framework/boot.art");
143  UsageError("");
144  UsageError("  --android-root=<path>: used to locate libraries for portable linking.");
145  UsageError("      Example: --android-root=out/host/linux-x86");
146  UsageError("      Default: $ANDROID_ROOT");
147  UsageError("");
148  UsageError("  --instruction-set=(arm|arm64|mips|x86|x86_64): compile for a particular");
149  UsageError("      instruction set.");
150  UsageError("      Example: --instruction-set=x86");
151  UsageError("      Default: arm");
152  UsageError("");
153  UsageError("  --instruction-set-features=...,: Specify instruction set features");
154  UsageError("      Example: --instruction-set-features=div");
155  UsageError("      Default: default");
156  UsageError("");
157  UsageError("  --compiler-backend=(Quick|Optimizing|Portable): select compiler backend");
158  UsageError("      set.");
159  UsageError("      Example: --compiler-backend=Portable");
160  UsageError("      Default: Quick");
161  UsageError("");
162  UsageError("  --compiler-filter=(verify-none|interpret-only|space|balanced|speed|everything):");
163  UsageError("      select compiler filter.");
164  UsageError("      Example: --compiler-filter=everything");
165#if ART_SMALL_MODE
166  UsageError("      Default: interpret-only");
167#else
168  UsageError("      Default: speed");
169#endif
170  UsageError("");
171  UsageError("  --huge-method-max=<method-instruction-count>: the threshold size for a huge");
172  UsageError("      method for compiler filter tuning.");
173  UsageError("      Example: --huge-method-max=%d", CompilerOptions::kDefaultHugeMethodThreshold);
174  UsageError("      Default: %d", CompilerOptions::kDefaultHugeMethodThreshold);
175  UsageError("");
176  UsageError("  --huge-method-max=<method-instruction-count>: threshold size for a huge");
177  UsageError("      method for compiler filter tuning.");
178  UsageError("      Example: --huge-method-max=%d", CompilerOptions::kDefaultHugeMethodThreshold);
179  UsageError("      Default: %d", CompilerOptions::kDefaultHugeMethodThreshold);
180  UsageError("");
181  UsageError("  --large-method-max=<method-instruction-count>: threshold size for a large");
182  UsageError("      method for compiler filter tuning.");
183  UsageError("      Example: --large-method-max=%d", CompilerOptions::kDefaultLargeMethodThreshold);
184  UsageError("      Default: %d", CompilerOptions::kDefaultLargeMethodThreshold);
185  UsageError("");
186  UsageError("  --small-method-max=<method-instruction-count>: threshold size for a small");
187  UsageError("      method for compiler filter tuning.");
188  UsageError("      Example: --small-method-max=%d", CompilerOptions::kDefaultSmallMethodThreshold);
189  UsageError("      Default: %d", CompilerOptions::kDefaultSmallMethodThreshold);
190  UsageError("");
191  UsageError("  --tiny-method-max=<method-instruction-count>: threshold size for a tiny");
192  UsageError("      method for compiler filter tuning.");
193  UsageError("      Example: --tiny-method-max=%d", CompilerOptions::kDefaultTinyMethodThreshold);
194  UsageError("      Default: %d", CompilerOptions::kDefaultTinyMethodThreshold);
195  UsageError("");
196  UsageError("  --num-dex-methods=<method-count>: threshold size for a small dex file for");
197  UsageError("      compiler filter tuning. If the input has fewer than this many methods");
198  UsageError("      and the filter is not interpret-only or verify-none, overrides the");
199  UsageError("      filter to use speed");
200  UsageError("      Example: --num-dex-method=%d", CompilerOptions::kDefaultNumDexMethodsThreshold);
201  UsageError("      Default: %d", CompilerOptions::kDefaultNumDexMethodsThreshold);
202  UsageError("");
203  UsageError("  --host: used with Portable backend to link against host runtime libraries");
204  UsageError("");
205  UsageError("  --dump-timing: display a breakdown of where time was spent");
206  UsageError("");
207  UsageError("  --include-patch-information: Include patching information so the generated code");
208  UsageError("      can have its base address moved without full recompilation.");
209  UsageError("");
210  UsageError("  --no-include-patch-information: Do not include patching information.");
211  UsageError("");
212  UsageError("  --include-debug-symbols: Include ELF symbols in this oat file");
213  UsageError("");
214  UsageError("  --no-include-debug-symbols: Do not include ELF symbols in this oat file");
215  UsageError("");
216  UsageError("  --runtime-arg <argument>: used to specify various arguments for the runtime,");
217  UsageError("      such as initial heap size, maximum heap size, and verbose output.");
218  UsageError("      Use a separate --runtime-arg switch for each argument.");
219  UsageError("      Example: --runtime-arg -Xms256m");
220  UsageError("");
221  UsageError("  --profile-file=<filename>: specify profiler output file to use for compilation.");
222  UsageError("");
223  UsageError("  --print-pass-names: print a list of pass names");
224  UsageError("");
225  UsageError("  --disable-passes=<pass-names>:  disable one or more passes separated by comma.");
226  UsageError("      Example: --disable-passes=UseCount,BBOptimizations");
227  UsageError("");
228  std::cerr << "See log for usage error information\n";
229  exit(EXIT_FAILURE);
230}
231
232class Dex2Oat {
233 public:
234  static bool Create(Dex2Oat** p_dex2oat,
235                     const Runtime::Options& runtime_options,
236                     const CompilerOptions& compiler_options,
237                     Compiler::Kind compiler_kind,
238                     InstructionSet instruction_set,
239                     InstructionSetFeatures instruction_set_features,
240                     VerificationResults* verification_results,
241                     DexFileToMethodInlinerMap* method_inliner_map,
242                     size_t thread_count)
243      SHARED_TRYLOCK_FUNCTION(true, Locks::mutator_lock_) {
244    CHECK(verification_results != nullptr);
245    CHECK(method_inliner_map != nullptr);
246    std::unique_ptr<Dex2Oat> dex2oat(new Dex2Oat(&compiler_options,
247                                           compiler_kind,
248                                           instruction_set,
249                                           instruction_set_features,
250                                           verification_results,
251                                           method_inliner_map,
252                                           thread_count));
253    if (!dex2oat->CreateRuntime(runtime_options, instruction_set)) {
254      *p_dex2oat = nullptr;
255      return false;
256    }
257    *p_dex2oat = dex2oat.release();
258    return true;
259  }
260
261  ~Dex2Oat() {
262    delete runtime_;
263    LogCompletionTime();
264  }
265
266  void LogCompletionTime() {
267    LOG(INFO) << "dex2oat took " << PrettyDuration(NanoTime() - start_ns_)
268              << " (threads: " << thread_count_ << ")";
269  }
270
271
272  // Reads the class names (java.lang.Object) and returns a set of descriptors (Ljava/lang/Object;)
273  CompilerDriver::DescriptorSet* ReadImageClassesFromFile(const char* image_classes_filename) {
274    std::unique_ptr<std::ifstream> image_classes_file(new std::ifstream(image_classes_filename,
275                                                                  std::ifstream::in));
276    if (image_classes_file.get() == nullptr) {
277      LOG(ERROR) << "Failed to open image classes file " << image_classes_filename;
278      return nullptr;
279    }
280    std::unique_ptr<CompilerDriver::DescriptorSet> result(ReadImageClasses(*image_classes_file));
281    image_classes_file->close();
282    return result.release();
283  }
284
285  CompilerDriver::DescriptorSet* ReadImageClasses(std::istream& image_classes_stream) {
286    std::unique_ptr<CompilerDriver::DescriptorSet> image_classes(new CompilerDriver::DescriptorSet);
287    while (image_classes_stream.good()) {
288      std::string dot;
289      std::getline(image_classes_stream, dot);
290      if (StartsWith(dot, "#") || dot.empty()) {
291        continue;
292      }
293      std::string descriptor(DotToDescriptor(dot.c_str()));
294      image_classes->insert(descriptor);
295    }
296    return image_classes.release();
297  }
298
299  // Reads the class names (java.lang.Object) and returns a set of descriptors (Ljava/lang/Object;)
300  CompilerDriver::DescriptorSet* ReadImageClassesFromZip(const char* zip_filename,
301                                                         const char* image_classes_filename,
302                                                         std::string* error_msg) {
303    std::unique_ptr<ZipArchive> zip_archive(ZipArchive::Open(zip_filename, error_msg));
304    if (zip_archive.get() == nullptr) {
305      return nullptr;
306    }
307    std::unique_ptr<ZipEntry> zip_entry(zip_archive->Find(image_classes_filename, error_msg));
308    if (zip_entry.get() == nullptr) {
309      *error_msg = StringPrintf("Failed to find '%s' within '%s': %s", image_classes_filename,
310                                zip_filename, error_msg->c_str());
311      return nullptr;
312    }
313    std::unique_ptr<MemMap> image_classes_file(zip_entry->ExtractToMemMap(zip_filename,
314                                                                          image_classes_filename,
315                                                                          error_msg));
316    if (image_classes_file.get() == nullptr) {
317      *error_msg = StringPrintf("Failed to extract '%s' from '%s': %s", image_classes_filename,
318                                zip_filename, error_msg->c_str());
319      return nullptr;
320    }
321    const std::string image_classes_string(reinterpret_cast<char*>(image_classes_file->Begin()),
322                                           image_classes_file->Size());
323    std::istringstream image_classes_stream(image_classes_string);
324    return ReadImageClasses(image_classes_stream);
325  }
326
327  const CompilerDriver* CreateOatFile(const std::string& boot_image_option,
328                                      const std::string& android_root,
329                                      bool is_host,
330                                      const std::vector<const DexFile*>& dex_files,
331                                      File* oat_file,
332                                      const std::string& bitcode_filename,
333                                      bool image,
334                                      std::unique_ptr<CompilerDriver::DescriptorSet>& image_classes,
335                                      bool dump_stats,
336                                      bool dump_passes,
337                                      TimingLogger& timings,
338                                      CumulativeLogger& compiler_phases_timings,
339                                      std::string profile_file,
340                                      SafeMap<std::string, std::string>* key_value_store) {
341    CHECK(key_value_store != nullptr);
342
343    // Handle and ClassLoader creation needs to come after Runtime::Create
344    jobject class_loader = nullptr;
345    Thread* self = Thread::Current();
346    if (!boot_image_option.empty()) {
347      ClassLinker* class_linker = Runtime::Current()->GetClassLinker();
348      std::vector<const DexFile*> class_path_files(dex_files);
349      OpenClassPathFiles(runtime_->GetClassPathString(), class_path_files);
350      ScopedObjectAccess soa(self);
351      for (size_t i = 0; i < class_path_files.size(); i++) {
352        class_linker->RegisterDexFile(*class_path_files[i]);
353      }
354      soa.Env()->AllocObject(WellKnownClasses::dalvik_system_PathClassLoader);
355      ScopedLocalRef<jobject> class_loader_local(soa.Env(),
356          soa.Env()->AllocObject(WellKnownClasses::dalvik_system_PathClassLoader));
357      class_loader = soa.Env()->NewGlobalRef(class_loader_local.get());
358      Runtime::Current()->SetCompileTimeClassPath(class_loader, class_path_files);
359    }
360
361    std::unique_ptr<CompilerDriver> driver(new CompilerDriver(compiler_options_,
362                                                              verification_results_,
363                                                              method_inliner_map_,
364                                                              compiler_kind_,
365                                                              instruction_set_,
366                                                              instruction_set_features_,
367                                                              image,
368                                                              image_classes.release(),
369                                                              thread_count_,
370                                                              dump_stats,
371                                                              dump_passes,
372                                                              &compiler_phases_timings,
373                                                              profile_file));
374
375    driver->GetCompiler()->SetBitcodeFileName(*driver.get(), bitcode_filename);
376
377    driver->CompileAll(class_loader, dex_files, &timings);
378
379    TimingLogger::ScopedTiming t2("dex2oat OatWriter", &timings);
380    std::string image_file_location;
381    uint32_t image_file_location_oat_checksum = 0;
382    uintptr_t image_file_location_oat_data_begin = 0;
383    if (!driver->IsImage()) {
384      TimingLogger::ScopedTiming t3("Loading image checksum", &timings);
385      gc::space::ImageSpace* image_space = Runtime::Current()->GetHeap()->GetImageSpace();
386      image_file_location_oat_checksum = image_space->GetImageHeader().GetOatChecksum();
387      image_file_location_oat_data_begin =
388          reinterpret_cast<uintptr_t>(image_space->GetImageHeader().GetOatDataBegin());
389      image_file_location = image_space->GetImageFilename();
390    }
391
392    if (!image_file_location.empty()) {
393      key_value_store->Put(OatHeader::kImageLocationKey, image_file_location);
394    }
395
396    OatWriter oat_writer(dex_files, image_file_location_oat_checksum,
397                         image_file_location_oat_data_begin,
398                         driver.get(),
399                         &timings,
400                         key_value_store);
401
402    t2.NewTiming("Writing ELF");
403    if (!driver->WriteElf(android_root, is_host, dex_files, &oat_writer, oat_file)) {
404      LOG(ERROR) << "Failed to write ELF file " << oat_file->GetPath();
405      return nullptr;
406    }
407
408    return driver.release();
409  }
410
411  bool CreateImageFile(const std::string& image_filename,
412                       uintptr_t image_base,
413                       const std::string& oat_filename,
414                       const std::string& oat_location,
415                       const CompilerDriver& compiler)
416      LOCKS_EXCLUDED(Locks::mutator_lock_) {
417    uintptr_t oat_data_begin;
418    {
419      // ImageWriter is scoped so it can free memory before doing FixupElf
420      ImageWriter image_writer(compiler);
421      if (!image_writer.Write(image_filename, image_base, oat_filename, oat_location)) {
422        LOG(ERROR) << "Failed to create image file " << image_filename;
423        return false;
424      }
425      oat_data_begin = image_writer.GetOatDataBegin();
426    }
427
428    std::unique_ptr<File> oat_file(OS::OpenFileReadWrite(oat_filename.c_str()));
429    if (oat_file.get() == nullptr) {
430      PLOG(ERROR) << "Failed to open ELF file: " << oat_filename;
431      return false;
432    }
433    if (!ElfFixup::Fixup(oat_file.get(), oat_data_begin)) {
434      LOG(ERROR) << "Failed to fixup ELF file " << oat_file->GetPath();
435      return false;
436    }
437    return true;
438  }
439
440 private:
441  explicit Dex2Oat(const CompilerOptions* compiler_options,
442                   Compiler::Kind compiler_kind,
443                   InstructionSet instruction_set,
444                   InstructionSetFeatures instruction_set_features,
445                   VerificationResults* verification_results,
446                   DexFileToMethodInlinerMap* method_inliner_map,
447                   size_t thread_count)
448      : compiler_options_(compiler_options),
449        compiler_kind_(compiler_kind),
450        instruction_set_(instruction_set),
451        instruction_set_features_(instruction_set_features),
452        verification_results_(verification_results),
453        method_inliner_map_(method_inliner_map),
454        runtime_(nullptr),
455        thread_count_(thread_count),
456        start_ns_(NanoTime()) {
457    CHECK(compiler_options != nullptr);
458    CHECK(verification_results != nullptr);
459    CHECK(method_inliner_map != nullptr);
460  }
461
462  bool CreateRuntime(const Runtime::Options& runtime_options, InstructionSet instruction_set)
463      SHARED_TRYLOCK_FUNCTION(true, Locks::mutator_lock_) {
464    if (!Runtime::Create(runtime_options, false)) {
465      LOG(ERROR) << "Failed to create runtime";
466      return false;
467    }
468    Runtime* runtime = Runtime::Current();
469    runtime->SetInstructionSet(instruction_set);
470    for (int i = 0; i < Runtime::kLastCalleeSaveType; i++) {
471      Runtime::CalleeSaveType type = Runtime::CalleeSaveType(i);
472      if (!runtime->HasCalleeSaveMethod(type)) {
473        runtime->SetCalleeSaveMethod(runtime->CreateCalleeSaveMethod(type), type);
474      }
475    }
476    runtime->GetClassLinker()->FixupDexCaches(runtime->GetResolutionMethod());
477    runtime->GetClassLinker()->RunRootClinits();
478    runtime_ = runtime;
479    return true;
480  }
481
482  // Appends to dex_files any elements of class_path that it doesn't already
483  // contain. This will open those dex files as necessary.
484  static void OpenClassPathFiles(const std::string& class_path,
485                                 std::vector<const DexFile*>& dex_files) {
486    std::vector<std::string> parsed;
487    Split(class_path, ':', parsed);
488    // Take Locks::mutator_lock_ so that lock ordering on the ClassLinker::dex_lock_ is maintained.
489    ScopedObjectAccess soa(Thread::Current());
490    for (size_t i = 0; i < parsed.size(); ++i) {
491      if (DexFilesContains(dex_files, parsed[i])) {
492        continue;
493      }
494      std::string error_msg;
495      if (!DexFile::Open(parsed[i].c_str(), parsed[i].c_str(), &error_msg, &dex_files)) {
496        LOG(WARNING) << "Failed to open dex file '" << parsed[i] << "': " << error_msg;
497      }
498    }
499  }
500
501  // Returns true if dex_files has a dex with the named location.
502  static bool DexFilesContains(const std::vector<const DexFile*>& dex_files,
503                               const std::string& location) {
504    for (size_t i = 0; i < dex_files.size(); ++i) {
505      if (dex_files[i]->GetLocation() == location) {
506        return true;
507      }
508    }
509    return false;
510  }
511
512  const CompilerOptions* const compiler_options_;
513  const Compiler::Kind compiler_kind_;
514
515  const InstructionSet instruction_set_;
516  const InstructionSetFeatures instruction_set_features_;
517
518  VerificationResults* const verification_results_;
519  DexFileToMethodInlinerMap* const method_inliner_map_;
520  Runtime* runtime_;
521  size_t thread_count_;
522  uint64_t start_ns_;
523
524  DISALLOW_IMPLICIT_CONSTRUCTORS(Dex2Oat);
525};
526
527static size_t OpenDexFiles(const std::vector<const char*>& dex_filenames,
528                           const std::vector<const char*>& dex_locations,
529                           std::vector<const DexFile*>& dex_files) {
530  size_t failure_count = 0;
531  for (size_t i = 0; i < dex_filenames.size(); i++) {
532    const char* dex_filename = dex_filenames[i];
533    const char* dex_location = dex_locations[i];
534    ATRACE_BEGIN(StringPrintf("Opening dex file '%s'", dex_filenames[i]).c_str());
535    std::string error_msg;
536    if (!OS::FileExists(dex_filename)) {
537      LOG(WARNING) << "Skipping non-existent dex file '" << dex_filename << "'";
538      continue;
539    }
540    if (!DexFile::Open(dex_filename, dex_location, &error_msg, &dex_files)) {
541      LOG(WARNING) << "Failed to open .dex from file '" << dex_filename << "': " << error_msg;
542      ++failure_count;
543    }
544    ATRACE_END();
545  }
546  return failure_count;
547}
548
549// The primary goal of the watchdog is to prevent stuck build servers
550// during development when fatal aborts lead to a cascade of failures
551// that result in a deadlock.
552class WatchDog {
553// WatchDog defines its own CHECK_PTHREAD_CALL to avoid using Log which uses locks
554#undef CHECK_PTHREAD_CALL
555#define CHECK_WATCH_DOG_PTHREAD_CALL(call, args, what) \
556  do { \
557    int rc = call args; \
558    if (rc != 0) { \
559      errno = rc; \
560      std::string message(# call); \
561      message += " failed for "; \
562      message += reason; \
563      Fatal(message); \
564    } \
565  } while (false)
566
567 public:
568  explicit WatchDog(bool is_watch_dog_enabled) {
569    is_watch_dog_enabled_ = is_watch_dog_enabled;
570    if (!is_watch_dog_enabled_) {
571      return;
572    }
573    shutting_down_ = false;
574    const char* reason = "dex2oat watch dog thread startup";
575    CHECK_WATCH_DOG_PTHREAD_CALL(pthread_mutex_init, (&mutex_, nullptr), reason);
576    CHECK_WATCH_DOG_PTHREAD_CALL(pthread_cond_init, (&cond_, nullptr), reason);
577    CHECK_WATCH_DOG_PTHREAD_CALL(pthread_attr_init, (&attr_), reason);
578    CHECK_WATCH_DOG_PTHREAD_CALL(pthread_create, (&pthread_, &attr_, &CallBack, this), reason);
579    CHECK_WATCH_DOG_PTHREAD_CALL(pthread_attr_destroy, (&attr_), reason);
580  }
581  ~WatchDog() {
582    if (!is_watch_dog_enabled_) {
583      return;
584    }
585    const char* reason = "dex2oat watch dog thread shutdown";
586    CHECK_WATCH_DOG_PTHREAD_CALL(pthread_mutex_lock, (&mutex_), reason);
587    shutting_down_ = true;
588    CHECK_WATCH_DOG_PTHREAD_CALL(pthread_cond_signal, (&cond_), reason);
589    CHECK_WATCH_DOG_PTHREAD_CALL(pthread_mutex_unlock, (&mutex_), reason);
590
591    CHECK_WATCH_DOG_PTHREAD_CALL(pthread_join, (pthread_, nullptr), reason);
592
593    CHECK_WATCH_DOG_PTHREAD_CALL(pthread_cond_destroy, (&cond_), reason);
594    CHECK_WATCH_DOG_PTHREAD_CALL(pthread_mutex_destroy, (&mutex_), reason);
595  }
596
597 private:
598  static void* CallBack(void* arg) {
599    WatchDog* self = reinterpret_cast<WatchDog*>(arg);
600    ::art::SetThreadName("dex2oat watch dog");
601    self->Wait();
602    return nullptr;
603  }
604
605  static void Message(char severity, const std::string& message) {
606    // TODO: Remove when we switch to LOG when we can guarantee it won't prevent shutdown in error
607    //       cases.
608    fprintf(stderr, "dex2oat%s %c %d %d %s\n",
609            kIsDebugBuild ? "d" : "",
610            severity,
611            getpid(),
612            GetTid(),
613            message.c_str());
614  }
615
616  static void Warn(const std::string& message) {
617    Message('W', message);
618  }
619
620  static void Fatal(const std::string& message) {
621    Message('F', message);
622    exit(1);
623  }
624
625  void Wait() {
626    bool warning = true;
627    CHECK_GT(kWatchDogTimeoutSeconds, kWatchDogWarningSeconds);
628    // TODO: tune the multiplier for GC verification, the following is just to make the timeout
629    //       large.
630    int64_t multiplier = kVerifyObjectSupport > kVerifyObjectModeFast ? 100 : 1;
631    timespec warning_ts;
632    InitTimeSpec(true, CLOCK_REALTIME, multiplier * kWatchDogWarningSeconds * 1000, 0, &warning_ts);
633    timespec timeout_ts;
634    InitTimeSpec(true, CLOCK_REALTIME, multiplier * kWatchDogTimeoutSeconds * 1000, 0, &timeout_ts);
635    const char* reason = "dex2oat watch dog thread waiting";
636    CHECK_WATCH_DOG_PTHREAD_CALL(pthread_mutex_lock, (&mutex_), reason);
637    while (!shutting_down_) {
638      int rc = TEMP_FAILURE_RETRY(pthread_cond_timedwait(&cond_, &mutex_,
639                                                         warning ? &warning_ts
640                                                                 : &timeout_ts));
641      if (rc == ETIMEDOUT) {
642        std::string message(StringPrintf("dex2oat did not finish after %d seconds",
643                                         warning ? kWatchDogWarningSeconds
644                                                 : kWatchDogTimeoutSeconds));
645        if (warning) {
646          Warn(message.c_str());
647          warning = false;
648        } else {
649          Fatal(message.c_str());
650        }
651      } else if (rc != 0) {
652        std::string message(StringPrintf("pthread_cond_timedwait failed: %s",
653                                         strerror(errno)));
654        Fatal(message.c_str());
655      }
656    }
657    CHECK_WATCH_DOG_PTHREAD_CALL(pthread_mutex_unlock, (&mutex_), reason);
658  }
659
660  // When setting timeouts, keep in mind that the build server may not be as fast as your desktop.
661#if ART_USE_PORTABLE_COMPILER
662  static const unsigned int kWatchDogWarningSeconds =  2 * 60;  // 2 minutes.
663  static const unsigned int kWatchDogTimeoutSeconds = 30 * 60;  // 25 minutes + buffer.
664#else
665  static const unsigned int kWatchDogWarningSeconds =  1 * 60;  // 1 minute.
666  static const unsigned int kWatchDogTimeoutSeconds =  6 * 60;  // 5 minutes + buffer.
667#endif
668
669  bool is_watch_dog_enabled_;
670  bool shutting_down_;
671  // TODO: Switch to Mutex when we can guarantee it won't prevent shutdown in error cases.
672  pthread_mutex_t mutex_;
673  pthread_cond_t cond_;
674  pthread_attr_t attr_;
675  pthread_t pthread_;
676};
677const unsigned int WatchDog::kWatchDogWarningSeconds;
678const unsigned int WatchDog::kWatchDogTimeoutSeconds;
679
680// Given a set of instruction features from the build, parse it.  The
681// input 'str' is a comma separated list of feature names.  Parse it and
682// return the InstructionSetFeatures object.
683static InstructionSetFeatures ParseFeatureList(std::string str) {
684  InstructionSetFeatures result;
685  typedef std::vector<std::string> FeatureList;
686  FeatureList features;
687  Split(str, ',', features);
688  for (FeatureList::iterator i = features.begin(); i != features.end(); i++) {
689    std::string feature = Trim(*i);
690    if (feature == "default") {
691      // Nothing to do.
692    } else if (feature == "div") {
693      // Supports divide instruction.
694       result.SetHasDivideInstruction(true);
695    } else if (feature == "nodiv") {
696      // Turn off support for divide instruction.
697      result.SetHasDivideInstruction(false);
698    } else if (feature == "lpae") {
699      // Supports Large Physical Address Extension.
700      result.SetHasLpae(true);
701    } else if (feature == "nolpae") {
702      // Turn off support for Large Physical Address Extension.
703      result.SetHasLpae(false);
704    } else {
705      Usage("Unknown instruction set feature: '%s'", feature.c_str());
706    }
707  }
708  // others...
709  return result;
710}
711
712void ParseStringAfterChar(const std::string& s, char c, std::string* parsed_value) {
713  std::string::size_type colon = s.find(c);
714  if (colon == std::string::npos) {
715    Usage("Missing char %c in option %s\n", c, s.c_str());
716  }
717  // Add one to remove the char we were trimming until.
718  *parsed_value = s.substr(colon + 1);
719}
720
721void ParseDouble(const std::string& option, char after_char,
722                 double min, double max, double* parsed_value) {
723  std::string substring;
724  ParseStringAfterChar(option, after_char, &substring);
725  bool sane_val = true;
726  double value;
727  if (false) {
728    // TODO: this doesn't seem to work on the emulator.  b/15114595
729    std::stringstream iss(substring);
730    iss >> value;
731    // Ensure that we have a value, there was no cruft after it and it satisfies a sensible range.
732    sane_val = iss.eof() && (value >= min) && (value <= max);
733  } else {
734    char* end = nullptr;
735    value = strtod(substring.c_str(), &end);
736    sane_val = *end == '\0' && value >= min && value <= max;
737  }
738  if (!sane_val) {
739    Usage("Invalid double value %s for option %s\n", substring.c_str(), option.c_str());
740  }
741  *parsed_value = value;
742}
743
744static int dex2oat(int argc, char** argv) {
745#if defined(__linux__) && defined(__arm__)
746  int major, minor;
747  struct utsname uts;
748  if (uname(&uts) != -1 &&
749      sscanf(uts.release, "%d.%d", &major, &minor) == 2 &&
750      ((major < 3) || ((major == 3) && (minor < 4)))) {
751    // Kernels before 3.4 don't handle the ASLR well and we can run out of address
752    // space (http://b/13564922). Work around the issue by inhibiting further mmap() randomization.
753    int old_personality = personality(0xffffffff);
754    if ((old_personality & ADDR_NO_RANDOMIZE) == 0) {
755      int new_personality = personality(old_personality | ADDR_NO_RANDOMIZE);
756      if (new_personality == -1) {
757        LOG(WARNING) << "personality(. | ADDR_NO_RANDOMIZE) failed.";
758      }
759    }
760  }
761#endif
762
763  original_argc = argc;
764  original_argv = argv;
765
766  TimingLogger timings("compiler", false, false);
767  CumulativeLogger compiler_phases_timings("compilation times");
768
769  InitLogging(argv);
770
771  // Skip over argv[0].
772  argv++;
773  argc--;
774
775  if (argc == 0) {
776    Usage("No arguments specified");
777  }
778
779  std::vector<const char*> dex_filenames;
780  std::vector<const char*> dex_locations;
781  int zip_fd = -1;
782  std::string zip_location;
783  std::string oat_filename;
784  std::string oat_symbols;
785  std::string oat_location;
786  int oat_fd = -1;
787  std::string bitcode_filename;
788  const char* image_classes_zip_filename = nullptr;
789  const char* image_classes_filename = nullptr;
790  std::string image_filename;
791  std::string boot_image_filename;
792  uintptr_t image_base = 0;
793  std::string android_root;
794  std::vector<const char*> runtime_args;
795  int thread_count = sysconf(_SC_NPROCESSORS_CONF);
796  Compiler::Kind compiler_kind = kUsePortableCompiler
797      ? Compiler::kPortable
798      : Compiler::kQuick;
799  const char* compiler_filter_string = nullptr;
800  int huge_method_threshold = CompilerOptions::kDefaultHugeMethodThreshold;
801  int large_method_threshold = CompilerOptions::kDefaultLargeMethodThreshold;
802  int small_method_threshold = CompilerOptions::kDefaultSmallMethodThreshold;
803  int tiny_method_threshold = CompilerOptions::kDefaultTinyMethodThreshold;
804  int num_dex_methods_threshold = CompilerOptions::kDefaultNumDexMethodsThreshold;
805
806  // Take the default set of instruction features from the build.
807  InstructionSetFeatures instruction_set_features =
808      ParseFeatureList(Runtime::GetDefaultInstructionSetFeatures());
809
810  InstructionSet instruction_set = kRuntimeISA;
811
812  // Profile file to use
813  std::string profile_file;
814  double top_k_profile_threshold = CompilerOptions::kDefaultTopKProfileThreshold;
815
816  bool is_host = false;
817  bool dump_stats = false;
818  bool dump_timing = false;
819  bool dump_passes = false;
820  bool include_patch_information = CompilerOptions::kDefaultIncludePatchInformation;
821  bool explicit_include_patch_information = false;
822  bool include_debug_symbols = kIsDebugBuild;
823  bool dump_slow_timing = kIsDebugBuild;
824  bool watch_dog_enabled = !kIsTargetBuild;
825  bool generate_gdb_information = kIsDebugBuild;
826
827  // Checks are all explicit until we know the architecture.
828  bool implicit_null_checks = false;
829  bool implicit_so_checks = false;
830  bool implicit_suspend_checks = false;
831
832  for (int i = 0; i < argc; i++) {
833    const StringPiece option(argv[i]);
834    const bool log_options = false;
835    if (log_options) {
836      LOG(INFO) << "dex2oat: option[" << i << "]=" << argv[i];
837    }
838    if (option.starts_with("--dex-file=")) {
839      dex_filenames.push_back(option.substr(strlen("--dex-file=")).data());
840    } else if (option.starts_with("--dex-location=")) {
841      dex_locations.push_back(option.substr(strlen("--dex-location=")).data());
842    } else if (option.starts_with("--zip-fd=")) {
843      const char* zip_fd_str = option.substr(strlen("--zip-fd=")).data();
844      if (!ParseInt(zip_fd_str, &zip_fd)) {
845        Usage("Failed to parse --zip-fd argument '%s' as an integer", zip_fd_str);
846      }
847      if (zip_fd < 0) {
848        Usage("--zip-fd passed a negative value %d", zip_fd);
849      }
850    } else if (option.starts_with("--zip-location=")) {
851      zip_location = option.substr(strlen("--zip-location=")).data();
852    } else if (option.starts_with("--oat-file=")) {
853      oat_filename = option.substr(strlen("--oat-file=")).data();
854    } else if (option.starts_with("--oat-symbols=")) {
855      oat_symbols = option.substr(strlen("--oat-symbols=")).data();
856    } else if (option.starts_with("--oat-fd=")) {
857      const char* oat_fd_str = option.substr(strlen("--oat-fd=")).data();
858      if (!ParseInt(oat_fd_str, &oat_fd)) {
859        Usage("Failed to parse --oat-fd argument '%s' as an integer", oat_fd_str);
860      }
861      if (oat_fd < 0) {
862        Usage("--oat-fd passed a negative value %d", oat_fd);
863      }
864    } else if (option == "--watch-dog") {
865      watch_dog_enabled = true;
866    } else if (option == "--no-watch-dog") {
867      watch_dog_enabled = false;
868    } else if (option == "--gen-gdb-info") {
869      generate_gdb_information = true;
870      // Debug symbols are needed for gdb information.
871      include_debug_symbols = true;
872    } else if (option == "--no-gen-gdb-info") {
873      generate_gdb_information = false;
874    } else if (option.starts_with("-j")) {
875      const char* thread_count_str = option.substr(strlen("-j")).data();
876      if (!ParseInt(thread_count_str, &thread_count)) {
877        Usage("Failed to parse -j argument '%s' as an integer", thread_count_str);
878      }
879    } else if (option.starts_with("--oat-location=")) {
880      oat_location = option.substr(strlen("--oat-location=")).data();
881    } else if (option.starts_with("--bitcode=")) {
882      bitcode_filename = option.substr(strlen("--bitcode=")).data();
883    } else if (option.starts_with("--image=")) {
884      image_filename = option.substr(strlen("--image=")).data();
885    } else if (option.starts_with("--image-classes=")) {
886      image_classes_filename = option.substr(strlen("--image-classes=")).data();
887    } else if (option.starts_with("--image-classes-zip=")) {
888      image_classes_zip_filename = option.substr(strlen("--image-classes-zip=")).data();
889    } else if (option.starts_with("--base=")) {
890      const char* image_base_str = option.substr(strlen("--base=")).data();
891      char* end;
892      image_base = strtoul(image_base_str, &end, 16);
893      if (end == image_base_str || *end != '\0') {
894        Usage("Failed to parse hexadecimal value for option %s", option.data());
895      }
896    } else if (option.starts_with("--boot-image=")) {
897      boot_image_filename = option.substr(strlen("--boot-image=")).data();
898    } else if (option.starts_with("--android-root=")) {
899      android_root = option.substr(strlen("--android-root=")).data();
900    } else if (option.starts_with("--instruction-set=")) {
901      StringPiece instruction_set_str = option.substr(strlen("--instruction-set=")).data();
902      if (instruction_set_str == "arm") {
903        instruction_set = kThumb2;
904      } else if (instruction_set_str == "arm64") {
905        instruction_set = kArm64;
906      } else if (instruction_set_str == "mips") {
907        instruction_set = kMips;
908      } else if (instruction_set_str == "x86") {
909        instruction_set = kX86;
910      } else if (instruction_set_str == "x86_64") {
911        instruction_set = kX86_64;
912      }
913    } else if (option.starts_with("--instruction-set-features=")) {
914      StringPiece str = option.substr(strlen("--instruction-set-features=")).data();
915      instruction_set_features = ParseFeatureList(str.as_string());
916    } else if (option.starts_with("--compiler-backend=")) {
917      StringPiece backend_str = option.substr(strlen("--compiler-backend=")).data();
918      if (backend_str == "Quick") {
919        compiler_kind = Compiler::kQuick;
920      } else if (backend_str == "Optimizing") {
921        compiler_kind = Compiler::kOptimizing;
922      } else if (backend_str == "Portable") {
923        compiler_kind = Compiler::kPortable;
924      }
925    } else if (option.starts_with("--compiler-filter=")) {
926      compiler_filter_string = option.substr(strlen("--compiler-filter=")).data();
927    } else if (option.starts_with("--huge-method-max=")) {
928      const char* threshold = option.substr(strlen("--huge-method-max=")).data();
929      if (!ParseInt(threshold, &huge_method_threshold)) {
930        Usage("Failed to parse --huge-method-max '%s' as an integer", threshold);
931      }
932      if (huge_method_threshold < 0) {
933        Usage("--huge-method-max passed a negative value %s", huge_method_threshold);
934      }
935    } else if (option.starts_with("--large-method-max=")) {
936      const char* threshold = option.substr(strlen("--large-method-max=")).data();
937      if (!ParseInt(threshold, &large_method_threshold)) {
938        Usage("Failed to parse --large-method-max '%s' as an integer", threshold);
939      }
940      if (large_method_threshold < 0) {
941        Usage("--large-method-max passed a negative value %s", large_method_threshold);
942      }
943    } else if (option.starts_with("--small-method-max=")) {
944      const char* threshold = option.substr(strlen("--small-method-max=")).data();
945      if (!ParseInt(threshold, &small_method_threshold)) {
946        Usage("Failed to parse --small-method-max '%s' as an integer", threshold);
947      }
948      if (small_method_threshold < 0) {
949        Usage("--small-method-max passed a negative value %s", small_method_threshold);
950      }
951    } else if (option.starts_with("--tiny-method-max=")) {
952      const char* threshold = option.substr(strlen("--tiny-method-max=")).data();
953      if (!ParseInt(threshold, &tiny_method_threshold)) {
954        Usage("Failed to parse --tiny-method-max '%s' as an integer", threshold);
955      }
956      if (tiny_method_threshold < 0) {
957        Usage("--tiny-method-max passed a negative value %s", tiny_method_threshold);
958      }
959    } else if (option.starts_with("--num-dex-methods=")) {
960      const char* threshold = option.substr(strlen("--num-dex-methods=")).data();
961      if (!ParseInt(threshold, &num_dex_methods_threshold)) {
962        Usage("Failed to parse --num-dex-methods '%s' as an integer", threshold);
963      }
964      if (num_dex_methods_threshold < 0) {
965        Usage("--num-dex-methods passed a negative value %s", num_dex_methods_threshold);
966      }
967    } else if (option == "--host") {
968      is_host = true;
969    } else if (option == "--runtime-arg") {
970      if (++i >= argc) {
971        Usage("Missing required argument for --runtime-arg");
972      }
973      if (log_options) {
974        LOG(INFO) << "dex2oat: option[" << i << "]=" << argv[i];
975      }
976      runtime_args.push_back(argv[i]);
977    } else if (option == "--dump-timing") {
978      dump_timing = true;
979    } else if (option == "--dump-passes") {
980      dump_passes = true;
981    } else if (option == "--dump-stats") {
982      dump_stats = true;
983    } else if (option == "--include-debug-symbols" || option == "--no-strip-symbols") {
984      include_debug_symbols = true;
985    } else if (option == "--no-include-debug-symbols" || option == "--strip-symbols") {
986      include_debug_symbols = false;
987    } else if (option.starts_with("--profile-file=")) {
988      profile_file = option.substr(strlen("--profile-file=")).data();
989      VLOG(compiler) << "dex2oat: profile file is " << profile_file;
990    } else if (option == "--no-profile-file") {
991      // No profile
992    } else if (option.starts_with("--top-k-profile-threshold=")) {
993      ParseDouble(option.data(), '=', 0.0, 100.0, &top_k_profile_threshold);
994    } else if (option == "--print-pass-names") {
995      PassDriverMEOpts::PrintPassNames();
996    } else if (option.starts_with("--disable-passes=")) {
997      std::string disable_passes = option.substr(strlen("--disable-passes=")).data();
998      PassDriverMEOpts::CreateDefaultPassList(disable_passes);
999    } else if (option.starts_with("--print-passes=")) {
1000      std::string print_passes = option.substr(strlen("--print-passes=")).data();
1001      PassDriverMEOpts::SetPrintPassList(print_passes);
1002    } else if (option == "--print-all-passes") {
1003      PassDriverMEOpts::SetPrintAllPasses();
1004    } else if (option.starts_with("--dump-cfg-passes=")) {
1005      std::string dump_passes = option.substr(strlen("--dump-cfg-passes=")).data();
1006      PassDriverMEOpts::SetDumpPassList(dump_passes);
1007    } else if (option == "--include-patch-information") {
1008      include_patch_information = true;
1009      explicit_include_patch_information = true;
1010    } else if (option == "--no-include-patch-information") {
1011      include_patch_information = false;
1012      explicit_include_patch_information = true;
1013    } else {
1014      Usage("Unknown argument %s", option.data());
1015    }
1016  }
1017
1018  if (oat_filename.empty() && oat_fd == -1) {
1019    Usage("Output must be supplied with either --oat-file or --oat-fd");
1020  }
1021
1022  if (!oat_filename.empty() && oat_fd != -1) {
1023    Usage("--oat-file should not be used with --oat-fd");
1024  }
1025
1026  if (!oat_symbols.empty() && oat_fd != -1) {
1027    Usage("--oat-symbols should not be used with --oat-fd");
1028  }
1029
1030  if (!oat_symbols.empty() && is_host) {
1031    Usage("--oat-symbols should not be used with --host");
1032  }
1033
1034  if (oat_fd != -1 && !image_filename.empty()) {
1035    Usage("--oat-fd should not be used with --image");
1036  }
1037
1038  if (android_root.empty()) {
1039    const char* android_root_env_var = getenv("ANDROID_ROOT");
1040    if (android_root_env_var == nullptr) {
1041      Usage("--android-root unspecified and ANDROID_ROOT not set");
1042    }
1043    android_root += android_root_env_var;
1044  }
1045
1046  bool image = (!image_filename.empty());
1047  if (!image && boot_image_filename.empty()) {
1048    boot_image_filename += android_root;
1049    boot_image_filename += "/framework/boot.art";
1050  }
1051  std::string boot_image_option;
1052  if (!boot_image_filename.empty()) {
1053    boot_image_option += "-Ximage:";
1054    boot_image_option += boot_image_filename;
1055  }
1056
1057  if (image_classes_filename != nullptr && !image) {
1058    Usage("--image-classes should only be used with --image");
1059  }
1060
1061  if (image_classes_filename != nullptr && !boot_image_option.empty()) {
1062    Usage("--image-classes should not be used with --boot-image");
1063  }
1064
1065  if (image_classes_zip_filename != nullptr && image_classes_filename == nullptr) {
1066    Usage("--image-classes-zip should be used with --image-classes");
1067  }
1068
1069  if (dex_filenames.empty() && zip_fd == -1) {
1070    Usage("Input must be supplied with either --dex-file or --zip-fd");
1071  }
1072
1073  if (!dex_filenames.empty() && zip_fd != -1) {
1074    Usage("--dex-file should not be used with --zip-fd");
1075  }
1076
1077  if (!dex_filenames.empty() && !zip_location.empty()) {
1078    Usage("--dex-file should not be used with --zip-location");
1079  }
1080
1081  if (dex_locations.empty()) {
1082    for (size_t i = 0; i < dex_filenames.size(); i++) {
1083      dex_locations.push_back(dex_filenames[i]);
1084    }
1085  } else if (dex_locations.size() != dex_filenames.size()) {
1086    Usage("--dex-location arguments do not match --dex-file arguments");
1087  }
1088
1089  if (zip_fd != -1 && zip_location.empty()) {
1090    Usage("--zip-location should be supplied with --zip-fd");
1091  }
1092
1093  if (boot_image_option.empty()) {
1094    if (image_base == 0) {
1095      Usage("Non-zero --base not specified");
1096    }
1097  }
1098
1099  std::string oat_stripped(oat_filename);
1100  std::string oat_unstripped;
1101  if (!oat_symbols.empty()) {
1102    oat_unstripped += oat_symbols;
1103  } else {
1104    oat_unstripped += oat_filename;
1105  }
1106
1107  if (compiler_filter_string == nullptr) {
1108    if (instruction_set == kMips64) {
1109      // TODO: fix compiler for Mips64.
1110      compiler_filter_string = "interpret-only";
1111    } else if (image) {
1112      compiler_filter_string = "speed";
1113    } else {
1114#if ART_SMALL_MODE
1115      compiler_filter_string = "interpret-only";
1116#else
1117      compiler_filter_string = "speed";
1118#endif
1119    }
1120  }
1121  CHECK(compiler_filter_string != nullptr);
1122  CompilerOptions::CompilerFilter compiler_filter = CompilerOptions::kDefaultCompilerFilter;
1123  if (strcmp(compiler_filter_string, "verify-none") == 0) {
1124    compiler_filter = CompilerOptions::kVerifyNone;
1125  } else if (strcmp(compiler_filter_string, "interpret-only") == 0) {
1126    compiler_filter = CompilerOptions::kInterpretOnly;
1127  } else if (strcmp(compiler_filter_string, "space") == 0) {
1128    compiler_filter = CompilerOptions::kSpace;
1129  } else if (strcmp(compiler_filter_string, "balanced") == 0) {
1130    compiler_filter = CompilerOptions::kBalanced;
1131  } else if (strcmp(compiler_filter_string, "speed") == 0) {
1132    compiler_filter = CompilerOptions::kSpeed;
1133  } else if (strcmp(compiler_filter_string, "everything") == 0) {
1134    compiler_filter = CompilerOptions::kEverything;
1135  } else {
1136    Usage("Unknown --compiler-filter value %s", compiler_filter_string);
1137  }
1138
1139  if (!explicit_include_patch_information) {
1140    include_patch_information =
1141        (compiler_kind == Compiler::kQuick && CompilerOptions::kDefaultIncludePatchInformation);
1142  }
1143
1144  // Set the compilation target's implicit checks options.
1145  switch (instruction_set) {
1146    case kArm:
1147    case kThumb2:
1148    case kX86:
1149      implicit_null_checks = true;
1150      implicit_so_checks = true;
1151      break;
1152
1153    default:
1154      // Defaults are correct.
1155      break;
1156  }
1157
1158  std::unique_ptr<CompilerOptions> compiler_options(new CompilerOptions(compiler_filter,
1159                                                                        huge_method_threshold,
1160                                                                        large_method_threshold,
1161                                                                        small_method_threshold,
1162                                                                        tiny_method_threshold,
1163                                                                        num_dex_methods_threshold,
1164                                                                        generate_gdb_information,
1165                                                                        include_patch_information,
1166                                                                        top_k_profile_threshold,
1167                                                                        include_debug_symbols,
1168                                                                        implicit_null_checks,
1169                                                                        implicit_so_checks,
1170                                                                        implicit_suspend_checks
1171#ifdef ART_SEA_IR_MODE
1172                                                                        , compiler_options.sea_ir_ =
1173                                                                              true;
1174#endif
1175  ));  // NOLINT(whitespace/parens)
1176
1177  // Done with usage checks, enable watchdog if requested
1178  WatchDog watch_dog(watch_dog_enabled);
1179
1180  // Check early that the result of compilation can be written
1181  std::unique_ptr<File> oat_file;
1182  bool create_file = !oat_unstripped.empty();  // as opposed to using open file descriptor
1183  if (create_file) {
1184    oat_file.reset(OS::CreateEmptyFile(oat_unstripped.c_str()));
1185    if (oat_location.empty()) {
1186      oat_location = oat_filename;
1187    }
1188  } else {
1189    oat_file.reset(new File(oat_fd, oat_location));
1190    oat_file->DisableAutoClose();
1191  }
1192  if (oat_file.get() == nullptr) {
1193    PLOG(ERROR) << "Failed to create oat file: " << oat_location;
1194    return EXIT_FAILURE;
1195  }
1196  if (create_file && fchmod(oat_file->Fd(), 0644) != 0) {
1197    PLOG(ERROR) << "Failed to make oat file world readable: " << oat_location;
1198    return EXIT_FAILURE;
1199  }
1200
1201  timings.StartTiming("dex2oat Setup");
1202  LOG(INFO) << CommandLine();
1203
1204  Runtime::Options runtime_options;
1205  std::vector<const DexFile*> boot_class_path;
1206  if (boot_image_option.empty()) {
1207    size_t failure_count = OpenDexFiles(dex_filenames, dex_locations, boot_class_path);
1208    if (failure_count > 0) {
1209      LOG(ERROR) << "Failed to open some dex files: " << failure_count;
1210      return EXIT_FAILURE;
1211    }
1212    runtime_options.push_back(std::make_pair("bootclasspath", &boot_class_path));
1213  } else {
1214    runtime_options.push_back(std::make_pair(boot_image_option.c_str(), nullptr));
1215  }
1216  for (size_t i = 0; i < runtime_args.size(); i++) {
1217    runtime_options.push_back(std::make_pair(runtime_args[i], nullptr));
1218  }
1219
1220  std::unique_ptr<VerificationResults> verification_results(new VerificationResults(
1221                                                            compiler_options.get()));
1222  DexFileToMethodInlinerMap method_inliner_map;
1223  CompilerCallbacksImpl callbacks(verification_results.get(), &method_inliner_map);
1224  runtime_options.push_back(std::make_pair("compilercallbacks", &callbacks));
1225  runtime_options.push_back(
1226      std::make_pair("imageinstructionset",
1227                     reinterpret_cast<const void*>(GetInstructionSetString(instruction_set))));
1228
1229  Dex2Oat* p_dex2oat;
1230  if (!Dex2Oat::Create(&p_dex2oat,
1231                       runtime_options,
1232                       *compiler_options,
1233                       compiler_kind,
1234                       instruction_set,
1235                       instruction_set_features,
1236                       verification_results.get(),
1237                       &method_inliner_map,
1238                       thread_count)) {
1239    LOG(ERROR) << "Failed to create dex2oat";
1240    return EXIT_FAILURE;
1241  }
1242  std::unique_ptr<Dex2Oat> dex2oat(p_dex2oat);
1243
1244  // Runtime::Create acquired the mutator_lock_ that is normally given away when we Runtime::Start,
1245  // give it away now so that we don't starve GC.
1246  Thread* self = Thread::Current();
1247  self->TransitionFromRunnableToSuspended(kNative);
1248  // If we're doing the image, override the compiler filter to force full compilation. Must be
1249  // done ahead of WellKnownClasses::Init that causes verification.  Note: doesn't force
1250  // compilation of class initializers.
1251  // Whilst we're in native take the opportunity to initialize well known classes.
1252  WellKnownClasses::Init(self->GetJniEnv());
1253
1254  // If --image-classes was specified, calculate the full list of classes to include in the image
1255  std::unique_ptr<CompilerDriver::DescriptorSet> image_classes(nullptr);
1256  if (image_classes_filename != nullptr) {
1257    std::string error_msg;
1258    if (image_classes_zip_filename != nullptr) {
1259      image_classes.reset(dex2oat->ReadImageClassesFromZip(image_classes_zip_filename,
1260                                                           image_classes_filename,
1261                                                           &error_msg));
1262    } else {
1263      image_classes.reset(dex2oat->ReadImageClassesFromFile(image_classes_filename));
1264    }
1265    if (image_classes.get() == nullptr) {
1266      LOG(ERROR) << "Failed to create list of image classes from '" << image_classes_filename <<
1267          "': " << error_msg;
1268      return EXIT_FAILURE;
1269    }
1270  } else if (image) {
1271    image_classes.reset(new CompilerDriver::DescriptorSet);
1272  }
1273
1274  std::vector<const DexFile*> dex_files;
1275  if (boot_image_option.empty()) {
1276    dex_files = Runtime::Current()->GetClassLinker()->GetBootClassPath();
1277  } else {
1278    if (dex_filenames.empty()) {
1279      ATRACE_BEGIN("Opening zip archive from file descriptor");
1280      std::string error_msg;
1281      std::unique_ptr<ZipArchive> zip_archive(ZipArchive::OpenFromFd(zip_fd, zip_location.c_str(),
1282                                                               &error_msg));
1283      if (zip_archive.get() == nullptr) {
1284        LOG(ERROR) << "Failed to open zip from file descriptor for '" << zip_location << "': "
1285            << error_msg;
1286        return EXIT_FAILURE;
1287      }
1288      if (!DexFile::OpenFromZip(*zip_archive.get(), zip_location, &error_msg, &dex_files)) {
1289        LOG(ERROR) << "Failed to open dex from file descriptor for zip file '" << zip_location
1290            << "': " << error_msg;
1291        return EXIT_FAILURE;
1292      }
1293      ATRACE_END();
1294    } else {
1295      size_t failure_count = OpenDexFiles(dex_filenames, dex_locations, dex_files);
1296      if (failure_count > 0) {
1297        LOG(ERROR) << "Failed to open some dex files: " << failure_count;
1298        return EXIT_FAILURE;
1299      }
1300    }
1301
1302    const bool kSaveDexInput = false;
1303    if (kSaveDexInput) {
1304      for (size_t i = 0; i < dex_files.size(); ++i) {
1305        const DexFile* dex_file = dex_files[i];
1306        std::string tmp_file_name(StringPrintf("/data/local/tmp/dex2oat.%d.%zd.dex", getpid(), i));
1307        std::unique_ptr<File> tmp_file(OS::CreateEmptyFile(tmp_file_name.c_str()));
1308        if (tmp_file.get() == nullptr) {
1309            PLOG(ERROR) << "Failed to open file " << tmp_file_name
1310                        << ". Try: adb shell chmod 777 /data/local/tmp";
1311            continue;
1312        }
1313        tmp_file->WriteFully(dex_file->Begin(), dex_file->Size());
1314        LOG(INFO) << "Wrote input to " << tmp_file_name;
1315      }
1316    }
1317  }
1318  // Ensure opened dex files are writable for dex-to-dex transformations.
1319  for (const auto& dex_file : dex_files) {
1320    if (!dex_file->EnableWrite()) {
1321      PLOG(ERROR) << "Failed to make .dex file writeable '" << dex_file->GetLocation() << "'\n";
1322    }
1323  }
1324
1325  /*
1326   * If we're not in interpret-only or verify-none mode, go ahead and compile small applications.
1327   * Don't bother to check if we're doing the image.
1328   */
1329  if (!image && compiler_options->IsCompilationEnabled()) {
1330    size_t num_methods = 0;
1331    for (size_t i = 0; i != dex_files.size(); ++i) {
1332      const DexFile* dex_file = dex_files[i];
1333      CHECK(dex_file != nullptr);
1334      num_methods += dex_file->NumMethodIds();
1335    }
1336    if (num_methods <= compiler_options->GetNumDexMethodsThreshold()) {
1337      compiler_options->SetCompilerFilter(CompilerOptions::kSpeed);
1338      VLOG(compiler) << "Below method threshold, compiling anyways";
1339    }
1340  }
1341
1342  // Fill some values into the key-value store for the oat header.
1343  std::unique_ptr<SafeMap<std::string, std::string> > key_value_store(
1344      new SafeMap<std::string, std::string>());
1345
1346  // Insert some compiler things.
1347  std::ostringstream oss;
1348  for (int i = 0; i < argc; ++i) {
1349    if (i > 0) {
1350      oss << ' ';
1351    }
1352    oss << argv[i];
1353  }
1354  key_value_store->Put(OatHeader::kDex2OatCmdLineKey, oss.str());
1355  oss.str("");  // Reset.
1356  oss << kRuntimeISA;
1357  key_value_store->Put(OatHeader::kDex2OatHostKey, oss.str());
1358
1359  std::unique_ptr<const CompilerDriver> compiler(dex2oat->CreateOatFile(boot_image_option,
1360                                                                        android_root,
1361                                                                        is_host,
1362                                                                        dex_files,
1363                                                                        oat_file.get(),
1364                                                                        bitcode_filename,
1365                                                                        image,
1366                                                                        image_classes,
1367                                                                        dump_stats,
1368                                                                        dump_passes,
1369                                                                        timings,
1370                                                                        compiler_phases_timings,
1371                                                                        profile_file,
1372                                                                        key_value_store.get()));
1373
1374  if (compiler.get() == nullptr) {
1375    LOG(ERROR) << "Failed to create oat file: " << oat_location;
1376    return EXIT_FAILURE;
1377  }
1378
1379  VLOG(compiler) << "Oat file written successfully (unstripped): " << oat_location;
1380
1381  // Notes on the interleaving of creating the image and oat file to
1382  // ensure the references between the two are correct.
1383  //
1384  // Currently we have a memory layout that looks something like this:
1385  //
1386  // +--------------+
1387  // | image        |
1388  // +--------------+
1389  // | boot oat     |
1390  // +--------------+
1391  // | alloc spaces |
1392  // +--------------+
1393  //
1394  // There are several constraints on the loading of the image and boot.oat.
1395  //
1396  // 1. The image is expected to be loaded at an absolute address and
1397  // contains Objects with absolute pointers within the image.
1398  //
1399  // 2. There are absolute pointers from Methods in the image to their
1400  // code in the oat.
1401  //
1402  // 3. There are absolute pointers from the code in the oat to Methods
1403  // in the image.
1404  //
1405  // 4. There are absolute pointers from code in the oat to other code
1406  // in the oat.
1407  //
1408  // To get this all correct, we go through several steps.
1409  //
1410  // 1. We have already created that oat file above with
1411  // CreateOatFile. Originally this was just our own proprietary file
1412  // but now it is contained within an ELF dynamic object (aka an .so
1413  // file). The Compiler returned by CreateOatFile provides
1414  // PatchInformation for references to oat code and Methods that need
1415  // to be update once we know where the oat file will be located
1416  // after the image.
1417  //
1418  // 2. We create the image file. It needs to know where the oat file
1419  // will be loaded after itself. Originally when oat file was simply
1420  // memory mapped so we could predict where its contents were based
1421  // on the file size. Now that it is an ELF file, we need to inspect
1422  // the ELF file to understand the in memory segment layout including
1423  // where the oat header is located within. ImageWriter's
1424  // PatchOatCodeAndMethods uses the PatchInformation from the
1425  // Compiler to touch up absolute references in the oat file.
1426  //
1427  // 3. We fixup the ELF program headers so that dlopen will try to
1428  // load the .so at the desired location at runtime by offsetting the
1429  // Elf32_Phdr.p_vaddr values by the desired base address.
1430  //
1431  if (image) {
1432    TimingLogger::ScopedTiming t("dex2oat ImageWriter", &timings);
1433    bool image_creation_success = dex2oat->CreateImageFile(image_filename,
1434                                                           image_base,
1435                                                           oat_unstripped,
1436                                                           oat_location,
1437                                                           *compiler.get());
1438    if (!image_creation_success) {
1439      return EXIT_FAILURE;
1440    }
1441    VLOG(compiler) << "Image written successfully: " << image_filename;
1442  }
1443
1444  if (is_host) {
1445    timings.EndTiming();
1446    if (dump_timing || (dump_slow_timing && timings.GetTotalNs() > MsToNs(1000))) {
1447      LOG(INFO) << Dumpable<TimingLogger>(timings);
1448    }
1449    if (dump_passes) {
1450      LOG(INFO) << Dumpable<CumulativeLogger>(*compiler.get()->GetTimingsLogger());
1451    }
1452    return EXIT_SUCCESS;
1453  }
1454
1455  // If we don't want to strip in place, copy from unstripped location to stripped location.
1456  // We need to strip after image creation because FixupElf needs to use .strtab.
1457  if (oat_unstripped != oat_stripped) {
1458    TimingLogger::ScopedTiming t("dex2oat OatFile copy", &timings);
1459    oat_file.reset();
1460     std::unique_ptr<File> in(OS::OpenFileForReading(oat_unstripped.c_str()));
1461    std::unique_ptr<File> out(OS::CreateEmptyFile(oat_stripped.c_str()));
1462    size_t buffer_size = 8192;
1463    std::unique_ptr<uint8_t> buffer(new uint8_t[buffer_size]);
1464    while (true) {
1465      int bytes_read = TEMP_FAILURE_RETRY(read(in->Fd(), buffer.get(), buffer_size));
1466      if (bytes_read <= 0) {
1467        break;
1468      }
1469      bool write_ok = out->WriteFully(buffer.get(), bytes_read);
1470      CHECK(write_ok);
1471    }
1472    oat_file.reset(out.release());
1473    VLOG(compiler) << "Oat file copied successfully (stripped): " << oat_stripped;
1474  }
1475
1476#if ART_USE_PORTABLE_COMPILER  // We currently only generate symbols on Portable
1477  if (!compiler_options.GetIncludeDebugSymbols()) {
1478    timings.NewSplit("dex2oat ElfStripper");
1479    // Strip unneeded sections for target
1480    off_t seek_actual = lseek(oat_file->Fd(), 0, SEEK_SET);
1481    CHECK_EQ(0, seek_actual);
1482    std::string error_msg;
1483    CHECK(ElfStripper::Strip(oat_file.get(), &error_msg)) << error_msg;
1484
1485
1486    // We wrote the oat file successfully, and want to keep it.
1487    VLOG(compiler) << "Oat file written successfully (stripped): " << oat_location;
1488  } else {
1489    VLOG(compiler) << "Oat file written successfully without stripping: " << oat_location;
1490  }
1491#endif  // ART_USE_PORTABLE_COMPILER
1492
1493  timings.EndTiming();
1494
1495  if (dump_timing || (dump_slow_timing && timings.GetTotalNs() > MsToNs(1000))) {
1496    LOG(INFO) << Dumpable<TimingLogger>(timings);
1497  }
1498  if (dump_passes) {
1499    LOG(INFO) << Dumpable<CumulativeLogger>(compiler_phases_timings);
1500  }
1501
1502  // Everything was successfully written, do an explicit exit here to avoid running Runtime
1503  // destructors that take time (bug 10645725) unless we're a debug build or running on valgrind.
1504  if (!kIsDebugBuild && (RUNNING_ON_VALGRIND == 0)) {
1505    dex2oat->LogCompletionTime();
1506    exit(EXIT_SUCCESS);
1507  }
1508
1509  return EXIT_SUCCESS;
1510}  // NOLINT(readability/fn_size)
1511}  // namespace art
1512
1513int main(int argc, char** argv) {
1514  return art::dex2oat(argc, argv);
1515}
1516