Add help support for -mcpu and -mattr.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@23222 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Target/PowerPC/PPCSubtarget.cpp b/lib/Target/PowerPC/PPCSubtarget.cpp
index 0efc1c1..ca9d077 100644
--- a/lib/Target/PowerPC/PPCSubtarget.cpp
+++ b/lib/Target/PowerPC/PPCSubtarget.cpp
@@ -40,25 +40,31 @@
/// 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 @@
/// 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)
diff --git a/lib/Target/SubtargetFeature.cpp b/lib/Target/SubtargetFeature.cpp
index 1583f4e..bcb8f75 100644
--- a/lib/Target/SubtargetFeature.cpp
+++ b/lib/Target/SubtargetFeature.cpp
@@ -99,6 +99,29 @@
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 @@
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 @@
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);