[lld] r344974 - [ELF] Don't warn on two legitimate cases when reading .llvm.call-graph-profile

Fangrui Song via llvm-commits llvm-commits at lists.llvm.org
Mon Oct 22 16:43:54 PDT 2018


Author: maskray
Date: Mon Oct 22 16:43:53 2018
New Revision: 344974

URL: http://llvm.org/viewvc/llvm-project?rev=344974&view=rev
Log:
[ELF] Don't warn on two legitimate cases when reading .llvm.call-graph-profile

Summary:
Before, superfluous warnings were emitted for the following two cases:

1) When from symbol was in a discarded section.
  The profile should be thought of as affiliated to the section.
  It makes sense to ignore the profile if the section is discarded.

2) When to symbol was in a shared object.
  The object file containing the profile may not know about the to
  symbol, which can reside in another object file (useful profile) or a
  shared object (not useful as symbols in the shared object are fixed
  and unorderable). It makes sense to ignore the profile from the object
  file.

  Note, the warning when to symbol was undefined was suppressed in
  D53044, which is still useful for --symbol-ordering-file=

This patch silences the warnings. The check is actually more relaxed (no
warnings if either From or To is not Defined) for simplicity and I don't
see a compelling reason to warn on more cases.

Reviewers: ruiu, davidxl, espindola, Bigcheese

Reviewed By: ruiu

Subscribers: emaste, arichardson, llvm-commits

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

Modified:
    lld/trunk/ELF/Driver.cpp
    lld/trunk/test/ELF/cgprofile-obj-warn.s
    lld/trunk/test/ELF/cgprofile-shared-warn.s

Modified: lld/trunk/ELF/Driver.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Driver.cpp?rev=344974&r1=344973&r2=344974&view=diff
==============================================================================
--- lld/trunk/ELF/Driver.cpp (original)
+++ lld/trunk/ELF/Driver.cpp Mon Oct 22 16:43:53 2018
@@ -681,22 +681,33 @@ static void readCallGraph(MemoryBufferRe
 }
 
 template <class ELFT> static void readCallGraphsFromObjectFiles() {
-  auto FindSection = [&](const Symbol *Sym) -> const InputSectionBase * {
-    warnUnorderableSymbol(Sym);
-    if (const auto *SymD = dyn_cast<Defined>(Sym))
-      return dyn_cast_or_null<InputSectionBase>(SymD->Section);
-    return nullptr;
-  };
-
   for (auto File : ObjectFiles) {
     auto *Obj = cast<ObjFile<ELFT>>(File);
     for (const Elf_CGProfile_Impl<ELFT> &CGPE : Obj->CGProfile) {
-      const InputSectionBase *FromSB =
-          FindSection(&Obj->getSymbol(CGPE.cgp_from));
-      const InputSectionBase *ToSB = FindSection(&Obj->getSymbol(CGPE.cgp_to));
-      if (!FromSB || !ToSB)
+      auto *FromSym = dyn_cast<Defined>(&Obj->getSymbol(CGPE.cgp_from));
+      auto *ToSym = dyn_cast<Defined>(&Obj->getSymbol(CGPE.cgp_to));
+      if (!FromSym || !ToSym)
         continue;
-      Config->CallGraphProfile[{FromSB, ToSB}] += CGPE.cgp_weight;
+      auto *FromSec = dyn_cast_or_null<InputSectionBase>(FromSym->Section);
+      auto *ToSec = dyn_cast_or_null<InputSectionBase>(ToSym->Section);
+
+      // The profile from .llvm.call-graph-profile is conceptually affiliated to
+      // FromSec. Don't warn unorderable symbol if FromSym is not absolute
+      // (FromSec isn't null) and the section is discarded
+      // (!FromSec->Repl->Live).
+      //
+      // We also don't want to warn when ToSym is undefined or is in a shared
+      // object (as symbols in shared objects are fixed and unorderable).
+      //
+      // The check used here is more relaxed (no warning if either FromSym or
+      // ToSym is not Defined) for simplicity and there is no compelling reason
+      // to warn on more cases.
+      if (!FromSec || FromSec->Repl->Live) {
+        warnUnorderableSymbol(FromSym);
+        warnUnorderableSymbol(ToSym);
+      }
+      if (FromSec && ToSec)
+        Config->CallGraphProfile[{FromSec, ToSec}] += CGPE.cgp_weight;
     }
   }
 }

Modified: lld/trunk/test/ELF/cgprofile-obj-warn.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/cgprofile-obj-warn.s?rev=344974&r1=344973&r2=344974&view=diff
==============================================================================
--- lld/trunk/test/ELF/cgprofile-obj-warn.s (original)
+++ lld/trunk/test/ELF/cgprofile-obj-warn.s Mon Oct 22 16:43:53 2018
@@ -27,9 +27,6 @@ A:
     .cg_profile poppy, A, 30
 
 # CHECK: unable to order absolute symbol: B
-# CHECK: unable to order undefined symbol: adena1
-# CHECK: unable to order undefined symbol: adena2
-# CHECK: unable to order undefined symbol: poppy
 
 # RUN: ld.lld %t -o /dev/null \
 # RUN:   -noinhibit-exec -icf=all --no-warn-symbol-ordering 2>&1 \

Modified: lld/trunk/test/ELF/cgprofile-shared-warn.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/cgprofile-shared-warn.s?rev=344974&r1=344973&r2=344974&view=diff
==============================================================================
--- lld/trunk/test/ELF/cgprofile-shared-warn.s (original)
+++ lld/trunk/test/ELF/cgprofile-shared-warn.s Mon Oct 22 16:43:53 2018
@@ -3,9 +3,19 @@
 # RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t.o
 # RUN: ld.lld --shared %t.o -o /dev/null 2>&1 | count 0
 # RUN: ld.lld -e A --unresolved-symbols=ignore-all %t.o -o /dev/null 2>&1 | count 0
-    .section    .text.A,"ax", at progbits
-    .globl  A
+
+# RUN: echo '.globl B; B: ret' | llvm-mc -filetype=obj -triple=x86_64-unknown-linux - -o %t1.o
+# RUN: ld.lld --shared %t1.o -o %t1.so
+# RUN: ld.lld -e A %t.o %t1.so -o /dev/null 2>&1 | count 0
+
+# RUN: ld.lld --gc-sections %t.o %t1.so -o /dev/null 2>&1 | count 0
+.globl _start
+_start:
+  ret
+
+.section .text.A,"ax", at progbits
+.globl A
 A:
-    callq B
+  callq B
 
-    .cg_profile A, B, 10
+.cg_profile A, B, 10




More information about the llvm-commits mailing list