diff --git a/lld/ELF/Config.h b/lld/ELF/Config.h index 00de985c0d5e..612ad8fa3475 100644 --- a/lld/ELF/Config.h +++ b/lld/ELF/Config.h @@ -66,6 +66,7 @@ struct Configuration { ELFKind EKind = ELFNoneKind; uint16_t EMachine = llvm::ELF::EM_NONE; uint64_t EntryAddr = -1; + unsigned Optimize = 0; }; extern Configuration *Config; diff --git a/lld/ELF/Driver.cpp b/lld/ELF/Driver.cpp index acb9d9b36d43..ee74722d5b73 100644 --- a/lld/ELF/Driver.cpp +++ b/lld/ELF/Driver.cpp @@ -156,6 +156,12 @@ void LinkerDriver::createFiles(opt::InputArgList &Args) { Config->SoName = getString(Args, OPT_soname); Config->Sysroot = getString(Args, OPT_sysroot); + if (auto *Arg = Args.getLastArg(OPT_O)) { + StringRef Val = Arg->getValue(); + if (Val.getAsInteger(10, Config->Optimize)) + error("Invalid optimization level"); + } + if (auto *Arg = Args.getLastArg(OPT_hash_style)) { StringRef S = Arg->getValue(); if (S == "gnu") { diff --git a/lld/ELF/Options.td b/lld/ELF/Options.td index 219547248075..3bf076eb8082 100644 --- a/lld/ELF/Options.td +++ b/lld/ELF/Options.td @@ -12,6 +12,8 @@ def Bstatic: Flag<["-"], "Bstatic">, def L : Joined<["-"], "L">, MetaVarName<"">, HelpText<"Directory to search for libraries">; +def O : Joined<["-"], "O">, HelpText<"Optimize">; + def allow_multiple_definition: Flag<["--"], "allow-multiple-definition">, HelpText<"Allow multiple definitions">; @@ -125,7 +127,6 @@ def alias_script_T : Separate<["-"], "T">, Alias