summaryrefslogtreecommitdiffstats
path: root/clang/lib/CodeGen
diff options
context:
space:
mode:
authorEric Christopher <echristo@gmail.com>2015-03-25 23:14:47 +0000
committerEric Christopher <echristo@gmail.com>2015-03-25 23:14:47 +0000
commit70c1665d83861e35ddd5c3a1b665992e1738b7e2 (patch)
tree81ae5f5574bde5733ac510322e512e33a72290cc /clang/lib/CodeGen
parentcf07c65be3094e023dfa45e555918782ccdcc1e7 (diff)
downloadbcm5719-llvm-70c1665d83861e35ddd5c3a1b665992e1738b7e2.tar.gz
bcm5719-llvm-70c1665d83861e35ddd5c3a1b665992e1738b7e2.zip
Reapply r232888 after applying a fix for -msse4 code generation.
As a note, any target that uses fake target features via command line options will have similar problems. llvm-svn: 233227
Diffstat (limited to 'clang/lib/CodeGen')
-rw-r--r--clang/lib/CodeGen/CGCall.cpp21
1 files changed, 21 insertions, 0 deletions
diff --git a/clang/lib/CodeGen/CGCall.cpp b/clang/lib/CodeGen/CGCall.cpp
index 3cb72bd1512..d39776191f3 100644
--- a/clang/lib/CodeGen/CGCall.cpp
+++ b/clang/lib/CodeGen/CGCall.cpp
@@ -31,6 +31,7 @@
#include "llvm/IR/InlineAsm.h"
#include "llvm/IR/Intrinsics.h"
#include "llvm/Transforms/Utils/Local.h"
+#include <sstream>
using namespace clang;
using namespace CodeGen;
@@ -1475,6 +1476,26 @@ void CodeGenModule::ConstructAttributeList(const CGFunctionInfo &FI,
if (!CodeGenOpts.StackRealignment)
FuncAttrs.addAttribute("no-realign-stack");
+
+ // Add target-cpu and target-features work if they differ from the defaults.
+ std::string &CPU = getTarget().getTargetOpts().CPU;
+ if (CPU != "" && CPU != getTarget().getTriple().getArchName())
+ FuncAttrs.addAttribute("target-cpu", getTarget().getTargetOpts().CPU);
+
+ // TODO: FeaturesAsWritten gets us the features on the command line,
+ // for canonicalization purposes we might want to avoid putting features
+ // in the target-features set if we know it'll be one of the default
+ // features in the backend, e.g. corei7-avx and +avx.
+ std::vector<std::string> &Features =
+ getTarget().getTargetOpts().FeaturesAsWritten;
+ if (!Features.empty()) {
+ std::stringstream S;
+ std::copy(Features.begin(), Features.end(),
+ std::ostream_iterator<std::string>(S, ","));
+ // The drop_back gets rid of the trailing space.
+ FuncAttrs.addAttribute("target-features",
+ StringRef(S.str()).drop_back(1));
+ }
}
ClangToLLVMArgMapping IRFunctionArgs(getContext(), FI);
OpenPOWER on IntegriCloud