mirror of https://github.com/microsoft/clang.git
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
This commit is contained in:
parent
20c847aac3
commit
9efb2c61ef
|
@ -1388,6 +1388,10 @@ def malign_functions_EQ : Joined<["-"], "malign-functions=">, Group<clang_ignore
|
|||
def malign_loops_EQ : Joined<["-"], "malign-loops=">, Group<clang_ignored_m_Group>;
|
||||
def malign_jumps_EQ : Joined<["-"], "malign-jumps=">, Group<clang_ignored_m_Group>;
|
||||
def mfancy_math_387 : Flag<["-"], "mfancy-math-387">, Group<clang_ignored_m_Group>;
|
||||
def mlong_calls : Flag<["-"], "mlong-calls">, Group<m_Group>,
|
||||
HelpText<"Generate branches with extended addressability, usually via indirect jumps.">;
|
||||
def mno_long_calls : Flag<["-"], "mno-long-calls">, Group<m_Group>,
|
||||
HelpText<"Restore the default behaviour of not generating long calls">;
|
||||
def mtvos_version_min_EQ : Joined<["-"], "mtvos-version-min=">, Group<m_Group>;
|
||||
def mappletvos_version_min_EQ : Joined<["-"], "mappletvos-version-min=">, Alias<mtvos_version_min_EQ>;
|
||||
def mtvos_simulator_version_min_EQ : Joined<["-"], "mtvos-simulator-version-min=">, Alias<mtvos_version_min_EQ>;
|
||||
|
@ -1532,10 +1536,6 @@ def mcrc : Flag<["-"], "mcrc">, Group<m_arm_Features_Group>,
|
|||
HelpText<"Allow use of CRC instructions (ARM only)">;
|
||||
def mnocrc : Flag<["-"], "mnocrc">, Group<m_arm_Features_Group>,
|
||||
HelpText<"Disallow use of CRC instructions (ARM only)">;
|
||||
def mlong_calls : Flag<["-"], "mlong-calls">, Group<m_arm_Features_Group>,
|
||||
HelpText<"Generate an indirect jump to enable jumps further than 64M">;
|
||||
def mno_long_calls : Flag<["-"], "mno-long-calls">, Group<m_arm_Features_Group>,
|
||||
HelpText<"Restore the default behaviour of not generating long calls">;
|
||||
|
||||
def mgeneral_regs_only : Flag<["-"], "mgeneral-regs-only">, Group<m_aarch64_Features_Group>,
|
||||
HelpText<"Generate code which only uses the general purpose registers (AArch64 only)">;
|
||||
|
|
|
@ -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<Builtin::Info> 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<std::string> &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<bool> &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",
|
||||
|
|
|
@ -2484,7 +2484,7 @@ static void getAArch64TargetFeatures(const Driver &D, const ArgList &Args,
|
|||
|
||||
static void getHexagonTargetFeatures(const ArgList &Args,
|
||||
std::vector<const char *> &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,
|
||||
|
|
|
@ -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"
|
||||
|
Loading…
Reference in New Issue