forked from OSchip/llvm-project
[lld-link] preserve @llvm.used symbols in LTO
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
This commit is contained in:
parent
8e21c08593
commit
61e8735f17
|
@ -688,6 +688,8 @@ void BitcodeFile::parse() {
|
||||||
Sym = Symtab->addRegular(this, SymName);
|
Sym = Symtab->addRegular(this, SymName);
|
||||||
}
|
}
|
||||||
Symbols.push_back(Sym);
|
Symbols.push_back(Sym);
|
||||||
|
if (ObjSym.isUsed())
|
||||||
|
Config->GCRoot.push_back(Sym);
|
||||||
}
|
}
|
||||||
Directives = Obj->getCOFFLinkerOpts();
|
Directives = Obj->getCOFFLinkerOpts();
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
}
|
|
@ -139,6 +139,7 @@ public:
|
||||||
using irsymtab::Symbol::getCOFFWeakExternalFallback;
|
using irsymtab::Symbol::getCOFFWeakExternalFallback;
|
||||||
using irsymtab::Symbol::getSectionName;
|
using irsymtab::Symbol::getSectionName;
|
||||||
using irsymtab::Symbol::isExecutable;
|
using irsymtab::Symbol::isExecutable;
|
||||||
|
using irsymtab::Symbol::isUsed;
|
||||||
};
|
};
|
||||||
|
|
||||||
/// A range over the symbols in this InputFile.
|
/// A range over the symbols in this InputFile.
|
||||||
|
|
Loading…
Reference in New Issue