From 839615a510c582ddcdb09a8e2934f30775daa032 Mon Sep 17 00:00:00 2001 From: Jim Laskey Date: Fri, 2 Sep 2005 19:27:43 +0000 Subject: [PATCH] Add help support for -mcpu and -mattr. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@23222 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/Target/SubtargetFeature.h | 5 +++ lib/ExecutionEngine/JIT/TargetSelect.cpp | 6 +-- lib/Target/PowerPC/PPCSubtarget.cpp | 48 +++++++++++++----------- lib/Target/SubtargetFeature.cpp | 27 +++++++++++++ tools/llc/llc.cpp | 6 +-- 5 files changed, 65 insertions(+), 27 deletions(-) diff --git a/include/llvm/Target/SubtargetFeature.h b/include/llvm/Target/SubtargetFeature.h index 4d504c1939c..fa815dbb76b 100644 --- a/include/llvm/Target/SubtargetFeature.h +++ b/include/llvm/Target/SubtargetFeature.h @@ -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, diff --git a/lib/ExecutionEngine/JIT/TargetSelect.cpp b/lib/ExecutionEngine/JIT/TargetSelect.cpp index 5b1ee74cc17..508604797fd 100644 --- a/lib/ExecutionEngine/JIT/TargetSelect.cpp +++ b/lib/ExecutionEngine/JIT/TargetSelect.cpp @@ -26,15 +26,15 @@ MArch("march", cl::desc("Architecture to generate assembly for:")); static cl::opt 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 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. diff --git a/lib/Target/PowerPC/PPCSubtarget.cpp b/lib/Target/PowerPC/PPCSubtarget.cpp index 0efc1c152d8..ca9d0778e04 100644 --- a/lib/Target/PowerPC/PPCSubtarget.cpp +++ b/lib/Target/PowerPC/PPCSubtarget.cpp @@ -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) diff --git a/lib/Target/SubtargetFeature.cpp b/lib/Target/SubtargetFeature.cpp index 1583f4e43b6..bcb8f751aac 100644 --- a/lib/Target/SubtargetFeature.cpp +++ b/lib/Target/SubtargetFeature.cpp @@ -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); diff --git a/tools/llc/llc.cpp b/tools/llc/llc.cpp index fbd2cf85fdc..f2bccd01973 100644 --- a/tools/llc/llc.cpp +++ b/tools/llc/llc.cpp @@ -50,15 +50,15 @@ MArch("march", cl::desc("Architecture to generate code for:")); static cl::opt 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 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 FileType("filetype", cl::init(TargetMachine::AssemblyFile),