[PATCH] D100498: [ThinLTO] Copy UnnamedAddr when spliting module.

Zequan Wu via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Wed Apr 14 11:27:06 PDT 2021


zequanwu created this revision.
zequanwu added reviewers: tejohnson, rnk.
Herald added subscribers: steven_wu, hiraditya, inglorion.
zequanwu requested review of this revision.
Herald added a project: LLVM.
Herald added a subscriber: llvm-commits.

The unnamedaddr property of a function is lost when using
`-fwhole-program-vtables` and thinlto which causes size increase under linker's
safe icf mode.

The size increase of chrome on Linux when switching from all icf to safe icf
drops from 5 MB to 3 MB after this change, and from 6 MB to 4 MB on Windows.

There is a repro:

  # a.h
  struct A {
    virtual int f();
    virtual int g();
  };
  
  # a.cpp
  #include "a.h"
  int A::f() { return 10; }
  int A::g() { return 10; }
  
  # main.cpp
  #include "a.h"
  
  int g(A* a) {
    return a->f();
  }
  
  int main(int argv, char** args) {
    A a;
    return g(&a);
  }
  
  $ clang++ -O2 -ffunction-sections -flto=thin -fwhole-program-vtables -fsplit-lto-unit -c main.cpp -o main.o  && clang++ -Wl,--icf=safe -fuse-ld=lld  -flto=thin main.o -o a.out && llvm-readobj -t a.out | grep -A 1 -e _ZN1A1fEv -e _ZN1A1gEv
      Name: _ZN1A1fEv (480)
      Value: 0x201830
  --
      Name: _ZN1A1gEv (490)
      Value: 0x201840


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D100498

Files:
  llvm/lib/Transforms/IPO/ThinLTOBitcodeWriter.cpp


Index: llvm/lib/Transforms/IPO/ThinLTOBitcodeWriter.cpp
===================================================================
--- llvm/lib/Transforms/IPO/ThinLTOBitcodeWriter.cpp
+++ llvm/lib/Transforms/IPO/ThinLTOBitcodeWriter.cpp
@@ -159,6 +159,7 @@
         Function::Create(EmptyFT, GlobalValue::ExternalLinkage,
                          F.getAddressSpace(), "", &M);
     NewF->setVisibility(F.getVisibility());
+    NewF->setUnnamedAddr(F.getUnnamedAddr());
     NewF->takeName(&F);
     F.replaceAllUsesWith(ConstantExpr::getBitCast(NewF, F.getType()));
     F.eraseFromParent();


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D100498.337506.patch
Type: text/x-patch
Size: 586 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20210414/772f284f/attachment.bin>


More information about the llvm-commits mailing list