From owner-svn-src-projects@FreeBSD.ORG Mon Nov 24 18:43:40 2014 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [8.8.178.115]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTPS id D0978B99; Mon, 24 Nov 2014 18:43:40 +0000 (UTC) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:1900:2254:2068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id BA6E0EB3; Mon, 24 Nov 2014 18:43:40 +0000 (UTC) Received: from svn.freebsd.org ([127.0.1.70]) by svn.freebsd.org (8.14.9/8.14.9) with ESMTP id sAOIheQA015497; Mon, 24 Nov 2014 18:43:40 GMT (envelope-from dim@FreeBSD.org) Received: (from dim@localhost) by svn.freebsd.org (8.14.9/8.14.9/Submit) id sAOIhbR9015482; Mon, 24 Nov 2014 18:43:37 GMT (envelope-from dim@FreeBSD.org) Message-Id: <201411241843.sAOIhbR9015482@svn.freebsd.org> X-Authentication-Warning: svn.freebsd.org: dim set sender to dim@FreeBSD.org using -f From: Dimitry Andric Date: Mon, 24 Nov 2014 18:43:37 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r274971 - projects/clang350-import/contrib/llvm/patches X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.18-1 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 24 Nov 2014 18:43:40 -0000 Author: dim Date: Mon Nov 24 18:43:37 2014 New Revision: 274971 URL: https://svnweb.freebsd.org/changeset/base/274971 Log: Cleanup patch set, and update README.TXT. Add three new patches. Added: projects/clang350-import/contrib/llvm/patches/patch-01-clang-version-include.diff - copied, changed from r274969, projects/clang350-import/contrib/llvm/patches/patch-r208961-clang-version-include.diff projects/clang350-import/contrib/llvm/patches/patch-02-format-extensions.diff - copied, changed from r274969, projects/clang350-import/contrib/llvm/patches/patch-r208987-format-extensions.diff projects/clang350-import/contrib/llvm/patches/patch-03-clang-vendor-suffix.diff - copied, changed from r274969, projects/clang350-import/contrib/llvm/patches/patch-r209107-clang-vendor-suffix.diff projects/clang350-import/contrib/llvm/patches/patch-04-default-target-triple.diff - copied, changed from r274969, projects/clang350-import/contrib/llvm/patches/patch-r221503-default-target-triple.diff projects/clang350-import/contrib/llvm/patches/patch-05-add-CC-aliases.diff - copied, changed from r274969, projects/clang350-import/contrib/llvm/patches/patch-r257109-add-CC-aliases.diff projects/clang350-import/contrib/llvm/patches/patch-06-clang-arm-target-cpu.diff - copied, changed from r274969, projects/clang350-import/contrib/llvm/patches/patch-r269387-clang-arm-target-cpu.diff projects/clang350-import/contrib/llvm/patches/patch-07-llvm-r213960-ppc32-tls.diff projects/clang350-import/contrib/llvm/patches/patch-08-llvm-r216989-r216990-fix-movw-armv6.diff - copied, changed from r274969, projects/clang350-import/contrib/llvm/patches/patch-r271024-llvm-r216989-r216990-fix-movw-armv6.diff projects/clang350-import/contrib/llvm/patches/patch-09-clang-r217410-i386-garbage-float.diff - copied, changed from r274969, projects/clang350-import/contrib/llvm/patches/patch-r271597-clang-r217410-i386-garbage-float.diff projects/clang350-import/contrib/llvm/patches/patch-10-llvm-r221709-debug-oom.diff - copied, changed from r274969, projects/clang350-import/contrib/llvm/patches/patch-r274442-llvm-r221709-debug-oom.diff projects/clang350-import/contrib/llvm/patches/patch-11-llvm-r222562-loop-rotate.diff projects/clang350-import/contrib/llvm/patches/patch-12-add-llvm-gvn-option.diff projects/clang350-import/contrib/llvm/patches/patch-13-llvm-r218241-dwarf2-warning.diff Deleted: projects/clang350-import/contrib/llvm/patches/patch-r208961-clang-version-include.diff projects/clang350-import/contrib/llvm/patches/patch-r208987-format-extensions.diff projects/clang350-import/contrib/llvm/patches/patch-r209107-clang-vendor-suffix.diff projects/clang350-import/contrib/llvm/patches/patch-r213492-amd64-multi-os-dot.diff projects/clang350-import/contrib/llvm/patches/patch-r221503-default-target-triple.diff projects/clang350-import/contrib/llvm/patches/patch-r243830-arm-disable-clear-cache.diff projects/clang350-import/contrib/llvm/patches/patch-r252503-arm-transient-stack-alignment.diff projects/clang350-import/contrib/llvm/patches/patch-r257109-add-CC-aliases.diff projects/clang350-import/contrib/llvm/patches/patch-r259053-gcc-installation-detector.diff projects/clang350-import/contrib/llvm/patches/patch-r259498-add-fxsave.diff projects/clang350-import/contrib/llvm/patches/patch-r261680-clang-r200899-fix-security-quantis.diff projects/clang350-import/contrib/llvm/patches/patch-r261991-llvm-r195391-fix-dwarf2.diff projects/clang350-import/contrib/llvm/patches/patch-r261991-llvm-r198385-fix-dwarf2.diff projects/clang350-import/contrib/llvm/patches/patch-r261991-llvm-r198389-fix-dwarf2.diff projects/clang350-import/contrib/llvm/patches/patch-r262261-llvm-r198028-sparc.diff projects/clang350-import/contrib/llvm/patches/patch-r262261-llvm-r198029-sparc.diff projects/clang350-import/contrib/llvm/patches/patch-r262261-llvm-r198030-sparc.diff projects/clang350-import/contrib/llvm/patches/patch-r262261-llvm-r198145-sparc.diff projects/clang350-import/contrib/llvm/patches/patch-r262261-llvm-r198149-sparc.diff projects/clang350-import/contrib/llvm/patches/patch-r262261-llvm-r198157-sparc.diff projects/clang350-import/contrib/llvm/patches/patch-r262261-llvm-r198280-sparc.diff projects/clang350-import/contrib/llvm/patches/patch-r262261-llvm-r198281-sparc.diff projects/clang350-import/contrib/llvm/patches/patch-r262261-llvm-r198286-sparc.diff projects/clang350-import/contrib/llvm/patches/patch-r262261-llvm-r198480-sparc.diff projects/clang350-import/contrib/llvm/patches/patch-r262261-llvm-r198484-sparc.diff projects/clang350-import/contrib/llvm/patches/patch-r262261-llvm-r198533-sparc.diff projects/clang350-import/contrib/llvm/patches/patch-r262261-llvm-r198565-sparc.diff projects/clang350-import/contrib/llvm/patches/patch-r262261-llvm-r198567-sparc.diff projects/clang350-import/contrib/llvm/patches/patch-r262261-llvm-r198580-sparc.diff projects/clang350-import/contrib/llvm/patches/patch-r262261-llvm-r198591-sparc.diff projects/clang350-import/contrib/llvm/patches/patch-r262261-llvm-r198592-sparc.diff projects/clang350-import/contrib/llvm/patches/patch-r262261-llvm-r198658-sparc.diff projects/clang350-import/contrib/llvm/patches/patch-r262261-llvm-r198681-sparc.diff projects/clang350-import/contrib/llvm/patches/patch-r262261-llvm-r198738-sparc.diff projects/clang350-import/contrib/llvm/patches/patch-r262261-llvm-r198739-sparc.diff projects/clang350-import/contrib/llvm/patches/patch-r262261-llvm-r198740-sparc.diff projects/clang350-import/contrib/llvm/patches/patch-r262261-llvm-r198893-sparc.diff projects/clang350-import/contrib/llvm/patches/patch-r262261-llvm-r198909-sparc.diff projects/clang350-import/contrib/llvm/patches/patch-r262261-llvm-r198910-sparc.diff projects/clang350-import/contrib/llvm/patches/patch-r262261-llvm-r199014-sparc.diff projects/clang350-import/contrib/llvm/patches/patch-r262261-llvm-r199024-sparc.diff projects/clang350-import/contrib/llvm/patches/patch-r262261-llvm-r199028-sparc.diff projects/clang350-import/contrib/llvm/patches/patch-r262261-llvm-r199031-sparc.diff projects/clang350-import/contrib/llvm/patches/patch-r262261-llvm-r199033-sparc.diff projects/clang350-import/contrib/llvm/patches/patch-r262261-llvm-r199061-sparc.diff projects/clang350-import/contrib/llvm/patches/patch-r262261-llvm-r199186-sparc.diff projects/clang350-import/contrib/llvm/patches/patch-r262261-llvm-r199187-sparc.diff projects/clang350-import/contrib/llvm/patches/patch-r262261-llvm-r199775-sparc.diff projects/clang350-import/contrib/llvm/patches/patch-r262261-llvm-r199781-sparc.diff projects/clang350-import/contrib/llvm/patches/patch-r262261-llvm-r199786-sparc.diff projects/clang350-import/contrib/llvm/patches/patch-r262261-llvm-r199940-sparc.diff projects/clang350-import/contrib/llvm/patches/patch-r262261-llvm-r199974-sparc.diff projects/clang350-import/contrib/llvm/patches/patch-r262261-llvm-r199975-sparc.diff projects/clang350-import/contrib/llvm/patches/patch-r262261-llvm-r199977-sparc.diff projects/clang350-import/contrib/llvm/patches/patch-r262261-llvm-r200103-sparc.diff projects/clang350-import/contrib/llvm/patches/patch-r262261-llvm-r200104-sparc.diff projects/clang350-import/contrib/llvm/patches/patch-r262261-llvm-r200112-sparc.diff projects/clang350-import/contrib/llvm/patches/patch-r262261-llvm-r200130-sparc.diff projects/clang350-import/contrib/llvm/patches/patch-r262261-llvm-r200131-sparc.diff projects/clang350-import/contrib/llvm/patches/patch-r262261-llvm-r200141-sparc.diff projects/clang350-import/contrib/llvm/patches/patch-r262261-llvm-r200282-sparc.diff projects/clang350-import/contrib/llvm/patches/patch-r262261-llvm-r200368-sparc.diff projects/clang350-import/contrib/llvm/patches/patch-r262261-llvm-r200373-sparc.diff projects/clang350-import/contrib/llvm/patches/patch-r262261-llvm-r200376-sparc.diff projects/clang350-import/contrib/llvm/patches/patch-r262261-llvm-r200509-sparc.diff projects/clang350-import/contrib/llvm/patches/patch-r262261-llvm-r200617-sparc.diff projects/clang350-import/contrib/llvm/patches/patch-r262261-llvm-r200960-sparc.diff projects/clang350-import/contrib/llvm/patches/patch-r262261-llvm-r200961-sparc.diff projects/clang350-import/contrib/llvm/patches/patch-r262261-llvm-r200962-sparc.diff projects/clang350-import/contrib/llvm/patches/patch-r262261-llvm-r200963-sparc.diff projects/clang350-import/contrib/llvm/patches/patch-r262261-llvm-r200965-sparc.diff projects/clang350-import/contrib/llvm/patches/patch-r262262-clang-r198311-sparc.diff projects/clang350-import/contrib/llvm/patches/patch-r262262-clang-r198312-sparc.diff projects/clang350-import/contrib/llvm/patches/patch-r262262-clang-r198911-sparc.diff projects/clang350-import/contrib/llvm/patches/patch-r262262-clang-r198912-sparc.diff projects/clang350-import/contrib/llvm/patches/patch-r262262-clang-r198918-sparc.diff projects/clang350-import/contrib/llvm/patches/patch-r262262-clang-r198923-sparc.diff projects/clang350-import/contrib/llvm/patches/patch-r262262-clang-r199012-sparc.diff projects/clang350-import/contrib/llvm/patches/patch-r262262-clang-r199034-sparc.diff projects/clang350-import/contrib/llvm/patches/patch-r262262-clang-r199037-sparc.diff projects/clang350-import/contrib/llvm/patches/patch-r262262-clang-r199188-sparc.diff projects/clang350-import/contrib/llvm/patches/patch-r262262-clang-r199399-sparc.diff projects/clang350-import/contrib/llvm/patches/patch-r262262-clang-r200452-sparc.diff projects/clang350-import/contrib/llvm/patches/patch-r262264-llvm-r200453-sparc.diff projects/clang350-import/contrib/llvm/patches/patch-r262265-llvm-r201718-sparc.diff projects/clang350-import/contrib/llvm/patches/patch-r262303-enable-ppc-integrated-as.diff projects/clang350-import/contrib/llvm/patches/patch-r262415-llvm-r201994-sparc.diff projects/clang350-import/contrib/llvm/patches/patch-r262460-llvm-r202059-sparc.diff projects/clang350-import/contrib/llvm/patches/patch-r262535-clang-r202177-sparc.diff projects/clang350-import/contrib/llvm/patches/patch-r262536-clang-r202179-sparc.diff projects/clang350-import/contrib/llvm/patches/patch-r262582-llvm-r202422-sparc.diff projects/clang350-import/contrib/llvm/patches/patch-r262611-llvm-r196874-fix-invalid-pwd-crash.diff projects/clang350-import/contrib/llvm/patches/patch-r263048-clang-r203624-fix-CC-aliases.diff projects/clang350-import/contrib/llvm/patches/patch-r263312-llvm-r169939-inline-asm-with-realign.diff projects/clang350-import/contrib/llvm/patches/patch-r263312-llvm-r196940-update-inline-asm-test.diff projects/clang350-import/contrib/llvm/patches/patch-r263312-llvm-r196986-allow-realign-alloca.diff projects/clang350-import/contrib/llvm/patches/patch-r263312-llvm-r202930-fix-alloca-esi-clobber.diff projects/clang350-import/contrib/llvm/patches/patch-r263313-llvm-r203311-fix-sse1-oom.diff projects/clang350-import/contrib/llvm/patches/patch-r263619-clang-r201662-arm-gnueabihf.diff projects/clang350-import/contrib/llvm/patches/patch-r264345-dwarf2-freebsd10.diff projects/clang350-import/contrib/llvm/patches/patch-r264826-llvm-r202188-variadic-fn-debug-info.diff projects/clang350-import/contrib/llvm/patches/patch-r264827-clang-r202185-variadic-fn-debug-info.diff projects/clang350-import/contrib/llvm/patches/patch-r265477-clang-r198655-standalone-debug.diff projects/clang350-import/contrib/llvm/patches/patch-r266674-clang-r209489-fix-xmmintrin.diff projects/clang350-import/contrib/llvm/patches/patch-r267704-llvm-r211435-fix-avx-backend.diff projects/clang350-import/contrib/llvm/patches/patch-r267981-llvm-r211435-fix-ppc-fctiduz.diff projects/clang350-import/contrib/llvm/patches/patch-r269387-clang-arm-target-cpu.diff projects/clang350-import/contrib/llvm/patches/patch-r270147-llvm-r197824-r213427-r213960.diff projects/clang350-import/contrib/llvm/patches/patch-r271024-llvm-r216989-r216990-fix-movw-armv6.diff projects/clang350-import/contrib/llvm/patches/patch-r271282-clang-r200797-r200798-r200805-debug-info-crash.diff projects/clang350-import/contrib/llvm/patches/patch-r271432-clang-r205331-debug-info-crash.diff projects/clang350-import/contrib/llvm/patches/patch-r271597-clang-r217410-i386-garbage-float.diff projects/clang350-import/contrib/llvm/patches/patch-r274286-llvm-r201784-asm-dollar.diff projects/clang350-import/contrib/llvm/patches/patch-r274442-llvm-r221709-debug-oom.diff Modified: projects/clang350-import/contrib/llvm/patches/README.TXT Modified: projects/clang350-import/contrib/llvm/patches/README.TXT ============================================================================== --- projects/clang350-import/contrib/llvm/patches/README.TXT Mon Nov 24 18:34:11 2014 (r274970) +++ projects/clang350-import/contrib/llvm/patches/README.TXT Mon Nov 24 18:43:37 2014 (r274971) @@ -1,11 +1,11 @@ This is a set of individual patches, which contain all the customizations to llvm/clang currently in the FreeBSD base system. These can be applied in -alphabetical order to a pristine llvm/clang 3.4 release source tree, for example -by doing: +alphabetical order to a pristine llvm/clang 3.5.0 release source tree, for +example by doing: -svn co https://llvm.org/svn/llvm-project/llvm/tags/RELEASE_34/final llvm-3.4-final -svn co https://llvm.org/svn/llvm-project/cfe/tags/RELEASE_34/final llvm-3.4-final/tools/clang -cd llvm-3.4-final +svn co https://llvm.org/svn/llvm-project/llvm/tags/RELEASE_350/final llvm-3.5.0-final +svn co https://llvm.org/svn/llvm-project/cfe/tags/RELEASE_350/final llvm-3.5.0-final/tools/clang +cd llvm-3.5.0-final for p in /usr/src/contrib/llvm/patches/patch-*.diff; do patch -p0 -f -F0 -E -i $p -s || break done Copied and modified: projects/clang350-import/contrib/llvm/patches/patch-01-clang-version-include.diff (from r274969, projects/clang350-import/contrib/llvm/patches/patch-r208961-clang-version-include.diff) ============================================================================== --- projects/clang350-import/contrib/llvm/patches/patch-r208961-clang-version-include.diff Mon Nov 24 18:11:16 2014 (r274969, copy source) +++ projects/clang350-import/contrib/llvm/patches/patch-01-clang-version-include.diff Mon Nov 24 18:43:37 2014 (r274971) @@ -1,5 +1,5 @@ -This patch adjusts clang's default include paths to add FreeBSD-specific -directories. +This patch adjusts clang's default include path add a FreeBSD base system +specific directory. Introduced here: http://svnweb.freebsd.org/changeset/base/208961 @@ -15,25 +15,13 @@ Index: tools/clang/lib/Frontend/InitHead #include "clang/Config/config.h" // C_INCLUDE_DIRS #include "clang/Lex/HeaderSearch.h" #include "clang/Lex/HeaderSearchOptions.h" -@@ -333,6 +334,9 @@ void InitHeaderSearch::AddDefaultCIncludePaths(con - #endif +@@ -336,6 +337,9 @@ void InitHeaderSearch::AddDefaultCIncludePaths(con + break; } break; + case llvm::Triple::FreeBSD: + AddPath("/usr/include/clang/" CLANG_VERSION_STRING, System, false); + break; - default: break; -@@ -423,11 +427,6 @@ AddDefaultCPlusPlusIncludePaths(const llvm::Triple - else - AddPath("/usr/include/c++/4.4", CXXSystem, false); - break; -- case llvm::Triple::FreeBSD: -- // FreeBSD 8.0 -- // FreeBSD 7.3 -- AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.2", "", "", "", triple); -- break; - case llvm::Triple::OpenBSD: { - std::string t = triple.getTriple(); - if (t.substr(0, 6) == "x86_64") + } Copied and modified: projects/clang350-import/contrib/llvm/patches/patch-02-format-extensions.diff (from r274969, projects/clang350-import/contrib/llvm/patches/patch-r208987-format-extensions.diff) ============================================================================== --- projects/clang350-import/contrib/llvm/patches/patch-r208987-format-extensions.diff Mon Nov 24 18:11:16 2014 (r274969, copy source) +++ projects/clang350-import/contrib/llvm/patches/patch-02-format-extensions.diff Mon Nov 24 18:43:37 2014 (r274971) @@ -3,12 +3,110 @@ which enables additional printf modifier Introduced here: http://svnweb.freebsd.org/changeset/base/208987 +Index: tools/clang/include/clang/Driver/Options.td +=================================================================== +--- tools/clang/include/clang/Driver/Options.td ++++ tools/clang/include/clang/Driver/Options.td +@@ -563,6 +563,8 @@ def fno_rewrite_includes : Flag<["-"], "fno-rewrit + + def ffreestanding : Flag<["-"], "ffreestanding">, Group, Flags<[CC1Option]>, + HelpText<"Assert that the compilation takes place in a freestanding environment">; ++def fformat_extensions: Flag<["-"], "fformat-extensions">, Group, Flags<[CC1Option]>, ++ HelpText<"Enable FreeBSD kernel specific format string extensions">; + def fgnu_keywords : Flag<["-"], "fgnu-keywords">, Group, Flags<[CC1Option]>, + HelpText<"Allow GNU-extension keywords regardless of language standard">; + def fgnu89_inline : Flag<["-"], "fgnu89-inline">, Group, Flags<[CC1Option]>, +Index: tools/clang/include/clang/Basic/LangOptions.def +=================================================================== +--- tools/clang/include/clang/Basic/LangOptions.def ++++ tools/clang/include/clang/Basic/LangOptions.def +@@ -87,6 +87,7 @@ LANGOPT(RTTI , 1, 1, "run-time type i + LANGOPT(RTTIData , 1, 1, "emit run-time type information data") + LANGOPT(MSBitfields , 1, 0, "Microsoft-compatible structure layout") + LANGOPT(Freestanding, 1, 0, "freestanding implementation") ++LANGOPT(FormatExtensions , 1, 0, "FreeBSD format extensions") + LANGOPT(NoBuiltin , 1, 0, "disable builtin functions") + LANGOPT(NoMathBuiltin , 1, 0, "disable math builtin functions") + +Index: tools/clang/include/clang/Analysis/Analyses/FormatString.h +=================================================================== +--- tools/clang/include/clang/Analysis/Analyses/FormatString.h ++++ tools/clang/include/clang/Analysis/Analyses/FormatString.h +@@ -158,6 +158,11 @@ class ConversionSpecifier { + ObjCObjArg, // '@' + ObjCBeg = ObjCObjArg, ObjCEnd = ObjCObjArg, + ++ // FreeBSD specific specifiers ++ FreeBSDbArg, ++ FreeBSDDArg, ++ FreeBSDrArg, ++ + // GlibC specific specifiers. + PrintErrno, // 'm' + +Index: tools/clang/lib/Sema/SemaChecking.cpp +=================================================================== +--- tools/clang/lib/Sema/SemaChecking.cpp ++++ tools/clang/lib/Sema/SemaChecking.cpp +@@ -3074,6 +3074,40 @@ CheckPrintfHandler::HandlePrintfSpecifier(const an + CoveredArgs.set(argIndex); + } + ++ // FreeBSD extensions ++ if (CS.getKind() == ConversionSpecifier::FreeBSDbArg || ++ CS.getKind() == ConversionSpecifier::FreeBSDDArg) { ++ // claim the second argument ++ CoveredArgs.set(argIndex + 1); ++ ++ // Now type check the data expression that matches the ++ // format specifier. ++ const Expr *Ex = getDataArg(argIndex); ++ const analyze_printf::ArgType &AT = ++ (CS.getKind() == ConversionSpecifier::FreeBSDbArg) ? ++ ArgType(S.Context.IntTy) : ArgType::CStrTy; ++ if (AT.isValid() && !AT.matchesType(S.Context, Ex->getType())) ++ S.Diag(getLocationOfByte(CS.getStart()), ++ diag::warn_format_conversion_argument_type_mismatch) ++ << AT.getRepresentativeType(S.Context) << Ex->getType() ++ << getSpecifierRange(startSpecifier, specifierLen) ++ << Ex->getSourceRange(); ++ ++ // Now type check the data expression that matches the ++ // format specifier. ++ Ex = getDataArg(argIndex + 1); ++ const analyze_printf::ArgType &AT2 = ArgType::CStrTy; ++ if (AT2.isValid() && !AT2.matchesType(S.Context, Ex->getType())) ++ S.Diag(getLocationOfByte(CS.getStart()), ++ diag::warn_format_conversion_argument_type_mismatch) ++ << AT2.getRepresentativeType(S.Context) << Ex->getType() ++ << getSpecifierRange(startSpecifier, specifierLen) ++ << Ex->getSourceRange(); ++ ++ return true; ++ } ++ // END OF FREEBSD EXTENSIONS ++ + // Check for using an Objective-C specific conversion specifier + // in a non-ObjC literal. + if (!ObjCContext && CS.isObjCArg()) { +Index: tools/clang/lib/Driver/Tools.cpp +=================================================================== +--- tools/clang/lib/Driver/Tools.cpp ++++ tools/clang/lib/Driver/Tools.cpp +@@ -3517,6 +3517,7 @@ void Clang::ConstructJob(Compilation &C, const Job + + // Forward -f (flag) options which we can pass directly. + Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls); ++ Args.AddLastArg(CmdArgs, options::OPT_fformat_extensions); + Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions); + Args.AddLastArg(CmdArgs, options::OPT_fstandalone_debug); + Args.AddLastArg(CmdArgs, options::OPT_fno_standalone_debug); Index: tools/clang/lib/Frontend/CompilerInvocation.cpp =================================================================== --- tools/clang/lib/Frontend/CompilerInvocation.cpp +++ tools/clang/lib/Frontend/CompilerInvocation.cpp -@@ -1319,6 +1319,7 @@ static void ParseLangArgs(LangOptions &Opts, ArgLi - Opts.ShortWChar = Args.hasArg(OPT_fshort_wchar); +@@ -1443,6 +1443,7 @@ static void ParseLangArgs(LangOptions &Opts, ArgLi + Opts.ShortWChar = Args.hasFlag(OPT_fshort_wchar, OPT_fno_short_wchar, false); Opts.ShortEnums = Args.hasArg(OPT_fshort_enums); Opts.Freestanding = Args.hasArg(OPT_ffreestanding); + Opts.FormatExtensions = Args.hasArg(OPT_fformat_extensions); @@ -114,101 +212,3 @@ Index: tools/clang/lib/Analysis/PrintfFo return true; default: -Index: tools/clang/lib/Sema/SemaChecking.cpp -=================================================================== ---- tools/clang/lib/Sema/SemaChecking.cpp -+++ tools/clang/lib/Sema/SemaChecking.cpp -@@ -2980,6 +2980,40 @@ CheckPrintfHandler::HandlePrintfSpecifier(const an - CoveredArgs.set(argIndex); - } - -+ // FreeBSD extensions -+ if (CS.getKind() == ConversionSpecifier::FreeBSDbArg || -+ CS.getKind() == ConversionSpecifier::FreeBSDDArg) { -+ // claim the second argument -+ CoveredArgs.set(argIndex + 1); -+ -+ // Now type check the data expression that matches the -+ // format specifier. -+ const Expr *Ex = getDataArg(argIndex); -+ const analyze_printf::ArgType &AT = -+ (CS.getKind() == ConversionSpecifier::FreeBSDbArg) ? -+ ArgType(S.Context.IntTy) : ArgType::CStrTy; -+ if (AT.isValid() && !AT.matchesType(S.Context, Ex->getType())) -+ S.Diag(getLocationOfByte(CS.getStart()), -+ diag::warn_printf_conversion_argument_type_mismatch) -+ << AT.getRepresentativeType(S.Context) << Ex->getType() -+ << getSpecifierRange(startSpecifier, specifierLen) -+ << Ex->getSourceRange(); -+ -+ // Now type check the data expression that matches the -+ // format specifier. -+ Ex = getDataArg(argIndex + 1); -+ const analyze_printf::ArgType &AT2 = ArgType::CStrTy; -+ if (AT2.isValid() && !AT2.matchesType(S.Context, Ex->getType())) -+ S.Diag(getLocationOfByte(CS.getStart()), -+ diag::warn_printf_conversion_argument_type_mismatch) -+ << AT2.getRepresentativeType(S.Context) << Ex->getType() -+ << getSpecifierRange(startSpecifier, specifierLen) -+ << Ex->getSourceRange(); -+ -+ return true; -+ } -+ // END OF FREEBSD EXTENSIONS -+ - // Check for using an Objective-C specific conversion specifier - // in a non-ObjC literal. - if (!ObjCContext && CS.isObjCArg()) { -Index: tools/clang/lib/Driver/Tools.cpp -=================================================================== ---- tools/clang/lib/Driver/Tools.cpp -+++ tools/clang/lib/Driver/Tools.cpp -@@ -2991,6 +2991,7 @@ void Clang::ConstructJob(Compilation &C, const Job - - // Forward -f (flag) options which we can pass directly. - Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls); -+ Args.AddLastArg(CmdArgs, options::OPT_fformat_extensions); - Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions); - Args.AddLastArg(CmdArgs, options::OPT_flimit_debug_info); - Args.AddLastArg(CmdArgs, options::OPT_fno_limit_debug_info); -Index: tools/clang/include/clang/Basic/LangOptions.def -=================================================================== ---- tools/clang/include/clang/Basic/LangOptions.def -+++ tools/clang/include/clang/Basic/LangOptions.def -@@ -84,6 +84,7 @@ LANGOPT(TraditionalCPP , 1, 0, "traditional CPP - LANGOPT(RTTI , 1, 1, "run-time type information") - LANGOPT(MSBitfields , 1, 0, "Microsoft-compatible structure layout") - LANGOPT(Freestanding, 1, 0, "freestanding implementation") -+LANGOPT(FormatExtensions , 1, 0, "FreeBSD format extensions") - LANGOPT(NoBuiltin , 1, 0, "disable builtin functions") - LANGOPT(NoMathBuiltin , 1, 0, "disable math builtin functions") - -Index: tools/clang/include/clang/Analysis/Analyses/FormatString.h -=================================================================== ---- tools/clang/include/clang/Analysis/Analyses/FormatString.h -+++ tools/clang/include/clang/Analysis/Analyses/FormatString.h -@@ -158,6 +158,11 @@ class ConversionSpecifier { - ObjCObjArg, // '@' - ObjCBeg = ObjCObjArg, ObjCEnd = ObjCObjArg, - -+ // FreeBSD specific specifiers -+ FreeBSDbArg, -+ FreeBSDDArg, -+ FreeBSDrArg, -+ - // GlibC specific specifiers. - PrintErrno, // 'm' - -Index: tools/clang/include/clang/Driver/Options.td -=================================================================== ---- tools/clang/include/clang/Driver/Options.td -+++ tools/clang/include/clang/Driver/Options.td -@@ -530,6 +530,8 @@ def fno_rewrite_includes : Flag<["-"], "fno-rewrit - - def ffreestanding : Flag<["-"], "ffreestanding">, Group, Flags<[CC1Option]>, - HelpText<"Assert that the compilation takes place in a freestanding environment">; -+def fformat_extensions: Flag<["-"], "fformat-extensions">, Group, Flags<[CC1Option]>, -+ HelpText<"Enable FreeBSD kernel specific format string extensions">; - def fgnu_keywords : Flag<["-"], "fgnu-keywords">, Group, Flags<[CC1Option]>, - HelpText<"Allow GNU-extension keywords regardless of language standard">; - def fgnu89_inline : Flag<["-"], "fgnu89-inline">, Group, Flags<[CC1Option]>, Copied and modified: projects/clang350-import/contrib/llvm/patches/patch-03-clang-vendor-suffix.diff (from r274969, projects/clang350-import/contrib/llvm/patches/patch-r209107-clang-vendor-suffix.diff) ============================================================================== --- projects/clang350-import/contrib/llvm/patches/patch-r209107-clang-vendor-suffix.diff Mon Nov 24 18:11:16 2014 (r274969, copy source) +++ projects/clang350-import/contrib/llvm/patches/patch-03-clang-vendor-suffix.diff Mon Nov 24 18:43:37 2014 (r274971) @@ -8,8 +8,8 @@ Index: tools/clang/lib/Basic/Version.cpp =================================================================== --- tools/clang/lib/Basic/Version.cpp +++ tools/clang/lib/Basic/Version.cpp -@@ -124,8 +124,10 @@ std::string getClangFullVersion() { - OS << "clang version " CLANG_VERSION_STRING " " +@@ -128,8 +128,10 @@ std::string getClangToolFullVersion(StringRef Tool + OS << ToolName << " version " CLANG_VERSION_STRING " " << getClangFullRepositoryVersion(); +#ifdef CLANG_VENDOR_SUFFIX @@ -17,6 +17,6 @@ Index: tools/clang/lib/Basic/Version.cpp +#elif defined(CLANG_VENDOR) // If vendor supplied, include the base LLVM version as well. -#ifdef CLANG_VENDOR - OS << " (based on LLVM " << PACKAGE_VERSION << ")"; + OS << " (based on " << BACKEND_PACKAGE_STRING << ")"; #endif Copied and modified: projects/clang350-import/contrib/llvm/patches/patch-04-default-target-triple.diff (from r274969, projects/clang350-import/contrib/llvm/patches/patch-r221503-default-target-triple.diff) ============================================================================== --- projects/clang350-import/contrib/llvm/patches/patch-r221503-default-target-triple.diff Mon Nov 24 18:11:16 2014 (r274969, copy source) +++ projects/clang350-import/contrib/llvm/patches/patch-04-default-target-triple.diff Mon Nov 24 18:43:37 2014 (r274971) @@ -21,6 +21,6 @@ Index: lib/Support/Unix/Host.inc @@ -61,3 +66,4 @@ std::string sys::getDefaultTargetTriple() { - return Triple; + return Triple::normalize(Triple); } +#endif // __FreeBSD__ Copied and modified: projects/clang350-import/contrib/llvm/patches/patch-05-add-CC-aliases.diff (from r274969, projects/clang350-import/contrib/llvm/patches/patch-r257109-add-CC-aliases.diff) ============================================================================== --- projects/clang350-import/contrib/llvm/patches/patch-r257109-add-CC-aliases.diff Mon Nov 24 18:11:16 2014 (r274969, copy source) +++ projects/clang350-import/contrib/llvm/patches/patch-05-add-CC-aliases.diff Mon Nov 24 18:43:37 2014 (r274971) @@ -7,19 +7,17 @@ Index: tools/clang/tools/driver/driver.c =================================================================== --- tools/clang/tools/driver/driver.cpp +++ tools/clang/tools/driver/driver.cpp -@@ -215,6 +215,7 @@ static void ParseProgName(SmallVectorImplgetOperand(OpNo); ++ const MCSymbolRefExpr &refExp = cast(*Op.getExpr()); ++ O << refExp.getSymbol().getName(); + O << '('; + printOperand(MI, OpNo+1, O); + O << ')'; ++ if (refExp.getKind() != MCSymbolRefExpr::VK_None) ++ O << '@' << MCSymbolRefExpr::getVariantKindName(refExp.getKind()); + } + + +Index: lib/Target/PowerPC/PPCInstrInfo.td +=================================================================== +--- lib/Target/PowerPC/PPCInstrInfo.td ++++ lib/Target/PowerPC/PPCInstrInfo.td +@@ -588,6 +588,12 @@ def tlsreg32 : Operand { + let EncoderMethod = "getTLSRegEncoding"; + let ParserMatchClass = PPCTLSRegOperand; + } ++def tlsgd32 : Operand {} ++def tlscall32 : Operand { ++ let PrintMethod = "printTLSCall"; ++ let MIOperandInfo = (ops calltarget:$func, tlsgd32:$sym); ++ let EncoderMethod = "getTLSCallEncoding"; ++} + + // PowerPC Predicate operand. + def pred : Operand { +@@ -1071,6 +1077,8 @@ let isCall = 1, PPC970_Unit = 7, Defs = [LR] in { + "bla $func", IIC_BrB, [(PPCcall (i32 imm:$func))]>; + + let isCodeGenOnly = 1 in { ++ def BL_TLS : IForm<18, 0, 1, (outs), (ins tlscall32:$func), ++ "bl $func", IIC_BrB, []>; + def BCCL : BForm<16, 0, 1, (outs), (ins pred:$cond, condbrtarget:$dst), + "b${cond:cc}l${cond:pm} ${cond:reg}, $dst">; + def BCCLA : BForm<16, 1, 1, (outs), (ins pred:$cond, abscondbrtarget:$dst), +@@ -2396,13 +2404,45 @@ def : Pat<(add i32:$in, (PPChi tblockaddress:$g, 0 + def PPC32GOT: Pseudo<(outs gprc:$rD), (ins), "#PPC32GOT", + [(set i32:$rD, (PPCppc32GOT))]>; + ++// Get the _GLOBAL_OFFSET_TABLE_ in PIC mode. ++// This uses two output registers, the first as the real output, the second as a ++// temporary register, used internally in code generation. ++def PPC32PICGOT: Pseudo<(outs gprc:$rD, gprc:$rT), (ins), "#PPC32PICGOT", ++ []>, NoEncode<"$rT">; ++ + def LDgotTprelL32: Pseudo<(outs gprc:$rD), (ins s16imm:$disp, gprc_nor0:$reg), +- "#LDgotTprelL32", +- [(set i32:$rD, +- (PPCldGotTprelL tglobaltlsaddr:$disp, i32:$reg))]>; ++ "#LDgotTprelL32", ++ [(set i32:$rD, ++ (PPCldGotTprelL tglobaltlsaddr:$disp, i32:$reg))]>; + def : Pat<(PPCaddTls i32:$in, tglobaltlsaddr:$g), + (ADD4TLS $in, tglobaltlsaddr:$g)>; + ++def ADDItlsgdL32 : Pseudo<(outs gprc:$rD), (ins gprc_nor0:$reg, s16imm:$disp), ++ "#ADDItlsgdL32", ++ [(set i32:$rD, ++ (PPCaddiTlsgdL i32:$reg, tglobaltlsaddr:$disp))]>; ++def GETtlsADDR32 : Pseudo<(outs gprc:$rD), (ins gprc:$reg, tlsgd32:$sym), ++ "#GETtlsADDR32", ++ [(set i32:$rD, ++ (PPCgetTlsAddr i32:$reg, tglobaltlsaddr:$sym))]>; ++def ADDItlsldL32 : Pseudo<(outs gprc:$rD), (ins gprc_nor0:$reg, s16imm:$disp), ++ "#ADDItlsldL32", ++ [(set i32:$rD, ++ (PPCaddiTlsldL i32:$reg, tglobaltlsaddr:$disp))]>; ++def GETtlsldADDR32 : Pseudo<(outs gprc:$rD), (ins gprc:$reg, tlsgd32:$sym), ++ "#GETtlsldADDR32", ++ [(set i32:$rD, ++ (PPCgetTlsldAddr i32:$reg, tglobaltlsaddr:$sym))]>; ++def ADDIdtprelL32 : Pseudo<(outs gprc:$rD), (ins gprc_nor0:$reg, s16imm:$disp), ++ "#ADDIdtprelL32", ++ [(set i32:$rD, ++ (PPCaddiDtprelL i32:$reg, tglobaltlsaddr:$disp))]>; ++def ADDISdtprelHA32 : Pseudo<(outs gprc:$rD), (ins gprc_nor0:$reg, s16imm:$disp), ++ "#ADDISdtprelHA32", ++ [(set i32:$rD, ++ (PPCaddisDtprelHA i32:$reg, ++ tglobaltlsaddr:$disp))]>; ++ + // Support for Position-independent code + def LWZtoc: Pseudo<(outs gprc:$rD), (ins tocentry32:$disp, gprc:$reg), + "#LWZtoc", +Index: lib/Target/PowerPC/PPCISelLowering.cpp +=================================================================== +--- lib/Target/PowerPC/PPCISelLowering.cpp ++++ lib/Target/PowerPC/PPCISelLowering.cpp +@@ -1685,47 +1685,61 @@ SDValue PPCTargetLowering::LowerGlobalTLSAddress(S + + if (Model == TLSModel::GeneralDynamic) { + SDValue TGA = DAG.getTargetGlobalAddress(GV, dl, PtrVT, 0, 0); +- SDValue GOTReg = DAG.getRegister(PPC::X2, MVT::i64); +- SDValue GOTEntryHi = DAG.getNode(PPCISD::ADDIS_TLSGD_HA, dl, PtrVT, +- GOTReg, TGA); ++ SDValue GOTPtr; ++ if (is64bit) { ++ SDValue GOTReg = DAG.getRegister(PPC::X2, MVT::i64); ++ GOTPtr = DAG.getNode(PPCISD::ADDIS_TLSGD_HA, dl, PtrVT, ++ GOTReg, TGA); ++ } else { ++ GOTPtr = DAG.getNode(PPCISD::PPC32_PICGOT, dl, PtrVT); ++ } + SDValue GOTEntry = DAG.getNode(PPCISD::ADDI_TLSGD_L, dl, PtrVT, +- GOTEntryHi, TGA); ++ GOTPtr, TGA); + + // We need a chain node, and don't have one handy. The underlying + // call has no side effects, so using the function entry node + // suffices. + SDValue Chain = DAG.getEntryNode(); +- Chain = DAG.getCopyToReg(Chain, dl, PPC::X3, GOTEntry); +- SDValue ParmReg = DAG.getRegister(PPC::X3, MVT::i64); ++ Chain = DAG.getCopyToReg(Chain, dl, ++ is64bit ? PPC::X3 : PPC::R3, GOTEntry); ++ SDValue ParmReg = DAG.getRegister(is64bit ? PPC::X3 : PPC::R3, ++ is64bit ? MVT::i64 : MVT::i32); + SDValue TLSAddr = DAG.getNode(PPCISD::GET_TLS_ADDR, dl, + PtrVT, ParmReg, TGA); + // The return value from GET_TLS_ADDR really is in X3 already, but + // some hacks are needed here to tie everything together. The extra + // copies dissolve during subsequent transforms. +- Chain = DAG.getCopyToReg(Chain, dl, PPC::X3, TLSAddr); +- return DAG.getCopyFromReg(Chain, dl, PPC::X3, PtrVT); ++ Chain = DAG.getCopyToReg(Chain, dl, is64bit ? PPC::X3 : PPC::R3, TLSAddr); ++ return DAG.getCopyFromReg(Chain, dl, is64bit ? PPC::X3 : PPC::R3, PtrVT); + } + + if (Model == TLSModel::LocalDynamic) { + SDValue TGA = DAG.getTargetGlobalAddress(GV, dl, PtrVT, 0, 0); +- SDValue GOTReg = DAG.getRegister(PPC::X2, MVT::i64); +- SDValue GOTEntryHi = DAG.getNode(PPCISD::ADDIS_TLSLD_HA, dl, PtrVT, +- GOTReg, TGA); ++ SDValue GOTPtr; ++ if (is64bit) { ++ SDValue GOTReg = DAG.getRegister(PPC::X2, MVT::i64); ++ GOTPtr = DAG.getNode(PPCISD::ADDIS_TLSLD_HA, dl, PtrVT, ++ GOTReg, TGA); ++ } else { ++ GOTPtr = DAG.getNode(PPCISD::PPC32_PICGOT, dl, PtrVT); ++ } + SDValue GOTEntry = DAG.getNode(PPCISD::ADDI_TLSLD_L, dl, PtrVT, +- GOTEntryHi, TGA); ++ GOTPtr, TGA); + + // We need a chain node, and don't have one handy. The underlying + // call has no side effects, so using the function entry node + // suffices. + SDValue Chain = DAG.getEntryNode(); +- Chain = DAG.getCopyToReg(Chain, dl, PPC::X3, GOTEntry); +- SDValue ParmReg = DAG.getRegister(PPC::X3, MVT::i64); ++ Chain = DAG.getCopyToReg(Chain, dl, ++ is64bit ? PPC::X3 : PPC::R3, GOTEntry); ++ SDValue ParmReg = DAG.getRegister(is64bit ? PPC::X3 : PPC::R3, ++ is64bit ? MVT::i64 : MVT::i32); + SDValue TLSAddr = DAG.getNode(PPCISD::GET_TLSLD_ADDR, dl, + PtrVT, ParmReg, TGA); + // The return value from GET_TLSLD_ADDR really is in X3 already, but + // some hacks are needed here to tie everything together. The extra + // copies dissolve during subsequent transforms. +- Chain = DAG.getCopyToReg(Chain, dl, PPC::X3, TLSAddr); ++ Chain = DAG.getCopyToReg(Chain, dl, is64bit ? PPC::X3 : PPC::R3, TLSAddr); + SDValue DtvOffsetHi = DAG.getNode(PPCISD::ADDIS_DTPREL_HA, dl, PtrVT, + Chain, ParmReg, TGA); + return DAG.getNode(PPCISD::ADDI_DTPREL_L, dl, PtrVT, DtvOffsetHi, TGA); +Index: lib/Target/PowerPC/MCTargetDesc/PPCELFObjectWriter.cpp +=================================================================== +--- lib/Target/PowerPC/MCTargetDesc/PPCELFObjectWriter.cpp ++++ lib/Target/PowerPC/MCTargetDesc/PPCELFObjectWriter.cpp +@@ -236,7 +236,10 @@ unsigned PPCELFObjectWriter::getRelocTypeInner(con + Type = ELF::R_PPC64_DTPREL16_HIGHESTA; + break; + case MCSymbolRefExpr::VK_PPC_GOT_TLSGD: +- Type = ELF::R_PPC64_GOT_TLSGD16; ++ if (is64Bit()) ++ Type = ELF::R_PPC64_GOT_TLSGD16; ++ else ++ Type = ELF::R_PPC_GOT_TLSGD16; + break; + case MCSymbolRefExpr::VK_PPC_GOT_TLSGD_LO: + Type = ELF::R_PPC64_GOT_TLSGD16_LO; +@@ -248,7 +251,10 @@ unsigned PPCELFObjectWriter::getRelocTypeInner(con + Type = ELF::R_PPC64_GOT_TLSGD16_HA; + break; + case MCSymbolRefExpr::VK_PPC_GOT_TLSLD: +- Type = ELF::R_PPC64_GOT_TLSLD16; ++ if (is64Bit()) ++ Type = ELF::R_PPC64_GOT_TLSLD16; ++ else ++ Type = ELF::R_PPC_GOT_TLSLD16; + break; + case MCSymbolRefExpr::VK_PPC_GOT_TLSLD_LO: + Type = ELF::R_PPC64_GOT_TLSLD16_LO; +@@ -344,13 +350,22 @@ unsigned PPCELFObjectWriter::getRelocTypeInner(con + switch (Modifier) { + default: llvm_unreachable("Unsupported Modifier"); + case MCSymbolRefExpr::VK_PPC_TLSGD: +- Type = ELF::R_PPC64_TLSGD; ++ if (is64Bit()) ++ Type = ELF::R_PPC64_TLSGD; ++ else ++ Type = ELF::R_PPC_TLSGD; + break; + case MCSymbolRefExpr::VK_PPC_TLSLD: +- Type = ELF::R_PPC64_TLSLD; ++ if (is64Bit()) ++ Type = ELF::R_PPC64_TLSLD; ++ else ++ Type = ELF::R_PPC_TLSLD; + break; + case MCSymbolRefExpr::VK_PPC_TLS: +- Type = ELF::R_PPC64_TLS; ++ if (is64Bit()) ++ Type = ELF::R_PPC64_TLS; ++ else ++ Type = ELF::R_PPC_TLS; + break; + } + break; +Index: lib/Target/PowerPC/PPCAsmPrinter.cpp +=================================================================== +--- lib/Target/PowerPC/PPCAsmPrinter.cpp ++++ lib/Target/PowerPC/PPCAsmPrinter.cpp +@@ -573,6 +573,34 @@ void PPCAsmPrinter::EmitInstruction(const MachineI + return; + } + ++ case PPC::PPC32PICGOT: { ++ MCSymbol *GOTSymbol = OutContext.GetOrCreateSymbol(StringRef("_GLOBAL_OFFSET_TABLE_")); ++ MCSymbol *GOTRef = OutContext.CreateTempSymbol(); ++ MCSymbol *NextInstr = OutContext.CreateTempSymbol(); ++ ++ EmitToStreamer(OutStreamer, MCInstBuilder(PPC::BL) ++ // FIXME: We would like an efficient form for this, so we don't have to do ++ // a lot of extra uniquing. ++ .addExpr(MCSymbolRefExpr::Create(NextInstr, OutContext))); ++ const MCExpr *OffsExpr = ++ MCBinaryExpr::CreateSub(MCSymbolRefExpr::Create(GOTSymbol, OutContext), ++ MCSymbolRefExpr::Create(GOTRef, OutContext), ++ OutContext); ++ OutStreamer.EmitLabel(GOTRef); ++ OutStreamer.EmitValue(OffsExpr, 4); ++ OutStreamer.EmitLabel(NextInstr); ++ EmitToStreamer(OutStreamer, MCInstBuilder(PPC::MFLR) ++ .addReg(MI->getOperand(0).getReg())); ++ EmitToStreamer(OutStreamer, MCInstBuilder(PPC::LWZ) ++ .addReg(MI->getOperand(1).getReg()) ++ .addImm(0) ++ .addReg(MI->getOperand(0).getReg())); ++ EmitToStreamer(OutStreamer, MCInstBuilder(PPC::ADD4) ++ .addReg(MI->getOperand(0).getReg()) ++ .addReg(MI->getOperand(1).getReg()) ++ .addReg(MI->getOperand(0).getReg())); ++ return; ++ } + case PPC::PPC32GOT: { + MCSymbol *GOTSymbol = OutContext.GetOrCreateSymbol(StringRef("_GLOBAL_OFFSET_TABLE_")); + const MCExpr *SymGotTlsL = +@@ -606,31 +634,43 @@ void PPCAsmPrinter::EmitInstruction(const MachineI + .addExpr(SymGotTlsGD)); + return; + } +- case PPC::ADDItlsgdL: { ++ case PPC::ADDItlsgdL: + // Transform: %Xd = ADDItlsgdL %Xs, + // Into: %Xd = ADDI8 %Xs, sym@got@tlsgd@l +- assert(Subtarget.isPPC64() && "Not supported for 32-bit PowerPC"); ++ case PPC::ADDItlsgdL32: { ++ // Transform: %Rd = ADDItlsgdL32 %Rs, ++ // Into: %Rd = ADDI %Rs, sym@got@tlsgd + const MachineOperand &MO = MI->getOperand(2); + const GlobalValue *GValue = MO.getGlobal(); + MCSymbol *MOSymbol = getSymbol(GValue); + const MCExpr *SymGotTlsGD = +- MCSymbolRefExpr::Create(MOSymbol, MCSymbolRefExpr::VK_PPC_GOT_TLSGD_LO, ++ MCSymbolRefExpr::Create(MOSymbol, Subtarget.isPPC64() ? ++ MCSymbolRefExpr::VK_PPC_GOT_TLSGD_LO : ++ MCSymbolRefExpr::VK_PPC_GOT_TLSGD, + OutContext); +- EmitToStreamer(OutStreamer, MCInstBuilder(PPC::ADDI8) +- .addReg(MI->getOperand(0).getReg()) +- .addReg(MI->getOperand(1).getReg()) +- .addExpr(SymGotTlsGD)); ++ EmitToStreamer(OutStreamer, ++ MCInstBuilder(Subtarget.isPPC64() ? PPC::ADDI8 : PPC::ADDI) ++ .addReg(MI->getOperand(0).getReg()) ++ .addReg(MI->getOperand(1).getReg()) ++ .addExpr(SymGotTlsGD)); + return; + } +- case PPC::GETtlsADDR: { ++ case PPC::GETtlsADDR: + // Transform: %X3 = GETtlsADDR %X3, + // Into: BL8_NOP_TLS __tls_get_addr(sym@tlsgd) +- assert(Subtarget.isPPC64() && "Not supported for 32-bit PowerPC"); ++ case PPC::GETtlsADDR32: { ++ // Transform: %R3 = GETtlsADDR32 %R3, ++ // Into: BL_TLS __tls_get_addr(sym@tlsgd)@PLT + + StringRef Name = "__tls_get_addr"; + MCSymbol *TlsGetAddr = OutContext.GetOrCreateSymbol(Name); ++ MCSymbolRefExpr::VariantKind Kind = MCSymbolRefExpr::VK_None; ++ ++ if (!Subtarget.isPPC64() && !Subtarget.isDarwin() && ++ TM.getRelocationModel() == Reloc::PIC_) ++ Kind = MCSymbolRefExpr::VK_PLT; + const MCSymbolRefExpr *TlsRef = +- MCSymbolRefExpr::Create(TlsGetAddr, MCSymbolRefExpr::VK_None, OutContext); ++ MCSymbolRefExpr::Create(TlsGetAddr, Kind, OutContext); + const MachineOperand &MO = MI->getOperand(2); + const GlobalValue *GValue = MO.getGlobal(); + MCSymbol *MOSymbol = getSymbol(GValue); +@@ -637,9 +677,11 @@ void PPCAsmPrinter::EmitInstruction(const MachineI + const MCExpr *SymVar = + MCSymbolRefExpr::Create(MOSymbol, MCSymbolRefExpr::VK_PPC_TLSGD, + OutContext); +- EmitToStreamer(OutStreamer, MCInstBuilder(PPC::BL8_NOP_TLS) +- .addExpr(TlsRef) +- .addExpr(SymVar)); ++ EmitToStreamer(OutStreamer, ++ MCInstBuilder(Subtarget.isPPC64() ? ++ PPC::BL8_NOP_TLS : PPC::BL_TLS) ++ .addExpr(TlsRef) ++ .addExpr(SymVar)); + return; + } + case PPC::ADDIStlsldHA: { +@@ -658,31 +700,44 @@ void PPCAsmPrinter::EmitInstruction(const MachineI + .addExpr(SymGotTlsLD)); + return; + } +- case PPC::ADDItlsldL: { ++ case PPC::ADDItlsldL: + // Transform: %Xd = ADDItlsldL %Xs, + // Into: %Xd = ADDI8 %Xs, sym@got@tlsld@l +- assert(Subtarget.isPPC64() && "Not supported for 32-bit PowerPC"); ++ case PPC::ADDItlsldL32: { ++ // Transform: %Rd = ADDItlsldL32 %Rs, ++ // Into: %Rd = ADDI %Rs, sym@got@tlsld + const MachineOperand &MO = MI->getOperand(2); + const GlobalValue *GValue = MO.getGlobal(); + MCSymbol *MOSymbol = getSymbol(GValue); + const MCExpr *SymGotTlsLD = +- MCSymbolRefExpr::Create(MOSymbol, MCSymbolRefExpr::VK_PPC_GOT_TLSLD_LO, ++ MCSymbolRefExpr::Create(MOSymbol, Subtarget.isPPC64() ? ++ MCSymbolRefExpr::VK_PPC_GOT_TLSLD_LO : ++ MCSymbolRefExpr::VK_PPC_GOT_TLSLD, + OutContext); +- EmitToStreamer(OutStreamer, MCInstBuilder(PPC::ADDI8) +- .addReg(MI->getOperand(0).getReg()) +- .addReg(MI->getOperand(1).getReg()) +- .addExpr(SymGotTlsLD)); ++ EmitToStreamer(OutStreamer, ++ MCInstBuilder(Subtarget.isPPC64() ? PPC::ADDI8 : PPC::ADDI) ++ .addReg(MI->getOperand(0).getReg()) ++ .addReg(MI->getOperand(1).getReg()) ++ .addExpr(SymGotTlsLD)); + return; + } +- case PPC::GETtlsldADDR: { ++ case PPC::GETtlsldADDR: + // Transform: %X3 = GETtlsldADDR %X3, + // Into: BL8_NOP_TLS __tls_get_addr(sym@tlsld) +- assert(Subtarget.isPPC64() && "Not supported for 32-bit PowerPC"); ++ case PPC::GETtlsldADDR32: { ++ // Transform: %R3 = GETtlsldADDR32 %R3, ++ // Into: BL_TLS __tls_get_addr(sym@tlsld)@PLT + + StringRef Name = "__tls_get_addr"; + MCSymbol *TlsGetAddr = OutContext.GetOrCreateSymbol(Name); ++ MCSymbolRefExpr::VariantKind Kind = MCSymbolRefExpr::VK_None; ++ ++ if (!Subtarget.isPPC64() && !Subtarget.isDarwin() && ++ TM.getRelocationModel() == Reloc::PIC_) ++ Kind = MCSymbolRefExpr::VK_PLT; ++ + const MCSymbolRefExpr *TlsRef = +- MCSymbolRefExpr::Create(TlsGetAddr, MCSymbolRefExpr::VK_None, OutContext); ++ MCSymbolRefExpr::Create(TlsGetAddr, Kind, OutContext); + const MachineOperand &MO = MI->getOperand(2); + const GlobalValue *GValue = MO.getGlobal(); + MCSymbol *MOSymbol = getSymbol(GValue); +@@ -689,15 +744,19 @@ void PPCAsmPrinter::EmitInstruction(const MachineI + const MCExpr *SymVar = + MCSymbolRefExpr::Create(MOSymbol, MCSymbolRefExpr::VK_PPC_TLSLD, + OutContext); +- EmitToStreamer(OutStreamer, MCInstBuilder(PPC::BL8_NOP_TLS) +- .addExpr(TlsRef) +- .addExpr(SymVar)); ++ EmitToStreamer(OutStreamer, ++ MCInstBuilder(Subtarget.isPPC64() ? ++ PPC::BL8_NOP_TLS : PPC::BL_TLS) ++ .addExpr(TlsRef) ++ .addExpr(SymVar)); + return; + } +- case PPC::ADDISdtprelHA: { ++ case PPC::ADDISdtprelHA: + // Transform: %Xd = ADDISdtprelHA %X3, + // Into: %Xd = ADDIS8 %X3, sym@dtprel@ha +- assert(Subtarget.isPPC64() && "Not supported for 32-bit PowerPC"); ++ case PPC::ADDISdtprelHA32: { ++ // Transform: %Rd = ADDISdtprelHA32 %R3, ++ // Into: %Rd = ADDIS %R3, sym@dtprel@ha + const MachineOperand &MO = MI->getOperand(2); + const GlobalValue *GValue = MO.getGlobal(); + MCSymbol *MOSymbol = getSymbol(GValue); +@@ -704,16 +763,19 @@ void PPCAsmPrinter::EmitInstruction(const MachineI + const MCExpr *SymDtprel = + MCSymbolRefExpr::Create(MOSymbol, MCSymbolRefExpr::VK_PPC_DTPREL_HA, + OutContext); +- EmitToStreamer(OutStreamer, MCInstBuilder(PPC::ADDIS8) +- .addReg(MI->getOperand(0).getReg()) +- .addReg(PPC::X3) +- .addExpr(SymDtprel)); ++ EmitToStreamer(OutStreamer, ++ MCInstBuilder(Subtarget.isPPC64() ? PPC::ADDIS8 : PPC::ADDIS) ++ .addReg(MI->getOperand(0).getReg()) ++ .addReg(Subtarget.isPPC64() ? PPC::X3 : PPC::R3) ++ .addExpr(SymDtprel)); + return; + } +- case PPC::ADDIdtprelL: { ++ case PPC::ADDIdtprelL: + // Transform: %Xd = ADDIdtprelL %Xs, + // Into: %Xd = ADDI8 %Xs, sym@dtprel@l +- assert(Subtarget.isPPC64() && "Not supported for 32-bit PowerPC"); ++ case PPC::ADDIdtprelL32: { ++ // Transform: %Rd = ADDIdtprelL32 %Rs, ++ // Into: %Rd = ADDI %Rs, sym@dtprel@l + const MachineOperand &MO = MI->getOperand(2); + const GlobalValue *GValue = MO.getGlobal(); + MCSymbol *MOSymbol = getSymbol(GValue); +@@ -720,10 +782,11 @@ void PPCAsmPrinter::EmitInstruction(const MachineI + const MCExpr *SymDtprel = + MCSymbolRefExpr::Create(MOSymbol, MCSymbolRefExpr::VK_PPC_DTPREL_LO, + OutContext); +- EmitToStreamer(OutStreamer, MCInstBuilder(PPC::ADDI8) +- .addReg(MI->getOperand(0).getReg()) +- .addReg(MI->getOperand(1).getReg()) +- .addExpr(SymDtprel)); ++ EmitToStreamer(OutStreamer, ++ MCInstBuilder(Subtarget.isPPC64() ? PPC::ADDI8 : PPC::ADDI) ++ .addReg(MI->getOperand(0).getReg()) ++ .addReg(MI->getOperand(1).getReg()) ++ .addExpr(SymDtprel)); + return; + } + case PPC::MFOCRF: +Index: lib/Target/PowerPC/PPCISelDAGToDAG.cpp +=================================================================== +--- lib/Target/PowerPC/PPCISelDAGToDAG.cpp ++++ lib/Target/PowerPC/PPCISelDAGToDAG.cpp +@@ -1473,6 +1473,12 @@ SDNode *PPCDAGToDAGISel::Select(SDNode *N) { + return CurDAG->getMachineNode(PPC::ADDItocL, dl, MVT::i64, + SDValue(Tmp, 0), GA); + } ++ case PPCISD::PPC32_PICGOT: { ++ // Generate a PIC-safe GOT reference. ++ assert(!PPCSubTarget->isPPC64() && PPCSubTarget->isSVR4ABI() && ++ "PPCISD::PPC32_PICGOT is only supported for 32-bit SVR4"); ++ return CurDAG->SelectNodeTo(N, PPC::PPC32PICGOT, PPCLowering->getPointerTy(), MVT::i32); ++ } + case PPCISD::VADD_SPLAT: { + // This expands into one of three sequences, depending on whether + // the first operand is odd or even, positive or negative. +Index: test/CodeGen/PowerPC/tls-pic.ll +=================================================================== +--- test/CodeGen/PowerPC/tls-pic.ll ++++ test/CodeGen/PowerPC/tls-pic.ll +@@ -1,5 +1,7 @@ + ; RUN: llc -march=ppc64 -mcpu=pwr7 -O0 -relocation-model=pic < %s | FileCheck -check-prefix=OPT0 %s + ; RUN: llc -march=ppc64 -mcpu=pwr7 -O1 -relocation-model=pic < %s | FileCheck -check-prefix=OPT1 %s ++; RUN: llc -march=ppc32 -O0 -relocation-model=pic < %s | FileCheck -check-prefix=OPT0-32 %s ++; RUN: llc -march=ppc32 -O1 -relocation-model=pic < %s | FileCheck -check-prefix=OPT1-32 %s + + target triple = "powerpc64-unknown-linux-gnu" + ; Test correct assembly code generation for thread-local storage using +@@ -22,6 +24,16 @@ entry: + ; OPT0-NEXT: nop + ; OPT0: addis [[REG2:[0-9]+]], 3, a@dtprel@ha + ; OPT0-NEXT: addi {{[0-9]+}}, [[REG2]], a@dtprel@l ++; OPT0-32-LABEL: main ++; OPT0-32: addi {{[0-9]+}}, {{[0-9]+}}, a@got@tlsld ++; OPT0-32: bl __tls_get_addr(a@tlsld)@PLT ++; OPT0-32: addis [[REG:[0-9]+]], 3, a@dtprel@ha ++; OPT0-32-NEXT: addi {{[0-9]+}}, [[REG]], a@dtprel@l ++; OPT1-32-LABEL: main ++; OPT1-32: addi 3, {{[0-9]+}}, a@got@tlsld ++; OPT1-32: bl __tls_get_addr(a@tlsld)@PLT ++; OPT1-32: addis [[REG:[0-9]+]], 3, a@dtprel@ha ++; OPT1-32-NEXT: addi {{[0-9]+}}, [[REG]], a@dtprel@l + + ; Test peephole optimization for thread-local storage using the + ; local dynamic model. +@@ -52,4 +64,6 @@ entry: + ; OPT1-NEXT: addi 3, [[REG]], a2@got@tlsgd@l + ; OPT1: bl __tls_get_addr(a2@tlsgd) + ; OPT1-NEXT: nop +- ++; OPT1-32-LABEL: main2 ++; OPT1-32: addi 3, {{[0-9]+}}, a2@got@tlsgd ++; OPT1-32: bl __tls_get_addr(a2@tlsgd)@PLT Copied and modified: projects/clang350-import/contrib/llvm/patches/patch-08-llvm-r216989-r216990-fix-movw-armv6.diff (from r274969, projects/clang350-import/contrib/llvm/patches/patch-r271024-llvm-r216989-r216990-fix-movw-armv6.diff) ============================================================================== --- projects/clang350-import/contrib/llvm/patches/patch-r271024-llvm-r216989-r216990-fix-movw-armv6.diff Mon Nov 24 18:11:16 2014 (r274969, copy source) +++ projects/clang350-import/contrib/llvm/patches/patch-08-llvm-r216989-r216990-fix-movw-armv6.diff Mon Nov 24 18:43:37 2014 (r274971) @@ -17,7 +17,7 @@ Index: lib/Target/ARM/ARMInstrInfo.td =================================================================== --- lib/Target/ARM/ARMInstrInfo.td +++ lib/Target/ARM/ARMInstrInfo.td -@@ -3248,7 +3248,8 @@ +@@ -3419,7 +3419,8 @@ def : ARMPat<(ARMaddc GPR:$src, imm0_65535_neg:$im def : ARMPat<(ARMadde GPR:$src, so_imm_not:$imm, CPSR), (SBCri GPR:$src, so_imm_not:$imm)>; def : ARMPat<(ARMadde GPR:$src, imm0_65535_neg:$imm, CPSR), @@ -32,7 +32,7 @@ Index: test/CodeGen/ARM/carry.ll --- test/CodeGen/ARM/carry.ll +++ test/CodeGen/ARM/carry.ll @@ -1,4 +1,4 @@ --; RUN: llc < %s -march=arm | FileCheck %s +-; RUN: llc -mtriple=arm-eabi %s -o - | FileCheck %s +; RUN: llc < %s -mtriple=armv6t2-eabi | FileCheck %s define i64 @f1(i64 %a, i64 %b) { Copied and modified: projects/clang350-import/contrib/llvm/patches/patch-09-clang-r217410-i386-garbage-float.diff (from r274969, projects/clang350-import/contrib/llvm/patches/patch-r271597-clang-r217410-i386-garbage-float.diff) ============================================================================== --- projects/clang350-import/contrib/llvm/patches/patch-r271597-clang-r217410-i386-garbage-float.diff Mon Nov 24 18:11:16 2014 (r274969, copy source) +++ projects/clang350-import/contrib/llvm/patches/patch-09-clang-r217410-i386-garbage-float.diff Mon Nov 24 18:43:37 2014 (r274971) @@ -17,9 +17,9 @@ Introduced here: http://svnweb.freebsd.o Index: lib/Target/X86/X86ISelLowering.cpp =================================================================== ---- lib/Target/X86/X86ISelLowering.cpp (revision 208032) -+++ lib/Target/X86/X86ISelLowering.cpp (working copy) -@@ -300,6 +300,8 @@ void X86TargetLowering::resetOperationActions() { +--- lib/Target/X86/X86ISelLowering.cpp ++++ lib/Target/X86/X86ISelLowering.cpp +@@ -316,6 +316,8 @@ void X86TargetLowering::resetOperationActions() { setTruncStoreAction(MVT::i32, MVT::i8 , Expand); setTruncStoreAction(MVT::i16, MVT::i8, Expand); @@ -28,7 +28,7 @@ Index: lib/Target/X86/X86ISelLowering.cp // SETOEQ and SETUNE require checking two conditions. setCondCodeAction(ISD::SETOEQ, MVT::f32, Expand); setCondCodeAction(ISD::SETOEQ, MVT::f64, Expand); -@@ -1011,8 +1013,6 @@ void X86TargetLowering::resetOperationActions() { +@@ -1043,8 +1045,6 @@ void X86TargetLowering::resetOperationActions() { AddPromotedToType (ISD::SELECT, VT, MVT::v2i64); } @@ -39,8 +39,8 @@ Index: lib/Target/X86/X86ISelLowering.cp setOperationAction(ISD::LOAD, MVT::v2i64, Legal); Index: test/CodeGen/X86/dont-trunc-store-double-to-float.ll =================================================================== ---- test/CodeGen/X86/dont-trunc-store-double-to-float.ll (revision 0) -+++ test/CodeGen/X86/dont-trunc-store-double-to-float.ll (working copy) +--- test/CodeGen/X86/dont-trunc-store-double-to-float.ll ++++ test/CodeGen/X86/dont-trunc-store-double-to-float.ll @@ -0,0 +1,20 @@ +; RUN: llc -march=x86 < %s | FileCheck %s + Copied and modified: projects/clang350-import/contrib/llvm/patches/patch-10-llvm-r221709-debug-oom.diff (from r274969, projects/clang350-import/contrib/llvm/patches/patch-r274442-llvm-r221709-debug-oom.diff) ============================================================================== --- projects/clang350-import/contrib/llvm/patches/patch-r274442-llvm-r221709-debug-oom.diff Mon Nov 24 18:11:16 2014 (r274969, copy source) +++ projects/clang350-import/contrib/llvm/patches/patch-10-llvm-r221709-debug-oom.diff Mon Nov 24 18:43:37 2014 (r274971) @@ -1,4 +1,4 @@ -Pull in r221709 from upstream llvm trunk (by Frédéric Riss): +Pull in r221709 from upstream llvm trunk (by Frédéric Riss): Totally forget deallocated SDNodes in SDDbgInfo. @@ -24,9 +24,9 @@ Introduced here: http://svnweb.freebsd.o Index: include/llvm/CodeGen/SelectionDAG.h *** DIFF OUTPUT TRUNCATED AT 1000 LINES ***