[obj2yaml] Refactor command line parsing
authorFangrui Song <i@maskray.me>
Mon, 18 Jul 2022 07:13:55 +0000 (00:13 -0700)
committerFangrui Song <i@maskray.me>
Mon, 18 Jul 2022 07:13:55 +0000 (00:13 -0700)
Similar to D73982 for yaml2obj.

* Hide unrelated options.
* Add an OVERVIEW: message.
* Disallow single-dash long options.

Reviewed By: jhenderson

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

llvm/test/tools/obj2yaml/help.test [new file with mode: 0644]
llvm/tools/obj2yaml/obj2yaml.cpp

diff --git a/llvm/test/tools/obj2yaml/help.test b/llvm/test/tools/obj2yaml/help.test
new file mode 100644 (file)
index 0000000..72e8e75
--- /dev/null
@@ -0,0 +1,11 @@
+## Show that help text is printed correctly when requested.
+
+# RUN: obj2yaml -h | FileCheck %s --check-prefixes=CHECK,CATEG --implicit-check-not=Options:
+# RUN: obj2yaml --help | FileCheck %s --check-prefixes=CHECK,CATEG --implicit-check-not=Options:
+# RUN: obj2yaml --help-list | FileCheck %s --implicit-check-not=Options:
+
+# CHECK: OVERVIEW: Dump a YAML description from an object file
+# CHECK: USAGE: obj2yaml{{(.exe)?}} [options] <input file>{{$}}
+# CHECK: OPTIONS:
+# CATEG: Generic Options:
+# CATEG: obj2yaml Options:
index 4eec967..f1dbd59 100644 (file)
 using namespace llvm;
 using namespace llvm::object;
 
+static cl::OptionCategory Cat("obj2yaml Options");
+
 static cl::opt<std::string>
     InputFilename(cl::Positional, cl::desc("<input file>"), cl::init("-"));
 static cl::opt<std::string> OutputFilename("o", cl::desc("Output filename"),
                                            cl::value_desc("filename"),
-                                           cl::init("-"), cl::Prefix);
+                                           cl::init("-"), cl::Prefix,
+                                           cl::cat(Cat));
 static cl::bits<RawSegments> RawSegment(
     "raw-segment",
     cl::desc("Mach-O: dump the raw contents of the listed segments instead of "
              "parsing them:"),
-    cl::values(clEnumVal(data, "__DATA"), clEnumVal(linkedit, "__LINKEDIT")));
+    cl::values(clEnumVal(data, "__DATA"), clEnumVal(linkedit, "__LINKEDIT")),
+    cl::cat(Cat));
 
 static Error dumpObject(const ObjectFile &Obj, raw_ostream &OS) {
   if (Obj.isCOFF())
@@ -97,7 +101,10 @@ static void reportError(StringRef Input, Error Err) {
 
 int main(int argc, char *argv[]) {
   InitLLVM X(argc, argv);
-  cl::ParseCommandLineOptions(argc, argv);
+  cl::HideUnrelatedOptions(Cat);
+  cl::ParseCommandLineOptions(
+      argc, argv, "Dump a YAML description from an object file", nullptr,
+      nullptr, /*LongOptionsUseDoubleDash=*/true);
 
   std::error_code EC;
   std::unique_ptr<ToolOutputFile> Out(