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