Add implicit null checks for the optimizing compiler

- for backends: arm, arm64, x86, x86_64
- fixed parameter passing for CodeGenerator
- 003-omnibus-opcodes test verifies that NullPointerExceptions work as
expected

Change-Id: I1b302acd353342504716c9169a80706cf3aba2c8
diff --git a/compiler/optimizing/optimizing_compiler.cc b/compiler/optimizing/optimizing_compiler.cc
index 6056373..daec0f0 100644
--- a/compiler/optimizing/optimizing_compiler.cc
+++ b/compiler/optimizing/optimizing_compiler.cc
@@ -328,7 +328,8 @@
                                             const DexFile& dex_file) const {
   UNUSED(invoke_type);
   compilation_stats_.RecordStat(MethodCompilationStat::kAttemptCompilation);
-  InstructionSet instruction_set = GetCompilerDriver()->GetInstructionSet();
+  CompilerDriver* compiler_driver = GetCompilerDriver();
+  InstructionSet instruction_set = compiler_driver->GetInstructionSet();
   // Always use the thumb2 assembler: some runtime functionality (like implicit stack
   // overflow checks) assume thumb2.
   if (instruction_set == kArm) {
@@ -349,7 +350,7 @@
   DexCompilationUnit dex_compilation_unit(
     nullptr, class_loader, art::Runtime::Current()->GetClassLinker(), dex_file, code_item,
     class_def_idx, method_idx, access_flags,
-    GetCompilerDriver()->GetVerifiedMethod(&dex_file, method_idx));
+    compiler_driver->GetVerifiedMethod(&dex_file, method_idx));
 
   std::string method_name = PrettyMethod(method_idx, dex_file);
 
@@ -364,7 +365,7 @@
                         &dex_compilation_unit,
                         &dex_compilation_unit,
                         &dex_file,
-                        GetCompilerDriver(),
+                        compiler_driver,
                         &compilation_stats_);
 
   VLOG(compiler) << "Building " << PrettyMethod(method_idx, dex_file);
@@ -374,9 +375,11 @@
     return nullptr;
   }
 
-  CompilerDriver* compiler_driver = GetCompilerDriver();
   std::unique_ptr<CodeGenerator> codegen(
-      CodeGenerator::Create(graph, instruction_set, *compiler_driver->GetInstructionSetFeatures()));
+      CodeGenerator::Create(graph,
+                            instruction_set,
+                            *compiler_driver->GetInstructionSetFeatures(),
+                            compiler_driver->GetCompilerOptions()));
   if (codegen.get() == nullptr) {
     CHECK(!shouldCompile) << "Could not find code generator for optimizing compiler";
     compilation_stats_.RecordStat(MethodCompilationStat::kNotCompiledNoCodegen);