[lld] r249996 - Handle a crash in conflict detection with archive members.
Rafael Espindola via llvm-commits
llvm-commits at lists.llvm.org
Sun Oct 11 13:19:20 PDT 2015
Author: rafael
Date: Sun Oct 11 15:19:20 2015
New Revision: 249996
URL: http://llvm.org/viewvc/llvm-project?rev=249996&view=rev
Log:
Handle a crash in conflict detection with archive members.
Added:
lld/trunk/test/elf2/incompatible-ar-first.s
Modified:
lld/trunk/ELF/Config.h
lld/trunk/ELF/InputFiles.h
lld/trunk/ELF/SymbolTable.cpp
Modified: lld/trunk/ELF/Config.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Config.h?rev=249996&r1=249995&r2=249996&view=diff
==============================================================================
--- lld/trunk/ELF/Config.h (original)
+++ lld/trunk/ELF/Config.h Sun Oct 11 15:19:20 2015
@@ -18,6 +18,7 @@
namespace lld {
namespace elf2 {
+class ELFFileBase;
class SymbolBody;
enum ELFKind {
@@ -30,6 +31,7 @@ enum ELFKind {
struct Configuration {
SymbolBody *EntrySym = nullptr;
+ ELFFileBase *FirstElf = nullptr;
llvm::StringRef DynamicLinker;
llvm::StringRef Entry;
llvm::StringRef Emulation;
Modified: lld/trunk/ELF/InputFiles.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/InputFiles.h?rev=249996&r1=249995&r2=249996&view=diff
==============================================================================
--- lld/trunk/ELF/InputFiles.h (original)
+++ lld/trunk/ELF/InputFiles.h Sun Oct 11 15:19:20 2015
@@ -249,6 +249,9 @@ std::unique_ptr<ELFFileBase> createELFFi
error("Invalid file class: " + MB.getBufferIdentifier());
}
+ if (!Config->FirstElf)
+ Config->FirstElf = Ret.get();
+
if (Config->ElfKind == ELFNoneKind) {
Config->ElfKind = Ret->getELFKind();
Config->EMachine = Ret->getEMachine();
Modified: lld/trunk/ELF/SymbolTable.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/SymbolTable.cpp?rev=249996&r1=249995&r2=249996&view=diff
==============================================================================
--- lld/trunk/ELF/SymbolTable.cpp (original)
+++ lld/trunk/ELF/SymbolTable.cpp Sun Oct 11 15:19:20 2015
@@ -35,7 +35,7 @@ void SymbolTable<ELFT>::addFile(std::uni
StringRef A = E->getName();
StringRef B = Config->Emulation;
if (B.empty())
- B = getFirstELF()->getName();
+ B = Config->FirstElf->getName();
error(A + " is incompatible with " + B);
}
}
Added: lld/trunk/test/elf2/incompatible-ar-first.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/elf2/incompatible-ar-first.s?rev=249996&view=auto
==============================================================================
--- lld/trunk/test/elf2/incompatible-ar-first.s (added)
+++ lld/trunk/test/elf2/incompatible-ar-first.s Sun Oct 11 15:19:20 2015
@@ -0,0 +1,11 @@
+// RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %p/Inputs/archive.s -o %ta.o
+// RUN: llvm-ar rc %t.a %ta.o
+// RUN: llvm-mc -filetype=obj -triple=i686-linux %s -o %tb.o
+// RUN: not ld.lld2 %t.a %tb.o 2>&1 | FileCheck %s
+
+// We used to crash when
+// * The first object seen by the symbol table is from an archive.
+// * -m was not used.
+// CHECK: a.o is incompatible with {{.*}}b.o
+
+// REQUIRES: x86
More information about the llvm-commits
mailing list