Skip to content

Commit

Permalink
[LTO] Scan all per-function subtargets when collecting runtime librar…
Browse files Browse the repository at this point in the history
…y names.

accumulateAndSortLibcalls in LTOCodeGenerator.cpp collects names of runtime
library functions which are used to identify user-defined functions that should
be protected. Previously, this function would only scan the TargetLowering
object belonging to the "main" subtarget for the library function names. This
commit changes it to scan all per-function subtargets.

Differential Revision: http://reviews.llvm.org/D7275

llvm-svn: 227533
  • Loading branch information
ahatanaka committed Jan 30, 2015
1 parent 23b5f67 commit 8fba18e
Show file tree
Hide file tree
Showing 2 changed files with 40 additions and 12 deletions.
34 changes: 22 additions & 12 deletions llvm/lib/LTO/LTOCodeGenerator.cpp
Expand Up @@ -368,10 +368,13 @@ static void findUsedValues(GlobalVariable *LLVMUsed,
UsedValues.insert(GV);
}

// Collect names of runtime library functions. User-defined functions with the
// same names are added to llvm.compiler.used to prevent them from being
// deleted by optimizations.
static void accumulateAndSortLibcalls(std::vector<StringRef> &Libcalls,
const TargetLibraryInfo& TLI,
const TargetLowering *Lowering)
{
const Module &Mod,
const TargetMachine &TM) {
// TargetLibraryInfo has info on C runtime library calls on the current
// target.
for (unsigned I = 0, E = static_cast<unsigned>(LibFunc::NumLibFuncs);
Expand All @@ -381,14 +384,21 @@ static void accumulateAndSortLibcalls(std::vector<StringRef> &Libcalls,
Libcalls.push_back(TLI.getName(F));
}

// TargetLowering has info on library calls that CodeGen expects to be
// available, both from the C runtime and compiler-rt.
if (Lowering)
for (unsigned I = 0, E = static_cast<unsigned>(RTLIB::UNKNOWN_LIBCALL);
I != E; ++I)
if (const char *Name
= Lowering->getLibcallName(static_cast<RTLIB::Libcall>(I)))
Libcalls.push_back(Name);
SmallPtrSet<const TargetLowering *, 1> TLSet;

for (const Function &F : Mod) {
const TargetLowering *Lowering =
TM.getSubtargetImpl(F)->getTargetLowering();

if (Lowering && TLSet.insert(Lowering).second)
// TargetLowering has info on library calls that CodeGen expects to be
// available, both from the C runtime and compiler-rt.
for (unsigned I = 0, E = static_cast<unsigned>(RTLIB::UNKNOWN_LIBCALL);
I != E; ++I)
if (const char *Name =
Lowering->getLibcallName(static_cast<RTLIB::Libcall>(I)))
Libcalls.push_back(Name);
}

array_pod_sort(Libcalls.begin(), Libcalls.end());
Libcalls.erase(std::unique(Libcalls.begin(), Libcalls.end()),
Expand All @@ -412,8 +422,8 @@ void LTOCodeGenerator::applyScopeRestrictions() {
std::vector<StringRef> Libcalls;
TargetLibraryInfoImpl TLII(Triple(TargetMach->getTargetTriple()));
TargetLibraryInfo TLI(TLII);
accumulateAndSortLibcalls(
Libcalls, TLI, TargetMach->getSubtargetImpl()->getTargetLowering());

accumulateAndSortLibcalls(Libcalls, TLI, *mergedModule, *TargetMach);

for (Module::iterator f = mergedModule->begin(),
e = mergedModule->end(); f != e; ++f)
Expand Down
18 changes: 18 additions & 0 deletions llvm/test/LTO/runtime-library-subtarget.ll
@@ -0,0 +1,18 @@
; Check that user-defined runtime library function __addsf3vfp is not removed
;
; RUN: llvm-as <%s >%t1
; RUN: llvm-lto -o %t2 %t1 -mcpu arm1176jz-s
; RUN: llvm-nm %t2 | FileCheck %s

target datalayout = "e-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32"
target triple = "thumbv7-apple-ios"

; CHECK: ___addsf3vfp

define float @__addsf3vfp(float %a, float %b) #0 {
entry:
%add = fadd float %a, %b
ret float %add
}

attributes #0 = { "target-cpu"="arm1176jzf-s"}

0 comments on commit 8fba18e

Please sign in to comment.