]> granicus.if.org Git - clang/commitdiff
add support for the GCC -include option.
authorChris Lattner <sabre@nondot.org>
Thu, 10 Jan 2008 01:53:41 +0000 (01:53 +0000)
committerChris Lattner <sabre@nondot.org>
Thu, 10 Jan 2008 01:53:41 +0000 (01:53 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@45810 91177308-0d34-0410-b5e6-96231b3b80d8

Driver/clang.cpp

index c2ebfb38a846db5b1465879a0b513c0084d8096b..26cbd4863fbbb63b54cc5186b50219012c21baac 100644 (file)
@@ -506,6 +506,11 @@ static llvm::cl::list<std::string>
 U_macros("U", llvm::cl::value_desc("macro"), llvm::cl::Prefix,
          llvm::cl::desc("Undefine the specified macro"));
 
+static llvm::cl::list<std::string>
+ImplicitIncludes("include", llvm::cl::value_desc("file"),
+                 llvm::cl::desc("Include file before parsing"));
+
+
 // Append a #define line to Buf for Macro.  Macro should be of the form XXX,
 // in which case we emit "#define XXX 1" or "XXX=Y z W" in which case we emit
 // "#define XXX Y z W".  To get a #define with no value, use "XXX=".
@@ -526,6 +531,16 @@ static void DefineBuiltinMacro(std::vector<char> &Buf, const char *Macro,
   Buf.push_back('\n');
 }
 
+/// AddImplicitInclude - Add an implicit #include of the specified file to the
+/// predefines buffer.
+static void AddImplicitInclude(std::vector<char> &Buf, const std::string &File){
+  const char *Inc = "#include \"";
+  Buf.insert(Buf.end(), Inc, Inc+strlen(Inc));
+  Buf.insert(Buf.end(), File.begin(), File.end());
+  Buf.push_back('"');
+  Buf.push_back('\n');
+}
+
 
 /// InitializePreprocessor - Initialize the preprocessor getting it and the
 /// environment ready to process a single file. This returns the file ID for the
@@ -562,7 +577,11 @@ static unsigned InitializePreprocessor(Preprocessor &PP,
   for (unsigned i = 0, e = U_macros.size(); i != e; ++i)
     DefineBuiltinMacro(PredefineBuffer, U_macros[i].c_str(), "#undef ");
   
-  // FIXME: Read any files specified by -imacros or -include.
+  // FIXME: Read any files specified by -imacros.
+  
+  // Add implicit #includes from -include.
+  for (unsigned i = 0, e = ImplicitIncludes.size(); i != e; ++i)
+    AddImplicitInclude(PredefineBuffer, ImplicitIncludes[i]);
   
   // Null terminate PredefinedBuffer and add it.
   PredefineBuffer.push_back(0);
@@ -583,7 +602,7 @@ static unsigned InitializePreprocessor(Preprocessor &PP,
 // FIXME: -nostdinc,-nostdinc++
 // FIXME: -imultilib
 //
-// FIXME: -include,-imacros
+// FIXME: -imacros
 
 static llvm::cl::opt<bool>
 nostdinc("nostdinc", llvm::cl::desc("Disable standard #include directories"));