[libc-commits] [libc] ec62bf2 - [libc] Move the implementation of mmap and munmap into a linux specific area.

Siva Chandra Reddy via libc-commits libc-commits at lists.llvm.org
Fri Jan 24 15:43:06 PST 2020


Author: Siva Chandra Reddy
Date: 2020-01-24T15:42:28-08:00
New Revision: ec62bf2fd3284c9a525011b191c4960fce01dca7

URL: https://github.com/llvm/llvm-project/commit/ec62bf2fd3284c9a525011b191c4960fce01dca7
DIFF: https://github.com/llvm/llvm-project/commit/ec62bf2fd3284c9a525011b191c4960fce01dca7.diff

LOG: [libc] Move the implementation of mmap and munmap into a linux specific area.

This allows us to get rid of the PAGE_SIZE macro and use EXEC_PAGESIZE
from linux/param.h.

Few other points about this change:
1. The linux syscall functions have been moved into a linux specific area
instead of src/unistd/syscall.h. The Linux syscall function from unistd.h
is a public vararg function. What we have currently are linux speciif internal
overloaded C++ functions. So, moving them to a Linux only area is more
meaningful.
2. The implementations of mmap and munmap are now in a 'linux' directory
within src/sys/mman. The idea here is that platform specific
implementations will live in a platform specific subdirectories like these.
Infrastructure common to a platform will live in the platform's config
directory. For example, the linux syscall implementations live in
config/linux.

Reviewers: abrachet

Tags: #libc-project

Differential Revision: https://reviews.llvm.org/D73302

Added: 
    libc/config/linux/syscall.h.def
    libc/src/sys/mman/linux/CMakeLists.txt
    libc/src/sys/mman/linux/mmap.cpp
    libc/src/sys/mman/linux/munmap.cpp
    libc/test/src/sys/mman/linux/CMakeLists.txt
    libc/test/src/sys/mman/linux/mmap_test.cpp

Modified: 
    libc/config/linux/CMakeLists.txt
    libc/config/linux/platfrom_defs.h.inc
    libc/include/CMakeLists.txt
    libc/src/CMakeLists.txt
    libc/src/sys/mman/CMakeLists.txt
    libc/test/config/linux/x86_64/CMakeLists.txt
    libc/test/config/linux/x86_64/syscall_test.cpp
    libc/test/src/sys/mman/CMakeLists.txt

Removed: 
    libc/src/sys/mman/mmap.cpp
    libc/src/sys/mman/munmap.cpp
    libc/src/unistd/CMakeLists.txt
    libc/src/unistd/syscall.h.def
    libc/test/src/sys/mman/mmap_test.cpp


################################################################################
diff  --git a/libc/config/linux/CMakeLists.txt b/libc/config/linux/CMakeLists.txt
index 7e2608e595f5..86b178abb0de 100644
--- a/libc/config/linux/CMakeLists.txt
+++ b/libc/config/linux/CMakeLists.txt
@@ -1 +1,11 @@
+add_gen_header(
+  linux_syscall_h
+  DEF_FILE syscall.h.def
+  GEN_HDR syscall.h
+  PARAMS
+    inline_syscalls=${LIBC_TARGET_MACHINE}/syscall.h.inc
+  DATA_FILES
+    ${LIBC_TARGET_MACHINE}/syscall.h.inc
+)
+
 add_subdirectory(x86_64)

diff  --git a/libc/config/linux/platfrom_defs.h.inc b/libc/config/linux/platfrom_defs.h.inc
index 19bf3f7593c1..495d07c80cf2 100644
--- a/libc/config/linux/platfrom_defs.h.inc
+++ b/libc/config/linux/platfrom_defs.h.inc
@@ -11,9 +11,3 @@
 #define ENTRYPOINT_SECTION_ATTRIBUTE(name) \
     __attribute__((section(".llvm.libc.entrypoint."#name)))
 #define LLVM_LIBC_ENTRYPOINT(name) ENTRYPOINT_SECTION_ATTRIBUTE(name) name
-
-// TODO: Get rid of the PAGE_SIZE macro. It is present only as an interim
-// measure until we can move the implementations of mmap and munmap to under
-// the config/linux directory. After that, the implementations can use
-// EXEC_PAGESIZE until page size can be read from the aux vector. 
-#define PAGE_SIZE 4096

diff  --git a/libc/src/unistd/syscall.h.def b/libc/config/linux/syscall.h.def
similarity index 100%
rename from libc/src/unistd/syscall.h.def
rename to libc/config/linux/syscall.h.def

diff  --git a/libc/include/CMakeLists.txt b/libc/include/CMakeLists.txt
index 7773be6227a3..8558d7586b57 100644
--- a/libc/include/CMakeLists.txt
+++ b/libc/include/CMakeLists.txt
@@ -56,6 +56,7 @@ add_gen_header(
   GEN_HDR sys/mman.h
   DEPENDS
     libc_posix_types_h
+    llvm_libc_common_h
 )
 
 add_gen_header(

diff  --git a/libc/src/CMakeLists.txt b/libc/src/CMakeLists.txt
index 28084cd9a9be..b416e83934d6 100644
--- a/libc/src/CMakeLists.txt
+++ b/libc/src/CMakeLists.txt
@@ -3,6 +3,5 @@ add_subdirectory(math)
 add_subdirectory(string)
 # TODO: Add this target conditional to the target OS.
 add_subdirectory(sys)
-add_subdirectory(unistd)
 
 add_subdirectory(__support)

diff  --git a/libc/src/sys/mman/CMakeLists.txt b/libc/src/sys/mman/CMakeLists.txt
index 9b8cc66299a6..b4bbe81c92ff 100644
--- a/libc/src/sys/mman/CMakeLists.txt
+++ b/libc/src/sys/mman/CMakeLists.txt
@@ -1,27 +1,3 @@
-#TODO: The sources and target listed here should ideally live in config/linux.
-
-add_entrypoint_object(
-  mmap
-  SRCS
-    mmap.cpp
-  HDRS
-    mmap.h
-  DEPENDS
-    sys_mman_h
-    sys_syscall_h
-    syscall_impl_h
-    __errno_location
-)
-
-add_entrypoint_object(
-  munmap
-  SRCS
-    munmap.cpp
-  HDRS
-    munmap.h
-  DEPENDS
-    sys_mman_h
-    sys_syscall_h
-    syscall_impl_h
-    __errno_location
-)
+if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${LIBC_TARGET_OS})
+  add_subdirectory(${LIBC_TARGET_OS})
+endif()

diff  --git a/libc/src/sys/mman/linux/CMakeLists.txt b/libc/src/sys/mman/linux/CMakeLists.txt
new file mode 100644
index 000000000000..527da6471900
--- /dev/null
+++ b/libc/src/sys/mman/linux/CMakeLists.txt
@@ -0,0 +1,25 @@
+add_entrypoint_object(
+  mmap
+  SRCS
+    mmap.cpp
+  HDRS
+    ../mmap.h
+  DEPENDS
+    sys_mman_h
+    sys_syscall_h
+    linux_syscall_h
+    __errno_location
+)
+
+add_entrypoint_object(
+  munmap
+  SRCS
+    munmap.cpp
+  HDRS
+    ../munmap.h
+  DEPENDS
+    sys_mman_h
+    sys_syscall_h
+    linux_syscall_h
+    __errno_location
+)

diff  --git a/libc/src/sys/mman/mmap.cpp b/libc/src/sys/mman/linux/mmap.cpp
similarity index 79%
rename from libc/src/sys/mman/mmap.cpp
rename to libc/src/sys/mman/linux/mmap.cpp
index 10ae0c70c98c..616cd98561a5 100644
--- a/libc/src/sys/mman/mmap.cpp
+++ b/libc/src/sys/mman/linux/mmap.cpp
@@ -1,4 +1,4 @@
-//===-------------- Implementation of the POSIX mmap function -------------===//
+//===---------- Linux implementation of the POSIX mmap function -----------===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
@@ -7,10 +7,13 @@
 //===----------------------------------------------------------------------===//
 
 #include "src/sys/mman/mmap.h"
-#include "include/sys/syscall.h" // For syscall numbers.
+
+#include "config/linux/syscall.h" // For internal syscall function.
+#include "include/sys/syscall.h"  // For syscall numbers.
 #include "src/__support/common.h"
 #include "src/errno/llvmlibc_errno.h"
-#include "src/unistd/syscall.h" // For internal syscall function.
+
+#include <linux/param.h> // For EXEC_PAGESIZE.
 
 namespace __llvm_libc {
 
@@ -22,8 +25,12 @@ void *LLVM_LIBC_ENTRYPOINT(mmap)(void *addr, size_t size, int prot, int flags,
   // done in this function as modern linux versions do it in the syscall.
   // TODO: Perform argument validation not done by the linux syscall.
 
+  // EXEC_PAGESIZE is used for the page size. While this is OK for x86_64, it
+  // might not be correct in general.
+  // TODO: Use pagesize read from the ELF aux vector instead of EXEC_PAGESIZE.
+
 #ifdef SYS_mmap2
-  offset /= PAGE_SIZE;
+  offset /= EXEC_PAGESIZE;
   long syscall_number = SYS_mmap2;
 #elif SYS_mmap
   long syscall_number = SYS_mmap;
@@ -44,7 +51,7 @@ void *LLVM_LIBC_ENTRYPOINT(mmap)(void *addr, size_t size, int prot, int flags,
   // However, since a valid return address cannot be within the last page, a
   // return value corresponding to a location in the last page is an error
   // value.
-  if (ret_val < 0 && ret_val > -PAGE_SIZE) {
+  if (ret_val < 0 && ret_val > -EXEC_PAGESIZE) {
     llvmlibc_errno = -ret_val;
     return MAP_FAILED;
   }

diff  --git a/libc/src/sys/mman/munmap.cpp b/libc/src/sys/mman/linux/munmap.cpp
similarity index 81%
rename from libc/src/sys/mman/munmap.cpp
rename to libc/src/sys/mman/linux/munmap.cpp
index d11f53a418c0..1f112f8f1281 100644
--- a/libc/src/sys/mman/munmap.cpp
+++ b/libc/src/sys/mman/linux/munmap.cpp
@@ -1,4 +1,4 @@
-//===------------- Implementation of the POSIX munmap function ------------===//
+//===---------- Linux implementation of the POSIX munmap function ---------===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
@@ -7,10 +7,11 @@
 //===----------------------------------------------------------------------===//
 
 #include "src/sys/mman/munmap.h"
-#include "include/sys/syscall.h" // For syscall numbers.
+
+#include "config/linux/syscall.h" // For internal syscall function.
+#include "include/sys/syscall.h"  // For syscall numbers.
 #include "src/__support/common.h"
 #include "src/errno/llvmlibc_errno.h"
-#include "src/unistd/syscall.h" // For internal syscall function.
 
 namespace __llvm_libc {
 

diff  --git a/libc/src/unistd/CMakeLists.txt b/libc/src/unistd/CMakeLists.txt
deleted file mode 100644
index ed23b704dfe7..000000000000
--- a/libc/src/unistd/CMakeLists.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-add_gen_header(
-  syscall_impl_h
-  DEF_FILE syscall.h.def
-  GEN_HDR syscall.h
-  PARAMS
-    inline_syscalls=../../config/${LIBC_TARGET_OS}/${LIBC_TARGET_MACHINE}/syscall.h.inc
-  DATA_FILES
-    ../../config/${LIBC_TARGET_OS}/${LIBC_TARGET_MACHINE}/syscall.h.inc
-)

diff  --git a/libc/test/config/linux/x86_64/CMakeLists.txt b/libc/test/config/linux/x86_64/CMakeLists.txt
index 9f9d21251c6f..23f82b27c9bd 100644
--- a/libc/test/config/linux/x86_64/CMakeLists.txt
+++ b/libc/test/config/linux/x86_64/CMakeLists.txt
@@ -3,6 +3,6 @@ add_libc_unittest(
   SUITE libc_linux_tests
   SRCS syscall_test.cpp
   DEPENDS
-   syscall_impl_h
+   linux_syscall_h
    support_common_h
 )

diff  --git a/libc/test/config/linux/x86_64/syscall_test.cpp b/libc/test/config/linux/x86_64/syscall_test.cpp
index 27628be6a4cd..efab1444d35c 100644
--- a/libc/test/config/linux/x86_64/syscall_test.cpp
+++ b/libc/test/config/linux/x86_64/syscall_test.cpp
@@ -6,7 +6,7 @@
 //
 //===----------------------------------------------------------------------===//
 
-#include "src/unistd/syscall.h"
+#include "config/linux/syscall.h"
 #include "utils/UnitTest/Test.h"
 
 #include <functional>

diff  --git a/libc/test/src/sys/mman/CMakeLists.txt b/libc/test/src/sys/mman/CMakeLists.txt
index 3fcc8fff3c29..b4bbe81c92ff 100644
--- a/libc/test/src/sys/mman/CMakeLists.txt
+++ b/libc/test/src/sys/mman/CMakeLists.txt
@@ -1,15 +1,3 @@
-add_libc_testsuite(libc_sys_mman_unittests)
-
-add_libc_unittest(
-  mmap_test
-  SUITE
-    libc_sys_mman_unittests
-  SRCS
-    mmap_test.cpp
-  DEPENDS
-    errno_h
-    sys_mman_h
-    mmap
-    munmap
-    __errno_location
-)
+if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${LIBC_TARGET_OS})
+  add_subdirectory(${LIBC_TARGET_OS})
+endif()

diff  --git a/libc/test/src/sys/mman/linux/CMakeLists.txt b/libc/test/src/sys/mman/linux/CMakeLists.txt
new file mode 100644
index 000000000000..3fcc8fff3c29
--- /dev/null
+++ b/libc/test/src/sys/mman/linux/CMakeLists.txt
@@ -0,0 +1,15 @@
+add_libc_testsuite(libc_sys_mman_unittests)
+
+add_libc_unittest(
+  mmap_test
+  SUITE
+    libc_sys_mman_unittests
+  SRCS
+    mmap_test.cpp
+  DEPENDS
+    errno_h
+    sys_mman_h
+    mmap
+    munmap
+    __errno_location
+)

diff  --git a/libc/test/src/sys/mman/mmap_test.cpp b/libc/test/src/sys/mman/linux/mmap_test.cpp
similarity index 100%
rename from libc/test/src/sys/mman/mmap_test.cpp
rename to libc/test/src/sys/mman/linux/mmap_test.cpp


        


More information about the libc-commits mailing list