[lld] r228743 - Driver: move non-positional parameters out of switch. NFC.

Rui Ueyama ruiu at google.com
Tue Feb 10 12:57:44 PST 2015


Author: ruiu
Date: Tue Feb 10 14:57:43 2015
New Revision: 228743

URL: http://llvm.org/viewvc/llvm-project?rev=228743&view=rev
Log:
Driver: move non-positional parameters out of switch. NFC.

Modified:
    lld/trunk/lib/Driver/GnuLdDriver.cpp

Modified: lld/trunk/lib/Driver/GnuLdDriver.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/Driver/GnuLdDriver.cpp?rev=228743&r1=228742&r2=228743&view=diff
==============================================================================
--- lld/trunk/lib/Driver/GnuLdDriver.cpp (original)
+++ lld/trunk/lib/Driver/GnuLdDriver.cpp Tue Feb 10 14:57:43 2015
@@ -349,6 +349,14 @@ GnuLdDriver::createELFLinkingContext(llv
   return nullptr;
 }
 
+static llvm::Optional<bool>
+getBool(const llvm::opt::InputArgList &parsedArgs,
+        unsigned yesFlag, unsigned noFlag) {
+  if (auto *arg = parsedArgs.getLastArg(yesFlag, noFlag))
+    return arg->getOption().getID() == yesFlag;
+  return llvm::None;
+}
+
 bool GnuLdDriver::parse(int argc, const char *argv[],
                         std::unique_ptr<ELFLinkingContext> &context,
                         raw_ostream &diag) {
@@ -368,17 +376,18 @@ bool GnuLdDriver::parse(int argc, const
   }
 
   // Handle --help
-  if (parsedArgs->getLastArg(OPT_help)) {
+  if (parsedArgs->hasArg(OPT_help)) {
     table.PrintHelp(llvm::outs(), argv[0], "LLVM Linker", false);
     return true;
   }
 
   // Use -target or use default target triple to instantiate LinkingContext
   llvm::Triple baseTriple;
-  if (llvm::opt::Arg *trip = parsedArgs->getLastArg(OPT_target))
-    baseTriple = llvm::Triple(trip->getValue());
-  else
+  if (auto *arg = parsedArgs->getLastArg(OPT_target)) {
+    baseTriple = llvm::Triple(arg->getValue());
+  } else {
     baseTriple = getDefaultTarget(argv[0]);
+  }
   llvm::Triple triple(baseTriple);
 
   if (!applyEmulation(triple, *parsedArgs, diag))
@@ -391,11 +400,9 @@ bool GnuLdDriver::parse(int argc, const
     return false;
   }
 
-  std::stack<int> groupStack;
-  int numfiles = 0;
-  bool asNeeded = false;
-  bool wholeArchive = false;
-  bool hasNoStdLib = false;
+  // Copy mllvm
+  for (auto *arg : parsedArgs->filtered(OPT_mllvm))
+    ctx->appendLLVMOption(arg->getValue());
 
   // Ignore unknown arguments.
   for (auto unknownArg : parsedArgs->filtered(OPT_UNKNOWN))
@@ -403,63 +410,53 @@ bool GnuLdDriver::parse(int argc, const
          << unknownArg->getValue() << "\n";
 
   // Set sys root path.
-  if (llvm::opt::Arg *sysRootPath = parsedArgs->getLastArg(OPT_sysroot))
-    ctx->setSysroot(sysRootPath->getValue());
-
-  // Add all search paths.
-  for (auto libDir : parsedArgs->filtered(OPT_L))
-    ctx->addSearchPath(libDir->getValue());
+  if (auto *arg = parsedArgs->getLastArg(OPT_sysroot))
+    ctx->setSysroot(arg->getValue());
 
   // Add the default search directory specific to the target.
-  if (!(hasNoStdLib = parsedArgs->hasArg(OPT_nostdlib)))
+  if (!parsedArgs->hasArg(OPT_nostdlib))
     addPlatformSearchDirs(*ctx, triple, baseTriple);
 
   // Handle --demangle option(For compatibility)
-  if (parsedArgs->getLastArg(OPT_demangle))
+  if (parsedArgs->hasArg(OPT_demangle))
     ctx->setDemangleSymbols(true);
 
   // Handle --no-demangle option.
-  if (parsedArgs->getLastArg(OPT_no_demangle))
+  if (parsedArgs->hasArg(OPT_no_demangle))
     ctx->setDemangleSymbols(false);
 
-  // Figure out output kind ( -r, -static, -shared)
-  if (llvm::opt::Arg *kind =
-          parsedArgs->getLastArg(OPT_relocatable, OPT_static, OPT_shared,
-                                 OPT_nmagic, OPT_omagic, OPT_no_omagic)) {
-    switch (kind->getOption().getID()) {
-    case OPT_relocatable:
-      ctx->setOutputELFType(llvm::ELF::ET_REL);
-      ctx->setPrintRemainingUndefines(false);
-      ctx->setAllowRemainingUndefines(true);
-      break;
-    case OPT_static:
-      ctx->setOutputELFType(llvm::ELF::ET_EXEC);
-      ctx->setIsStaticExecutable(true);
-      break;
-    case OPT_shared:
-      ctx->setOutputELFType(llvm::ELF::ET_DYN);
-      ctx->setAllowShlibUndefines(true);
-      ctx->setUseShlibUndefines(false);
-      ctx->setPrintRemainingUndefines(false);
-      ctx->setAllowRemainingUndefines(true);
-      break;
-    }
+  // Figure out output kind (-r, -static, -shared)
+  if (parsedArgs->hasArg(OPT_relocatable)) {
+    ctx->setOutputELFType(llvm::ELF::ET_REL);
+    ctx->setPrintRemainingUndefines(false);
+    ctx->setAllowRemainingUndefines(true);
+  }
+
+  if (parsedArgs->hasArg(OPT_static)) {
+    ctx->setOutputELFType(llvm::ELF::ET_EXEC);
+    ctx->setIsStaticExecutable(true);
+  }
+
+  if (parsedArgs->hasArg(OPT_shared)) {
+    ctx->setOutputELFType(llvm::ELF::ET_DYN);
+    ctx->setAllowShlibUndefines(true);
+    ctx->setUseShlibUndefines(false);
+    ctx->setPrintRemainingUndefines(false);
+    ctx->setAllowRemainingUndefines(true);
   }
 
   // Figure out if the output type is nmagic/omagic
-  if (llvm::opt::Arg *kind =
-          parsedArgs->getLastArg(OPT_nmagic, OPT_omagic, OPT_no_omagic)) {
-    switch (kind->getOption().getID()) {
+  if (auto *arg = parsedArgs->getLastArg(
+        OPT_nmagic, OPT_omagic, OPT_no_omagic)) {
+    switch (arg->getOption().getID()) {
     case OPT_nmagic:
       ctx->setOutputMagic(ELFLinkingContext::OutputMagic::NMAGIC);
       ctx->setIsStaticExecutable(true);
       break;
-
     case OPT_omagic:
       ctx->setOutputMagic(ELFLinkingContext::OutputMagic::OMAGIC);
       ctx->setIsStaticExecutable(true);
       break;
-
     case OPT_no_omagic:
       ctx->setOutputMagic(ELFLinkingContext::OutputMagic::DEFAULT);
       ctx->setNoAllowDynamicLibraries();
@@ -467,26 +464,127 @@ bool GnuLdDriver::parse(int argc, const
     }
   }
 
-  for (auto inputArg : *parsedArgs) {
-    switch (inputArg->getOption().getID()) {
-    case OPT_merge_strings:
-      ctx->setMergeCommonStrings(true);
-      break;
-    case OPT_t:
-      ctx->setLogInputFiles(true);
-      break;
-    case OPT_use_shlib_undefs:
-      ctx->setUseShlibUndefines(true);
-      break;
-    case OPT_no_allow_shlib_undefs:
-      ctx->setAllowShlibUndefines(false);
-      break;
-    case OPT_allow_shlib_undefs:
-      ctx->setAllowShlibUndefines(true);
-      break;
+  if (parsedArgs->hasArg(OPT_strip_all))
+    ctx->setStripSymbols(true);
+
+  if (auto *arg = parsedArgs->getLastArg(OPT_soname))
+    ctx->setSharedObjectName(arg->getValue());
+
+  if (parsedArgs->hasArg(OPT_rosegment))
+    ctx->setCreateSeparateROSegment();
+
+  if (parsedArgs->hasArg(OPT_no_align_segments))
+    ctx->setAlignSegments(false);
+
+  if (auto *arg = parsedArgs->getLastArg(OPT_image_base)) {
+    uint64_t baseAddress = 0;
+    StringRef inputValue = arg->getValue();
+    if (inputValue.getAsInteger(0, baseAddress) || !baseAddress) {
+      diag << "invalid value for image base " << inputValue << "\n";
+      return false;
+    }
+    ctx->setBaseAddress(baseAddress);
+  }
+
+  if (parsedArgs->hasArg(OPT_merge_strings))
+    ctx->setMergeCommonStrings(true);
+
+  if (parsedArgs->hasArg(OPT_t))
+    ctx->setLogInputFiles(true);
+
+  if (parsedArgs->hasArg(OPT_use_shlib_undefs))
+    ctx->setUseShlibUndefines(true);
+
+  if (auto val = getBool(*parsedArgs, OPT_allow_shlib_undefs,
+                         OPT_no_allow_shlib_undefs))
+    ctx->setAllowShlibUndefines(*val);
+
+  if (auto *arg = parsedArgs->getLastArg(OPT_e))
+    ctx->setEntrySymbolName(arg->getValue());
+
+  if (auto *arg = parsedArgs->getLastArg(OPT_output))
+    ctx->setOutputPath(arg->getValue());
+
+  if (parsedArgs->hasArg(OPT_noinhibit_exec))
+    ctx->setAllowRemainingUndefines(true);
+
+  if (parsedArgs->hasArg(OPT_export_dynamic))
+    ctx->setExportDynamic(true);
+
+  if (parsedArgs->hasArg(OPT_allow_multiple_definition))
+    ctx->setAllowDuplicates(true);
+
+  if (auto *arg = parsedArgs->getLastArg(OPT_dynamic_linker))
+    ctx->setInterpreter(arg->getValue());
+
+  if (auto *arg = parsedArgs->getLastArg(OPT_init))
+    ctx->setInitFunction(arg->getValue());
+
+  if (auto *arg = parsedArgs->getLastArg(OPT_fini))
+    ctx->setFiniFunction(arg->getValue());
+
+  if (auto *arg = parsedArgs->getLastArg(OPT_output_filetype))
+    ctx->setOutputFileType(arg->getValue());
+
+  for (auto *arg : parsedArgs->filtered(OPT_L))
+    ctx->addSearchPath(arg->getValue());
+
+  for (auto *arg : parsedArgs->filtered(OPT_u))
+    ctx->addInitialUndefinedSymbol(arg->getValue());
+
+  for (auto *arg : parsedArgs->filtered(OPT_defsym)) {
+    StringRef sym, target;
+    uint64_t addr;
+    if (parseDefsymAsAbsolute(arg->getValue(), sym, addr)) {
+      ctx->addInitialAbsoluteSymbol(sym, addr);
+    } else if (parseDefsymAsAlias(arg->getValue(), sym, target)) {
+      ctx->addAlias(sym, target);
+    } else {
+      diag << "invalid --defsym: " << arg->getValue() << "\n";
+      return false;
+    }
+  }
+
+  for (auto *arg : parsedArgs->filtered(OPT_z)) {
+    StringRef opt = arg->getValue();
+    if (opt == "muldefs") {
+      ctx->setAllowDuplicates(true);
+    } else if (opt.startswith("max-page-size")) {
+      // Parse -z max-page-size option.
+      // The default page size is considered the minimum page size the user
+      // can set, check the user input if its atleast the minimum page size
+      // and does not exceed the maximum page size allowed for the target.
+      uint64_t maxPageSize = 0;
+
+      // Error if the page size user set is less than the maximum page size
+      // and greather than the default page size and the user page size is a
+      // modulo of the default page size.
+      if ((!parseZOption(opt, maxPageSize)) ||
+          (maxPageSize < ctx->getPageSize()) ||
+          (maxPageSize % ctx->getPageSize())) {
+        diag << "invalid option: " << opt << "\n";
+        return false;
+      }
+      ctx->setMaxPageSize(maxPageSize);
+    } else {
+      diag << "warning: ignoring unknown argument for -z: " << opt << "\n";
     }
   }
 
+  for (auto *arg : parsedArgs->filtered(OPT_rpath)) {
+    SmallVector<StringRef, 2> rpaths;
+    StringRef(arg->getValue()).split(rpaths, ":");
+    for (auto path : rpaths)
+      ctx->addRpath(path);
+  }
+
+  for (auto *arg : parsedArgs->filtered(OPT_rpath_link)) {
+    SmallVector<StringRef, 2> rpaths;
+    StringRef(arg->getValue()).split(rpaths, ":");
+    for (auto path : rpaths)
+      ctx->addRpathLink(path);
+  }
+
   // Register possible input file parsers.
   ctx->registry().addSupportELFObjects(
       ctx->mergeCommonStrings(),
@@ -498,52 +596,14 @@ bool GnuLdDriver::parse(int argc, const
     ctx->registry().addSupportELFDynamicSharedObjects(
         ctx->useShlibUndefines(), ctx->targetHandler());
 
-  // Process all the arguments and create input files.
-  for (auto inputArg : *parsedArgs) {
-    switch (inputArg->getOption().getID()) {
-    case OPT_mllvm:
-      ctx->appendLLVMOption(inputArg->getValue());
-      break;
-    case OPT_e:
-      ctx->setEntrySymbolName(inputArg->getValue());
-      break;
-
-    case OPT_output:
-      ctx->setOutputPath(inputArg->getValue());
-      break;
-
-    case OPT_noinhibit_exec:
-      ctx->setAllowRemainingUndefines(true);
-      break;
-
-    case OPT_export_dynamic:
-      ctx->setExportDynamic(true);
-      break;
-
-    case OPT_allow_multiple_definition:
-      ctx->setAllowDuplicates(true);
-      break;
-
-    case OPT_dynamic_linker:
-      ctx->setInterpreter(inputArg->getValue());
-      break;
-
-    case OPT_u:
-      ctx->addInitialUndefinedSymbol(inputArg->getValue());
-      break;
-
-    case OPT_init:
-      ctx->setInitFunction(inputArg->getValue());
-      break;
-
-    case OPT_fini:
-      ctx->setFiniFunction(inputArg->getValue());
-      break;
-
-    case OPT_output_filetype:
-      ctx->setOutputFileType(inputArg->getValue());
-      break;
+  std::stack<int> groupStack;
+  int numfiles = 0;
+  bool asNeeded = false;
+  bool wholeArchive = false;
 
+  // Process files
+  for (auto arg : *parsedArgs) {
+    switch (arg->getOption().getID()) {
     case OPT_no_whole_archive:
       wholeArchive = false;
       break;
@@ -560,20 +620,6 @@ bool GnuLdDriver::parse(int argc, const
       asNeeded = false;
       break;
 
-    case OPT_defsym: {
-      StringRef sym, target;
-      uint64_t addr;
-      if (parseDefsymAsAbsolute(inputArg->getValue(), sym, addr)) {
-        ctx->addInitialAbsoluteSymbol(sym, addr);
-      } else if (parseDefsymAsAlias(inputArg->getValue(), sym, target)) {
-        ctx->addAlias(sym, target);
-      } else {
-        diag << "invalid --defsym: " << inputArg->getValue() << "\n";
-        return false;
-      }
-      break;
-    }
-
     case OPT_start_group:
       groupStack.push(numfiles);
       break;
@@ -590,36 +636,10 @@ bool GnuLdDriver::parse(int argc, const
       break;
     }
 
-    case OPT_z: {
-      StringRef extOpt = inputArg->getValue();
-      if (extOpt == "muldefs")
-        ctx->setAllowDuplicates(true);
-      else if (extOpt.startswith("max-page-size")) {
-        // Parse -z max-page-size option.
-        // The default page size is considered the minimum page size the user
-        // can set, check the user input if its atleast the minimum page size
-        // and does not exceed the maximum page size allowed for the target.
-        uint64_t maxPageSize = 0;
-
-        // Error if the page size user set is less than the maximum page size
-        // and greather than the default page size and the user page size is a
-        // modulo of the default page size.
-        if ((!parseZOption(extOpt, maxPageSize)) ||
-            (maxPageSize < ctx->getPageSize()) ||
-            (maxPageSize % ctx->getPageSize())) {
-          diag << "invalid option: " << extOpt << "\n";
-          return false;
-        }
-        ctx->setMaxPageSize(maxPageSize);
-      } else
-        diag << "warning: ignoring unknown argument for -z: " << extOpt << "\n";
-      break;
-    }
-
     case OPT_INPUT:
     case OPT_l: {
-      bool dashL = (inputArg->getOption().getID() == OPT_l);
-      StringRef path = inputArg->getValue();
+      bool dashL = (arg->getOption().getID() == OPT_l);
+      StringRef path = arg->getValue();
 
       ErrorOr<StringRef> pathOrErr = findFile(*ctx, path, dashL);
       if (std::error_code ec = pathOrErr.getError()) {
@@ -642,8 +662,9 @@ bool GnuLdDriver::parse(int argc, const
           diag << "Cannot open " << path << ": " << ec.message() << "\n";
           return false;
         }
+        bool nostdlib = parsedArgs->hasArg(OPT_nostdlib);
         std::error_code ec =
-            evalLinkerScript(*ctx, std::move(mb.get()), diag, hasNoStdLib);
+            evalLinkerScript(*ctx, std::move(mb.get()), diag, nostdlib);
         if (ec) {
           diag << path << ": Error parsing linker script: "
                << ec.message() << "\n";
@@ -663,55 +684,8 @@ bool GnuLdDriver::parse(int argc, const
       numfiles += files.size();
       break;
     }
-
-    case OPT_rpath: {
-      SmallVector<StringRef, 2> rpaths;
-      StringRef(inputArg->getValue()).split(rpaths, ":");
-      for (auto path : rpaths)
-        ctx->addRpath(path);
-      break;
-    }
-
-    case OPT_rpath_link: {
-      SmallVector<StringRef, 2> rpaths;
-      StringRef(inputArg->getValue()).split(rpaths, ":");
-      for (auto path : rpaths)
-        ctx->addRpathLink(path);
-      break;
-    }
-
-    case OPT_strip_all: {
-      ctx->setStripSymbols(true);
-      break;
-    }
-
-    case OPT_soname:
-      ctx->setSharedObjectName(inputArg->getValue());
-      break;
-
-    case OPT_rosegment:
-      ctx->setCreateSeparateROSegment();
-      break;
-
-    case OPT_no_align_segments:
-      ctx->setAlignSegments(false);
-      break;
-
-    case OPT_image_base: {
-      uint64_t baseAddress = 0;
-      StringRef inputValue = inputArg->getValue();
-      if ((inputValue.getAsInteger(0, baseAddress)) || !baseAddress) {
-        diag << "invalid value for image base " << inputValue << "\n";
-        return false;
-      }
-      ctx->setBaseAddress(baseAddress);
-      break;
     }
-
-    default:
-      break;
-    } // end switch on option ID
-  }   // end for
+  }
 
   if (ctx->getNodes().empty()) {
     diag << "No input files\n";





More information about the llvm-commits mailing list