[PATCH] __ANDROID_NDK__ build

Andy Chien achien at blueshiftinc.com
Thu Oct 30 13:07:00 PDT 2014


Hi all,

I'm working on Android build of LLDB using the Android NDK toolchain.
Unfortunately there are enough subtle differences between using the NDK
toolchain (for multiple targets) vs AOSP and building standalone LLVM vs
building it as part of LLDB build process that I needed to add a new
__ANDROID_NDK__ definition instead of relying on ANDROID or __ANDROID__.

Please have a look. Thanks!
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20141030/7656d18f/attachment.html>
-------------- next part --------------
diff --git a/include/llvm/Target/TargetLibraryInfo.h b/include/llvm/Target/TargetLibraryInfo.h
index 56a8919..ebe6ff1 100644
--- a/include/llvm/Target/TargetLibraryInfo.h
+++ b/include/llvm/Target/TargetLibraryInfo.h
@@ -13,6 +13,12 @@
 #include "llvm/ADT/DenseMap.h"
 #include "llvm/Pass.h"
 
+#if defined(__ANDROID_NDK__)
+#undef stat64
+#undef lstat64
+#undef fstat64
+#endif
+
 namespace llvm {
   class Triple;
 
diff --git a/include/llvm/Transforms/Instrumentation.h b/include/llvm/Transforms/Instrumentation.h
index c6a339b..cd1643a 100644
--- a/include/llvm/Transforms/Instrumentation.h
+++ b/include/llvm/Transforms/Instrumentation.h
@@ -16,7 +16,7 @@
 
 #include "llvm/ADT/StringRef.h"
 
-#if defined(__GNUC__) && defined(__linux__) && !defined(ANDROID)
+#if defined(__GNUC__) && defined(__linux__) && !defined(ANDROID) && !defined(__ANDROID_NDK__)
 inline void *getDFSanArgTLSPtrForJIT() {
   extern __thread __attribute__((tls_model("initial-exec")))
     void *__dfsan_arg_tls;
@@ -78,7 +78,7 @@ ModulePass *createDataFlowSanitizerPass(StringRef ABIListFile = StringRef(),
                                         void *(*getArgTLS)() = nullptr,
                                         void *(*getRetValTLS)() = nullptr);
 
-#if defined(__GNUC__) && defined(__linux__) && !defined(ANDROID)
+#if defined(__GNUC__) && defined(__linux__) && !defined(ANDROID) && !defined(__ANDROID_NDK__)
 inline ModulePass *createDataFlowSanitizerPassForJIT(StringRef ABIListFile =
                                                          StringRef()) {
   return createDataFlowSanitizerPass(ABIListFile, getDFSanArgTLSPtrForJIT,
diff --git a/lib/Support/DynamicLibrary.cpp b/lib/Support/DynamicLibrary.cpp
index d2b551e..e0b0616 100644
--- a/lib/Support/DynamicLibrary.cpp
+++ b/lib/Support/DynamicLibrary.cpp
@@ -143,7 +143,7 @@ void* DynamicLibrary::SearchForAddressOfSymbol(const char *symbolName) {
 // On linux we have a weird situation. The stderr/out/in symbols are both
 // macros and global variables because of standards requirements. So, we
 // boldly use the EXPLICIT_SYMBOL macro without checking for a #define first.
-#if defined(__linux__) and !defined(__ANDROID__)
+#if defined(__linux__) and !defined(__ANDROID__) and !defined(__ANDROID_NDK__)
   {
     EXPLICIT_SYMBOL(stderr);
     EXPLICIT_SYMBOL(stdout);
diff --git a/lib/Support/LockFileManager.cpp b/lib/Support/LockFileManager.cpp
index 5b82c36..7132a15 100644
--- a/lib/Support/LockFileManager.cpp
+++ b/lib/Support/LockFileManager.cpp
@@ -58,7 +58,7 @@ LockFileManager::readLockFile(StringRef LockFileName) {
 }
 
 bool LockFileManager::processStillExecuting(StringRef Hostname, int PID) {
-#if LLVM_ON_UNIX && !defined(__ANDROID__)
+#if LLVM_ON_UNIX && !defined(__ANDROID__) && !defined(__ANDROID_NDK__)
   char MyHostname[256];
   MyHostname[255] = 0;
   MyHostname[0] = 0;
diff --git a/lib/Support/Unix/Memory.inc b/lib/Support/Unix/Memory.inc
index c9d89a8..2fa7c76 100644
--- a/lib/Support/Unix/Memory.inc
+++ b/lib/Support/Unix/Memory.inc
@@ -340,7 +340,7 @@ void Memory::InvalidateInstructionCache(const void *Addr,
   __clear_cache(const_cast<char *>(Start), const_cast<char *>(End));
 #  elif defined(__mips__)
   const char *Start = static_cast<const char *>(Addr);
-#    if defined(ANDROID)
+#    if defined(ANDROID) || defined(__ANDROID_NDK__)
   // The declaration of "cacheflush" in Android bionic:
   // extern int cacheflush(long start, long end, long flags);
   const char *End = Start + Len;
diff --git a/lib/Transforms/Hello/CMakeLists.txt b/lib/Transforms/Hello/CMakeLists.txt
index 3851b35..b74fb89 100644
--- a/lib/Transforms/Hello/CMakeLists.txt
+++ b/lib/Transforms/Hello/CMakeLists.txt
@@ -6,7 +6,7 @@ if( NOT LLVM_REQUIRES_RTTI )
   endif()
 endif()
 
-if(WIN32 OR CYGWIN)
+if(WIN32 OR CYGWIN OR __ANDROID_NDK__)
   set(LLVM_LINK_COMPONENTS Core Support)
 endif()
 
diff --git a/tools/bugpoint-passes/CMakeLists.txt b/tools/bugpoint-passes/CMakeLists.txt
index de68bb5..4b3d7df 100644
--- a/tools/bugpoint-passes/CMakeLists.txt
+++ b/tools/bugpoint-passes/CMakeLists.txt
@@ -10,7 +10,7 @@ if( NOT LLVM_REQUIRES_RTTI )
   endif()
 endif()
 
-if(WIN32 OR CYGWIN)
+if(WIN32 OR CYGWIN OR __ANDROID_NDK__)
   set(LLVM_LINK_COMPONENTS Core)
 endif()
 
diff --git a/utils/unittest/googletest/include/gtest/internal/gtest-port.h b/utils/unittest/googletest/include/gtest/internal/gtest-port.h
index f5bfd4e..617ec0e 100644
--- a/utils/unittest/googletest/include/gtest/internal/gtest-port.h
+++ b/utils/unittest/googletest/include/gtest/internal/gtest-port.h
@@ -233,7 +233,7 @@
 # define GTEST_OS_FREEBSD 1
 #elif defined __linux__
 # define GTEST_OS_LINUX 1
-# if defined(ANDROID) || defined(__ANDROID__)
+# if defined(ANDROID) || defined(__ANDROID__) || defined(__ANDROID_NDK__)
 #  define GTEST_OS_LINUX_ANDROID 1
 # endif  // ANDROID
 #elif defined __MVS__
@@ -271,7 +271,7 @@
 
 // Defines this to true iff Google Test can use POSIX regular expressions.
 #ifndef GTEST_HAS_POSIX_RE
-# define GTEST_HAS_POSIX_RE (!GTEST_OS_WINDOWS)
+# define GTEST_HAS_POSIX_RE (!GTEST_OS_WINDOWS && !defined(__ANDROID_NDK__))
 #endif
 
 #if GTEST_HAS_POSIX_RE
@@ -523,7 +523,7 @@
 #ifndef GTEST_HAS_CLONE
 // The user didn't tell us, so we need to figure it out.
 
-# if GTEST_OS_LINUX && !defined(__ia64__)
+# if GTEST_OS_LINUX && !defined(__ia64__) && !defined(__ANDROID_NDK__)
 #  define GTEST_HAS_CLONE 1
 # else
 #  define GTEST_HAS_CLONE 0


More information about the llvm-commits mailing list