[lld] r228646 - Driver: Replace switch cases with ifs.

Rui Ueyama ruiu at google.com
Tue Feb 10 10:37:03 PST 2015


Thank you for reviewing! Addressed in r228717.

On Tue, Feb 10, 2015 at 2:24 AM, Jean-Daniel Dupas <dev at xenonium.com> wrote:

> I saw it is a common practice to test presence of argument using
>
> if (parsedArgs->getLastArg(OPT_dll)) {
> }
>
> Is there any reason to prefer the previous form over:
>
> if (parsedArgs->hasArg(OPT_dll)) {
> }
>
> I find the later clearer as it explicitly express that we just need to now
> if the arg is present.
>
> > Le 10 févr. 2015 à 02:10, Rui Ueyama <ruiu at google.com> a écrit :
> >
> > Author: ruiu
> > Date: Mon Feb  9 19:10:23 2015
> > New Revision: 228646
> >
> > URL: http://llvm.org/viewvc/llvm-project?rev=228646&view=rev
> > Log:
> > Driver: Replace switch cases with ifs.
> >
> > We used to do like this instead of putting all command line processing
> > code within one gigantic switch statement. It is converted to a switch
> > in r188958, which introduced InputGraph.
> >
> > In this patch I roll that change back. Now all "break"s are removed,
> > and the nesting is one level shallow.
> >
> > Modified:
> >    lld/trunk/lib/Driver/WinLinkDriver.cpp
> >
> > Modified: lld/trunk/lib/Driver/WinLinkDriver.cpp
> > URL:
> http://llvm.org/viewvc/llvm-project/lld/trunk/lib/Driver/WinLinkDriver.cpp?rev=228646&r1=228645&r2=228646&view=diff
> >
> ==============================================================================
> > --- lld/trunk/lib/Driver/WinLinkDriver.cpp (original)
> > +++ lld/trunk/lib/Driver/WinLinkDriver.cpp Mon Feb  9 19:10:23 2015
> > @@ -784,6 +784,10 @@ parseArgs(int argc, const char **argv, P
> >     diag << "warning: ignoring unknown argument: " << arg << "\n";
> >   }
> >
> > +  // Copy mllvm
> > +  for (auto arg : parsedArgs->filtered(OPT_mllvm))
> > +    ctx.appendLLVMOption(arg->getValue());
> > +
> >   // If we have expaneded response files and /verbose is given, print
> out the
> >   // final command line.
> >   if (!isReadingDirectiveSection && expanded &&
> > @@ -936,168 +940,140 @@ bool WinLinkDriver::parse(int argc, cons
> >
> >   // Handle /nodefaultlib:<lib>. The same option without argument is
> handled in
> >   // the following for loop.
> > -  for (auto nodeDefaultLib : parsedArgs->filtered(OPT_nodefaultlib)) {
> > -    ctx.addNoDefaultLib(nodeDefaultLib->getValue());
> > -  }
> > +  for (auto *arg : parsedArgs->filtered(OPT_nodefaultlib))
> > +    ctx.addNoDefaultLib(arg->getValue());
> >
> >   // Handle /defaultlib. Argument of the option is added to the input
> file list
> >   // unless it's blacklisted by /nodefaultlib.
> >   std::vector<StringRef> defaultLibs;
> > -  for (auto defaultLib : parsedArgs->filtered(OPT_defaultlib)) {
> > -    defaultLibs.push_back(defaultLib->getValue());
> > -  }
> > -
> > -  std::vector<StringRef> inputFiles;
> > +  for (auto *arg : parsedArgs->filtered(OPT_defaultlib))
> > +    defaultLibs.push_back(arg->getValue());
> >
> > -  // 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_alternatename: {
> > -      StringRef weak, def;
> > -      if (!parseAlternateName(inputArg->getValue(), weak, def, diag))
> > -        return false;
> > -      ctx.setAlternateName(weak, def);
> > -      break;
> > -    }
> > +  // -alternatename:<alias>=<symbol>
> > +  for (auto *arg : parsedArgs->filtered(OPT_alternatename)) {
> > +    StringRef weak, def;
> > +    if (!parseAlternateName(arg->getValue(), weak, def, diag))
> > +      return false;
> > +    ctx.setAlternateName(weak, def);
> > +  }
> >
> > -    case OPT_base:
> > -      // Parse /base command line option. The argument for the
> parameter is in
> > -      // the form of "<address>[:<size>]".
> > +  // Parse /base command line option. The argument for the parameter is
> in
> > +  // the form of "<address>[:<size>]".
> > +  if (auto *arg = parsedArgs->getLastArg(OPT_base)) {
> >       uint64_t addr, size;
> > -
> >       // Size should be set to SizeOfImage field in the COFF header, and
> if
> >       // it's smaller than the actual size, the linker should warn about
> that.
> >       // Currently we just ignore the value of size parameter.
> > -      if (!parseMemoryOption(inputArg->getValue(), addr, size))
> > +      if (!parseMemoryOption(arg->getValue(), addr, size))
> >         return false;
> >       ctx.setBaseAddress(addr);
> > -      break;
> > +  }
> >
> > -    case OPT_dll:
> > -      // Parse /dll command line option
> > -      ctx.setIsDll(true);
> > -      // Default base address of a DLL is 0x10000000.
> > -      if (!parsedArgs->getLastArg(OPT_base))
> > -        ctx.setBaseAddress(0x10000000);
> > -      break;
> > +  // Parse /dll command line option
> > +  if (parsedArgs->getLastArg(OPT_dll)) {
> > +    ctx.setIsDll(true);
> > +    // Default base address of a DLL is 0x10000000.
> > +    if (!parsedArgs->getLastArg(OPT_base))
> > +      ctx.setBaseAddress(0x10000000);
> > +  }
> >
> > -    case OPT_stack: {
> > -      // Parse /stack command line option
> > -      uint64_t reserve;
> > -      uint64_t commit = ctx.getStackCommit();
> > -      if (!parseMemoryOption(inputArg->getValue(), reserve, commit))
> > -        return false;
> > -      ctx.setStackReserve(reserve);
> > -      ctx.setStackCommit(commit);
> > -      break;
> > -    }
> > +  // Parse /stack command line option
> > +  if (auto *arg = parsedArgs->getLastArg(OPT_stack)) {
> > +    uint64_t reserve;
> > +    uint64_t commit = ctx.getStackCommit();
> > +    if (!parseMemoryOption(arg->getValue(), reserve, commit))
> > +      return false;
> > +    ctx.setStackReserve(reserve);
> > +    ctx.setStackCommit(commit);
> > +  }
> >
> > -    case OPT_heap: {
> > -      // Parse /heap command line option
> > -      uint64_t reserve;
> > -      uint64_t commit = ctx.getHeapCommit();
> > -      if (!parseMemoryOption(inputArg->getValue(), reserve, commit))
> > -        return false;
> > -      ctx.setHeapReserve(reserve);
> > -      ctx.setHeapCommit(commit);
> > -      break;
> > -    }
> > +  // Parse /heap command line option
> > +  if (auto *arg = parsedArgs->getLastArg(OPT_heap)) {
> > +    uint64_t reserve;
> > +    uint64_t commit = ctx.getHeapCommit();
> > +    if (!parseMemoryOption(arg->getValue(), reserve, commit))
> > +      return false;
> > +    ctx.setHeapReserve(reserve);
> > +    ctx.setHeapCommit(commit);
> > +  }
> >
> > -    case OPT_align: {
> > -      uint32_t align;
> > -      StringRef arg = inputArg->getValue();
> > -      if (arg.getAsInteger(10, align)) {
> > -        diag << "error: invalid value for /align: " << arg << "\n";
> > -        return false;
> > -      }
> > -      ctx.setSectionDefaultAlignment(align);
> > -      break;
> > +  if (auto *arg = parsedArgs->getLastArg(OPT_align)) {
> > +    uint32_t align;
> > +    StringRef val = arg->getValue();
> > +    if (val.getAsInteger(10, align)) {
> > +      diag << "error: invalid value for /align: " << val << "\n";
> > +      return false;
> >     }
> > +    ctx.setSectionDefaultAlignment(align);
> > +  }
> >
> > -    case OPT_version: {
> > -      uint32_t major, minor;
> > -      if (!parseVersion(inputArg->getValue(), major, minor))
> > -        return false;
> > -      ctx.setImageVersion(PECOFFLinkingContext::Version(major, minor));
> > -      break;
> > -    }
> > +  if (auto *arg = parsedArgs->getLastArg(OPT_version)) {
> > +    uint32_t major, minor;
> > +    if (!parseVersion(arg->getValue(), major, minor))
> > +      return false;
> > +    ctx.setImageVersion(PECOFFLinkingContext::Version(major, minor));
> > +  }
> >
> > -    case OPT_merge: {
> > -      // Parse /merge:<from>=<to>.
> > -      StringRef from, to;
> > -      std::tie(from, to) = StringRef(inputArg->getValue()).split('=');
> > -      if (from.empty() || to.empty()) {
> > -        diag << "error: malformed /merge option: " <<
> inputArg->getValue()
> > -             << "\n";
> > -        return false;
> > -      }
> > -      if (!ctx.addSectionRenaming(diag, from, to))
> > -        return false;
> > -      break;
> > +  // Parse /merge:<from>=<to>.
> > +  for (auto *arg : parsedArgs->filtered(OPT_merge)) {
> > +    StringRef from, to;
> > +    std::tie(from, to) = StringRef(arg->getValue()).split('=');
> > +    if (from.empty() || to.empty()) {
> > +      diag << "error: malformed /merge option: " << arg->getValue() <<
> "\n";
> > +      return false;
> >     }
> > +    if (!ctx.addSectionRenaming(diag, from, to))
> > +      return false;
> > +  }
> >
> > -    case OPT_subsystem: {
> > -      // Parse
> /subsystem:<subsystem>[,<majorOSVersion>[.<minorOSVersion>]].
> > -      llvm::COFF::WindowsSubsystem subsystem;
> > -      llvm::Optional<uint32_t> major, minor;
> > -      if (!parseSubsystem(inputArg->getValue(), subsystem, major,
> minor, diag))
> > -        return false;
> > -      ctx.setSubsystem(subsystem);
> > -      if (major.hasValue())
> > -        ctx.setMinOSVersion(PECOFFLinkingContext::Version(*major,
> *minor));
> > -      break;
> > -    }
> > +  // Parse /subsystem:<subsystem>[,<majorOSVersion>[.<minorOSVersion>]].
> > +  if (auto *arg = parsedArgs->getLastArg(OPT_subsystem)) {
> > +    llvm::COFF::WindowsSubsystem subsystem;
> > +    llvm::Optional<uint32_t> major, minor;
> > +    if (!parseSubsystem(arg->getValue(), subsystem, major, minor, diag))
> > +      return false;
> > +    ctx.setSubsystem(subsystem);
> > +    if (major.hasValue())
> > +      ctx.setMinOSVersion(PECOFFLinkingContext::Version(*major,
> *minor));
> > +  }
> >
> > -    case OPT_section: {
> > -      // Parse /section:name,[[!]{DEKPRSW}]
> > -      std::string section;
> > -      llvm::Optional<uint32_t> flags, mask;
> > -      if (!parseSection(inputArg->getValue(), section, flags, mask)) {
> > -        diag << "Unknown argument for /section: " <<
> inputArg->getValue()
> > -             << "\n";
> > -        return false;
> > -      }
> > -      if (flags.hasValue())
> > -        ctx.setSectionSetMask(section, *flags);
> > -      if (mask.hasValue())
> > -        ctx.setSectionClearMask(section, *mask);
> > -      break;
> > +  // Parse /section:name,[[!]{DEKPRSW}]
> > +  for (auto *arg : parsedArgs->filtered(OPT_section)) {
> > +    std::string section;
> > +    llvm::Optional<uint32_t> flags, mask;
> > +    if (!parseSection(arg->getValue(), section, flags, mask)) {
> > +      diag << "Unknown argument for /section: " << arg->getValue() <<
> "\n";
> > +      return false;
> >     }
> > +    if (flags.hasValue())
> > +      ctx.setSectionSetMask(section, *flags);
> > +    if (mask.hasValue())
> > +      ctx.setSectionClearMask(section, *mask);
> > +  }
> >
> > -    case OPT_manifest:
> > -      // Do nothing. This is default.
> > -      break;
> > -
> > -    case OPT_manifest_colon: {
> > -      // Parse /manifest:EMBED[,ID=#]|NO.
> > -      bool enable = true;
> > -      bool embed = false;
> > -      int id = 1;
> > -      if (!parseManifest(inputArg->getValue(), enable, embed, id)) {
> > -        diag << "Unknown argument for /manifest: " <<
> inputArg->getValue()
> > -             << "\n";
> > -        return false;
> > -      }
> > -      ctx.setCreateManifest(enable);
> > -      ctx.setEmbedManifest(embed);
> > -      ctx.setManifestId(id);
> > -      break;
> > +  // Parse /manifest:EMBED[,ID=#]|NO.
> > +  if (auto *arg = parsedArgs->getLastArg(OPT_manifest_colon)) {
> > +    bool enable = true;
> > +    bool embed = false;
> > +    int id = 1;
> > +    if (!parseManifest(arg->getValue(), enable, embed, id)) {
> > +      diag << "Unknown argument for /manifest: " << arg->getValue() <<
> "\n";
> > +      return false;
> >     }
> > +    ctx.setCreateManifest(enable);
> > +    ctx.setEmbedManifest(embed);
> > +    ctx.setManifestId(id);
> > +  }
> >
> > -    case OPT_manifestuac: {
> > -      // Parse /manifestuac.
> > -      if (StringRef(inputArg->getValue()).equals_lower("no")) {
> > -        ctx.setManifestUAC(false);
> > -        break;
> > -      }
> > +  // Parse /manifestuac.
> > +  if (auto *arg = parsedArgs->getLastArg(OPT_manifestuac)) {
> > +    if (StringRef(arg->getValue()).equals_lower("no")) {
> > +      ctx.setManifestUAC(false);
> > +    } else {
> >       llvm::Optional<std::string> privilegeLevel;
> >       llvm::Optional<std::string> uiAccess;
> > -      if (!parseManifestUAC(inputArg->getValue(), privilegeLevel,
> uiAccess)) {
> > -        diag << "Unknown argument for /manifestuac: " <<
> inputArg->getValue()
> > +      if (!parseManifestUAC(arg->getValue(), privilegeLevel, uiAccess))
> {
> > +        diag << "Unknown argument for /manifestuac: " << arg->getValue()
> >              << "\n";
> >         return false;
> >       }
> > @@ -1105,231 +1081,197 @@ bool WinLinkDriver::parse(int argc, cons
> >         ctx.setManifestLevel(privilegeLevel.getValue());
> >       if (uiAccess.hasValue())
> >         ctx.setManifestUiAccess(uiAccess.getValue());
> > -      break;
> >     }
> > +  }
> >
> > -    case OPT_manifestfile:
> > -      ctx.setManifestOutputPath(ctx.allocate(inputArg->getValue()));
> > -      break;
> > -
> > -    case OPT_manifestdependency:
> > -      // /manifestdependency:<string> option. Note that the argument
> will be
> > -      // embedded to the manifest XML file with no error check, for
> link.exe
> > -      // compatibility. We do not gurantete that the resulting XML file
> is
> > -      // valid.
> > -      ctx.setManifestDependency(ctx.allocate(inputArg->getValue()));
> > -      break;
> > +  if (auto *arg = parsedArgs->getLastArg(OPT_manifestfile))
> > +    ctx.setManifestOutputPath(ctx.allocate(arg->getValue()));
> >
> > -    case OPT_failifmismatch:
> > -      if (handleFailIfMismatchOption(inputArg->getValue(),
> failIfMismatchMap,
> > -                                     diag))
> > -        return false;
> > -      break;
> > +  // /manifestdependency:<string> option. Note that the argument will be
> > +  // embedded to the manifest XML file with no error check, for link.exe
> > +  // compatibility. We do not gurantete that the resulting XML file is
> > +  // valid.
> > +  if (auto *arg = parsedArgs->getLastArg(OPT_manifestdependency))
> > +    ctx.setManifestDependency(ctx.allocate(arg->getValue()));
> >
> > -    case OPT_entry:
> > -      ctx.setEntrySymbolName(ctx.allocate(inputArg->getValue()));
> > -      break;
> > +  for (auto *arg : parsedArgs->filtered(OPT_failifmismatch))
> > +    if (handleFailIfMismatchOption(arg->getValue(), failIfMismatchMap,
> diag))
> > +      return false;
> >
> > -    case OPT_export: {
> > -      PECOFFLinkingContext::ExportDesc desc;
> > -      if (!parseExport(inputArg->getValue(), desc)) {
> > -        diag << "Error: malformed /export option: " <<
> inputArg->getValue()
> > -             << "\n";
> > -        return false;
> > -      }
> > +  if (auto *arg = parsedArgs->getLastArg(OPT_entry))
> > +    ctx.setEntrySymbolName(ctx.allocate(arg->getValue()));
> >
> > -      // Mangle the symbol name only if it is reading user-supplied
> command line
> > -      // arguments. Because the symbol name in the .drectve section is
> already
> > -      // mangled by the compiler, we shouldn't add a leading underscore
> in that
> > -      // case. It's odd that the command line option has different
> semantics in
> > -      // the .drectve section, but this behavior is needed for
> compatibility
> > -      // with MSVC's link.exe.
> > -      if (!isReadingDirectiveSection)
> > -        desc.name = ctx.decorateSymbol(desc.name);
> > -      ctx.addDllExport(desc);
> > -      break;
> > +  for (auto *arg : parsedArgs->filtered(OPT_export)) {
> > +    PECOFFLinkingContext::ExportDesc desc;
> > +    if (!parseExport(arg->getValue(), desc)) {
> > +      diag << "Error: malformed /export option: " << arg->getValue() <<
> "\n";
> > +      return false;
> >     }
> >
> > -    case OPT_deffile: {
> > -      llvm::BumpPtrAllocator alloc;
> > -      std::vector<moduledef::Directive *> dirs;
> > -      if (!parseDef(inputArg->getValue(), alloc, dirs)) {
> > -        diag << "Error: invalid module-definition file\n";
> > -        return false;
> > -      }
> > -      for (moduledef::Directive *dir : dirs) {
> > -        if (auto *exp = dyn_cast<moduledef::Exports>(dir)) {
> > -          for (PECOFFLinkingContext::ExportDesc desc :
> exp->getExports()) {
> > -            desc.name = ctx.decorateSymbol(desc.name);
> > -            ctx.addDllExport(desc);
> > -          }
> > -        } else if (auto *hs = dyn_cast<moduledef::Heapsize>(dir)) {
> > -          ctx.setHeapReserve(hs->getReserve());
> > -          ctx.setHeapCommit(hs->getCommit());
> > -        } else if (auto *lib = dyn_cast<moduledef::Library>(dir)) {
> > -          ctx.setIsDll(true);
> > -          ctx.setOutputPath(ctx.allocate(lib->getName()));
> > -          if (lib->getBaseAddress() && !ctx.getBaseAddress())
> > -            ctx.setBaseAddress(lib->getBaseAddress());
> > -        } else if (auto *name = dyn_cast<moduledef::Name>(dir)) {
> > -          if (!name->getOutputPath().empty() &&
> ctx.outputPath().empty())
> > -            ctx.setOutputPath(ctx.allocate(name->getOutputPath()));
> > -          if (name->getBaseAddress() && ctx.getBaseAddress())
> > -            ctx.setBaseAddress(name->getBaseAddress());
> > -        } else if (auto *ver = dyn_cast<moduledef::Version>(dir)) {
> > -          ctx.setImageVersion(PECOFFLinkingContext::Version(
> > -              ver->getMajorVersion(), ver->getMinorVersion()));
> > -        } else {
> > -          llvm::dbgs() << static_cast<int>(dir->getKind()) << "\n";
> > -          llvm_unreachable("Unknown module-definition directive.\n");
> > +    // Mangle the symbol name only if it is reading user-supplied
> command line
> > +    // arguments. Because the symbol name in the .drectve section is
> already
> > +    // mangled by the compiler, we shouldn't add a leading underscore
> in that
> > +    // case. It's odd that the command line option has different
> semantics in
> > +    // the .drectve section, but this behavior is needed for
> compatibility
> > +    // with MSVC's link.exe.
> > +    if (!isReadingDirectiveSection)
> > +      desc.name = ctx.decorateSymbol(desc.name);
> > +    ctx.addDllExport(desc);
> > +  }
> > +
> > +  for (auto *arg : parsedArgs->filtered(OPT_deffile)) {
> > +    llvm::BumpPtrAllocator alloc;
> > +    std::vector<moduledef::Directive *> dirs;
> > +    if (!parseDef(arg->getValue(), alloc, dirs)) {
> > +      diag << "Error: invalid module-definition file\n";
> > +      return false;
> > +    }
> > +    for (moduledef::Directive *dir : dirs) {
> > +      if (auto *exp = dyn_cast<moduledef::Exports>(dir)) {
> > +        for (PECOFFLinkingContext::ExportDesc desc : exp->getExports())
> {
> > +          desc.name = ctx.decorateSymbol(desc.name);
> > +          ctx.addDllExport(desc);
> >         }
> > +      } else if (auto *hs = dyn_cast<moduledef::Heapsize>(dir)) {
> > +        ctx.setHeapReserve(hs->getReserve());
> > +        ctx.setHeapCommit(hs->getCommit());
> > +      } else if (auto *lib = dyn_cast<moduledef::Library>(dir)) {
> > +        ctx.setIsDll(true);
> > +        ctx.setOutputPath(ctx.allocate(lib->getName()));
> > +        if (lib->getBaseAddress() && !ctx.getBaseAddress())
> > +          ctx.setBaseAddress(lib->getBaseAddress());
> > +      } else if (auto *name = dyn_cast<moduledef::Name>(dir)) {
> > +        if (!name->getOutputPath().empty() && ctx.outputPath().empty())
> > +          ctx.setOutputPath(ctx.allocate(name->getOutputPath()));
> > +        if (name->getBaseAddress() && ctx.getBaseAddress())
> > +          ctx.setBaseAddress(name->getBaseAddress());
> > +      } else if (auto *ver = dyn_cast<moduledef::Version>(dir)) {
> > +        ctx.setImageVersion(PECOFFLinkingContext::Version(
> > +                              ver->getMajorVersion(),
> ver->getMinorVersion()));
> > +      } else {
> > +        llvm::dbgs() << static_cast<int>(dir->getKind()) << "\n";
> > +        llvm_unreachable("Unknown module-definition directive.\n");
> >       }
> >     }
> > +  }
> >
> > -    case OPT_libpath:
> > -      ctx.appendInputSearchPath(ctx.allocate(inputArg->getValue()));
> > -      break;
> > +  for (auto *arg : parsedArgs->filtered(OPT_libpath))
> > +    ctx.appendInputSearchPath(ctx.allocate(arg->getValue()));
> >
> > -    case OPT_opt: {
> > -      StringRef arg = inputArg->getValue();
> > -      if (arg.equals_lower("noref")) {
> > -        ctx.setDeadStripping(false);
> > -        break;
> > -      }
> > -      if (arg.equals_lower("ref") || arg.equals_lower("icf") ||
> > -          arg.equals_lower("noicf") || arg.startswith_lower("icf=") ||
> > -          arg.equals_lower("lbr") || arg.equals_lower("nolbr")) {
> > -        // Ignore known but unsupported options.
> > -        break;
> > -      }
> > -      diag << "unknown option for /opt: " << arg << "\n";
> > +  for (auto *arg : parsedArgs->filtered(OPT_opt)) {
> > +    std::string val = StringRef(arg->getValue()).lower();
> > +    if (val == "noref") {
> > +      ctx.setDeadStripping(false);
> > +    } else if (val != "ref" && val != "icf" && val != "noicf" &&
> > +            val != "lbr" && val != "nolbr" &&
> > +               !StringRef(val).startswith("icf=")) {
> > +      diag << "unknown option for /opt: " << val << "\n";
> >       return false;
> >     }
> > +  }
> >
> > -    case OPT_debug:
> > -      // LLD is not yet capable of creating a PDB file, so /debug does
> not have
> > -      // any effect.
> > -      // TODO: This should disable dead stripping. Currently we can't
> do that
> > -      // because removal of associative sections depends on dead
> stripping.
> > -      ctx.setDebug(true);
> > -      break;
> > -
> > -    case OPT_verbose:
> > -      ctx.setLogInputFiles(true);
> > -      break;
> > -
> > -    case OPT_force:
> > -    case OPT_force_unresolved:
> > -      // /force and /force:unresolved mean the same thing. We do not
> currently
> > -      // support /force:multiple.
> > -      ctx.setAllowRemainingUndefines(true);
> > -      break;
> > -
> > -    case OPT_fixed:
> > -      // /fixed is not compatible with /dynamicbase. Check for it.
> > -      if (parsedArgs->getLastArg(OPT_dynamicbase)) {
> > -        diag << "/dynamicbase must not be specified with /fixed\n";
> > -        return false;
> > -      }
> > -      ctx.setBaseRelocationEnabled(false);
> > -      ctx.setDynamicBaseEnabled(false);
> > -      break;
> > -
> > -    case OPT_swaprun_cd:
> > -      // /swaprun:{cd,net} options set
> IMAGE_FILE_{REMOVABLE,NET}_RUN_FROM_SWAP
> > -      // bits in the COFF header, respectively. If one of the bits is
> on, the
> > -      // Windows loader will copy the entire file to swap area then
> execute it,
> > -      // so that the user can eject a CD or disconnect from the network.
> > -      ctx.setSwapRunFromCD(true);
> > -      break;
> > +  // LLD is not yet capable of creating a PDB file, so /debug does not
> have
> > +  // any effect.
> > +  // TODO: This should disable dead stripping. Currently we can't do
> that
> > +  // because removal of associative sections depends on dead stripping.
> > +  if (parsedArgs->getLastArg(OPT_debug))
> > +    ctx.setDebug(true);
> > +
> > +  if (parsedArgs->getLastArg(OPT_verbose))
> > +    ctx.setLogInputFiles(true);
> > +
> > +  // /force and /force:unresolved mean the same thing. We do not
> currently
> > +  // support /force:multiple.
> > +  if (parsedArgs->getLastArg(OPT_force) ||
> > +      parsedArgs->getLastArg(OPT_force_unresolved)) {
> > +    ctx.setAllowRemainingUndefines(true);
> > +  }
> >
> > -    case OPT_swaprun_net:
> > -      ctx.setSwapRunFromNet(true);
> > -      break;
> > +  if (parsedArgs->getLastArg(OPT_fixed)) {
> > +    // /fixed is not compatible with /dynamicbase. Check for it.
> > +    if (parsedArgs->getLastArg(OPT_dynamicbase)) {
> > +      diag << "/dynamicbase must not be specified with /fixed\n";
> > +      return false;
> > +    }
> > +    ctx.setBaseRelocationEnabled(false);
> > +    ctx.setDynamicBaseEnabled(false);
> > +  }
> >
> > -    case OPT_profile:
> > -      // /profile implies /opt:ref, /opt:noicf, /incremental:no and
> /fixed:no.
> > -      ctx.setDeadStripping(true);
> > -      ctx.setBaseRelocationEnabled(true);
> > -      ctx.setDynamicBaseEnabled(true);
> > -      break;
> > +  // /swaprun:{cd,net} options set
> IMAGE_FILE_{REMOVABLE,NET}_RUN_FROM_SWAP
> > +  // bits in the COFF header, respectively. If one of the bits is on,
> the
> > +  // Windows loader will copy the entire file to swap area then execute
> it,
> > +  // so that the user can eject a CD or disconnect from the network.
> > +  if (parsedArgs->getLastArg(OPT_swaprun_cd))
> > +    ctx.setSwapRunFromCD(true);
> > +
> > +  if (parsedArgs->getLastArg(OPT_swaprun_net))
> > +    ctx.setSwapRunFromNet(true);
> > +
> > +  if (parsedArgs->getLastArg(OPT_profile)) {
> > +    // /profile implies /opt:ref, /opt:noicf, /incremental:no and
> /fixed:no.
> > +    ctx.setDeadStripping(true);
> > +    ctx.setBaseRelocationEnabled(true);
> > +    ctx.setDynamicBaseEnabled(true);
> > +  }
> >
> > -    case OPT_implib:
> > -      ctx.setOutputImportLibraryPath(inputArg->getValue());
> > -      break;
> > +  for (auto *arg : parsedArgs->filtered(OPT_implib))
> > +    ctx.setOutputImportLibraryPath(arg->getValue());
> >
> > -    case OPT_delayload:
> > -      ctx.addInitialUndefinedSymbol(ctx.getDelayLoadHelperName());
> > -      ctx.addDelayLoadDLL(inputArg->getValue());
> > -      break;
> > +  for (auto *arg : parsedArgs->filtered(OPT_delayload)) {
> > +    ctx.addInitialUndefinedSymbol(ctx.getDelayLoadHelperName());
> > +    ctx.addDelayLoadDLL(arg->getValue());
> > +  }
> >
> > -    case OPT_stub: {
> > -      ArrayRef<uint8_t> contents;
> > -      if (!readFile(ctx, inputArg->getValue(), contents)) {
> > -        diag << "Failed to read DOS stub file " << inputArg->getValue()
> << "\n";
> > -        return false;
> > -      }
> > -      ctx.setDosStub(contents);
> > -      break;
> > +  if (auto *arg = parsedArgs->getLastArg(OPT_stub)) {
> > +    ArrayRef<uint8_t> contents;
> > +    if (!readFile(ctx, arg->getValue(), contents)) {
> > +      diag << "Failed to read DOS stub file " << arg->getValue() <<
> "\n";
> > +      return false;
> >     }
> > +    ctx.setDosStub(contents);
> > +  }
> >
> > -    case OPT_incl: {
> > -      StringRef sym = ctx.allocate(inputArg->getValue());
> > -      if (isReadingDirectiveSection) {
> > -        undefinedSymbols->insert(sym);
> > -      } else {
> > -        ctx.addInitialUndefinedSymbol(sym);
> > -      }
> > -      break;
> > +  for (auto *arg : parsedArgs->filtered(OPT_incl)) {
> > +    StringRef sym = ctx.allocate(arg->getValue());
> > +    if (isReadingDirectiveSection) {
> > +      undefinedSymbols->insert(sym);
> > +    } else {
> > +      ctx.addInitialUndefinedSymbol(sym);
> >     }
> > +  }
> >
> > -    case OPT_noentry:
> > -      ctx.setHasEntry(false);
> > -      break;
> > -
> > -    case OPT_nodefaultlib_all:
> > -      ctx.setNoDefaultLibAll(true);
> > -      break;
> > -
> > -    case OPT_out:
> > -      ctx.setOutputPath(ctx.allocate(inputArg->getValue()));
> > -      break;
> > +  if (parsedArgs->getLastArg(OPT_noentry))
> > +    ctx.setHasEntry(false);
> >
> > -    case OPT_INPUT:
> > -      inputFiles.push_back(ctx.allocate(inputArg->getValue()));
> > -      break;
> > +  if (parsedArgs->getLastArg(OPT_nodefaultlib_all))
> > +    ctx.setNoDefaultLibAll(true);
> >
> > -    case OPT_pdb:
> > -      ctx.setPDBFilePath(inputArg->getValue());
> > -      break;
> > +  if (auto *arg = parsedArgs->getLastArg(OPT_out))
> > +    ctx.setOutputPath(ctx.allocate(arg->getValue()));
> >
> > -    case OPT_lldmoduledeffile:
> > -      ctx.setModuleDefinitionFile(inputArg->getValue());
> > -      break;
> > +  if (auto *arg = parsedArgs->getLastArg(OPT_pdb))
> > +    ctx.setPDBFilePath(arg->getValue());
> >
> > -#define DEFINE_BOOLEAN_FLAG(name, setter)       \
> > -    case OPT_##name:                            \
> > -      ctx.setter(true);                         \
> > -      break;                                    \
> > -    case OPT_##name##_no:                       \
> > -      ctx.setter(false);                        \
> > -      break
> > -
> > -    DEFINE_BOOLEAN_FLAG(nxcompat, setNxCompat);
> > -    DEFINE_BOOLEAN_FLAG(largeaddressaware, setLargeAddressAware);
> > -    DEFINE_BOOLEAN_FLAG(allowbind, setAllowBind);
> > -    DEFINE_BOOLEAN_FLAG(allowisolation, setAllowIsolation);
> > -    DEFINE_BOOLEAN_FLAG(dynamicbase, setDynamicBaseEnabled);
> > -    DEFINE_BOOLEAN_FLAG(tsaware, setTerminalServerAware);
> > -    DEFINE_BOOLEAN_FLAG(highentropyva, setHighEntropyVA);
> > -    DEFINE_BOOLEAN_FLAG(safeseh, setSafeSEH);
> > +  if (auto *arg = parsedArgs->getLastArg(OPT_lldmoduledeffile))
> > +    ctx.setModuleDefinitionFile(arg->getValue());
> >
> > -#undef DEFINE_BOOLEAN_FLAG
> > +  std::vector<StringRef> inputFiles;
> > +  for (auto *arg : parsedArgs->filtered(OPT_INPUT))
> > +    inputFiles.push_back(ctx.allocate(arg->getValue()));
> >
> > -    default:
> > -      break;
> > -    }
> > -  }
> > +#define BOOLEAN_FLAG(name, setter) \
> > +  if (auto *arg = parsedArgs->getLastArg(OPT_##name, OPT_##name##_no)) \
> > +    ctx.setter(arg->getOption().matches(OPT_##name));
> > +
> > +  BOOLEAN_FLAG(nxcompat, setNxCompat);
> > +  BOOLEAN_FLAG(largeaddressaware, setLargeAddressAware);
> > +  BOOLEAN_FLAG(allowbind, setAllowBind);
> > +  BOOLEAN_FLAG(allowisolation, setAllowIsolation);
> > +  BOOLEAN_FLAG(dynamicbase, setDynamicBaseEnabled);
> > +  BOOLEAN_FLAG(tsaware, setTerminalServerAware);
> > +  BOOLEAN_FLAG(highentropyva, setHighEntropyVA);
> > +  BOOLEAN_FLAG(safeseh, setSafeSEH);
> > +#undef BOOLEAN_FLAG
> >
> >   // Arguments after "--" are interpreted as filenames even if they
> >   // start with a hypen or a slash. This is not compatible with link.exe
> >
> >
> > _______________________________________________
> > llvm-commits mailing list
> > llvm-commits at cs.uiuc.edu
> > http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20150210/8382d62c/attachment.html>


More information about the llvm-commits mailing list