Fix Windows build issues for librsloader.

This change adds some unimplemented versions of functions from the
mman.h header file (mmap, munmap, mprotect, ...). These functions
are unused on Windows, since we don't actually need the loader.

Change-Id: I2058aa28af43ea2b2d9df77a457928788e2b9f15
diff --git a/Android.mk b/Android.mk
index 42a018e..4c02056 100644
--- a/Android.mk
+++ b/Android.mk
@@ -298,6 +298,10 @@
 
 LOCAL_SRC_FILES := $(rsloader_SRC_FILES)
 
+ifdef USE_MINGW
+LOCAL_SRC_FILES += driver/linkloader/lib/mmanWindows.cpp
+endif
+
 LOCAL_ADDITIONAL_DEPENDENCIES := $(LOCAL_PATH)/Android.mk
 
 LOCAL_CFLAGS += $(rs_base_CFLAGS)
diff --git a/driver/linkloader/include/impl/ELFSectionBits.hxx b/driver/linkloader/include/impl/ELFSectionBits.hxx
index bd585d4..c99254b 100644
--- a/driver/linkloader/include/impl/ELFSectionBits.hxx
+++ b/driver/linkloader/include/impl/ELFSectionBits.hxx
@@ -22,7 +22,11 @@
 
 #include <llvm/Support/raw_ostream.h>
 
+#ifndef USE_MINGW       /* TODO create a proper HAVE_MMAN_H */
 #include <sys/mman.h>
+#else
+#include "mmanWindows.h"
+#endif
 
 template <unsigned Bitwidth>
 inline void ELFSectionBits<Bitwidth>::print() const {
diff --git a/driver/linkloader/include/impl/ELFSectionNoBits.hxx b/driver/linkloader/include/impl/ELFSectionNoBits.hxx
index d1a6436..6f9f713 100644
--- a/driver/linkloader/include/impl/ELFSectionNoBits.hxx
+++ b/driver/linkloader/include/impl/ELFSectionNoBits.hxx
@@ -24,8 +24,6 @@
 #include <llvm/Support/Format.h>
 #include <llvm/Support/raw_ostream.h>
 
-#include <sys/mman.h>
-
 template <unsigned Bitwidth>
 template <typename Archiver>
 inline ELFSectionNoBits<Bitwidth> *
diff --git a/driver/linkloader/include/mmanWindows.h b/driver/linkloader/include/mmanWindows.h
new file mode 100644
index 0000000..f9c68ff
--- /dev/null
+++ b/driver/linkloader/include/mmanWindows.h
@@ -0,0 +1,64 @@
+/*
+ * Copyright 2013, 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.
+ */
+
+#ifndef MMANWINDOWS_H
+#define MMANWINDOWS_H
+
+#ifdef _WIN32
+
+#include <stdlib.h>
+#include <sys/types.h>
+
+// From bionic/libc/include/sys/mman.h
+#ifndef MAP_ANON
+#define MAP_ANON  MAP_ANONYMOUS
+#endif
+
+#define MAP_FAILED ((void *)-1)
+
+#define MREMAP_MAYMOVE  1
+#define MREMAP_FIXED    2
+
+extern void*  mmap(void *, size_t, int, int, int, off_t);
+extern int    munmap(void *, size_t);
+extern int    msync(const void *, size_t, int);
+extern int    mprotect(const void *, size_t, int);
+extern void*  mremap(void *, size_t, size_t, unsigned long);
+
+extern int    mlockall(int);
+extern int    munlockall(void);
+extern int    mlock(const void *, size_t);
+extern int    munlock(const void *, size_t);
+extern int    madvise(const void *, size_t, int);
+
+extern int    mlock(const void *addr, size_t len);
+extern int    munlock(const void *addr, size_t len);
+
+extern int    mincore(void*  start, size_t  length, unsigned char*  vec);
+
+// From bionic/libc/kernel/common/asm-generic/mman-common.h
+#define PROT_READ 0x1
+#define PROT_WRITE 0x2
+#define PROT_EXEC 0x4
+#define PROT_SEM 0x8
+#define PROT_NONE 0x0
+
+#define MAP_PRIVATE 0x02
+#define MAP_ANONYMOUS 0x20
+
+#endif  // _WIN32
+
+#endif  // MMANWINDOWS_H
diff --git a/driver/linkloader/lib/MemChunk.cpp b/driver/linkloader/lib/MemChunk.cpp
index 24dcf8e..6a04916 100644
--- a/driver/linkloader/lib/MemChunk.cpp
+++ b/driver/linkloader/lib/MemChunk.cpp
@@ -21,7 +21,11 @@
 
 #include <llvm/Support/raw_ostream.h>
 
+#ifndef USE_MINGW       /* TODO create a proper HAVE_MMAN_H */
 #include <sys/mman.h>
+#else
+#include "mmanWindows.h"
+#endif
 
 #include <stdlib.h>
 
diff --git a/driver/linkloader/lib/StubLayout.cpp b/driver/linkloader/lib/StubLayout.cpp
index 00555ad..bfaf355 100644
--- a/driver/linkloader/lib/StubLayout.cpp
+++ b/driver/linkloader/lib/StubLayout.cpp
@@ -22,7 +22,6 @@
 
 #include <stdint.h>
 #include <stdlib.h>
-#include <sys/mman.h>
 
 StubLayout::StubLayout() : table(NULL), count(0) {
 }
diff --git a/driver/linkloader/lib/mmanWindows.cpp b/driver/linkloader/lib/mmanWindows.cpp
new file mode 100644
index 0000000..1b4d608
--- /dev/null
+++ b/driver/linkloader/lib/mmanWindows.cpp
@@ -0,0 +1,33 @@
+/*
+ * Copyright 2013, 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.
+ */
+
+#ifdef USE_MINGW
+
+#include "mmanWindows.h"
+
+void* mmap(void *, size_t, int, int, int, off_t) {
+  return MAP_FAILED;
+}
+
+int munmap(void *, size_t) {
+  return -1;
+}
+
+int mprotect(const void *, size_t, int) {
+  return -1;
+}
+
+#endif  // USE_MINGW