Separate function list for each target.

Change-Id: I0f5f92efe206adb843a18ff05cd95707ee5a24d2
diff --git a/lib/AndroidBitcode/ABCCompilerDriver.cpp b/lib/AndroidBitcode/ABCCompilerDriver.cpp
index 59d6dda..696cd62 100644
--- a/lib/AndroidBitcode/ABCCompilerDriver.cpp
+++ b/lib/AndroidBitcode/ABCCompilerDriver.cpp
@@ -98,16 +98,13 @@
   // Add non-portable function list. For each function X, linker will rename
   // it to X_portable. And X_portable" is implemented in libportable to solve
   // portable issues.
-  mLinkerConfig->addPortable("stat");
-  mLinkerConfig->addPortable("fstat");
-  mLinkerConfig->addPortable("lstat");
-  mLinkerConfig->addPortable("fstatat");
-  mLinkerConfig->addPortable("socket");
-  mLinkerConfig->addPortable("setsockopt");
-  mLinkerConfig->addPortable("getsockopt");
-  mLinkerConfig->addPortable("epoll_event");
-  mLinkerConfig->addPortable("epoll_ctl");
-  mLinkerConfig->addPortable("epoll_wait");
+  const char **non_portable_func = getNonPortableList();
+  if (non_portable_func != NULL) {
+    while (*non_portable_func != NULL) {
+      mLinkerConfig->addPortable(*non_portable_func);
+      non_portable_func++;
+    }
+  }
 
   // -shared
   mLinkerConfig->setShared(true);
diff --git a/lib/AndroidBitcode/Android.mk b/lib/AndroidBitcode/Android.mk
index 1abc7b2..6ad1348 100644
--- a/lib/AndroidBitcode/Android.mk
+++ b/lib/AndroidBitcode/Android.mk
@@ -22,7 +22,9 @@
 #=====================================================================
 
 libbcc_androidbitcode_SRC_FILES := \
-  ABCCompilerDriver.cpp
+  ABCCompilerDriver.cpp \
+  MipsABCCompilerDriver.cpp \
+  X86ABCCompilerDriver.cpp
 
 #=====================================================================
 # Device Static Library: libbccAndroidBitcode
diff --git a/lib/AndroidBitcode/MipsABCCompilerDriver.cpp b/lib/AndroidBitcode/MipsABCCompilerDriver.cpp
new file mode 100644
index 0000000..24632be
--- /dev/null
+++ b/lib/AndroidBitcode/MipsABCCompilerDriver.cpp
@@ -0,0 +1,44 @@
+/*
+ * Copyright 2012, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "MipsABCCompilerDriver.h"
+
+namespace {
+
+static const char *MipsNonPortableList[] = {
+  "stat",
+  "fstat",
+  "lstat",
+  "fstatat",
+  "socket",
+  "setsockopt",
+  "getsockopt",
+  "open",
+  "mmap",
+  "ioctl",
+
+  NULL  // NUL-terminator
+};
+
+} // end anonymous namespace
+
+namespace bcc {
+
+const char **MipsABCCompilerDriver::getNonPortableList() const {
+  return MipsNonPortableList;
+}
+
+} // end namespace bcc
diff --git a/lib/AndroidBitcode/MipsABCCompilerDriver.h b/lib/AndroidBitcode/MipsABCCompilerDriver.h
index dea58ea..531fe83 100644
--- a/lib/AndroidBitcode/MipsABCCompilerDriver.h
+++ b/lib/AndroidBitcode/MipsABCCompilerDriver.h
@@ -27,6 +27,9 @@
       : ABCCompilerDriver(pTriple) { }
 
   virtual ~MipsABCCompilerDriver() { }
+
+private:
+  virtual const char **getNonPortableList() const;
 };
 
 } // end namespace bcc
diff --git a/lib/AndroidBitcode/X86ABCCompilerDriver.cpp b/lib/AndroidBitcode/X86ABCCompilerDriver.cpp
new file mode 100644
index 0000000..04cfe63
--- /dev/null
+++ b/lib/AndroidBitcode/X86ABCCompilerDriver.cpp
@@ -0,0 +1,43 @@
+/*
+ * Copyright 2012, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "X86ABCCompilerDriver.h"
+
+namespace {
+
+static const char *X86NonPortableList[] = {
+  "stat",
+  "fstat",
+  "lstat",
+  "fstatat",
+  "open",
+  "ioctl",
+  "fcntl",
+  "epoll_ctl",
+  "epoll_wait",
+
+  NULL  // NUL-terminator
+};
+
+} // end anonymous namespace
+
+namespace bcc {
+
+const char **X86ABCCompilerDriver::getNonPortableList() const {
+  return X86NonPortableList;
+}
+
+} // end namespace bcc
diff --git a/lib/AndroidBitcode/X86ABCCompilerDriver.h b/lib/AndroidBitcode/X86ABCCompilerDriver.h
index 4d76b5f..34e9603 100644
--- a/lib/AndroidBitcode/X86ABCCompilerDriver.h
+++ b/lib/AndroidBitcode/X86ABCCompilerDriver.h
@@ -27,6 +27,9 @@
       : ABCCompilerDriver(pTriple) { }
 
   virtual ~X86ABCCompilerDriver() { }
+
+private:
+  virtual const char **getNonPortableList() const;
 };
 
 } // end namespace bcc