[PATCH] [LTOCodeGenerator] Iterate over all subtargets when collecting runtime library names that should be protected

Duncan P. N. Exon Smith dexonsmith at apple.com
Thu Jan 29 16:48:04 PST 2015


LGTM too.

> On 2015-Jan-29, at 16:47, Eric Christopher <echristo at gmail.com> wrote:
> 
> LGTM.
> 
> 
> On Thu, Jan 29, 2015, 4:42 PM Akira Hatanaka <ahatanak at gmail.com> wrote:
> Add comment that explains what accumulateAndSortLibcalls does.
> 
> 
> http://reviews.llvm.org/D7275
> 
> Files:
>   lib/LTO/LTOCodeGenerator.cpp
>   test/LTO/runtime-library-subtarget.ll
>   tools/llvm-lto/llvm-lto.cpp
> 
> Index: lib/LTO/LTOCodeGenerator.cpp
> ===================================================================
> --- lib/LTO/LTOCodeGenerator.cpp
> +++ lib/LTO/LTOCodeGenerator.cpp
> @@ -368,10 +368,13 @@
>        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);
> @@ -381,14 +384,21 @@
>        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()),
> @@ -412,8 +422,8 @@
>    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)
> Index: test/LTO/runtime-library-subtarget.ll
> ===================================================================
> --- /dev/null
> +++ 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"}
> Index: tools/llvm-lto/llvm-lto.cpp
> ===================================================================
> --- tools/llvm-lto/llvm-lto.cpp
> +++ tools/llvm-lto/llvm-lto.cpp
> @@ -217,6 +217,9 @@
>    for (unsigned i = 0; i < KeptDSOSyms.size(); ++i)
>      CodeGen.addMustPreserveSymbol(KeptDSOSyms[i].c_str());
> 
> +  // Set cpu and attrs strings for the default target/subtarget.
> +  CodeGen.setCpu(MCPU.c_str());
> +
>    std::string attrs;
>    for (unsigned i = 0; i < MAttrs.size(); ++i) {
>      if (i > 0)
> 
> EMAIL PREFERENCES
>   http://reviews.llvm.org/settings/panel/emailpreferences/





More information about the llvm-commits mailing list