[lld] r278056 - COFF: handle /debugtype option

David Majnemer via llvm-commits llvm-commits at lists.llvm.org
Mon Aug 8 15:32:05 PDT 2016


On Monday, August 8, 2016, Saleem Abdulrasool via llvm-commits <
llvm-commits at lists.llvm.org> wrote:

> Author: compnerd
> Date: Mon Aug  8 17:02:44 2016
> New Revision: 278056
>
> URL: http://llvm.org/viewvc/llvm-project?rev=278056&view=rev
> Log:
> COFF: handle /debugtype option
>
> Add the support infrastructure for the /debugtype option which takes a
> comma
> delimited list of debug info to generate. The defaults are based on other
> options potentially (/driver or /profile). This sets up the infrastructure
> to
> allow us to emit RSDS records to get "build id" equivalents on COFF
> (similar to
> binutils).
>
> Modified:
>     lld/trunk/COFF/Config.h
>     lld/trunk/COFF/Driver.cpp
>     lld/trunk/COFF/Options.td
>
> Modified: lld/trunk/COFF/Config.h
> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/COFF/Config.
> h?rev=278056&r1=278055&r2=278056&view=diff
> ============================================================
> ==================
> --- lld/trunk/COFF/Config.h (original)
> +++ lld/trunk/COFF/Config.h Mon Aug  8 17:02:44 2016
> @@ -61,6 +61,13 @@ struct Export {
>    }
>  };
>
> +enum class DebugType {
> +  None  = 0x0,
> +  CV    = 0x1,  /// CodeView
> +  PData = 0x2,  /// Procedure Data
> +  Fixup = 0x4,  /// Relocation Table
> +};
> +
>  // Global configuration.
>  struct Configuration {
>    enum ManifestKind { SideBySide, Embed, No };
> @@ -78,6 +85,7 @@ struct Configuration {
>    bool Force = false;
>    bool Debug = false;
>    bool WriteSymtab = true;
> +  unsigned DebugTypes = static_cast<unsigned>(DebugType::None);
>
>    // Symbols in this set are considered as live by the garbage collector.
>    std::set<Undefined *> GCRoot;
>
> Modified: lld/trunk/COFF/Driver.cpp
> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/COFF/Driver.
> cpp?rev=278056&r1=278055&r2=278056&view=diff
> ============================================================
> ==================
> --- lld/trunk/COFF/Driver.cpp (original)
> +++ lld/trunk/COFF/Driver.cpp Mon Aug  8 17:02:44 2016
> @@ -16,6 +16,7 @@
>  #include "Writer.h"
>  #include "lld/Driver/Driver.h"
>  #include "llvm/ADT/Optional.h"
> +#include "llvm/ADT/StringSwitch.h"
>  #include "llvm/LibDriver/LibDriver.h"
>  #include "llvm/Option/Arg.h"
>  #include "llvm/Option/ArgList.h"
> @@ -282,6 +283,28 @@ static std::string createResponseFile(co
>    return Data.str();
>  }
>
> +static unsigned getDefaultDebugType(const llvm::opt::InputArgList &Args) {
> +  unsigned DebugTypes = static_cast<unsigned>(DebugType::CV);
> +  if (Args.hasArg(OPT_driver))
> +    DebugTypes |= static_cast<unsigned>(DebugType::PData);
> +  if (Args.hasArg(OPT_profile))
> +    DebugTypes |= static_cast<unsigned>(DebugType::Fixup);
> +  return DebugTypes;
> +}
> +
> +static unsigned parseDebugType(StringRef Arg) {
> +  llvm::SmallVector<StringRef, 3> Types;
> +  Arg.split(Types, ',', /*KeepEmpty=*/false);
> +
> +  unsigned DebugTypes = static_cast<unsigned>(DebugType::None);
> +  for (StringRef Type : Types)
> +    DebugTypes |= StringSwitch<unsigned>(Type.lower())
> +                      .Case("cv", static_cast<unsigned>(DebugType::CV))
> +                      .Case("pdata", static_cast<unsigned>(
> DebugType::PData))
> +                      .Case("fixup", static_cast<unsigned>(
> DebugType::Fixup));


What if Type is none of the above? Don't you need a .Default call?


> +  return DebugTypes;
> +}
> +
>  void LinkerDriver::link(llvm::ArrayRef<const char *> ArgsArr) {
>    // If the first command line argument is "/lib", link.exe acts like
> lib.exe.
>    // We call our own implementation of lib.exe that understands bitcode
> files.
> @@ -341,8 +364,13 @@ void LinkerDriver::link(llvm::ArrayRef<c
>      Config->Force = true;
>
>    // Handle /debug
> -  if (Args.hasArg(OPT_debug))
> +  if (Args.hasArg(OPT_debug)) {
>      Config->Debug = true;
> +    Config->DebugTypes =
> +        Args.hasArg(OPT_debugtype)
> +            ? parseDebugType(Args.getLastArg(OPT_debugtype)->getValue())
> +            : getDefaultDebugType(Args);
> +  }
>
>    // Handle /noentry
>    if (Args.hasArg(OPT_noentry)) {
>
> Modified: lld/trunk/COFF/Options.td
> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/COFF/
> Options.td?rev=278056&r1=278055&r2=278056&view=diff
> ============================================================
> ==================
> --- lld/trunk/COFF/Options.td (original)
> +++ lld/trunk/COFF/Options.td Mon Aug  8 17:02:44 2016
> @@ -62,7 +62,9 @@ def deffile : Joined<["/", "-"], "def:">
>      HelpText<"Use module-definition file">;
>
>  def debug : F<"debug">, HelpText<"Embed a symbol table in the image">;
> +def debugtype : P<"debugtype", "Debug Info Options">;
>  def dll : F<"dll">, HelpText<"Create a DLL">;
> +def driver : P<"driver", "Generate a Windows NT Kernel Mode Driver">;
>  def nodefaultlib_all : F<"nodefaultlib">;
>  def noentry : F<"noentry">;
>  def profile : F<"profile">;
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org <javascript:;>
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20160808/60932d3c/attachment.html>


More information about the llvm-commits mailing list