<div dir="ltr">Hi Oliver,<br><br>I'm not sure this is the right direction to go here, I've got another patch in progress to solve this problem and I'll have something tomorrow. Sorry about the delay.<div><br></div><div>Thanks!</div><div><br></div><div>-eric</div></div><br><div class="gmail_quote">On Wed, Apr 1, 2015 at 7:47 AM Oliver Stannard <<a href="mailto:oliver.stannard@arm.com">oliver.stannard@arm.com</a>> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hi echristo,<br>
<br>
These target features are used by the clang driver when targeting ARM and MIPS, but cc1 strips them out and they are not valid backend features. Therefore, we should not store them in the function attributes.<br>
<br>
REPOSITORY<br>
  rL LLVM<br>
<br>
<a href="http://reviews.llvm.org/D8771" target="_blank">http://reviews.llvm.org/D8771</a><br>
<br>
Files:<br>
  lib/CodeGen/CGCall.cpp<br>
  test/CodeGen/function-target-<u></u>features.c<br>
<br>
Index: lib/CodeGen/CGCall.cpp<br>
==============================<u></u>==============================<u></u>=======<br>
--- lib/CodeGen/CGCall.cpp<br>
+++ lib/CodeGen/CGCall.cpp<br>
@@ -1490,11 +1490,16 @@<br>
         getTarget().getTargetOpts().<u></u>FeaturesAsWritten;<br>
     if (!Features.empty()) {<br>
       std::stringstream S;<br>
-      std::copy(Features.begin(), Features.end(),<br>
-                std::ostream_iterator<std::<u></u>string>(S, ","));<br>
+      // The "+soft-float" and "+soft-float-abi" features are not real target<br>
+      // features, and should not be passed to the backend.<br>
+      std::copy_if(Features.begin(), Features.end(),<br>
+                   std::ostream_iterator<std::<u></u>string>(S, ","),<br>
+                   [](const std::string& name) {<br>
+                     return (name != "+soft-float") && (name != "+soft-float-abi");<br>
+                   });<br>
       // The drop_back gets rid of the trailing space.<br>
-      FuncAttrs.addAttribute("<u></u>target-features",<br>
-                             StringRef(S.str()).drop_back(<u></u>1));<br>
+      if (!S.str().empty())<br>
+        FuncAttrs.addAttribute("<u></u>target-features", StringRef(S.str()).drop_back(<u></u>1));<br>
     }<br>
   }<br>
<br>
Index: test/CodeGen/function-target-<u></u>features.c<br>
==============================<u></u>==============================<u></u>=======<br>
--- test/CodeGen/function-target-<u></u>features.c<br>
+++ test/CodeGen/function-target-<u></u>features.c<br>
@@ -9,6 +9,8 @@<br>
 // RUN: %clang_cc1 -triple x86_64-unknown-unknown -emit-llvm -o - %s -target-cpu corei7 -target-feature +avx | FileCheck %s -check-prefix=CORE-CPU-AND-<u></u>FEATURES<br>
 // RUN: %clang_cc1 -triple x86_64-unknown-unknown -emit-llvm -o - %s -target-cpu x86-64 | FileCheck %s -check-prefix=X86-64-CPU-NOT<br>
 // RUN: %clang_cc1 -triple x86_64-unknown-unknown -emit-llvm -o - %s -target-cpu corei7-avx -target-feature -avx | FileCheck %s -check-prefix=AVX-MINUS-<u></u>FEATURE<br>
+// RUN: %clang_cc1 -triple armv7-none-eabi -emit-llvm -o - %s -target-feature +soft-float | FileCheck %s -check-prefix=ARM-SOFT-FLOAT<br>
+// RUN: %clang_cc1 -triple armv7-none-eabi -emit-llvm -o - %s -target-feature +soft-float-abi | FileCheck %s -check-prefix=ARM-SOFT-FLOAT-<u></u>ABI<br>
<br>
 void foo() {}<br>
<br>
@@ -19,3 +21,5 @@<br>
 // CORE-CPU-AND-FEATURES: "target-cpu"="corei7" "target-features"="+avx"<br>
 // X86-64-CPU-NOT: "target-cpu"<br>
 // AVX-MINUS-FEATURE: "target-features"="-avx"<br>
+// ARM-SOFT-FLOAT-NOT: "target-features"<br>
+// ARM-SOFT-FLOAT-ABI-NOT: "target-features"<br>
<br>
EMAIL PREFERENCES<br>
  <a href="http://reviews.llvm.org/settings/panel/emailpreferences/" target="_blank">http://reviews.llvm.org/<u></u>settings/panel/<u></u>emailpreferences/</a><br>
</blockquote></div>