From 9dc740d0a9ae2b14fbf897d021217b6b5ce54dcd Mon Sep 17 00:00:00 2001 From: George Rimar Date: Tue, 6 Feb 2018 12:20:05 +0000 Subject: [PATCH] [ELF] - Re-commit r324322 "Use InitTargetOptionsFromCodeGenFlags/ParseCommandLineOptions for parsing LTO options.". With fix: Keep logic that ignores -plugin-opt=mcpu=x86-64 -plugin-opt=thinlto, add checks for those to testcases. Original commit message: [ELF] - Use InitTargetOptionsFromCodeGenFlags/ParseCommandLineOptions for parsing LTO options. gold plugin uses InitTargetOptionsFromCodeGenFlags + ParseCommandLineOptions for parsing LTO options. Patch do the same change for LLD. Such change helps to avoid parsing/whitelisting LTO plugin options again on linker side, what can help LLD to automatically support new -plugin-opt=xxx options passed. Differential revision: https://reviews.llvm.org/D42733 llvm-svn: 324340 --- lld/ELF/Driver.cpp | 22 ++++++++++------------ lld/test/ELF/lto-plugin-ignore.s | 11 ++++++----- 2 files changed, 16 insertions(+), 17 deletions(-) diff --git a/lld/ELF/Driver.cpp b/lld/ELF/Driver.cpp index afe98180dc4e..94b42407bf49 100644 --- a/lld/ELF/Driver.cpp +++ b/lld/ELF/Driver.cpp @@ -42,6 +42,7 @@ #include "lld/Common/Driver.h" #include "lld/Common/ErrorHandler.h" #include "lld/Common/Memory.h" +#include "lld/Common/TargetOptionsCommandFlags.h" #include "lld/Common/Threads.h" #include "lld/Common/Version.h" #include "llvm/ADT/StringExtras.h" @@ -252,18 +253,11 @@ void LinkerDriver::addLibrary(StringRef Name) { // LTO calls LLVM functions to compile bitcode files to native code. // Technically this can be delayed until we read bitcode files, but // we don't bother to do lazily because the initialization is fast. -static void initLLVM(opt::InputArgList &Args) { +static void initLLVM() { InitializeAllTargets(); InitializeAllTargetMCs(); InitializeAllAsmPrinters(); InitializeAllAsmParsers(); - - // Parse and evaluate -mllvm options. - std::vector V; - V.push_back("lld (LLVM option parsing)"); - for (auto *Arg : Args.filtered(OPT_mllvm)) - V.push_back(Arg->getValue()); - cl::ParseCommandLineOptions(V.size(), V.data()); } // Some command line options or some combinations of them are not allowed. @@ -372,7 +366,7 @@ void LinkerDriver::main(ArrayRef ArgsArr, bool CanExitEarly) { } readConfigs(Args); - initLLVM(Args); + initLLVM(); createFiles(Args); inferMachineType(); setConfigs(Args); @@ -696,6 +690,7 @@ void LinkerDriver::readConfigs(opt::InputArgList &Args) { Config->ZWxneeded = hasZOption(Args, "wxneeded"); // Parse LTO plugin-related options for compatibility with gold. + std::vector LTOOptions({Config->Argv[0].data()}); for (auto *Arg : Args.filtered(OPT_plugin_opt)) { StringRef S = Arg->getValue(); if (S == "disable-verify") @@ -710,10 +705,13 @@ void LinkerDriver::readConfigs(opt::InputArgList &Args) { Config->ThinLTOJobs = parseInt(S.substr(5), Arg); else if (!S.startswith("/") && !S.startswith("-fresolution=") && !S.startswith("-pass-through=") && !S.startswith("mcpu=") && - !S.startswith("thinlto") && S != "-function-sections" && - S != "-data-sections") - error(Arg->getSpelling() + ": unknown option: " + S); + !S.startswith("thinlto")) + LTOOptions.push_back(S.data()); } + // Parse and evaluate -mllvm options. + for (auto *Arg : Args.filtered(OPT_mllvm)) + LTOOptions.push_back(Arg->getValue()); + cl::ParseCommandLineOptions(LTOOptions.size(), LTOOptions.data()); if (Config->LTOO > 3) error("invalid optimization level for LTO: " + Twine(Config->LTOO)); diff --git a/lld/test/ELF/lto-plugin-ignore.s b/lld/test/ELF/lto-plugin-ignore.s index 2f45a43b2428..dfc017330abd 100644 --- a/lld/test/ELF/lto-plugin-ignore.s +++ b/lld/test/ELF/lto-plugin-ignore.s @@ -3,9 +3,10 @@ # RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t # RUN: ld.lld %t -plugin-opt=/foo/bar -plugin-opt=-fresolution=zed \ # RUN: -plugin-opt=-pass-through=-lgcc -plugin-opt=-function-sections \ -# RUN: -plugin-opt=-data-sections -o /dev/null +# RUN: -plugin-opt=-data-sections -plugin-opt=mcpu=x86-64 \ +# RUN: -plugin-opt=thinlto -o /dev/null -# RUN: not ld.lld %t -plugin-opt=-data-sectionssss \ -# RUN: -plugin-opt=-function-sectionsss 2>&1 | FileCheck %s -# CHECK: unknown option: -data-sectionsss -# CHECK: unknown option: -function-sectionsss +# RUN: not ld.lld %t -plugin-opt=-data-sectionxxx \ +# RUN: -plugin-opt=-function-sectionxxx 2>&1 | FileCheck %s +# CHECK: Unknown command line argument '-data-sectionxxx' +# CHECK: Unknown command line argument '-function-sectionxxx'