diff options
| author | Rafael Espindola <rafael.espindola@gmail.com> | 2015-09-28 20:30:11 +0000 |
|---|---|---|
| committer | Rafael Espindola <rafael.espindola@gmail.com> | 2015-09-28 20:30:11 +0000 |
| commit | 4b2ca85c1af5f0b237c5e65ea0378c6d374d1aaf (patch) | |
| tree | 4332a72a896f0d989e8aae1ea2d27e187ac2c354 | |
| parent | 5c692009bc346c732c1ff58a7242812ef7373b1f (diff) | |
| download | bcm5719-llvm-4b2ca85c1af5f0b237c5e65ea0378c6d374d1aaf.tar.gz bcm5719-llvm-4b2ca85c1af5f0b237c5e65ea0378c6d374d1aaf.zip | |
Implement --allow-multiple-definition.
Patch by George Rimar!
llvm-svn: 248733
| -rw-r--r-- | lld/ELF/Config.h | 1 | ||||
| -rw-r--r-- | lld/ELF/Driver.cpp | 3 | ||||
| -rw-r--r-- | lld/ELF/Options.td | 3 | ||||
| -rw-r--r-- | lld/ELF/SymbolTable.cpp | 9 | ||||
| -rw-r--r-- | lld/test/elf2/Inputs/allow-multiple-definition.s | 4 | ||||
| -rw-r--r-- | lld/test/elf2/allow-multiple-definition.s | 29 |
6 files changed, 47 insertions, 2 deletions
diff --git a/lld/ELF/Config.h b/lld/ELF/Config.h index d4000b54675..c28cb11f897 100644 --- a/lld/ELF/Config.h +++ b/lld/ELF/Config.h @@ -29,6 +29,7 @@ struct Configuration { bool DiscardNone = false; bool ExportDynamic = false; bool NoInhibitExec = false; + bool AllowMultipleDefinition = false; }; extern Configuration *Config; diff --git a/lld/ELF/Driver.cpp b/lld/ELF/Driver.cpp index 948d4ecd8e7..c57739b27b6 100644 --- a/lld/ELF/Driver.cpp +++ b/lld/ELF/Driver.cpp @@ -139,6 +139,9 @@ void LinkerDriver::link(ArrayRef<const char *> ArgsArr) { if (Args.hasArg(OPT_noinhibit_exec)) Config->NoInhibitExec = true; + if (Args.hasArg(OPT_allow_multiple_definition)) + Config->AllowMultipleDefinition = true; + // Create a list of input files. std::vector<MemoryBufferRef> Inputs; diff --git a/lld/ELF/Options.td b/lld/ELF/Options.td index 1a237cb6b1c..ef69c6aefe9 100644 --- a/lld/ELF/Options.td +++ b/lld/ELF/Options.td @@ -38,6 +38,9 @@ def discard_none : Flag<["-"], "discard-none">, def export_dynamic : Flag<["--"], "export-dynamic">, HelpText<"Put symbols in the dynamic symbol table">; +def allow_multiple_definition: Flag<["--"], "allow-multiple-definition">, + HelpText<"Allow multiple definitions">; + def L : Joined<["-"], "L">, MetaVarName<"<dir>">, HelpText<"Directory to search for libraries">; diff --git a/lld/ELF/SymbolTable.cpp b/lld/ELF/SymbolTable.cpp index 39dde6a0d8c..3884b88cbe1 100644 --- a/lld/ELF/SymbolTable.cpp +++ b/lld/ELF/SymbolTable.cpp @@ -150,8 +150,13 @@ void SymbolTable::dupError(const SymbolBody &Old, const SymbolBody &New) { NewFile = F.get(); } - error(Twine("duplicate symbol: ") + Old.getName() + " in " + - OldFile->getName() + " and " + NewFile->getName()); + std::string Msg = (Twine("duplicate symbol: ") + Old.getName() + " in " + + OldFile->getName() + " and " + NewFile->getName()) + .str(); + if (Config->AllowMultipleDefinition) + warning(Msg); + else + error(Msg); } // This function resolves conflicts if there's an existing symbol with diff --git a/lld/test/elf2/Inputs/allow-multiple-definition.s b/lld/test/elf2/Inputs/allow-multiple-definition.s new file mode 100644 index 00000000000..c2655a437ae --- /dev/null +++ b/lld/test/elf2/Inputs/allow-multiple-definition.s @@ -0,0 +1,4 @@ +.globl _bar +.type _bar, @function +_bar: + mov $2, %eax diff --git a/lld/test/elf2/allow-multiple-definition.s b/lld/test/elf2/allow-multiple-definition.s new file mode 100644 index 00000000000..ef275c342c2 --- /dev/null +++ b/lld/test/elf2/allow-multiple-definition.s @@ -0,0 +1,29 @@ +# REQUIRES: x86 + +# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t1 +# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %p/Inputs/allow-multiple-definition.s -o %t2 +# RUN: not lld -flavor gnu2 %t1 %t2 -o %t3 +# RUN: lld -flavor gnu2 --allow-multiple-definition %t1 %t2 -o %t3 +# RUN: lld -flavor gnu2 --allow-multiple-definition %t2 %t1 -o %t4 +# RUN: llvm-objdump -d %t3 | FileCheck %s +# RUN: llvm-objdump -d %t4 | FileCheck -check-prefix=REVERT %s + +# inputs contain different constants for instuction movl. +# Tests below checks that order of files in command line +# affects on what symbol will be used. +# If flag allow-multiple-definition is enabled the first +# meet symbol should be used. + +# CHECK: _bar: +# CHECK-NEXT: 11000: b8 01 00 00 00 movl $1, %eax + +# REVERT: _bar: +# REVERT-NEXT: 11000: b8 02 00 00 00 movl $2, %eax + +.globl _bar +.type _bar, @function +_bar: + mov $1, %eax + +.globl _start +_start: |

