[cfe-commits] r90090 - in /cfe/trunk: include/clang/Frontend/CompilerInvocation.h lib/Driver/CC1Options.cpp tools/driver/cc1_main.cpp tools/driver/driver.cpp
Daniel Dunbar
daniel at zuster.org
Sun Nov 29 12:58:33 PST 2009
Author: ddunbar
Date: Sun Nov 29 14:58:32 2009
New Revision: 90090
URL: http://llvm.org/viewvc/llvm-project?rev=90090&view=rev
Log:
Change CompilerInvocation::CreateFromArgs to take Argv0 and the address of main (or something in the main executable) so it can find the builtin compiler files.
Modified:
cfe/trunk/include/clang/Frontend/CompilerInvocation.h
cfe/trunk/lib/Driver/CC1Options.cpp
cfe/trunk/tools/driver/cc1_main.cpp
cfe/trunk/tools/driver/driver.cpp
Modified: cfe/trunk/include/clang/Frontend/CompilerInvocation.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Frontend/CompilerInvocation.h?rev=90090&r1=90089&r2=90090&view=diff
==============================================================================
--- cfe/trunk/include/clang/Frontend/CompilerInvocation.h (original)
+++ cfe/trunk/include/clang/Frontend/CompilerInvocation.h Sun Nov 29 14:58:32 2009
@@ -80,9 +80,15 @@
/// FIXME: Documenting error behavior.
///
/// \param Res [out] - The resulting invocation.
- /// \param Args - The input argument strings.
+ /// \param ArgBegin - The first element in the argument vector.
+ /// \param ArgEnd - The last element in the argument vector.
+ /// \param Argv0 - The program path (from argv[0]), for finding the builtin
+ /// compiler path.
+ /// \param MainAddr - The address of main (or some other function in the main
+ /// executable), for finding the builtin compiler path.
static void CreateFromArgs(CompilerInvocation &Res, const char **ArgBegin,
- const char **ArgEnd);
+ const char **ArgEnd, const char *Argv0,
+ void *MainAddr);
/// toArgs - Convert the CompilerInvocation to a list of strings suitable for
/// passing to CreateFromArgs.
Modified: cfe/trunk/lib/Driver/CC1Options.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/CC1Options.cpp?rev=90090&r1=90089&r2=90090&view=diff
==============================================================================
--- cfe/trunk/lib/Driver/CC1Options.cpp (original)
+++ cfe/trunk/lib/Driver/CC1Options.cpp Sun Nov 29 14:58:32 2009
@@ -8,6 +8,7 @@
//===----------------------------------------------------------------------===//
#include "clang/Driver/CC1Options.h"
+#include "clang/Basic/Version.h"
#include "clang/Driver/ArgList.h"
#include "clang/Driver/Arg.h"
#include "clang/Driver/OptTable.h"
@@ -19,6 +20,7 @@
#include "llvm/ADT/SmallVector.h"
#include "llvm/Support/raw_ostream.h"
#include "llvm/System/Host.h"
+#include "llvm/System/Path.h"
using namespace clang::driver;
using namespace clang::driver::options;
@@ -373,14 +375,34 @@
return DashX;
}
-static void ParseHeaderSearchArgs(HeaderSearchOptions &Opts, ArgList &Args) {
+static std::string GetBuiltinIncludePath(const char *Argv0,
+ void *MainAddr) {
+ llvm::sys::Path P = llvm::sys::Path::GetMainExecutable(Argv0, MainAddr);
+
+ if (!P.isEmpty()) {
+ P.eraseComponent(); // Remove /clang from foo/bin/clang
+ P.eraseComponent(); // Remove /bin from foo/bin
+
+ // Get foo/lib/clang/<version>/include
+ P.appendComponent("lib");
+ P.appendComponent("clang");
+ P.appendComponent(CLANG_VERSION_STRING);
+ P.appendComponent("include");
+ }
+
+ return P.str();
+}
+
+static void ParseHeaderSearchArgs(HeaderSearchOptions &Opts, ArgList &Args,
+ const char *Argv0, void *MainAddr) {
using namespace cc1options;
Opts.Sysroot = getLastArgValue(Args, OPT_isysroot, "/");
Opts.Verbose = Args.hasArg(OPT_v);
Opts.UseStandardIncludes = !Args.hasArg(OPT_nostdinc);
Opts.BuiltinIncludePath = "";
+ // FIXME: Add an option for this, its a slow call.
if (!Args.hasArg(OPT_nobuiltininc))
- Opts.BuiltinIncludePath = "FIXME"; // FIXME: Get builtin include path!
+ Opts.BuiltinIncludePath = GetBuiltinIncludePath(Argv0, MainAddr);
// Add -I... and -F... options in order.
for (arg_iterator it = Args.filtered_begin(OPT_I, OPT_F),
@@ -638,7 +660,9 @@
void CompilerInvocation::CreateFromArgs(CompilerInvocation &Res,
const char **ArgBegin,
- const char **ArgEnd) {
+ const char **ArgEnd,
+ const char *Argv0,
+ void *MainAddr) {
// Parse the arguments.
llvm::OwningPtr<OptTable> Opts(createCC1OptTable());
unsigned MissingArgIndex, MissingArgCount;
@@ -660,7 +684,8 @@
ParseDiagnosticArgs(Res.getDiagnosticOpts(), *InputArgs);
FrontendOptions::InputKind DashX =
ParseFrontendArgs(Res.getFrontendOpts(), *InputArgs);
- ParseHeaderSearchArgs(Res.getHeaderSearchOpts(), *InputArgs);
+ ParseHeaderSearchArgs(Res.getHeaderSearchOpts(), *InputArgs,
+ Argv0, MainAddr);
if (DashX != FrontendOptions::IK_AST)
ParseLangArgs(Res.getLangOpts(), *InputArgs, DashX);
ParsePreprocessorArgs(Res.getPreprocessorOpts(), *InputArgs);
Modified: cfe/trunk/tools/driver/cc1_main.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/driver/cc1_main.cpp?rev=90090&r1=90089&r2=90090&view=diff
==============================================================================
--- cfe/trunk/tools/driver/cc1_main.cpp (original)
+++ cfe/trunk/tools/driver/cc1_main.cpp Sun Nov 29 14:58:32 2009
@@ -25,7 +25,8 @@
using namespace clang;
using namespace clang::driver;
-int cc1_main(Diagnostic &Diags, const char **ArgBegin, const char **ArgEnd) {
+int cc1_main(Diagnostic &Diags, const char **ArgBegin, const char **ArgEnd,
+ const char *Argv0, void *MainAddr) {
llvm::errs() << "cc1 argv:";
for (const char **i = ArgBegin; i != ArgEnd; ++i)
llvm::errs() << " \"" << *i << '"';
@@ -51,7 +52,8 @@
// Create a compiler invocation.
llvm::errs() << "cc1 creating invocation.\n";
CompilerInvocation Invocation;
- CompilerInvocation::CreateFromArgs(Invocation, ArgBegin, ArgEnd);
+ CompilerInvocation::CreateFromArgs(Invocation, ArgBegin, ArgEnd,
+ Argv0, MainAddr);
// Convert the invocation back to argument strings.
std::vector<std::string> InvocationArgs;
@@ -70,7 +72,7 @@
// same thing.
CompilerInvocation Invocation2;
CompilerInvocation::CreateFromArgs(Invocation2, Invocation2Args.begin(),
- Invocation2Args.end());
+ Invocation2Args.end(), Argv0, MainAddr);
// FIXME: Implement CompilerInvocation comparison.
if (true) {
Modified: cfe/trunk/tools/driver/driver.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/driver/driver.cpp?rev=90090&r1=90089&r2=90090&view=diff
==============================================================================
--- cfe/trunk/tools/driver/driver.cpp (original)
+++ cfe/trunk/tools/driver/driver.cpp Sun Nov 29 14:58:32 2009
@@ -179,7 +179,8 @@
}
extern int cc1_main(Diagnostic &Diags,
- const char **ArgBegin, const char **ArgEnd);
+ const char **ArgBegin, const char **ArgEnd,
+ const char *Argv0, void *MainAddr);
int main(int argc, const char **argv) {
llvm::sys::PrintStackTraceOnErrorSignal();
@@ -192,7 +193,8 @@
// Dispatch to cc1_main if appropriate.
if (argc > 1 && llvm::StringRef(argv[1]) == "-cc1")
- return cc1_main(Diags, argv+2, argv+argc);
+ return cc1_main(Diags, argv+2, argv+argc, argv[0],
+ (void*) (intptr_t) GetExecutablePath);
#ifdef CLANG_IS_PRODUCTION
bool IsProduction = true;
More information about the cfe-commits
mailing list