The getDefaultSubtargetFeatures method of SubtargetFeature did actually return a

string of features for that target. However LTO was using that string to pass
into the "create target machine" stuff. That stuff needed the feature string to
be in a particular form. In particular, it needed the CPU specified first and
then the attributes. If there isn't a CPU specified, it required it to be blank
-- e.g., ",+altivec". Yuck.

Modify the getDefaultSubtargetFeatures method to be a non-static member
function. For all attributes for a specific subtarget, it will add them in like
normal. It will also take a CPU string so that it can satisfy this horrible
syntax.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@103451 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Bill Wendling 2010-05-11 00:30:02 +00:00
parent 31b9c44cc1
commit 81043ee5dc
4 changed files with 30 additions and 15 deletions

View File

@ -108,9 +108,10 @@ public:
// Dump feature info.
void dump() const;
/// Retrieve a formatted string of the default features for
/// the specified target triple.
static std::string getDefaultSubtargetFeatures(const Triple &Triple);
/// Retrieve a formatted string of the default features for the specified
/// target triple.
void getDefaultSubtargetFeatures(const std::string &CPU,
const Triple& Triple);
};
} // End namespace llvm

View File

@ -359,29 +359,41 @@ void SubtargetFeatures::dump() const {
print(dbgs());
}
/// getDefaultSubtargetFeatures - Return a string listing
/// the features associated with the target triple.
/// getDefaultSubtargetFeatures - Return a string listing the features
/// associated with the target triple.
///
/// FIXME: This is an inelegant way of specifying the features of a
/// subtarget. It would be better if we could encode this information
/// into the IR. See <rdar://5972456>.
///
std::string SubtargetFeatures::getDefaultSubtargetFeatures(
const Triple& Triple) {
void SubtargetFeatures::getDefaultSubtargetFeatures(const std::string &CPU,
const Triple& Triple) {
setCPU(CPU);
const char *Attrs = 0;
switch (Triple.getVendor()) {
case Triple::Apple:
switch (Triple.getArch()) {
case Triple::ppc: // powerpc-apple-*
return std::string("altivec");
Attrs = "altivec";
break;
case Triple::ppc64: // powerpc64-apple-*
return std::string("64bit,altivec");
Attrs = "64bit,altivec";
break;
default:
break;
}
break;
default:
break;
}
}
return std::string("");
StringRef SR(Attrs);
while (!SR.empty()) {
std::pair<StringRef, StringRef> Res = SR.split(',');
AddFeature(Res.first);
SR = Res.second;
}
}

View File

@ -300,8 +300,9 @@ bool LTOCodeGenerator::determineTarget(std::string& errMsg)
}
// construct LTModule, hand over ownership of module and target
const std::string FeatureStr =
SubtargetFeatures::getDefaultSubtargetFeatures(llvm::Triple(Triple));
SubtargetFeatures Features;
Features.getDefaultSubtargetFeatures("" /* cpu */, llvm::Triple(Triple));
std::string FeatureStr = Features.getString();
_target = march->createTargetMachine(Triple, FeatureStr);
}
return false;

View File

@ -140,8 +140,9 @@ LTOModule* LTOModule::makeLTOModule(MemoryBuffer* buffer,
return NULL;
// construct LTModule, hand over ownership of module and target
const std::string FeatureStr =
SubtargetFeatures::getDefaultSubtargetFeatures(llvm::Triple(Triple));
SubtargetFeatures Features;
Features.getDefaultSubtargetFeatures("" /* cpu */, llvm::Triple(Triple));
std::string FeatureStr = Features.getString();
TargetMachine* target = march->createTargetMachine(Triple, FeatureStr);
return new LTOModule(m.take(), target);
}