mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 19:23:23 +01:00
Add help support for -mcpu and -mattr.
llvm-svn: 23222
This commit is contained in:
parent
7995b70148
commit
1f9c40400c
@ -34,6 +34,7 @@ namespace llvm {
|
||||
//
|
||||
struct SubtargetFeatureKV {
|
||||
const char *Key; // K-V key string
|
||||
const char *Desc; // Help descriptor
|
||||
uint32_t Value; // K-V integer value
|
||||
|
||||
// Compare routine for std binary search
|
||||
@ -126,6 +127,10 @@ public:
|
||||
/// Adding Features.
|
||||
void AddFeature(const std::string &String, bool IsEnabled = true);
|
||||
|
||||
/// Display help for feature choices.
|
||||
static void Help(const char *Heading,
|
||||
const SubtargetFeatureKV *Table, size_t TableSize);
|
||||
|
||||
/// Parse feature string for quick usage.
|
||||
static uint32_t Parse(const std::string &String,
|
||||
const std::string &DefaultCPU,
|
||||
|
@ -26,15 +26,15 @@ MArch("march", cl::desc("Architecture to generate assembly for:"));
|
||||
|
||||
static cl::opt<std::string>
|
||||
MCPU("mcpu",
|
||||
cl::desc("Target a specific cpu type"),
|
||||
cl::desc("Target a specific cpu type (-mcpu=help for list of choices)"),
|
||||
cl::value_desc("cpu-name"),
|
||||
cl::init(""));
|
||||
|
||||
static cl::list<std::string>
|
||||
MAttrs("mattr",
|
||||
cl::CommaSeparated,
|
||||
cl::desc("Target specific attributes:"),
|
||||
cl::value_desc("attributes"));
|
||||
cl::desc("Target specific attributes (-mattr=help for list of choices)"),
|
||||
cl::value_desc("attr1,+attr2, ..., -attrN"));
|
||||
|
||||
/// create - Create an return a new JIT compiler if there is one available
|
||||
/// for the current target. Otherwise, return null.
|
||||
|
@ -40,25 +40,31 @@ enum PowerPCFeature {
|
||||
|
||||
/// Sorted (by key) array of values for CPU subtype.
|
||||
static const SubtargetFeatureKV PowerPCSubTypeKV[] = {
|
||||
{ "601" , 0 },
|
||||
{ "602" , 0 },
|
||||
{ "603" , 0 },
|
||||
{ "603e" , 0 },
|
||||
{ "603ev" , 0 },
|
||||
{ "604" , 0 },
|
||||
{ "604e" , 0 },
|
||||
{ "620" , 0 },
|
||||
{ "7400" , PowerPCFeatureAltivec },
|
||||
{ "7450" , PowerPCFeatureAltivec },
|
||||
{ "750" , 0 },
|
||||
{ "970" , PowerPCFeature64Bit | PowerPCFeatureAltivec |
|
||||
{ "601" , "Select the PowerPC 601 processor", 0 },
|
||||
{ "602" , "Select the PowerPC 602 processor", 0 },
|
||||
{ "603" , "Select the PowerPC 603 processor", 0 },
|
||||
{ "603e" , "Select the PowerPC 603e processor", 0 },
|
||||
{ "603ev" , "Select the PowerPC 603ev processor", 0 },
|
||||
{ "604" , "Select the PowerPC 604 processor", 0 },
|
||||
{ "604e" , "Select the PowerPC 604e processor", 0 },
|
||||
{ "620" , "Select the PowerPC 620 processor", 0 },
|
||||
{ "7400" , "Select the PowerPC 7400 (G4) processor",
|
||||
PowerPCFeatureAltivec },
|
||||
{ "7450" , "Select the PowerPC 7450 (G4+) processor",
|
||||
PowerPCFeatureAltivec },
|
||||
{ "750" , "Select the PowerPC 750 (G3) processor", 0 },
|
||||
{ "970" , "Select the PowerPC 970 (G5 - GPUL) processor",
|
||||
PowerPCFeature64Bit | PowerPCFeatureAltivec |
|
||||
PowerPCFeatureFSqrt | PowerPCFeatureGPUL },
|
||||
{ "g3" , 0 },
|
||||
{ "g4" , PowerPCFeatureAltivec },
|
||||
{ "g4+" , PowerPCFeatureAltivec },
|
||||
{ "g5" , PowerPCFeature64Bit | PowerPCFeatureAltivec |
|
||||
{ "g3" , "Select the PowerPC G3 (750) processor", 0 },
|
||||
{ "g4" , "Select the PowerPC G4 (7400) processor",
|
||||
PowerPCFeatureAltivec },
|
||||
{ "g4+" , "Select the PowerPC G4+ (7450) processor",
|
||||
PowerPCFeatureAltivec },
|
||||
{ "g5" , "Select the PowerPC g5 (970 - GPUL) processor",
|
||||
PowerPCFeature64Bit | PowerPCFeatureAltivec |
|
||||
PowerPCFeatureFSqrt | PowerPCFeatureGPUL },
|
||||
{ "generic", 0 }
|
||||
{ "generic", "Select instructions for a generic PowerPC processor", 0 }
|
||||
};
|
||||
/// Length of PowerPCSubTypeKV.
|
||||
static const unsigned PowerPCSubTypeKVSize = sizeof(PowerPCSubTypeKV)
|
||||
@ -66,10 +72,10 @@ static const unsigned PowerPCSubTypeKVSize = sizeof(PowerPCSubTypeKV)
|
||||
|
||||
/// Sorted (by key) array of values for CPU features.
|
||||
static SubtargetFeatureKV PowerPCFeatureKV[] = {
|
||||
{ "64bit" , PowerPCFeature64Bit },
|
||||
{ "altivec", PowerPCFeatureAltivec },
|
||||
{ "fsqrt" , PowerPCFeatureFSqrt },
|
||||
{ "gpul" , PowerPCFeatureGPUL }
|
||||
{ "64bit" , "Should 64 bit instructions be used" , PowerPCFeature64Bit },
|
||||
{ "altivec", "Should Altivec instructions be used" , PowerPCFeatureAltivec },
|
||||
{ "fsqrt" , "Should the fsqrt instruction be used", PowerPCFeatureFSqrt },
|
||||
{ "gpul" , "Should GPUL instructions be used" , PowerPCFeatureGPUL }
|
||||
};
|
||||
/// Length of PowerPCFeatureKV.
|
||||
static const unsigned PowerPCFeatureKVSize = sizeof(PowerPCFeatureKV)
|
||||
|
@ -99,6 +99,29 @@ SubtargetFeatures::Find(const std::string &S,
|
||||
return F;
|
||||
}
|
||||
|
||||
/// Display help for feature choices.
|
||||
void SubtargetFeatures::Help(const char *Heading,
|
||||
const SubtargetFeatureKV *Table, size_t TableSize) {
|
||||
// Determine the length of the longest key
|
||||
size_t MaxLen = 0;
|
||||
for (size_t i = 0; i < TableSize; i++)
|
||||
MaxLen = std::max(MaxLen, std::strlen(Table[i].Key));
|
||||
// Print heading
|
||||
std::cerr << "Help for " << Heading << " choices\n\n";
|
||||
// For each feature
|
||||
for (size_t i = 0; i < TableSize; i++) {
|
||||
// Compute required padding
|
||||
size_t Pad = MaxLen - std::strlen(Table[i].Key) + 1;
|
||||
// Print details
|
||||
std::cerr << Table[i].Key << std::string(Pad, ' ') << " - "
|
||||
<< Table[i].Desc << "\n";
|
||||
}
|
||||
// Wrap it up
|
||||
std::cerr << "\n\n";
|
||||
// Leave tool
|
||||
exit(1);
|
||||
}
|
||||
|
||||
/// Parse feature string for quick usage.
|
||||
uint32_t SubtargetFeatures::Parse(const std::string &String,
|
||||
const std::string &DefaultCPU,
|
||||
@ -124,6 +147,8 @@ uint32_t SubtargetFeatures::Parse(const std::string &String,
|
||||
Split(Features, String);
|
||||
// Check if default is needed
|
||||
if (Features[0].empty()) Features[0] = DefaultCPU;
|
||||
// Check for help
|
||||
if (Features[0] == "help") Help("CPU", CPUTable, CPUTableSize);
|
||||
// Find CPU entry
|
||||
const SubtargetFeatureKV *CPUEntry =
|
||||
Find(Features[0], CPUTable, CPUTableSize);
|
||||
@ -141,6 +166,8 @@ uint32_t SubtargetFeatures::Parse(const std::string &String,
|
||||
for (size_t i = 1; i < Features.size(); i++) {
|
||||
// Get next feature
|
||||
const std::string &Feature = Features[i];
|
||||
// Check for help
|
||||
if (Feature == "+help") Help("feature", FeatureTable, FeatureTableSize);
|
||||
// Find feature in table.
|
||||
const SubtargetFeatureKV *FeatureEntry =
|
||||
Find(StripFlag(Feature), FeatureTable, FeatureTableSize);
|
||||
|
@ -50,15 +50,15 @@ MArch("march", cl::desc("Architecture to generate code for:"));
|
||||
|
||||
static cl::opt<std::string>
|
||||
MCPU("mcpu",
|
||||
cl::desc("Target a specific cpu type"),
|
||||
cl::desc("Target a specific cpu type (-mcpu=help for list of choices)"),
|
||||
cl::value_desc("cpu-name"),
|
||||
cl::init(""));
|
||||
|
||||
static cl::list<std::string>
|
||||
MAttrs("mattr",
|
||||
cl::CommaSeparated,
|
||||
cl::desc("Target specific attributes:"),
|
||||
cl::value_desc("attributes"));
|
||||
cl::desc("Target specific attributes (-mattr=help for list of choices)"),
|
||||
cl::value_desc("attr1,+attr2, ..., -attrN"));
|
||||
|
||||
cl::opt<TargetMachine::CodeGenFileType>
|
||||
FileType("filetype", cl::init(TargetMachine::AssemblyFile),
|
||||
|
Loading…
Reference in New Issue
Block a user