From deee9e4afddda0ceb07f9a82af2a8d297b464d77 Mon Sep 17 00:00:00 2001 From: Tom Roeder Date: Mon, 31 Mar 2014 16:59:13 +0000 Subject: [PATCH] This patch fixes LTO's RecordStreamer so that it records symbols in the MCExpr part of an asm .symver directive as being used. This prevents referenced functions from being internalized and deleted. Without the patch to LTOModule.cpp, the test case will produce the error: LLVM ERROR: A @@ version cannot be undefined. llvm-svn: 205221 --- lib/LTO/LTOModule.cpp | 1 + test/LTO/symver-asm.ll | 16 ++++++++++++++++ 2 files changed, 17 insertions(+) create mode 100644 test/LTO/symver-asm.ll diff --git a/lib/LTO/LTOModule.cpp b/lib/LTO/LTOModule.cpp index cffc9aaf7e2..567da04f90c 100644 --- a/lib/LTO/LTOModule.cpp +++ b/lib/LTO/LTOModule.cpp @@ -660,6 +660,7 @@ namespace { void EmitAssignment(MCSymbol *Symbol, const MCExpr *Value) override { // FIXME: should we handle aliases? markDefined(*Symbol); + AddValueSymbols(Value); } bool EmitSymbolAttribute(MCSymbol *Symbol, MCSymbolAttr Attribute) override { diff --git a/test/LTO/symver-asm.ll b/test/LTO/symver-asm.ll new file mode 100644 index 00000000000..03dda2bedd9 --- /dev/null +++ b/test/LTO/symver-asm.ll @@ -0,0 +1,16 @@ +; RUN: llvm-as < %s >%t1 +; RUN: llvm-lto -o %t2 %t1 +; RUN: llvm-nm %t2 | FileCheck %s + +target triple = "x86_64-unknown-linux-gnu" + +module asm ".symver io_cancel_0_4,io_cancel@@LIBAIO_0.4" + +; Even without -exported-symbol, io_cancel_0_4 should be noticed by LTOModule's +; RecordStreamer, so it shouldn't get eliminated. However, the object file will +; contain the aliased symver as well as the original. +define i32 @io_cancel_0_4() { +; CHECK: io_cancel@@LIBAIO_0.4 +; CHECK: io_cancel_0_4 + ret i32 0 +}