]> granicus.if.org Git - clang/commitdiff
[ARM] Add a driver option for +no-neg-immediates
authorSanne Wouda <sanne.wouda@arm.com>
Mon, 27 Mar 2017 15:34:52 +0000 (15:34 +0000)
committerSanne Wouda <sanne.wouda@arm.com>
Mon, 27 Mar 2017 15:34:52 +0000 (15:34 +0000)
Reviewers: olista01, rengolin, javed.absar, samparker

Reviewed By: samparker

Subscribers: samparker, llvm-commits, aemerson

Differential Revision: https://reviews.llvm.org/D31197

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@298850 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Driver/Options.td
lib/Driver/ToolChains/Arch/AArch64.cpp
lib/Driver/ToolChains/Arch/ARM.cpp
test/Driver/arm-no-neg-immediates.c [new file with mode: 0644]

index 1660b3966dae61f786e046aef387e18ce1034aca..06d4a244c1a508377147c0d5a3d913bac5295eab 100644 (file)
@@ -1760,6 +1760,8 @@ 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 mno_neg_immediates: Flag<["-"], "mno-neg-immediates">, Group<m_arm_Features_Group>,
+  HelpText<"Disallow converting instructions with negative immediates to their negation or inversion.">;
 
 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)">;
index 7dc2f57d829973710069662742ccb43ca08cab68..554d051fb155cf43f3ceec805d2b86a51008920d 100644 (file)
@@ -193,4 +193,7 @@ void aarch64::getAArch64TargetFeatures(const Driver &D, const ArgList &Args,
 
   if (Args.hasArg(options::OPT_ffixed_x18))
     Features.push_back("+reserve-x18");
+
+  if (Args.hasArg(options::OPT_mno_neg_immediates))
+    Features.push_back("+no-neg-immediates");
 }
index 15f224bb22af7e53a83dd49a8a89aecb7b3b1ce8..4eac976201145dccba260a6a3ac3aed5d3f5c9c5 100644 (file)
@@ -449,6 +449,9 @@ void arm::getARMTargetFeatures(const ToolChain &TC,
   // The kext linker doesn't know how to deal with movw/movt.
   if (KernelOrKext || Args.hasArg(options::OPT_mno_movt))
     Features.push_back("+no-movt");
+
+  if (Args.hasArg(options::OPT_mno_neg_immediates))
+    Features.push_back("+no-neg-immediates");
 }
 
 const std::string arm::getARMArch(StringRef Arch, const llvm::Triple &Triple) {
diff --git a/test/Driver/arm-no-neg-immediates.c b/test/Driver/arm-no-neg-immediates.c
new file mode 100644 (file)
index 0000000..f1e4d5f
--- /dev/null
@@ -0,0 +1,8 @@
+// RUN: %clang -target arm-none-gnueabi -### %s 2>&1 | FileCheck %s --check-prefix=CHECK-DEFAULT
+// RUN: %clang -target arm-none-gnueabi -mno-neg-immediates -### %s 2>&1 | FileCheck %s
+
+// RUN: %clang -target aarch64-none-gnueabi -### %s 2>&1 | FileCheck %s --check-prefix=CHECK-DEFAULT
+// RUN: %clang -target aarch64-none-gnueabi -mno-neg-immediates -### %s 2>&1 | FileCheck %s
+
+// CHECK: "-target-feature" "+no-neg-immediates"
+// CHECK-DEFAULT-NOT: "+no-neg-immediates"