[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