From owner-svn-src-projects@freebsd.org Sat Sep 10 15:38:47 2016 Return-Path: Delivered-To: svn-src-projects@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id C3053BD58A8 for ; Sat, 10 Sep 2016 15:38:47 +0000 (UTC) (envelope-from dim@FreeBSD.org) Received: from repo.freebsd.org (repo.freebsd.org [IPv6:2610:1c1:1:6068::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 81A70EC2; Sat, 10 Sep 2016 15:38:47 +0000 (UTC) (envelope-from dim@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id u8AFck0E093653; Sat, 10 Sep 2016 15:38:46 GMT (envelope-from dim@FreeBSD.org) Received: (from dim@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id u8AFcktD093648; Sat, 10 Sep 2016 15:38:46 GMT (envelope-from dim@FreeBSD.org) Message-Id: <201609101538.u8AFcktD093648@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: dim set sender to dim@FreeBSD.org using -f From: Dimitry Andric Date: Sat, 10 Sep 2016 15:38:46 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r305680 - in projects/clang390-import/contrib/llvm: lib/Target/PowerPC tools/clang/include/clang/Driver 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.23 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: Sat, 10 Sep 2016 15:38:47 -0000 Author: dim Date: Sat Sep 10 15:38:46 2016 New Revision: 305680 URL: https://svnweb.freebsd.org/changeset/base/305680 Log: Pull in r280040 from upstream llvm trunk (by Hal Finkel): [PowerPC] Add support for -mlongcall The "long call" option forces the use of the indirect calling sequence for all calls (even those that don't really need it). GCC provides this option; This is helpful, under certain circumstances, for building very-large binaries, and some other specialized use cases. Fixes PR19098. Pull in r280041 from upstream clang trunk (by Hal Finkel): [PowerPC] Add support for -mlongcall Add support for GCC's PowerPC -mlongcall option; the backend supports the corresponding target feature as of r280040. Fixes PR19098. Modified: projects/clang390-import/contrib/llvm/lib/Target/PowerPC/PPC.td projects/clang390-import/contrib/llvm/lib/Target/PowerPC/PPCISelLowering.cpp projects/clang390-import/contrib/llvm/lib/Target/PowerPC/PPCSubtarget.cpp projects/clang390-import/contrib/llvm/lib/Target/PowerPC/PPCSubtarget.h projects/clang390-import/contrib/llvm/tools/clang/include/clang/Driver/Options.td Modified: projects/clang390-import/contrib/llvm/lib/Target/PowerPC/PPC.td ============================================================================== --- projects/clang390-import/contrib/llvm/lib/Target/PowerPC/PPC.td Sat Sep 10 09:37:41 2016 (r305679) +++ projects/clang390-import/contrib/llvm/lib/Target/PowerPC/PPC.td Sat Sep 10 15:38:46 2016 (r305680) @@ -136,6 +136,8 @@ def FeatureInvariantFunctionDescriptors SubtargetFeature<"invariant-function-descriptors", "HasInvariantFunctionDescriptors", "true", "Assume function descriptors are invariant">; +def FeatureLongCall : SubtargetFeature<"longcall", "UseLongCalls", "true", + "Always use indirect calls">; def FeatureHTM : SubtargetFeature<"htm", "HasHTM", "true", "Enable Hardware Transactional Memory instructions">; def FeatureMFTB : SubtargetFeature<"", "FeatureMFTB", "true", Modified: projects/clang390-import/contrib/llvm/lib/Target/PowerPC/PPCISelLowering.cpp ============================================================================== --- projects/clang390-import/contrib/llvm/lib/Target/PowerPC/PPCISelLowering.cpp Sat Sep 10 09:37:41 2016 (r305679) +++ projects/clang390-import/contrib/llvm/lib/Target/PowerPC/PPCISelLowering.cpp Sat Sep 10 15:38:46 2016 (r305680) @@ -4680,7 +4680,9 @@ PPCTargetLowering::LowerCall(TargetLower ImmutableCallSite *CS = CLI.CS; if (isTailCall) { - if (Subtarget.isSVR4ABI() && Subtarget.isPPC64()) + if (Subtarget.useLongCalls() && !(CS && CS->isMustTailCall())) + isTailCall = false; + else if (Subtarget.isSVR4ABI() && Subtarget.isPPC64()) isTailCall = IsEligibleForTailCallOptimization_64SVR4(Callee, CallConv, CS, isVarArg, Outs, Ins, DAG); @@ -4710,6 +4712,13 @@ PPCTargetLowering::LowerCall(TargetLower report_fatal_error("failed to perform tail call elimination on a call " "site marked musttail"); + // When long calls (i.e. indirect calls) are always used, calls are always + // made via function pointer. If we have a function name, first translate it + // into a pointer. + if (Subtarget.useLongCalls() && isa(Callee) && + !isTailCall) + Callee = LowerGlobalAddress(Callee, DAG); + if (Subtarget.isSVR4ABI()) { if (Subtarget.isPPC64()) return LowerCall_64SVR4(Chain, Callee, CallConv, isVarArg, Modified: projects/clang390-import/contrib/llvm/lib/Target/PowerPC/PPCSubtarget.cpp ============================================================================== --- projects/clang390-import/contrib/llvm/lib/Target/PowerPC/PPCSubtarget.cpp Sat Sep 10 09:37:41 2016 (r305679) +++ projects/clang390-import/contrib/llvm/lib/Target/PowerPC/PPCSubtarget.cpp Sat Sep 10 15:38:46 2016 (r305680) @@ -105,6 +105,7 @@ void PPCSubtarget::initializeEnvironment HasFusion = false; HasFloat128 = false; IsISA3_0 = false; + UseLongCalls = false; HasPOPCNTD = POPCNTD_Unavailable; } Modified: projects/clang390-import/contrib/llvm/lib/Target/PowerPC/PPCSubtarget.h ============================================================================== --- projects/clang390-import/contrib/llvm/lib/Target/PowerPC/PPCSubtarget.h Sat Sep 10 09:37:41 2016 (r305679) +++ projects/clang390-import/contrib/llvm/lib/Target/PowerPC/PPCSubtarget.h Sat Sep 10 15:38:46 2016 (r305680) @@ -132,6 +132,7 @@ protected: bool HasFusion; bool HasFloat128; bool IsISA3_0; + bool UseLongCalls; POPCNTDKind HasPOPCNTD; @@ -275,6 +276,7 @@ public: bool hasFusion() const { return HasFusion; } bool hasFloat128() const { return HasFloat128; } bool isISA3_0() const { return IsISA3_0; } + bool useLongCalls() const { return UseLongCalls; } POPCNTDKind hasPOPCNTD() const { return HasPOPCNTD; } Modified: projects/clang390-import/contrib/llvm/tools/clang/include/clang/Driver/Options.td ============================================================================== --- projects/clang390-import/contrib/llvm/tools/clang/include/clang/Driver/Options.td Sat Sep 10 09:37:41 2016 (r305679) +++ projects/clang390-import/contrib/llvm/tools/clang/include/clang/Driver/Options.td Sat Sep 10 15:38:46 2016 (r305680) @@ -1574,6 +1574,10 @@ def mfloat128: Flag<["-"], "mfloat128">, Group; def mno_float128 : Flag<["-"], "mno-float128">, Group; +def mlongcall: Flag<["-"], "mlongcall">, + Group; +def mno_longcall : Flag<["-"], "mno-longcall">, + Group; def faltivec : Flag<["-"], "faltivec">, Group, Flags<[CC1Option]>, HelpText<"Enable AltiVec vector initializer syntax">;