Add export pragma table for caching.  And fix the bug which breaks Ball and Fountain.
diff --git a/lib/bcc/Compiler.cpp b/lib/bcc/Compiler.cpp
index 50aeaa2..1b1c495 100644
--- a/lib/bcc/Compiler.cpp
+++ b/lib/bcc/Compiler.cpp
@@ -467,25 +467,25 @@
     }
 
     if (mCacheSize < mCacheHdr->relocOffset +
-        mCacheHdr->relocCount * sizeof(oBCCRelocEntry)) {
+                     mCacheHdr->relocCount * sizeof(oBCCRelocEntry)) {
       LOGE("relocate table overflow\n");
       goto bail;
     }
 
     if (mCacheSize < mCacheHdr->exportVarsOffset +
-        mCacheHdr->exportVarsCount * sizeof(uint32_t)) {
+                     mCacheHdr->exportVarsCount * sizeof(uint32_t)) {
       LOGE("export variables table overflow\n");
       goto bail;
     }
 
     if (mCacheSize < mCacheHdr->exportFuncsOffset +
-        mCacheHdr->exportFuncsCount * sizeof(uint32_t)) {
+                     mCacheHdr->exportFuncsCount * sizeof(uint32_t)) {
       LOGE("export functions table overflow\n");
       goto bail;
     }
 
     if (mCacheSize < mCacheHdr->exportPragmasOffset +
-        mCacheHdr->exportPragmasCount * sizeof(uint32_t)) {
+                     mCacheHdr->exportPragmasSize) {
       LOGE("export pragmas table overflow\n");
       goto bail;
     }
@@ -1047,8 +1047,8 @@
                                           mCacheHdr->exportVarsOffset);
 
       for (int i = 0; i < varCount; i++) {
-        *vars++ = (BCCvoid *)(reinterpret_cast<char *>(*cachedVars) +
-                              mCacheDiff);
+        *vars = (BCCvoid *)((char *)(*cachedVars) + mCacheDiff);
+        vars++;
         cachedVars++;
       }
     }
@@ -1066,8 +1066,6 @@
       *vars++ = *I;
     }
   }
-
-  return;
 }
 
 
@@ -1088,8 +1086,8 @@
                                            mCacheHdr->exportFuncsOffset);
 
       for (int i = 0; i < funcCount; i++) {
-        *funcs++ = (BCCvoid *)(reinterpret_cast<char *>(*cachedFuncs) +
-                               mCacheDiff);
+        *funcs = (BCCvoid *)((char *)(*cachedFuncs) + mCacheDiff);
+        funcs++;
         cachedFuncs++;
       }
     }
@@ -1102,15 +1100,11 @@
   if (funcCount > maxFuncCount)
     funcCount = maxFuncCount;
   if (funcs) {
-    for (ExportFuncList::const_iterator I = mExportFuncs.begin(),
-         E = mExportFuncs.end();
-         I != E;
-         I++) {
+    for (ExportFuncList::const_iterator
+         I = mExportFuncs.begin(), E = mExportFuncs.end(); I != E; I++) {
       *funcs++ = *I;
     }
   }
-
-  return;
 }
 
 
@@ -1119,9 +1113,27 @@
                           BCCsizei maxStringCount,
                           BCCchar **strings) {
   int stringCount;
+
   if (mUseCache && mCacheFd >= 0 && !mCacheNew) {
+    stringCount = static_cast<int>(mCacheHdr->exportPragmasCount) * 2;
+
     if (actualStringCount)
-      *actualStringCount = 0;  // XXX
+      *actualStringCount = stringCount;
+
+    if (stringCount > maxStringCount)
+      stringCount = maxStringCount;
+
+    if (strings) {
+      char *pragmaTab = mCacheMapAddr + mCacheHdr->exportPragmasOffset;
+
+      oBCCPragmaEntry *cachedPragmaEntries = (oBCCPragmaEntry *)pragmaTab;
+
+      for (int i = 0; stringCount >= 2; stringCount -= 2, i++) {
+        *strings++ = pragmaTab + cachedPragmaEntries[i].pragmaNameOffset;
+        *strings++ = pragmaTab + cachedPragmaEntries[i].pragmaValueOffset;
+      }
+    }
+
     return;
   }
 
@@ -1132,9 +1144,9 @@
   if (stringCount > maxStringCount)
     stringCount = maxStringCount;
   if (strings) {
+    size_t i = 0;
     for (PragmaList::const_iterator it = mPragmas.begin();
-         stringCount > 0;
-         stringCount -= 2, it++) {
+         stringCount >= 2; stringCount -= 2, it++, ++i) {
       *strings++ = const_cast<BCCchar*>(it->first.c_str());
       *strings++ = const_cast<BCCchar*>(it->second.c_str());
     }
@@ -1297,7 +1309,7 @@
   hdr->relocOffset = sizeof(oBCCHeader);
   hdr->relocCount = mCodeEmitter->getCachingRelocations().size();
 
-  offset += hdr->relocCount * (sizeof(oBCCRelocEntry));
+  offset += hdr->relocCount * sizeof(oBCCRelocEntry);
 
   // Export Variable Table Offset and Entry Count
   hdr->exportVarsOffset = offset;
@@ -1313,9 +1325,17 @@
 
   // Export Pragmas Table Offset and Entry Count
   hdr->exportPragmasOffset = offset;
-  hdr->exportPragmasCount = 0; // TODO(all): mPragmas.size();
+  hdr->exportPragmasCount = mPragmas.size();
+  hdr->exportPragmasSize = hdr->exportPragmasCount * sizeof(oBCCPragmaEntry);
 
-  offset += hdr->exportPragmasCount * sizeof(uint32_t);
+  offset += hdr->exportPragmasCount * sizeof(oBCCPragmaEntry);
+
+  for (PragmaList::const_iterator
+       I = mPragmas.begin(), E = mPragmas.end(); I != E; ++I) {
+    offset += I->first.size() + 1;
+    offset += I->second.size() + 1;
+    hdr->exportPragmasSize += I->first.size() + I->second.size() + 2;
+  }
 
   // Code Offset and Size
 
@@ -1419,14 +1439,35 @@
   }
 
 
-  // TODO(all): Write Export Pragmas Table
-#if 0
-#else
-  // Note: As long as we have comment out export pragmas table code,
-  // we have to seek the position to correct offset.
+  // Write Export Pragmas Table
+  {
+    uint32_t pragmaEntryOffset =
+      hdr->exportPragmasCount * sizeof(oBCCPragmaEntry);
 
-  lseek(mCacheFd, hdr->codeOffset, SEEK_SET);
-#endif
+    for (PragmaList::const_iterator
+         I = mPragmas.begin(), E = mPragmas.end(); I != E; ++I) {
+      oBCCPragmaEntry entry;
+
+      entry.pragmaNameOffset = pragmaEntryOffset;
+      entry.pragmaNameSize = I->first.size();
+      pragmaEntryOffset += entry.pragmaNameSize + 1;
+
+      entry.pragmaValueOffset = pragmaEntryOffset;
+      entry.pragmaValueSize = I->second.size();
+      pragmaEntryOffset += entry.pragmaValueSize + 1;
+
+      sysWriteFully(mCacheFd, (char *)&entry, sizeof(oBCCPragmaEntry),
+                    "Write export pragma entry");
+    }
+
+    for (PragmaList::const_iterator
+         I = mPragmas.begin(), E = mPragmas.end(); I != E; ++I) {
+      sysWriteFully(mCacheFd, I->first.c_str(), I->first.size() + 1,
+                    "Write export pragma name string");
+      sysWriteFully(mCacheFd, I->second.c_str(), I->second.size() + 1,
+                    "Write export pragma value string");
+    }
+  }
 
   if (codeOffsetNeedPadding) {
     // requires additional padding