Add -help option to Darwin Driver. Use grouping in Options table to better format...
authorNick Kledzik <kledzik@apple.com>
Fri, 19 Jul 2013 01:02:49 +0000 (01:02 +0000)
committerNick Kledzik <kledzik@apple.com>
Fri, 19 Jul 2013 01:02:49 +0000 (01:02 +0000)
llvm-svn: 186640

lld/include/lld/ReaderWriter/MachOTargetInfo.h
lld/lib/Driver/DarwinLdDriver.cpp
lld/lib/Driver/DarwinOptions.td
lld/lib/ReaderWriter/MachO/MachOTargetInfo.cpp

index 2392c6e..d0568ce 100644 (file)
@@ -72,6 +72,8 @@ public:
   void setArch(Arch arch) { _arch = arch; }
   bool setOS(OS os, StringRef minOSVersion);
   bool minOS(StringRef mac, StringRef iOS) const;
+  void setDoNothing(bool value) { _doNothing = value; }
+  bool doNothing() const { return _doNothing; }
 
 private:
   virtual Writer &writer() const;
@@ -92,6 +94,7 @@ private:
 
   uint32_t        _outputFileType; // e.g MH_EXECUTE
   bool            _outputFileTypeStatic; // Disambiguate static vs dynamic prog
+  bool            _doNothing;   // for -help and -v which just print info
   Arch            _arch;
   OS              _os;
   PackedVersion   _osMinVersion;
index 60ea967..f603fd8 100644 (file)
@@ -75,6 +75,8 @@ bool DarwinLdDriver::linkMachO(int argc, const char *argv[],
   MachOTargetInfo info;
   if (parse(argc, argv, info, diagnostics))
     return true;
+  if ( info.doNothing() )
+    return false;
     
   return link(info, diagnostics);
 }
@@ -193,6 +195,16 @@ bool DarwinLdDriver::parse(int argc, const char *argv[],
     info.appendInputFile((*it)->getValue());
   }
   
+  // Handle -help
+  if (parsedArgs->getLastArg(OPT_help)) {
+    table.PrintHelp(llvm::outs(), argv[0], "LLVM Darwin Linker", false);
+    // If only -help on command line, don't try to do any linking
+    if ( argc == 2 ) {
+      info.setDoNothing(true);
+      return false;
+    }
+  }
+
   // Validate the combination of options used.
   if (info.validate(diagnostics))
     return true;
index f69d105..8141878 100644 (file)
@@ -1,31 +1,55 @@
 include "llvm/Option/OptParser.td"
 
+
 // output kinds
-def relocatable : Flag<["-"], "r">, HelpText<"create relocatable output">;
-def static : Flag<["-"], "static">;
-def dynamic : Flag<["-"], "dynamic">;
-def dylib : Flag<["-"], "dylib">;
-def bundle : Flag<["-"], "bundle">;
-def execute : Flag<["-"], "execute">;
-def preload : Flag<["-"], "preload">;
-
-// linking options
-def dead_strip : Flag<["-"], "dead_strip">;
-def entry : Separate<["-"], "e">, HelpText<"entry symbol name">;
-def mllvm : Separate<["-"], "mllvm">, HelpText<"Options to pass to LLVM">;
-def arch : Separate<["-"], "arch">, HelpText<"architecture">;
+def grp_kind : OptionGroup<"outs">, HelpText<"OUTPUT KIND">;
+def relocatable : Flag<["-"], "r">, 
+                HelpText<"Create relocatable object file">, Group<grp_kind>;
+def static : Flag<["-"], "static">, 
+                HelpText<"Create static executable">, Group<grp_kind>;
+def dynamic : Flag<["-"], "dynamic">, 
+                HelpText<"Create dynamic executable (default)">,Group<grp_kind>;
+def dylib : Flag<["-"], "dylib">, 
+                HelpText<"Create dynamic library">, Group<grp_kind>;
+def bundle : Flag<["-"], "bundle">, 
+                HelpText<"Create dynamic bundle">, Group<grp_kind>;
+def execute : Flag<["-"], "execute">, 
+                HelpText<"Create main executable (default)">, Group<grp_kind>;
+def preload : Flag<["-"], "preload">, 
+                HelpText<"Create preload">, Group<grp_kind>;
+
+// optimizations
+def grp_opts : OptionGroup<"opts">, HelpText<"OPTIMIZATIONS">;
+def dead_strip : Flag<["-"], "dead_strip">,
+                HelpText<"Remove unreference code and data">, Group<grp_opts>;
 def macosx_version_min : Separate<["-"], "macosx_version_min">, 
-                          HelpText<"min Mac OS X version">;
+                HelpText<"Minimum Mac OS X version">, Group<grp_opts>;
 def ios_version_min : Separate<["-"], "ios_version_min">, 
-                          HelpText<"min iOS version">;
+                HelpText<"Minimum iOS version">, Group<grp_opts>;
 def ios_simulator_version_min : Separate<["-"], "ios_simulator_version_min">, 
-                          HelpText<"min iOS simulator version">;
-def all_load : Flag<["-"], "all_load">;
+                HelpText<"Minimum iOS simulator version">, Group<grp_opts>;
+def mllvm : Separate<["-"], "mllvm">, 
+                HelpText<"Options to pass to LLVM during LTO">, Group<grp_opts>;
+
+// main executable options
+def grp_main : OptionGroup<"opts">, HelpText<"MAIN EXECUTABLE OPTIONS">;
+def entry : Separate<["-"], "e">, HelpText<"entry symbol name">,Group<grp_main>;
 
-// search options
-def L : Joined<["-"], "L">;
+// dylib executable options
+def grp_dylib : OptionGroup<"opts">, HelpText<"DYLIB EXECUTABLE OPTIONS">;
 
-// inputs and outputs
-def output : Separate<["-"], "o">, HelpText<"output file name">;
+// library options
+def grp_libs : OptionGroup<"libs">, HelpText<"LIBRARY OPTIONS">;
+def L : Joined<["-"], "L">,
+        HelpText<"Add directory to library search path">, Group<grp_libs>;
+def all_load : Flag<["-"], "all_load">,
+        HelpText<"Forces all members of all static libraries to be loaded">, 
+        Group<grp_libs>;
+  
 
+// general options
+def output : Separate<["-"], "o">, HelpText<"Output file path">;
+def arch : Separate<["-"], "arch">, HelpText<"Architecture to link">;
 
+// extras
+def help : Flag<["-"], "help">;
index 0141e1a..4e3ae6c 100644 (file)
@@ -89,6 +89,7 @@ bool MachOTargetInfo::PackedVersion::operator==(
 MachOTargetInfo::MachOTargetInfo() 
   : _outputFileType(mach_o::MH_EXECUTE)
   , _outputFileTypeStatic(false)
+  , _doNothing(false)
   , _arch(arch_unknown)
   , _os(OS::macOSX)
   , _osMinVersion("0.0")
@@ -182,6 +183,11 @@ bool MachOTargetInfo::addUnixThreadLoadCommand() const {
 }
 
 bool MachOTargetInfo::validateImpl(raw_ostream &diagnostics) {
+  if (_inputFiles.empty()) {
+    diagnostics << "no object files specified\n";
+    return true;
+  }
+
   if ((_outputFileType == mach_o::MH_EXECUTE) && _entrySymbolName.empty()) {
     if (_outputFileTypeStatic) {
       _entrySymbolName = "start";