Re-enable IMT stub test.

bug:27794971
Change-Id: Ief5cbb9ca4a07596a2f389e386124f9bb5323073
diff --git a/runtime/arch/stub_test.cc b/runtime/arch/stub_test.cc
index 1c4b470..759f807 100644
--- a/runtime/arch/stub_test.cc
+++ b/runtime/arch/stub_test.cc
@@ -21,6 +21,7 @@
 #include "class_linker-inl.h"
 #include "common_runtime_test.h"
 #include "entrypoints/quick/quick_entrypoints_enum.h"
+#include "linear_alloc.h"
 #include "mirror/class-inl.h"
 #include "mirror/string-inl.h"
 #include "scoped_thread_state_change.h"
@@ -1999,14 +2000,28 @@
   // 1. imt_conflict
 
   // Contains.
-  // TODO(ngeoffray): Re-enable this test. They are now broken with the ImtConflictTable.
-  // b/27794971
-/*
+
+  // We construct the ImtConflictTable ourselves, as we cannot go into the runtime stub
+  // that will create it: the runtime stub expects to be called by compiled code.
+  ArtMethod* runtime_conflict_method = Runtime::Current()->GetImtConflictMethod();
+  LinearAlloc* linear_alloc = Runtime::Current()->GetLinearAlloc();
+  ArtMethod* conflict_method = Runtime::Current()->CreateImtConflictMethod(linear_alloc);
+  ImtConflictTable* runtime_conflict_table =
+      runtime_conflict_method->GetImtConflictTable(sizeof(void*));
+  void* data = linear_alloc->Alloc(
+      self,
+      ImtConflictTable::ComputeSizeWithOneMoreEntry(runtime_conflict_table));
+  ImtConflictTable* new_table = new (data) ImtConflictTable(
+      runtime_conflict_table, inf_contains, contains_amethod);
+  conflict_method->SetImtConflictTable(new_table);
+
   size_t result =
-      Invoke3WithReferrerAndHidden(0U, reinterpret_cast<size_t>(array_list.Get()),
+      Invoke3WithReferrerAndHidden(reinterpret_cast<size_t>(conflict_method),
+                                   reinterpret_cast<size_t>(array_list.Get()),
                                    reinterpret_cast<size_t>(obj.Get()),
                                    StubTest::GetEntrypoint(self, kQuickQuickImtConflictTrampoline),
-                                   self, contains_amethod,
+                                   self,
+                                   contains_amethod,
                                    static_cast<size_t>(inf_contains->GetDexMethodIndex()));
 
   ASSERT_FALSE(self->IsExceptionPending());
@@ -2020,25 +2035,29 @@
 
   // Contains.
 
-  result = Invoke3WithReferrerAndHidden(
-      0U, reinterpret_cast<size_t>(array_list.Get()), reinterpret_cast<size_t>(obj.Get()),
-      StubTest::GetEntrypoint(self, kQuickQuickImtConflictTrampoline), self, contains_amethod,
-      static_cast<size_t>(inf_contains->GetDexMethodIndex()));
+  result =
+      Invoke3WithReferrerAndHidden(reinterpret_cast<size_t>(conflict_method),
+                                   reinterpret_cast<size_t>(array_list.Get()),
+                                   reinterpret_cast<size_t>(obj.Get()),
+                                   StubTest::GetEntrypoint(self, kQuickQuickImtConflictTrampoline),
+                                   self,
+                                   contains_amethod,
+                                   static_cast<size_t>(inf_contains->GetDexMethodIndex()));
 
   ASSERT_FALSE(self->IsExceptionPending());
   EXPECT_EQ(static_cast<size_t>(JNI_TRUE), result);
-*/
+
   // 2. regular interface trampoline
 
-  size_t result = Invoke3WithReferrer(static_cast<size_t>(inf_contains->GetDexMethodIndex()),
-                                      reinterpret_cast<size_t>(array_list.Get()),
-                                      reinterpret_cast<size_t>(obj.Get()),
-                                      StubTest::GetEntrypoint(self,
-                                         kQuickInvokeInterfaceTrampolineWithAccessCheck),
-                                      self, contains_amethod);
+  result = Invoke3WithReferrer(static_cast<size_t>(inf_contains->GetDexMethodIndex()),
+                               reinterpret_cast<size_t>(array_list.Get()),
+                               reinterpret_cast<size_t>(obj.Get()),
+                               StubTest::GetEntrypoint(self,
+                                   kQuickInvokeInterfaceTrampolineWithAccessCheck),
+                               self, contains_amethod);
 
   ASSERT_FALSE(self->IsExceptionPending());
-  EXPECT_EQ(static_cast<size_t>(JNI_FALSE), result);
+  EXPECT_EQ(static_cast<size_t>(JNI_TRUE), result);
 
   result = Invoke3WithReferrer(
       static_cast<size_t>(inf_contains->GetDexMethodIndex()),