summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPeter Collingbourne <peter@pcc.me.uk>2015-06-09 04:29:54 +0000
committerPeter Collingbourne <peter@pcc.me.uk>2015-06-09 04:29:54 +0000
commit73b75e3d0cdada5b7a9ed097ee9a912d8bd13dcc (patch)
tree7923d128168a33617d812238335e0eacb3a2a6e0
parentd9e4e98cceef2a47da2c1cc53f66af2b1e8cbbfb (diff)
downloadbcm5719-llvm-73b75e3d0cdada5b7a9ed097ee9a912d8bd13dcc.tar.gz
bcm5719-llvm-73b75e3d0cdada5b7a9ed097ee9a912d8bd13dcc.zip
COFF: Handle references from LTO object to lazy symbols correctly.
The code generator may create references to runtime library symbols such as __chkstk which were not visible via LTOModule. Handle these cases by loading the object file from the library, but abort if we end up having loaded any bitcode objects. Because loading the object file may have introduced new undefined references, call reportRemainingUndefines again to detect and report them. Differential Revision: http://reviews.llvm.org/D10332 llvm-svn: 239386
-rw-r--r--lld/COFF/SymbolTable.cpp18
-rw-r--r--lld/test/COFF/Inputs/lto-chkstk-chkstk.s3
-rw-r--r--lld/test/COFF/Inputs/lto-chkstk-foo.s3
-rw-r--r--lld/test/COFF/lto-chkstk.ll17
4 files changed, 41 insertions, 0 deletions
diff --git a/lld/COFF/SymbolTable.cpp b/lld/COFF/SymbolTable.cpp
index 55721f78528..8d6754e6e35 100644
--- a/lld/COFF/SymbolTable.cpp
+++ b/lld/COFF/SymbolTable.cpp
@@ -292,8 +292,26 @@ std::error_code SymbolTable::addCombinedLTOObject() {
}
Sym->Body = Body;
}
+
+ // We may see new references to runtime library symbols such as __chkstk
+ // here. These symbols must be wholly defined in non-bitcode files.
+ if (auto *B = dyn_cast<Lazy>(Sym->Body)) {
+ size_t NumBitcodeFiles = BitcodeFiles.size();
+ if (auto EC = addMemberFile(B))
+ return EC;
+ if (BitcodeFiles.size() != NumBitcodeFiles) {
+ llvm::errs()
+ << "LTO: late loaded symbol created new bitcode reference: " << Name
+ << "\n";
+ return make_error_code(LLDError::BrokenFile);
+ }
+ }
}
+ // New runtime library symbol references may have created undefined references.
+ if (reportRemainingUndefines())
+ return make_error_code(LLDError::BrokenFile);
+
return std::error_code();
}
diff --git a/lld/test/COFF/Inputs/lto-chkstk-chkstk.s b/lld/test/COFF/Inputs/lto-chkstk-chkstk.s
new file mode 100644
index 00000000000..292b30d5ffa
--- /dev/null
+++ b/lld/test/COFF/Inputs/lto-chkstk-chkstk.s
@@ -0,0 +1,3 @@
+.globl __chkstk
+__chkstk:
+ret
diff --git a/lld/test/COFF/Inputs/lto-chkstk-foo.s b/lld/test/COFF/Inputs/lto-chkstk-foo.s
new file mode 100644
index 00000000000..a69f870a1b6
--- /dev/null
+++ b/lld/test/COFF/Inputs/lto-chkstk-foo.s
@@ -0,0 +1,3 @@
+.globl foo
+foo:
+ret
diff --git a/lld/test/COFF/lto-chkstk.ll b/lld/test/COFF/lto-chkstk.ll
new file mode 100644
index 00000000000..7fa3742c0dd
--- /dev/null
+++ b/lld/test/COFF/lto-chkstk.ll
@@ -0,0 +1,17 @@
+; RUN: llvm-as -o %t.obj %s
+; RUN: llvm-mc -triple=x86_64-pc-windows-msvc -filetype=obj -o %T/lto-chkstk-foo.obj %S/Inputs/lto-chkstk-foo.s
+; RUN: llvm-mc -triple=x86_64-pc-windows-msvc -filetype=obj -o %T/lto-chkstk-chkstk.obj %S/Inputs/lto-chkstk-chkstk.s
+; RUN: llvm-ar cru %t.lib %T/lto-chkstk-chkstk.obj
+; RUN: lld -flavor link2 /out:%t.exe /entry:main /subsystem:console %t.obj %T/lto-chkstk-foo.obj %t.lib
+
+target datalayout = "e-m:w-i64:64-f80:128-n8:16:32:64-S128"
+target triple = "x86_64-pc-windows-msvc"
+
+define void @main() {
+entry:
+ %array4096 = alloca [4096 x i8]
+ call void @foo([4096 x i8]* %array4096)
+ ret void
+}
+
+declare void @foo([4096 x i8]*)
OpenPOWER on IntegriCloud