diff --git a/lld/ELF/Config.h b/lld/ELF/Config.h index 851e150b0bb99..3c9c7a1ea626f 100644 --- a/lld/ELF/Config.h +++ b/lld/ELF/Config.h @@ -81,6 +81,7 @@ struct Configuration { bool EhFrameHdr; bool EnableNewDtags; bool ExportDynamic; + bool FatalWarnings; bool GcSections; bool GnuHash = false; bool ICF; diff --git a/lld/ELF/Driver.cpp b/lld/ELF/Driver.cpp index c8041e0db65c7..5ce2a8c4d14cd 100644 --- a/lld/ELF/Driver.cpp +++ b/lld/ELF/Driver.cpp @@ -344,6 +344,7 @@ void LinkerDriver::readConfigs(opt::InputArgList &Args) { Config->EhFrameHdr = Args.hasArg(OPT_eh_frame_hdr); Config->EnableNewDtags = !Args.hasArg(OPT_disable_new_dtags); Config->ExportDynamic = Args.hasArg(OPT_export_dynamic); + Config->FatalWarnings = Args.hasArg(OPT_fatal_warnings); Config->GcSections = Args.hasArg(OPT_gc_sections); Config->ICF = Args.hasArg(OPT_icf); Config->NoGnuUnique = Args.hasArg(OPT_no_gnu_unique); diff --git a/lld/ELF/Error.cpp b/lld/ELF/Error.cpp index 991ec97d05667..d4a02e1435d05 100644 --- a/lld/ELF/Error.cpp +++ b/lld/ELF/Error.cpp @@ -24,7 +24,12 @@ void log(const Twine &Msg) { llvm::outs() << Msg << "\n"; } -void warning(const Twine &Msg) { llvm::errs() << Msg << "\n"; } +void warning(const Twine &Msg) { + if (Config->FatalWarnings) + error(Msg); + else + llvm::errs() << Msg << "\n"; +} void error(const Twine &Msg) { *ErrorOS << Msg << "\n"; diff --git a/lld/ELF/Options.td b/lld/ELF/Options.td index 139f08d18432b..d4d5b1bc96223 100644 --- a/lld/ELF/Options.td +++ b/lld/ELF/Options.td @@ -66,6 +66,9 @@ def export_dynamic: F<"export-dynamic">, def export_dynamic_symbol: S<"export-dynamic-symbol">, HelpText<"Put a symbol in the dynamic symbol table">; +def fatal_warnings: F<"fatal-warnings">, + HelpText<"Treat warnings as errors">; + def fini: S<"fini">, MetaVarName<"">, HelpText<"Specify a finalizer function">; @@ -232,7 +235,6 @@ def plugin_opt_eq: J<"plugin-opt=">; def allow_shlib_undefined: F<"allow-shlib-undefined">; def define_common: F<"define-common">; def detect_odr_violations: F<"detect-odr-violations">; -def fatal_warnings: F<"fatal-warnings">; def no_add_needed: F<"no-add-needed">; def no_allow_shlib_undefined: F<"no-allow-shlib-undefined">; def no_copy_dt_needed_entries: F<"no-copy-dt-needed-entries">, diff --git a/lld/test/ELF/fatal-warnings.s b/lld/test/ELF/fatal-warnings.s new file mode 100644 index 0000000000000..0bc2a2b444762 --- /dev/null +++ b/lld/test/ELF/fatal-warnings.s @@ -0,0 +1,16 @@ +# REQUIRES: x86 +# RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %s -o %t1.o +# RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %p/Inputs/warn-common.s -o %t2.o + +# RUN: ld.lld --warn-common %t1.o %t2.o -o %t1.out 2>&1 | \ +# RUN: FileCheck -check-prefix=ERR %s +# ERR: multiple common of + +# RUN: not ld.lld --warn-common --fatal-warnings %t1.o %t2.o -o %t2.out 2>&1 | \ +# RUN: FileCheck -check-prefix=ERR %s + +.globl _start +_start: + +.type arr,@object +.comm arr,4,4