Fix ClassLinker::MayBeCalledWithDirectCodePointer for JIT

Currently, we don't know if another method has a direct code
pointer or not. This should fix the case where breakpoints
occasionally don't work with JIT.

The JIT now also checks that a method doesn't have any breakpoints
before starting to compile it.

Bug: 17950037

Change-Id: I17cfe874fe4825beba23903a5053d5cb27e106cb
diff --git a/runtime/class_linker.cc b/runtime/class_linker.cc
index 67872d7..b0708a6 100644
--- a/runtime/class_linker.cc
+++ b/runtime/class_linker.cc
@@ -5286,6 +5286,10 @@
 }
 
 bool ClassLinker::MayBeCalledWithDirectCodePointer(mirror::ArtMethod* m) {
+  if (Runtime::Current()->UseJit()) {
+    // JIT can have direct code pointers from any method to any other method.
+    return true;
+  }
   // Non-image methods don't use direct code pointer.
   if (!m->GetDeclaringClass()->IsBootStrapClassLoaded()) {
     return false;
diff --git a/runtime/debugger.cc b/runtime/debugger.cc
index 7144577..a1ae236 100644
--- a/runtime/debugger.cc
+++ b/runtime/debugger.cc
@@ -3153,6 +3153,11 @@
   return nullptr;
 }
 
+bool Dbg::MethodHasAnyBreakpoints(mirror::ArtMethod* method) {
+  ReaderMutexLock mu(Thread::Current(), *Locks::breakpoint_lock_);
+  return FindFirstBreakpointForMethod(method) != nullptr;
+}
+
 // Sanity checks all existing breakpoints on the same method.
 static void SanityCheckExistingBreakpoints(mirror::ArtMethod* m,
                                            DeoptimizationRequest::Kind deoptimization_kind)
diff --git a/runtime/debugger.h b/runtime/debugger.h
index d015294..4f4a781 100644
--- a/runtime/debugger.h
+++ b/runtime/debugger.h
@@ -253,6 +253,10 @@
   // Returns true if we had -Xrunjdwp or -agentlib:jdwp= on the command line.
   static bool IsJdwpConfigured();
 
+  // Returns true if a method has any breakpoints.
+  static bool MethodHasAnyBreakpoints(mirror::ArtMethod* method)
+      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) LOCKS_EXCLUDED(Locks::breakpoint_lock_);
+
   static bool IsDisposed();
 
   /*
diff --git a/runtime/jit/jit.cc b/runtime/jit/jit.cc
index 13c1f81..5dc739e 100644
--- a/runtime/jit/jit.cc
+++ b/runtime/jit/jit.cc
@@ -128,6 +128,10 @@
 
 bool Jit::CompileMethod(mirror::ArtMethod* method, Thread* self) {
   DCHECK(!method->IsRuntimeMethod());
+  if (Dbg::IsDebuggerActive() && Dbg::MethodHasAnyBreakpoints(method)) {
+    VLOG(jit) << "JIT not compiling " << PrettyMethod(method) << " due to breakpoint";
+    return false;
+  }
   const bool result = jit_compile_method_(jit_compiler_handle_, method, self);
   if (result) {
     method->SetEntryPointFromInterpreter(artInterpreterToCompiledCodeBridge);