[cfe-commits] r149434 - in /cfe/trunk: lib/Frontend/FrontendActions.cpp lib/Headers/module.map test/Modules/compiler_builtins.m

Douglas Gregor dgregor at apple.com
Tue Jan 31 13:57:50 PST 2012


Author: dgregor
Date: Tue Jan 31 15:57:50 2012
New Revision: 149434

URL: http://llvm.org/viewvc/llvm-project?rev=149434&view=rev
Log:
Split compiler builtin module into "stdlib" builtins and "intrinsic"
builds, and bring mm_alloc.h into the fold. Start playing some tricks
with these builtin modules to mirror the include_next tricks that the
headers already perform.

Modified:
    cfe/trunk/lib/Frontend/FrontendActions.cpp
    cfe/trunk/lib/Headers/module.map
    cfe/trunk/test/Modules/compiler_builtins.m

Modified: cfe/trunk/lib/Frontend/FrontendActions.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/FrontendActions.cpp?rev=149434&r1=149433&r2=149434&view=diff
==============================================================================
--- cfe/trunk/lib/Frontend/FrontendActions.cpp (original)
+++ cfe/trunk/lib/Frontend/FrontendActions.cpp Tue Jan 31 15:57:50 2012
@@ -126,6 +126,32 @@
                           Sysroot, OS);
 }
 
+/// \brief Add an appropriate #include/#import for the given header within
+/// the current module context.
+static void addHeaderInclude(StringRef Header, 
+                             bool IsBuiltinModule,
+                             const LangOptions &LangOpts,
+                             llvm::SmallString<256> &Includes) {
+  if (IsBuiltinModule) {
+    // Our own builtin headers play some evil tricks that depend both on
+    // knowing that our headers will be found first and on include_next. To
+    // Make sure these include_next tricks work, we include with <> and
+    // just the filename itself rather than using an absolutely path.
+    // FIXME: Is there some sensible way to generalize this?
+    Includes += "#include <";
+    Includes += llvm::sys::path::filename(Header);
+    Includes += ">\n";
+    return;
+  }
+  
+  if (LangOpts.ObjC1)
+    Includes += "#import \"";
+  else
+    Includes += "#include \"";  
+  Includes += Header;
+  Includes += "\"\n";
+}
+
 /// \brief Collect the set of header includes needed to construct the given 
 /// module.
 ///
@@ -137,31 +163,21 @@
                                         FileManager &FileMgr,
                                         ModuleMap &ModMap,
                                         clang::Module *Module,
+                                        bool IsBuiltinModule,
                                         llvm::SmallString<256> &Includes) {
   // Don't collect any headers for unavailable modules.
   if (!Module->isAvailable())
     return;
 
   // Add includes for each of these headers.
-  for (unsigned I = 0, N = Module->Headers.size(); I != N; ++I) {
-    if (LangOpts.ObjC1)
-      Includes += "#import \"";
-    else
-      Includes += "#include \"";
-    Includes += Module->Headers[I]->getName();
-    Includes += "\"\n";
-  }
+  for (unsigned I = 0, N = Module->Headers.size(); I != N; ++I)
+    addHeaderInclude(Module->Headers[I]->getName(), IsBuiltinModule, LangOpts, 
+                     Includes);
 
   if (const FileEntry *UmbrellaHeader = Module->getUmbrellaHeader()) {
-    if (Module->Parent) {
-      // Include the umbrella header for submodules.
-      if (LangOpts.ObjC1)
-        Includes += "#import \"";
-      else
-        Includes += "#include \"";
-      Includes += UmbrellaHeader->getName();
-      Includes += "\"\n";
-    }
+    if (Module->Parent)
+      addHeaderInclude(UmbrellaHeader->getName(), IsBuiltinModule, LangOpts, 
+                       Includes);
   } else if (const DirectoryEntry *UmbrellaDir = Module->getUmbrellaDir()) {
     // Add all of the headers we find in this subdirectory.
     llvm::error_code EC;
@@ -183,13 +199,8 @@
         if (ModMap.isHeaderInUnavailableModule(Header))
           continue;
       
-      // Include this header umbrella header for submodules.
-      if (LangOpts.ObjC1)
-        Includes += "#import \"";
-      else
-        Includes += "#include \"";
-      Includes += Dir->path();
-      Includes += "\"\n";
+      // Include this header.
+      addHeaderInclude(Dir->path(), IsBuiltinModule, LangOpts, Includes);
     }
   }
   
@@ -197,7 +208,8 @@
   for (clang::Module::submodule_iterator Sub = Module->submodule_begin(),
                                       SubEnd = Module->submodule_end();
        Sub != SubEnd; ++Sub)
-    collectModuleHeaderIncludes(LangOpts, FileMgr, ModMap, *Sub, Includes);
+    collectModuleHeaderIncludes(LangOpts, FileMgr, ModMap, *Sub, 
+                                IsBuiltinModule, Includes);
 }
 
 bool GenerateModuleAction::BeginSourceFileAction(CompilerInstance &CI, 
@@ -249,10 +261,11 @@
   const FileEntry *UmbrellaHeader = Module->getUmbrellaHeader();
   
   // Collect the set of #includes we need to build the module.
+  bool IsBuiltinModule = StringRef(Module->Name).startswith("_Builtin_");
   llvm::SmallString<256> HeaderContents;
   collectModuleHeaderIncludes(CI.getLangOpts(), CI.getFileManager(),
     CI.getPreprocessor().getHeaderSearchInfo().getModuleMap(),
-    Module, HeaderContents);
+    Module, IsBuiltinModule, HeaderContents);
   if (UmbrellaHeader && HeaderContents.empty()) {
     // Simple case: we have an umbrella header and there are no additional
     // includes, we can just parse the umbrella header directly.

Modified: cfe/trunk/lib/Headers/module.map
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Headers/module.map?rev=149434&r1=149433&r2=149434&view=diff
==============================================================================
--- cfe/trunk/lib/Headers/module.map (original)
+++ cfe/trunk/lib/Headers/module.map Tue Jan 31 15:57:50 2012
@@ -1,9 +1,4 @@
-module __compiler_builtins [system] {
-  explicit module altivec {
-    requires altivec
-    header "altivec.h"
-  }
-
+module _Builtin_stdlib [system] {
   explicit module float_constants {
     header "float.h"
   }
@@ -36,6 +31,18 @@
     header "stdint.h"
   }
 
+  explicit module varargs {
+    requires unavailable
+    header "varargs.h"
+  }
+}
+
+module _Builtin_intrinsics [system] {
+  explicit module altivec {
+    requires altivec
+    header "altivec.h"
+  }
+
   explicit module intel {
     requires x86
 
@@ -129,14 +136,12 @@
       requires mm3dnow
       header "mm3dnow.h"
     }
+
+    explicit module mm_malloc {
+      header "mm_malloc.h"
+    }
   }
 
-  // FIXME: mm_malloc.h
   // FIXME: tgmath.h
   // FIXME: unwind.h
-
-  explicit module varargs {
-    requires unavailable
-    header "varargs.h"
-  }
 }

Modified: cfe/trunk/test/Modules/compiler_builtins.m
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/compiler_builtins.m?rev=149434&r1=149433&r2=149434&view=diff
==============================================================================
--- cfe/trunk/test/Modules/compiler_builtins.m (original)
+++ cfe/trunk/test/Modules/compiler_builtins.m Tue Jan 31 15:57:50 2012
@@ -1,20 +1,24 @@
 // RUN: rm -rf %t
 // RUN: %clang -fsyntax-only -fmodules -fmodule-cache-path %t %s -Xclang -verify
 
- at import __compiler_builtins.float_constants;
+ at import _Builtin_stdlib.float_constants;
 
 float getFltMax() { return FLT_MAX; }
 
- at import __compiler_builtins.limits;
+ at import _Builtin_stdlib.limits;
 
 char getCharMax() { return CHAR_MAX; }
 
 size_t size; // expected-error{{unknown type name 'size_t'}}
 
+ at import _Builtin_stdlib.stdint;
+
+intmax_t value;
+
 #ifdef __SSE__
- at import __compiler_builtins.intel.sse;
+ at import _Builtin_intrinsics.intel.sse;
 #endif
 
 #ifdef __AVX2__
- at import __compiler_builtins.intel.avx2;
+ at import _Builtin_intrinsics.intel.avx2;
 #endif





More information about the cfe-commits mailing list