Index: tools/clang/lib/Basic/Targets/OSTargets.h =================================================================== --- tools/clang/lib/Basic/Targets/OSTargets.h (revision 329559) +++ tools/clang/lib/Basic/Targets/OSTargets.h (working copy) @@ -352,6 +352,47 @@ } }; +// QNX650 target +template +class LLVM_LIBRARY_VISIBILITY QNX650TargetInfo : public OSTargetInfo { +protected: + void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, + MacroBuilder &Builder) const override { + // Linux defines; list based off of gcc output + DefineStd(Builder, "unix", Opts); + Builder.defineMacro("__ELF__"); + Builder.defineMacro("__STDC__"); + Builder.defineMacro("__QNX__"); + Builder.defineMacro("__QNXNTO__"); + Builder.defineMacro("__LITTLEENDIAN__"); + Builder.defineMacro("__X86__"); + +// if (Opts.POSIXThreads) +// Builder.defineMacro("_REENTRANT"); + if (Opts.CPlusPlus) + Builder.defineMacro("_GNU_SOURCE"); +// if (this->HasFloat128) +// Builder.defineMacro("__FLOAT128__"); + } +public: + QNX650TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts) + : OSTargetInfo(Triple, Opts) { + this->WIntType = TargetInfo::UnsignedInt; + + switch (Triple.getArch()) { + default: + break; + case llvm::Triple::x86: + this->HasFloat128 = true; + break; + } + } + + const char *getStaticInitSectionSpecifier() const override { + return ".text.startup"; + } +}; + // NetBSD Target template class LLVM_LIBRARY_VISIBILITY NetBSDTargetInfo : public OSTargetInfo { Index: tools/clang/lib/Basic/Targets.cpp =================================================================== --- tools/clang/lib/Basic/Targets.cpp (revision 329559) +++ tools/clang/lib/Basic/Targets.cpp (working copy) @@ -508,6 +508,8 @@ return new AnanasTargetInfo(Triple, Opts); case llvm::Triple::CloudABI: return new CloudABITargetInfo(Triple, Opts); + case llvm::Triple::QNX650: + return new QNX650TargetInfo(Triple, Opts); case llvm::Triple::Linux: { switch (Triple.getEnvironment()) { default: Index: tools/clang/lib/Driver/ToolChain.cpp =================================================================== --- tools/clang/lib/Driver/ToolChain.cpp (revision 329559) +++ tools/clang/lib/Driver/ToolChain.cpp (working copy) @@ -727,6 +727,8 @@ void ToolChain::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs, ArgStringList &CC1Args) const { + + printf("TOOL\n"); // Header search paths should be handled by each of the subclasses. // Historically, they have not been, and instead have been handled inside of // the CC1-layer frontend. As the logic is hoisted out, this generic function Index: tools/clang/lib/Driver/ToolChains/Gnu.cpp =================================================================== --- tools/clang/lib/Driver/ToolChains/Gnu.cpp (revision 329559) +++ tools/clang/lib/Driver/ToolChains/Gnu.cpp (working copy) @@ -66,7 +66,6 @@ const char *LinkingOutput) const { const Driver &D = getToolChain().getDriver(); ArgStringList CmdArgs; - for (const auto &A : Args) { if (forwardToGCC(A->getOption())) { // It is unfortunate that we have to claim here, as this means @@ -173,14 +172,33 @@ const std::string &customGCCName = D.getCCCGenericGCCName(); const char *GCCName; if (!customGCCName.empty()) + { GCCName = customGCCName.c_str(); + } else if (D.CCCIsCXX()) { - GCCName = "g++"; + if ( getToolChain().getOS() != "qnx650" ) + { + GCCName = "g++"; + } + else + { + GCCName = "ntox86-g++"; + } } else - GCCName = "gcc"; + { + if ( getToolChain().getOS() != "qnx650" ) + { + GCCName = "gcc"; + } + else + { + GCCName = "ntox86-g++"; + } + } const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath(GCCName)); C.addCommand(llvm::make_unique(JA, *this, Exec, CmdArgs, Inputs)); + } void tools::gcc::Preprocessor::RenderExtraToolArgs( Index: tools/clang/lib/Driver/ToolChains/Linux.cpp =================================================================== --- tools/clang/lib/Driver/ToolChains/Linux.cpp (revision 329559) +++ tools/clang/lib/Driver/ToolChains/Linux.cpp (working copy) @@ -584,6 +584,7 @@ const Driver &D = getDriver(); std::string SysRoot = computeSysRoot(); + printf("LINUX\n"); if (DriverArgs.hasArg(clang::driver::options::OPT_nostdinc)) return; @@ -748,6 +749,7 @@ if (getTriple().getOS() == llvm::Triple::RTEMS) return; + printf("UUU\n"); // Add an include of '/include' directly. This isn't provided by default by // system GCCs, but is often used with cross-compiling GCCs, and harmless to // add even when Clang is acting as-if it were a system compiler. Index: tools/clang/lib/Format/BreakableToken.cpp =================================================================== --- tools/clang/lib/Format/BreakableToken.cpp (revision 329559) +++ tools/clang/lib/Format/BreakableToken.cpp (working copy) @@ -646,6 +646,18 @@ !switchesFormatting(tokenAt(LineIndex)); } +static bool IsNotPCLint(StringRef line, unsigned at) +{ + // Could be improved by not assumeing a space after "lint", could be any whitespace + // Also would be safe to search for a - or ! after the word to raise likely hood + // it's really a pclint keyword. But good enough for now + StringRef Lint("lint "); + if ( at + Lint.size() < line.size() ) + return line.find(Lint, at) == StringRef::npos; + + return true; +} + BreakableLineCommentSection::BreakableLineCommentSection( const FormatToken &Token, unsigned StartColumn, unsigned OriginalStartColumn, bool FirstInLine, bool InPPDirective, @@ -679,7 +691,8 @@ "unsupported line comment prefix, '//' and '#' are supported"); OriginalPrefix[i] = Prefix[i] = IndentPrefix; if (Lines[i].size() > Prefix[i].size() && - isAlphanumeric(Lines[i][Prefix[i].size()])) { + isAlphanumeric(Lines[i][Prefix[i].size()]) && + IsNotPCLint(Lines[i], Prefix[i].size()) ) { if (Prefix[i] == "//") Prefix[i] = "// "; else if (Prefix[i] == "///") Index: tools/clang/lib/Frontend/InitHeaderSearch.cpp =================================================================== --- tools/clang/lib/Frontend/InitHeaderSearch.cpp (revision 329559) +++ tools/clang/lib/Frontend/InitHeaderSearch.cpp (working copy) @@ -216,6 +216,7 @@ case llvm::Triple::NaCl: case llvm::Triple::PS4: case llvm::Triple::ELFIAMCU: + case llvm::Triple::QNX650: case llvm::Triple::Fuchsia: break; case llvm::Triple::Win32: @@ -323,6 +324,9 @@ case llvm::Triple::RTEMS: case llvm::Triple::NaCl: case llvm::Triple::ELFIAMCU: + case llvm::Triple::QNX650: + AddPath("/usr/local/bid/clang70/qnx/usr/include", ExternCSystem, false); + break; case llvm::Triple::Fuchsia: break; case llvm::Triple::PS4: { @@ -426,6 +430,13 @@ t, "", "", triple); break; } + case llvm::Triple::QNX650: + AddPath("/usr/local/bid/clang70/qnx/usr/lib/gcc/i486-pc-nto-qnx6.5.0/4.8.3/include", CXXSystem, false); + AddPath("/usr/local/bid/clang70/qnx/usr/include/c++/4.8.3", CXXSystem, false); + AddPath("/usr/local/bid/clang70/qnx/usr/include/c++/4.8.3/i486-pc-nto-qnx6.5.0", CXXSystem, false); + AddPath("/usr/local/bid/clang70/qnx/usr/include/c++/4.8.3/backward", CXXSystem, false); + AddPath("/usr/local/bid/clang70/qnx/usr/include", CXXSystem, false); + break; case llvm::Triple::Minix: AddGnuCPlusPlusIncludePaths("/usr/gnu/include/c++/4.4.3", "", "", "", triple); Index: tools/clang/tools/CMakeLists.txt =================================================================== --- tools/clang/tools/CMakeLists.txt (revision 329559) +++ tools/clang/tools/CMakeLists.txt (working copy) @@ -35,3 +35,6 @@ # libclang may require clang-tidy in clang-tools-extra. add_clang_subdirectory(libclang) + +add_subdirectory(include-what-you-use) +