From 9efb2c61efdba4e900cc01278ce79c478f7e3f77 Mon Sep 17 00:00:00 2001 From: Krzysztof Parzyszek Date: Tue, 30 Aug 2016 13:57:50 +0000 Subject: [PATCH] Handle -mlong-calls on Hexagon Differential Revision:://reviews.llvm.org/D22766 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@280089 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/clang/Driver/Options.td | 8 ++++---- lib/Basic/Targets.cpp | 8 +++++++- lib/Driver/Tools.cpp | 7 ++++++- test/Driver/hexagon-long-calls.c | 15 +++++++++++++++ 4 files changed, 32 insertions(+), 6 deletions(-) create mode 100644 test/Driver/hexagon-long-calls.c diff --git a/include/clang/Driver/Options.td b/include/clang/Driver/Options.td index eaf1d2a43b..f0b9f5cb54 100644 --- a/include/clang/Driver/Options.td +++ b/include/clang/Driver/Options.td @@ -1388,6 +1388,10 @@ def malign_functions_EQ : Joined<["-"], "malign-functions=">, Group, Group; +def mlong_calls : Flag<["-"], "mlong-calls">, Group, + HelpText<"Generate branches with extended addressability, usually via indirect jumps.">; +def mno_long_calls : Flag<["-"], "mno-long-calls">, Group, + HelpText<"Restore the default behaviour of not generating long calls">; def mtvos_version_min_EQ : Joined<["-"], "mtvos-version-min=">, Group; def mappletvos_version_min_EQ : Joined<["-"], "mappletvos-version-min=">, Alias; def mtvos_simulator_version_min_EQ : Joined<["-"], "mtvos-simulator-version-min=">, Alias; @@ -1532,10 +1536,6 @@ def mcrc : Flag<["-"], "mcrc">, Group, HelpText<"Allow use of CRC instructions (ARM only)">; def mnocrc : Flag<["-"], "mnocrc">, Group, HelpText<"Disallow use of CRC instructions (ARM only)">; -def mlong_calls : Flag<["-"], "mlong-calls">, Group, - HelpText<"Generate an indirect jump to enable jumps further than 64M">; -def mno_long_calls : Flag<["-"], "mno-long-calls">, Group, - HelpText<"Restore the default behaviour of not generating long calls">; def mgeneral_regs_only : Flag<["-"], "mgeneral-regs-only">, Group, HelpText<"Generate code which only uses the general purpose registers (AArch64 only)">; diff --git a/lib/Basic/Targets.cpp b/lib/Basic/Targets.cpp index 36e6d4594f..9ae22ffeed 100644 --- a/lib/Basic/Targets.cpp +++ b/lib/Basic/Targets.cpp @@ -6109,6 +6109,7 @@ class HexagonTargetInfo : public TargetInfo { static const TargetInfo::GCCRegAlias GCCRegAliases[]; std::string CPU; bool HasHVX, HasHVXDouble; + bool UseLongCalls; public: HexagonTargetInfo(const llvm::Triple &Triple, const TargetOptions &) @@ -6133,6 +6134,7 @@ public: UseBitFieldTypeAlignment = true; ZeroLengthBitfieldBoundary = 32; HasHVX = HasHVXDouble = false; + UseLongCalls = false; } ArrayRef getTargetBuiltins() const override { @@ -6167,6 +6169,7 @@ public: .Case("hexagon", true) .Case("hvx", HasHVX) .Case("hvx-double", HasHVXDouble) + .Case("long-calls", UseLongCalls) .Default(false); } @@ -6256,6 +6259,9 @@ bool HexagonTargetInfo::handleTargetFeatures(std::vector &Features, HasHVX = HasHVXDouble = true; else if (F == "-hvx-double") HasHVXDouble = false; + + if (F == "+long-calls") + UseLongCalls = true; } return true; } @@ -6266,11 +6272,11 @@ bool HexagonTargetInfo::initFeatureMap(llvm::StringMap &Features, // Default for v60: -hvx, -hvx-double. Features["hvx"] = false; Features["hvx-double"] = false; + Features["long-calls"] = false; return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec); } - const char *const HexagonTargetInfo::GCCRegNames[] = { "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15", diff --git a/lib/Driver/Tools.cpp b/lib/Driver/Tools.cpp index da578ddfdd..0d04e45f36 100644 --- a/lib/Driver/Tools.cpp +++ b/lib/Driver/Tools.cpp @@ -2484,7 +2484,7 @@ static void getAArch64TargetFeatures(const Driver &D, const ArgList &Args, static void getHexagonTargetFeatures(const ArgList &Args, std::vector &Features) { - bool HasHVX = false, HasHVXD = false; + bool HasHVX = false, HasHVXD = false, UseLongCalls = false; // FIXME: This should be able to use handleTargetFeaturesGroup except it is // doing dependent option handling here rather than in initFeatureMap or a @@ -2499,6 +2499,10 @@ static void getHexagonTargetFeatures(const ArgList &Args, HasHVXD = HasHVX = true; else if (Opt.matches(options::OPT_mno_hexagon_hvx_double)) HasHVXD = false; + else if (Opt.matches(options::OPT_mlong_calls)) + UseLongCalls = true; + else if (Opt.matches(options::OPT_mno_long_calls)) + UseLongCalls = false; else continue; A->claim(); @@ -2506,6 +2510,7 @@ static void getHexagonTargetFeatures(const ArgList &Args, Features.push_back(HasHVX ? "+hvx" : "-hvx"); Features.push_back(HasHVXD ? "+hvx-double" : "-hvx-double"); + Features.push_back(UseLongCalls ? "+long-calls" : "-long-calls"); } static void getWebAssemblyTargetFeatures(const ArgList &Args, diff --git a/test/Driver/hexagon-long-calls.c b/test/Driver/hexagon-long-calls.c new file mode 100644 index 0000000000..e88922a3c2 --- /dev/null +++ b/test/Driver/hexagon-long-calls.c @@ -0,0 +1,15 @@ +// RUN: %clang -target hexagon -### %s 2>&1 \ +// RUN: | FileCheck %s -check-prefix CHECK-DEFAULT + +// RUN: %clang -target hexagon -### -mlong-calls %s 2>&1 \ +// RUN: | FileCheck %s -check-prefix CHECK-LONG-CALLS + +// RUN: %clang -target hexagon -### -mlong-calls -mno-long-calls %s 2>&1 \ +// RUN: | FileCheck %s -check-prefix CHECK-NO-LONG-CALLS + +// CHECK-DEFAULT-NOT: "-target-feature" "+long-calls" + +// CHECK-LONG-CALLS: "-target-feature" "+long-calls" + +// CHECK-NO-LONG-CALLS-NOT: "-target-feature" "+long-calls" + -- 2.40.0