Skip to content

Commit

Permalink
[lld-link] preserve @llvm.used symbols in LTO
Browse files Browse the repository at this point in the history
Summary:
We translate @llvm.used to COFF by generating /include directives
in the .drectve section. However, in LTO links, this happens after
directives have already been processed, so the new directives do
not take effect. This change marks @llvm.used symbols as GCRoots
so that they are preserved as intended.

Fixes PR40733.

Reviewers: rnk, pcc, ruiu

Reviewed By: ruiu

Subscribers: mehdi_amini, steven_wu, dexonsmith, dang, llvm-commits

Tags: #llvm

Differential Revision: https://reviews.llvm.org/D58255

llvm-svn: 354410
  • Loading branch information
inglorion committed Feb 20, 2019
1 parent 8e21c08 commit 61e8735
Show file tree
Hide file tree
Showing 3 changed files with 18 additions and 0 deletions.
2 changes: 2 additions & 0 deletions lld/COFF/InputFiles.cpp
Expand Up @@ -688,6 +688,8 @@ void BitcodeFile::parse() {
Sym = Symtab->addRegular(this, SymName);
}
Symbols.push_back(Sym);
if (ObjSym.isUsed())
Config->GCRoot.push_back(Sym);
}
Directives = Obj->getCOFFLinkerOpts();
}
Expand Down
15 changes: 15 additions & 0 deletions lld/test/COFF/used-lto.ll
@@ -0,0 +1,15 @@
; REQUIRES: x86
; RUN: llvm-as -o %t.obj %s
; RUN: lld-link -dll -debug -opt:ref -noentry -out:%t.dll %t.obj
; RUN: llvm-pdbutil dump -publics %t.pdb | FileCheck %s

; CHECK: S_PUB32 {{.*}} `foo`

target datalayout = "e-m:w-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-pc-windows-msvc"

@llvm.used = appending global [1 x i8*] [i8* bitcast (void ()* @foo to i8*)], section "llvm.metadata"

define void @foo() {
ret void
}
1 change: 1 addition & 0 deletions llvm/include/llvm/LTO/LTO.h
Expand Up @@ -139,6 +139,7 @@ class InputFile {
using irsymtab::Symbol::getCOFFWeakExternalFallback;
using irsymtab::Symbol::getSectionName;
using irsymtab::Symbol::isExecutable;
using irsymtab::Symbol::isUsed;
};

/// A range over the symbols in this InputFile.
Expand Down

0 comments on commit 61e8735

Please sign in to comment.