Fix the LDT code to be -O2 safe and valgrind clean.

Change-Id: Iad987f828a8d8932a9f7212c71eddd3c943f6311
diff --git a/build/Android.common.mk b/build/Android.common.mk
index 575c810..de2622a 100644
--- a/build/Android.common.mk
+++ b/build/Android.common.mk
@@ -25,7 +25,7 @@
 	dalvik/libdex
 
 ART_CFLAGS := \
-	-O0 \
+	-O2 \
 	-ggdb3 \
 	-Wall \
 	-Werror \
diff --git a/src/thread_x86.cc b/src/thread_x86.cc
index 0e7cd7d..57eeffd 100644
--- a/src/thread_x86.cc
+++ b/src/thread_x86.cc
@@ -13,10 +13,12 @@
 void Thread::InitCpu() {
   // Read LDT
   CHECK_EQ((size_t)LDT_ENTRY_SIZE, sizeof(uint64_t));
-  uint64_t ldt_[LDT_ENTRIES];
-  syscall(SYS_modify_ldt, 0, ldt_, sizeof(ldt_));
+  uint64_t ldt[LDT_ENTRIES];
+  memset(ldt, 0, sizeof(ldt));
+  syscall(SYS_modify_ldt, 0, ldt, sizeof(ldt));
   // Create empty slot to point at current Thread*
-  struct user_desc ldt_entry;
+  user_desc ldt_entry;
+  memset(&ldt_entry, 0, sizeof(ldt_entry));
   ldt_entry.entry_number = -1;
   ldt_entry.base_addr = (unsigned int)this;
   ldt_entry.limit = kPageSize;
@@ -27,7 +29,7 @@
   ldt_entry.seg_not_present = 0;
   ldt_entry.useable = 1;
   for (int i = 0; i < LDT_ENTRIES; i++) {
-    if (ldt_[i] == 0) {
+    if (ldt[i] == 0) {
       ldt_entry.entry_number = i;
       break;
     }
@@ -42,7 +44,7 @@
   uint16_t rpl = 3;  // Requested privilege level
   uint16_t selector = (ldt_entry.entry_number << 3) | table_indicator | rpl;
   // TODO: use our assembler to generate code
-  asm("movw %w0, %%fs"
+  asm volatile("movw %w0, %%fs"
       :    // output
       : "q"(selector)  // input
       :);  // clobber
@@ -51,7 +53,7 @@
   // Sanity check reads from FS goes to this Thread*
   Thread* self_check;
   // TODO: use our assembler to generate code
-  asm("movl %%fs:(%1), %0"
+  asm volatile("movl %%fs:(%1), %0"
       : "=r"(self_check)  // output
       : "r"(OFFSETOF_MEMBER(Thread, self_))  // input
       :);  // clobber