1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-22 18:54:02 +01:00

[lli] Make lli support -mcpu=native for CPU autodetection

llc, opt, and clang can all autodetect the CPU and supported features. lli cannot as far as I could tell.

This patch uses the getCPUStr() and introduces a new getCPUFeatureList() and uses those in lli in place of MCPU and MAttrs.

Ideally, we would merge getCPUFeatureList and getCPUFeatureStr, but opt and llc need a string and lli wanted a list. Maybe we should just return the SubtargetFeature object and let the caller decide what it needs?

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

llvm-svn: 322100
This commit is contained in:
Craig Topper 2018-01-09 18:14:18 +00:00
parent e568747614
commit b38fcb7fd8
2 changed files with 22 additions and 2 deletions

View File

@ -326,6 +326,26 @@ LLVM_ATTRIBUTE_UNUSED static std::string getFeaturesStr() {
return Features.getString(); return Features.getString();
} }
LLVM_ATTRIBUTE_UNUSED static std::vector<std::string> getFeatureList() {
SubtargetFeatures Features;
// If user asked for the 'native' CPU, we need to autodetect features.
// This is necessary for x86 where the CPU might not support all the
// features the autodetected CPU name lists in the target. For example,
// not all Sandybridge processors support AVX.
if (MCPU == "native") {
StringMap<bool> HostFeatures;
if (sys::getHostCPUFeatures(HostFeatures))
for (auto &F : HostFeatures)
Features.AddFeature(F.first(), F.second);
}
for (unsigned i = 0; i != MAttrs.size(); ++i)
Features.AddFeature(MAttrs[i]);
return Features.getFeatures();
}
/// \brief Set function attributes of functions in Module M based on CPU, /// \brief Set function attributes of functions in Module M based on CPU,
/// Features, and command line flags. /// Features, and command line flags.
LLVM_ATTRIBUTE_UNUSED static void LLVM_ATTRIBUTE_UNUSED static void

View File

@ -378,8 +378,8 @@ int main(int argc, char **argv, char * const *envp) {
std::string ErrorMsg; std::string ErrorMsg;
EngineBuilder builder(std::move(Owner)); EngineBuilder builder(std::move(Owner));
builder.setMArch(MArch); builder.setMArch(MArch);
builder.setMCPU(MCPU); builder.setMCPU(getCPUStr());
builder.setMAttrs(MAttrs); builder.setMAttrs(getFeatureList());
if (RelocModel.getNumOccurrences()) if (RelocModel.getNumOccurrences())
builder.setRelocationModel(RelocModel); builder.setRelocationModel(RelocModel);
if (CMModel.getNumOccurrences()) if (CMModel.getNumOccurrences())