diff options
author | dim <dim@FreeBSD.org> | 2011-10-20 21:14:49 +0000 |
---|---|---|
committer | dim <dim@FreeBSD.org> | 2011-10-20 21:14:49 +0000 |
commit | 3963a48221351c61c17fb3f382341ab04809a3d3 (patch) | |
tree | ee2483e98b09cac943dc93a6969d83ca737ff139 /tools/driver | |
parent | 611ba3ea3300b71eb95dc4e45f20eee5dddd32e1 (diff) | |
download | FreeBSD-src-3963a48221351c61c17fb3f382341ab04809a3d3.zip FreeBSD-src-3963a48221351c61c17fb3f382341ab04809a3d3.tar.gz |
Vendor import of clang release_30 branch r142614:
http://llvm.org/svn/llvm-project/cfe/branches/release_30@142614
Diffstat (limited to 'tools/driver')
-rw-r--r-- | tools/driver/Makefile | 9 | ||||
-rw-r--r-- | tools/driver/cc1_main.cpp | 17 | ||||
-rw-r--r-- | tools/driver/cc1as_main.cpp | 94 | ||||
-rw-r--r-- | tools/driver/driver.cpp | 71 |
4 files changed, 84 insertions, 107 deletions
diff --git a/tools/driver/Makefile b/tools/driver/Makefile index 1ba8bc2..6b34a99 100644 --- a/tools/driver/Makefile +++ b/tools/driver/Makefile @@ -9,13 +9,7 @@ CLANG_LEVEL := ../.. TOOLNAME = clang -ifndef CLANG_IS_PRODUCTION TOOLALIAS = clang++ -else - ifdef CLANGXX_IS_PRODUCTION - TOOLALIAS = clang++ - endif -endif # We don't currently expect production Clang builds to be interested in # plugins. This is important for startup performance. @@ -73,6 +67,3 @@ endif ifdef CLANG_IS_PRODUCTION CPP.Defines += -DCLANG_IS_PRODUCTION endif -ifdef CLANGXX_IS_PRODUCTION -CPP.Defines += -DCLANGXX_IS_PRODUCTION -endif diff --git a/tools/driver/cc1_main.cpp b/tools/driver/cc1_main.cpp index 9ad4af1..27f79b7 100644 --- a/tools/driver/cc1_main.cpp +++ b/tools/driver/cc1_main.cpp @@ -27,9 +27,9 @@ #include "llvm/ADT/Statistic.h" #include "llvm/Support/ErrorHandling.h" #include "llvm/Support/ManagedStatic.h" +#include "llvm/Support/TargetSelect.h" #include "llvm/Support/Timer.h" #include "llvm/Support/raw_ostream.h" -#include "llvm/Target/TargetSelect.h" #include <cstdio> using namespace clang; @@ -38,7 +38,7 @@ using namespace clang; //===----------------------------------------------------------------------===// static void LLVMErrorHandler(void *UserData, const std::string &Message) { - Diagnostic &Diags = *static_cast<Diagnostic*>(UserData); + DiagnosticsEngine &Diags = *static_cast<DiagnosticsEngine*>(UserData); Diags.Report(diag::err_fe_error_backend) << Message; @@ -47,7 +47,7 @@ static void LLVMErrorHandler(void *UserData, const std::string &Message) { } // FIXME: Define the need for this testing away. -static int cc1_test(Diagnostic &Diags, +static int cc1_test(DiagnosticsEngine &Diags, const char **ArgBegin, const char **ArgEnd) { using namespace clang::driver; @@ -83,7 +83,7 @@ static int cc1_test(Diagnostic &Diags, Invocation.toArgs(InvocationArgs); // Dump the converted arguments. - llvm::SmallVector<const char*, 32> Invocation2Args; + SmallVector<const char*, 32> Invocation2Args; llvm::errs() << "invocation argv :"; for (unsigned i = 0, e = InvocationArgs.size(); i != e; ++i) { Invocation2Args.push_back(InvocationArgs[i].c_str()); @@ -118,23 +118,22 @@ int cc1_main(const char **ArgBegin, const char **ArgEnd, llvm::IntrusiveRefCntPtr<DiagnosticIDs> DiagID(new DiagnosticIDs()); // Run clang -cc1 test. - if (ArgBegin != ArgEnd && llvm::StringRef(ArgBegin[0]) == "-cc1test") { - Diagnostic Diags(DiagID, new TextDiagnosticPrinter(llvm::errs(), + if (ArgBegin != ArgEnd && StringRef(ArgBegin[0]) == "-cc1test") { + DiagnosticsEngine Diags(DiagID, new TextDiagnosticPrinter(llvm::errs(), DiagnosticOptions())); return cc1_test(Diags, ArgBegin + 1, ArgEnd); } // Initialize targets first, so that --version shows registered targets. llvm::InitializeAllTargets(); - llvm::InitializeAllMCAsmInfos(); - llvm::InitializeAllMCSubtargetInfos(); + llvm::InitializeAllTargetMCs(); llvm::InitializeAllAsmPrinters(); llvm::InitializeAllAsmParsers(); // Buffer diagnostics from argument parsing so that we can output them using a // well formed diagnostic object. TextDiagnosticBuffer *DiagsBuffer = new TextDiagnosticBuffer; - Diagnostic Diags(DiagID, DiagsBuffer); + DiagnosticsEngine Diags(DiagID, DiagsBuffer); CompilerInvocation::CreateFromArgs(Clang->getInvocation(), ArgBegin, ArgEnd, Diags); diff --git a/tools/driver/cc1as_main.cpp b/tools/driver/cc1as_main.cpp index 358d746..7cc42aa 100644 --- a/tools/driver/cc1as_main.cpp +++ b/tools/driver/cc1as_main.cpp @@ -30,8 +30,12 @@ #include "llvm/MC/MCCodeEmitter.h" #include "llvm/MC/MCContext.h" #include "llvm/MC/MCInstrInfo.h" +#include "llvm/MC/MCObjectFileInfo.h" +#include "llvm/MC/MCRegisterInfo.h" #include "llvm/MC/MCStreamer.h" #include "llvm/MC/MCSubtargetInfo.h" +#include "llvm/MC/MCAsmBackend.h" +#include "llvm/MC/MCTargetAsmParser.h" #include "llvm/Support/CommandLine.h" #include "llvm/Support/FormattedStream.h" #include "llvm/Support/ErrorHandling.h" @@ -39,23 +43,15 @@ #include "llvm/Support/MemoryBuffer.h" #include "llvm/Support/PrettyStackTrace.h" #include "llvm/Support/SourceMgr.h" -#include "llvm/Support/Timer.h" -#include "llvm/Support/raw_ostream.h" #include "llvm/Support/Host.h" #include "llvm/Support/Path.h" #include "llvm/Support/Signals.h" +#include "llvm/Support/TargetRegistry.h" +#include "llvm/Support/TargetSelect.h" +#include "llvm/Support/Timer.h" +#include "llvm/Support/raw_ostream.h" #include "llvm/Support/system_error.h" -#include "llvm/Target/TargetAsmBackend.h" -#include "llvm/Target/TargetAsmInfo.h" -#include "llvm/Target/TargetAsmParser.h" #include "llvm/Target/TargetData.h" -#include "llvm/Target/TargetInstrInfo.h" -#include "llvm/Target/TargetLowering.h" -#include "llvm/Target/TargetLoweringObjectFile.h" -#include "llvm/Target/TargetMachine.h" -#include "llvm/Target/TargetRegistry.h" -#include "llvm/Target/TargetSelect.h" -#include "llvm/Target/TargetSubtargetInfo.h" using namespace clang; using namespace clang::driver; using namespace llvm; @@ -125,7 +121,7 @@ public: } static void CreateFromArgs(AssemblerInvocation &Res, const char **ArgBegin, - const char **ArgEnd, Diagnostic &Diags); + const char **ArgEnd, DiagnosticsEngine &Diags); }; } @@ -133,7 +129,7 @@ public: void AssemblerInvocation::CreateFromArgs(AssemblerInvocation &Opts, const char **ArgBegin, const char **ArgEnd, - Diagnostic &Diags) { + DiagnosticsEngine &Diags) { using namespace clang::driver::cc1asoptions; // Parse the arguments. OwningPtr<OptTable> OptTbl(createCC1AsOptTable()); @@ -207,7 +203,7 @@ void AssemblerInvocation::CreateFromArgs(AssemblerInvocation &Opts, } static formatted_raw_ostream *GetOutputStream(AssemblerInvocation &Opts, - Diagnostic &Diags, + DiagnosticsEngine &Diags, bool Binary) { if (Opts.OutputPath.empty()) Opts.OutputPath = "-"; @@ -230,7 +226,8 @@ static formatted_raw_ostream *GetOutputStream(AssemblerInvocation &Opts, return new formatted_raw_ostream(*Out, formatted_raw_ostream::DELETE_STREAM); } -static bool ExecuteAssembler(AssemblerInvocation &Opts, Diagnostic &Diags) { +static bool ExecuteAssembler(AssemblerInvocation &Opts, + DiagnosticsEngine &Diags) { // Get the target specific parser. std::string Error; const Target *TheTarget(TargetRegistry::lookupTarget(Opts.Triple, Error)); @@ -259,64 +256,60 @@ static bool ExecuteAssembler(AssemblerInvocation &Opts, Diagnostic &Diags) { OwningPtr<MCAsmInfo> MAI(TheTarget->createMCAsmInfo(Opts.Triple)); assert(MAI && "Unable to create target asm info!"); + OwningPtr<MCRegisterInfo> MRI(TheTarget->createMCRegInfo(Opts.Triple)); + assert(MRI && "Unable to create target register info!"); + bool IsBinary = Opts.OutputType == AssemblerInvocation::FT_Obj; formatted_raw_ostream *Out = GetOutputStream(Opts, Diags, IsBinary); if (!Out) return false; - // FIXME: We shouldn't need to do this (and link in codegen). - OwningPtr<TargetMachine> TM(TheTarget->createTargetMachine(Opts.Triple, - "", "")); - if (!TM) { - Diags.Report(diag::err_target_unknown_triple) << Opts.Triple; - return false; - } - - const TargetAsmInfo *tai = new TargetAsmInfo(*TM); - MCContext Ctx(*MAI, tai); + // FIXME: This is not pretty. MCContext has a ptr to MCObjectFileInfo and + // MCObjectFileInfo needs a MCContext reference in order to initialize itself. + OwningPtr<MCObjectFileInfo> MOFI(new MCObjectFileInfo()); + MCContext Ctx(*MAI, *MRI, MOFI.get()); + // FIXME: Assembler behavior can change with -static. + MOFI->InitMCObjectFileInfo(Opts.Triple, + Reloc::Default, CodeModel::Default, Ctx); if (Opts.SaveTemporaryLabels) Ctx.setAllowTemporaryLabels(false); OwningPtr<MCStreamer> Str; - const TargetLoweringObjectFile &TLOF = - TM->getTargetLowering()->getObjFileLowering(); - const_cast<TargetLoweringObjectFile&>(TLOF).Initialize(Ctx, *TM); - - const MCSubtargetInfo &STI = TM->getSubtarget<MCSubtargetInfo>(); + OwningPtr<MCInstrInfo> MCII(TheTarget->createMCInstrInfo()); + OwningPtr<MCSubtargetInfo> + STI(TheTarget->createMCSubtargetInfo(Opts.Triple, "", "")); // FIXME: There is a bit of code duplication with addPassesToEmitFile. if (Opts.OutputType == AssemblerInvocation::FT_Asm) { MCInstPrinter *IP = - TheTarget->createMCInstPrinter(Opts.OutputAsmVariant, *MAI); + TheTarget->createMCInstPrinter(Opts.OutputAsmVariant, *MAI, *STI); MCCodeEmitter *CE = 0; - TargetAsmBackend *TAB = 0; + MCAsmBackend *MAB = 0; if (Opts.ShowEncoding) { - CE = TheTarget->createCodeEmitter(*TM->getInstrInfo(), STI, Ctx); - TAB = TheTarget->createAsmBackend(Opts.Triple); + CE = TheTarget->createMCCodeEmitter(*MCII, *STI, Ctx); + MAB = TheTarget->createMCAsmBackend(Opts.Triple); } Str.reset(TheTarget->createAsmStreamer(Ctx, *Out, /*asmverbose*/true, /*useLoc*/ true, - /*useCFI*/ true, IP, CE, TAB, + /*useCFI*/ true, IP, CE, MAB, Opts.ShowInst)); } else if (Opts.OutputType == AssemblerInvocation::FT_Null) { Str.reset(createNullStreamer(Ctx)); } else { assert(Opts.OutputType == AssemblerInvocation::FT_Obj && "Invalid file type!"); - MCCodeEmitter *CE = TheTarget->createCodeEmitter(*TM->getInstrInfo(), - STI, Ctx); - TargetAsmBackend *TAB = TheTarget->createAsmBackend(Opts.Triple); - Str.reset(TheTarget->createObjectStreamer(Opts.Triple, Ctx, *TAB, *Out, - CE, Opts.RelaxAll, - Opts.NoExecStack)); + MCCodeEmitter *CE = TheTarget->createMCCodeEmitter(*MCII, *STI, Ctx); + MCAsmBackend *MAB = TheTarget->createMCAsmBackend(Opts.Triple); + Str.reset(TheTarget->createMCObjectStreamer(Opts.Triple, Ctx, *MAB, *Out, + CE, Opts.RelaxAll, + Opts.NoExecStack)); Str.get()->InitSections(); } - OwningPtr<MCAsmParser> Parser(createMCAsmParser(*TheTarget, SrcMgr, Ctx, + OwningPtr<MCAsmParser> Parser(createMCAsmParser(SrcMgr, Ctx, *Str.get(), *MAI)); - OwningPtr<TargetAsmParser> - TAP(TheTarget->createAsmParser(const_cast<MCSubtargetInfo&>(STI), *Parser)); + OwningPtr<MCTargetAsmParser> TAP(TheTarget->createMCAsmParser(*STI, *Parser)); if (!TAP) { Diags.Report(diag::err_target_unknown_triple) << Opts.Triple; return false; @@ -337,7 +330,7 @@ static bool ExecuteAssembler(AssemblerInvocation &Opts, Diagnostic &Diags) { } static void LLVMErrorHandler(void *UserData, const std::string &Message) { - Diagnostic &Diags = *static_cast<Diagnostic*>(UserData); + DiagnosticsEngine &Diags = *static_cast<DiagnosticsEngine*>(UserData); Diags.Report(diag::err_fe_error_backend) << Message; @@ -354,12 +347,7 @@ int cc1as_main(const char **ArgBegin, const char **ArgEnd, // Initialize targets and assembly printers/parsers. InitializeAllTargetInfos(); - // FIXME: We shouldn't need to initialize the Target(Machine)s. - InitializeAllTargets(); - InitializeAllMCAsmInfos(); - InitializeAllMCInstrInfos(); - InitializeAllMCSubtargetInfos(); - InitializeAllAsmPrinters(); + InitializeAllTargetMCs(); InitializeAllAsmParsers(); // Construct our diagnostic client. @@ -367,7 +355,7 @@ int cc1as_main(const char **ArgBegin, const char **ArgEnd, = new TextDiagnosticPrinter(errs(), DiagnosticOptions()); DiagClient->setPrefix("clang -cc1as"); llvm::IntrusiveRefCntPtr<DiagnosticIDs> DiagID(new DiagnosticIDs()); - Diagnostic Diags(DiagID, DiagClient); + DiagnosticsEngine Diags(DiagID, DiagClient); // Set an error handler, so that any LLVM backend diagnostics go through our // error handler. diff --git a/tools/driver/driver.cpp b/tools/driver/driver.cpp index ca89826..bd1d2a2 100644 --- a/tools/driver/driver.cpp +++ b/tools/driver/driver.cpp @@ -35,9 +35,9 @@ #include "llvm/Support/Path.h" #include "llvm/Support/Program.h" #include "llvm/Support/Signals.h" +#include "llvm/Support/TargetRegistry.h" +#include "llvm/Support/TargetSelect.h" #include "llvm/Support/system_error.h" -#include "llvm/Target/TargetRegistry.h" -#include "llvm/Target/TargetSelect.h" #include <cctype> using namespace clang; using namespace clang::driver; @@ -53,7 +53,7 @@ llvm::sys::Path GetExecutablePath(const char *Argv0, bool CanonicalPrefixes) { } static const char *SaveStringInSet(std::set<std::string> &SavedStrings, - llvm::StringRef S) { + StringRef S) { return SavedStrings.insert(S).first->c_str(); } @@ -84,9 +84,9 @@ static const char *SaveStringInSet(std::set<std::string> &SavedStrings, /// \param Args - The vector of command line arguments. /// \param Edit - The override command to perform. /// \param SavedStrings - Set to use for storing string representations. -static void ApplyOneQAOverride(llvm::raw_ostream &OS, - llvm::SmallVectorImpl<const char*> &Args, - llvm::StringRef Edit, +static void ApplyOneQAOverride(raw_ostream &OS, + SmallVectorImpl<const char*> &Args, + StringRef Edit, std::set<std::string> &SavedStrings) { // This does not need to be efficient. @@ -101,9 +101,9 @@ static void ApplyOneQAOverride(llvm::raw_ostream &OS, OS << "### Adding argument " << Str << " at end\n"; Args.push_back(Str); } else if (Edit[0] == 's' && Edit[1] == '/' && Edit.endswith("/") && - Edit.slice(2, Edit.size()-1).find('/') != llvm::StringRef::npos) { - llvm::StringRef MatchPattern = Edit.substr(2).split('/').first; - llvm::StringRef ReplPattern = Edit.substr(2).split('/').second; + Edit.slice(2, Edit.size()-1).find('/') != StringRef::npos) { + StringRef MatchPattern = Edit.substr(2).split('/').first; + StringRef ReplPattern = Edit.substr(2).split('/').second; ReplPattern = ReplPattern.slice(0, ReplPattern.size()-1); for (unsigned i = 1, e = Args.size(); i != e; ++i) { @@ -151,10 +151,10 @@ static void ApplyOneQAOverride(llvm::raw_ostream &OS, /// ApplyQAOverride - Apply a comma separate list of edits to the /// input argument lists. See ApplyOneQAOverride. -static void ApplyQAOverride(llvm::SmallVectorImpl<const char*> &Args, +static void ApplyQAOverride(SmallVectorImpl<const char*> &Args, const char *OverrideStr, std::set<std::string> &SavedStrings) { - llvm::raw_ostream *OS = &llvm::errs(); + raw_ostream *OS = &llvm::errs(); if (OverrideStr[0] == '#') { ++OverrideStr; @@ -184,7 +184,7 @@ extern int cc1as_main(const char **ArgBegin, const char **ArgEnd, const char *Argv0, void *MainAddr); static void ExpandArgsFromBuf(const char *Arg, - llvm::SmallVectorImpl<const char*> &ArgVector, + SmallVectorImpl<const char*> &ArgVector, std::set<std::string> &SavedStrings) { const char *FName = Arg + 1; llvm::OwningPtr<llvm::MemoryBuffer> MemBuf; @@ -242,7 +242,7 @@ static void ExpandArgsFromBuf(const char *Arg, } static void ExpandArgv(int argc, const char **argv, - llvm::SmallVectorImpl<const char*> &ArgVector, + SmallVectorImpl<const char*> &ArgVector, std::set<std::string> &SavedStrings) { for (int i = 0; i < argc; ++i) { const char *Arg = argv[i]; @@ -255,7 +255,7 @@ static void ExpandArgv(int argc, const char **argv, } } -static void ParseProgName(llvm::SmallVectorImpl<const char *> &ArgVector, +static void ParseProgName(SmallVectorImpl<const char *> &ArgVector, std::set<std::string> &SavedStrings, Driver &TheDriver) { @@ -290,8 +290,8 @@ static void ParseProgName(llvm::SmallVectorImpl<const char *> &ArgVector, { "++", true, false }, }; std::string ProgName(llvm::sys::path::stem(ArgVector[0])); - llvm::StringRef ProgNameRef(ProgName); - llvm::StringRef Prefix; + StringRef ProgNameRef(ProgName); + StringRef Prefix; for (int Components = 2; Components; --Components) { bool FoundMatch = false; @@ -309,15 +309,15 @@ static void ParseProgName(llvm::SmallVectorImpl<const char *> &ArgVector, } if (FoundMatch) { - llvm::StringRef::size_type LastComponent = ProgNameRef.rfind('-', + StringRef::size_type LastComponent = ProgNameRef.rfind('-', ProgNameRef.size() - strlen(suffixes[i].Suffix)); - if (LastComponent != llvm::StringRef::npos) + if (LastComponent != StringRef::npos) Prefix = ProgNameRef.slice(0, LastComponent); break; } - llvm::StringRef::size_type LastComponent = ProgNameRef.rfind('-'); - if (LastComponent == llvm::StringRef::npos) + StringRef::size_type LastComponent = ProgNameRef.rfind('-'); + if (LastComponent == StringRef::npos) break; ProgNameRef = ProgNameRef.slice(0, LastComponent); } @@ -327,7 +327,7 @@ static void ParseProgName(llvm::SmallVectorImpl<const char *> &ArgVector, std::string IgnoredError; if (llvm::TargetRegistry::lookupTarget(Prefix, IgnoredError)) { - llvm::SmallVectorImpl<const char *>::iterator it = ArgVector.begin(); + SmallVectorImpl<const char *>::iterator it = ArgVector.begin(); if (it != ArgVector.end()) ++it; ArgVector.insert(it, SaveStringInSet(SavedStrings, Prefix)); @@ -341,13 +341,13 @@ int main(int argc_, const char **argv_) { llvm::PrettyStackTraceProgram X(argc_, argv_); std::set<std::string> SavedStrings; - llvm::SmallVector<const char*, 256> argv; + SmallVector<const char*, 256> argv; ExpandArgv(argc_, argv_, argv, SavedStrings); // Handle -cc1 integrated tools. - if (argv.size() > 1 && llvm::StringRef(argv[1]).startswith("-cc1")) { - llvm::StringRef Tool = argv[1] + 4; + if (argv.size() > 1 && StringRef(argv[1]).startswith("-cc1")) { + StringRef Tool = argv[1] + 4; if (Tool == "") return cc1_main(argv.data()+2, argv.data()+argv.size(), argv[0], @@ -363,7 +363,7 @@ int main(int argc_, const char **argv_) { bool CanonicalPrefixes = true; for (int i = 1, size = argv.size(); i < size; ++i) { - if (llvm::StringRef(argv[i]) == "-no-canonical-prefixes") { + if (StringRef(argv[i]) == "-no-canonical-prefixes") { CanonicalPrefixes = false; break; } @@ -375,22 +375,15 @@ int main(int argc_, const char **argv_) { = new TextDiagnosticPrinter(llvm::errs(), DiagnosticOptions()); DiagClient->setPrefix(llvm::sys::path::stem(Path.str())); llvm::IntrusiveRefCntPtr<DiagnosticIDs> DiagID(new DiagnosticIDs()); - Diagnostic Diags(DiagID, DiagClient); + DiagnosticsEngine Diags(DiagID, DiagClient); #ifdef CLANG_IS_PRODUCTION const bool IsProduction = true; -# ifdef CLANGXX_IS_PRODUCTION - const bool CXXIsProduction = true; -# else - const bool CXXIsProduction = false; -# endif #else const bool IsProduction = false; - const bool CXXIsProduction = false; #endif Driver TheDriver(Path.str(), llvm::sys::getHostTriple(), - "a.out", IsProduction, CXXIsProduction, - Diags); + "a.out", IsProduction, Diags); // Attempt to find the original path used to invoke the driver, to determine // the installed path. We do this manually, because we want to support that @@ -458,9 +451,15 @@ int main(int argc_, const char **argv_) { llvm::OwningPtr<Compilation> C(TheDriver.BuildCompilation(argv)); int Res = 0; + const Command *FailingCommand = 0; if (C.get()) - Res = TheDriver.ExecuteCompilation(*C); - + Res = TheDriver.ExecuteCompilation(*C, FailingCommand); + + // If result status is < 0, then the driver command signalled an error. + // In this case, generate additional diagnostic information if possible. + if (Res < 0) + TheDriver.generateCompilationDiagnostics(*C, FailingCommand); + // If any timers were active but haven't been destroyed yet, print their // results now. This happens in -disable-free mode. llvm::TimerGroup::printAll(llvm::errs()); |