[llvm] r227431 - Don't create multiple mergeable sections with -fdata-sections.

David Blaikie dblaikie at gmail.com
Thu Jan 29 08:57:05 PST 2015


On Jan 29, 2015 4:46 AM, "Rafael Espindola" <rafael.espindola at gmail.com>
wrote:
>
> Author: rafael
> Date: Thu Jan 29 06:43:28 2015
> New Revision: 227431
>
> URL: http://llvm.org/viewvc/llvm-project?rev=227431&view=rev
> Log:
> Don't create multiple mergeable sections with -fdata-sections.
>
> ELF has support for sections that can be split into fixed size or
> null terminated entities.
>
> Since these sections can be split by the linker, it is not necessary
> to split them in codegen.
>
> This reduces the combined .o size in a llvm+clang build from
> 202,394,570 to 173,819,098 bytes.

Nice! - though the linked binary size is essentially the same (bar the
rodata you mentioned below - hmm, chrome is fussy about executable
size...)?

>
> The time for linking clang with gold (on a VM, on a laptop) goes
> from 2.250089985 to 1.383001792 seconds.

That sounds pretty awesome! Though I thought my gold links even on my
non-virtual beefy desktop were longer than that. Perhaps not.

>
> The flip side is the size of rodata in clang goes from 10,926,785
> to 10,929,345 bytes.
>
> The increase seems to be because of
http://sourceware.org/bugzilla/show_bug.cgi?id=17902.
>
> Modified:
>     llvm/trunk/lib/CodeGen/TargetLoweringObjectFileImpl.cpp
>     llvm/trunk/test/CodeGen/X86/global-sections.ll
>
> Modified: llvm/trunk/lib/CodeGen/TargetLoweringObjectFileImpl.cpp
> URL:
http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/TargetLoweringObjectFileImpl.cpp?rev=227431&r1=227430&r2=227431&view=diff
>
==============================================================================
> --- llvm/trunk/lib/CodeGen/TargetLoweringObjectFileImpl.cpp (original)
> +++ llvm/trunk/lib/CodeGen/TargetLoweringObjectFileImpl.cpp Thu Jan 29
06:43:28 2015
> @@ -246,24 +246,25 @@ static StringRef getSectionPrefixForGlob
>  const MCSection *TargetLoweringObjectFileELF::
>  SelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind,
>                         Mangler &Mang, const TargetMachine &TM) const {
> +  unsigned Flags = getELFSectionFlags(Kind);
> +
>    // If we have -ffunction-section or -fdata-section then we should emit
the
>    // global value to a uniqued section specifically for it.
> -  bool EmitUniquedSection;
> -  if (Kind.isText())
> -    EmitUniquedSection = TM.getFunctionSections();
> -  else
> -    EmitUniquedSection = TM.getDataSections();
> +  bool EmitUniquedSection = false;
> +  if (!(Flags & ELF::SHF_MERGE) && !Kind.isCommon()) {
> +    if (Kind.isText())
> +      EmitUniquedSection = TM.getFunctionSections();
> +    else
> +      EmitUniquedSection = TM.getDataSections();
> +  }
>
> -  // If this global is linkonce/weak and the target handles this by
emitting it
> -  // into a 'uniqued' section name, create and return the section now.
> -  if ((EmitUniquedSection && !Kind.isCommon()) || GV->hasComdat()) {
> +  if (EmitUniquedSection || GV->hasComdat()) {
>      StringRef Prefix = getSectionPrefixForGlobal(Kind);
>
>      SmallString<128> Name(Prefix);
>      TM.getNameWithPrefix(Name, GV, Mang, true);
>
>      StringRef Group = "";
> -    unsigned Flags = getELFSectionFlags(Kind);
>      if (const Comdat *C = getELFComdat(GV)) {
>        Flags |= ELF::SHF_GROUP;
>        Group = C->getName();
>
> Modified: llvm/trunk/test/CodeGen/X86/global-sections.ll
> URL:
http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/global-sections.ll?rev=227431&r1=227430&r2=227431&view=diff
>
==============================================================================
> --- llvm/trunk/test/CodeGen/X86/global-sections.ll (original)
> +++ llvm/trunk/test/CodeGen/X86/global-sections.ll Thu Jan 29 06:43:28
2015
> @@ -121,7 +121,7 @@ define void @F1() {
>  ; LINUX: G7:
>  ; LINUX:        .asciz  "abcdefghi"
>
> -; LINUX-SECTIONS: .section        .rodata.G7,"aMS", at progbits,1
> +; LINUX-SECTIONS: .section        .rodata.str1.1,"aMS", at progbits,1
>  ; LINUX-SECTIONS:       .globl G7
>
>  ; WIN32-SECTIONS: .section        .rdata,"rd",one_only,_G7
> @@ -182,7 +182,7 @@ define void @F1() {
>  @G14 = private unnamed_addr constant [4 x i8] c"foo\00", align 1
>
>  ; LINUX-SECTIONS:        .type   .LG14, at object           # @G14
> -; LINUX-SECTIONS:        .section        .rodata..LG14,"aMS", at progbits,1
> +; LINUX-SECTIONS:        .section        .rodata.str1.1,"aMS", at progbits,1
>  ; LINUX-SECTIONS: .LG14:
>  ; LINUX-SECTIONS:        .asciz  "foo"
>  ; LINUX-SECTIONS:        .size   .LG14, 4
> @@ -206,7 +206,7 @@ define void @F1() {
>  ; DARWIN64: .section       __TEXT,__const
>  ; DARWIN64: _G15:
>
> -; LINUX-SECTIONS: .section      .rodata.G15,"aM", at progbits,8
> +; LINUX-SECTIONS: .section      .rodata.cst8,"aM", at progbits,8
>  ; LINUX-SECTIONS: G15:
>
>  ; WIN32-SECTIONS: .section      .rdata,"rd",one_only,_G15
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20150129/079bab79/attachment.html>


More information about the llvm-commits mailing list