summaryrefslogtreecommitdiffstats
path: root/llvm/test
diff options
context:
space:
mode:
authorDave Lee <davelee.com@gmail.com>2017-10-20 17:04:43 +0000
committerDave Lee <davelee.com@gmail.com>2017-10-20 17:04:43 +0000
commitf9b72327b00acddc649d3c3b20500cae3d6ba1e1 (patch)
treec927d0f97d111ae7ab88394b5d80cb4d5ed7f25e /llvm/test
parent3818aeaeb9337d5880e9c4ecea05f68f52d09117 (diff)
downloadbcm5719-llvm-f9b72327b00acddc649d3c3b20500cae3d6ba1e1.tar.gz
bcm5719-llvm-f9b72327b00acddc649d3c3b20500cae3d6ba1e1.zip
Make x86 __ehhandler comdat if parent function is
Summary: This change comes from using lld for i686-windows-msvc. Before this change, lld emits an error of: error: relocation against symbol in discarded section: .xdata It's possible that this could be addressed in lld, but I think this change is reasonable on its own. At a high level, this is being generated: A (.text comdat) -> B (.text) -> C (.xdata comdat) Where A is a C++ inline function, which references B, an exception handler thunk, which references C, the exception handling info. With this structure, lld will error when applying relocations to B if the C it references has been discarded (some other C has been selected). This change checks if A is comdat, and if so places the exception registration thunk (B) in the comdata group of A (and B). It appears that MSVC makes the __ehhandler function comdat. Is it possible that duplicate thunks are being emitted into the final binary with other linkers, or are they stripping the unused thunks? Reviewers: rnk, majnemer, compnerd, smeenai Reviewed By: rnk, compnerd Subscribers: llvm-commits Differential Revision: https://reviews.llvm.org/D38940 llvm-svn: 316219
Diffstat (limited to 'llvm/test')
-rw-r--r--llvm/test/CodeGen/WinEH/wineh-comdat.ll17
1 files changed, 17 insertions, 0 deletions
diff --git a/llvm/test/CodeGen/WinEH/wineh-comdat.ll b/llvm/test/CodeGen/WinEH/wineh-comdat.ll
new file mode 100644
index 00000000000..5484370a767
--- /dev/null
+++ b/llvm/test/CodeGen/WinEH/wineh-comdat.ll
@@ -0,0 +1,17 @@
+; RUN: opt -mtriple=i686-unknown-windows-msvc -S -x86-winehstate < %s | FileCheck %s
+
+$f = comdat any
+
+define void @f() comdat personality i32 (...)* @__CxxFrameHandler3 {
+ invoke void @g() to label %return unwind label %unwind
+return:
+ ret void
+unwind:
+ %pad = cleanuppad within none []
+ cleanupret from %pad unwind to caller
+}
+
+declare void @g()
+declare i32 @__CxxFrameHandler3(...)
+
+; CHECK: define internal i32 @"__ehhandler$f"(i8*, i8*, i8*, i8*){{ .+}} comdat($f) {
OpenPOWER on IntegriCloud