[llvm] r193718 - Produce .weak_def_can_be_hidden for some linkonce_odr values

Nick Kledzik kledzik at apple.com
Thu Oct 31 16:15:02 PDT 2013


On Oct 30, 2013, at 3:08 PM, Rafael Espindola <rafael.espindola at gmail.com> wrote:

> Author: rafael
> Date: Wed Oct 30 17:08:11 2013
> New Revision: 193718
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=193718&view=rev
> Log:
> Produce .weak_def_can_be_hidden for some linkonce_odr values
> 
> With this patch llvm produces a weak_def_can_be_hidden for linkonce_odr
> if they are also unnamed_addr or don't have their address taken.
> 
> There is not a lot of documentation about .weak_def_can_be_hidden, but
> from the old discussion about linkonce_odr_auto_hide and the name of
> the directive this looks correct: these symbols can be hidden.
> 
> Testing this with the ld64 in Xcode 5 linking clang reduces the number of
> exported symbols from 21053 to 19049.
Rafael,  Thanks for driving this!    

Of these 19049 left, how many are weak?  And do they really need to be weak or is there more logic we could add to make more of them can-be-hidden?

-Nick


> 
> Added:
>    llvm/trunk/test/CodeGen/X86/weak_def_can_be_hidden.ll
> Modified:
>    llvm/trunk/include/llvm/CodeGen/AsmPrinter.h
>    llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
> 
> Modified: llvm/trunk/include/llvm/CodeGen/AsmPrinter.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/CodeGen/AsmPrinter.h?rev=193718&r1=193717&r2=193718&view=diff
> ==============================================================================
> --- llvm/trunk/include/llvm/CodeGen/AsmPrinter.h (original)
> +++ llvm/trunk/include/llvm/CodeGen/AsmPrinter.h Wed Oct 30 17:08:11 2013
> @@ -486,7 +486,7 @@ namespace llvm {
>     void EmitVisibility(MCSymbol *Sym, unsigned Visibility,
>                         bool IsDefinition = true) const;
> 
> -    void EmitLinkage(unsigned Linkage, MCSymbol *GVSym) const;
> +    void EmitLinkage(const GlobalValue *GV, MCSymbol *GVSym) const;
> 
>     void EmitJumpTableEntry(const MachineJumpTableInfo *MJTI,
>                             const MachineBasicBlock *MBB, unsigned uid) const;
> 
> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp?rev=193718&r1=193717&r2=193718&view=diff
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp (original)
> +++ llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp Wed Oct 30 17:08:11 2013
> @@ -48,6 +48,7 @@
> #include "llvm/Target/TargetLoweringObjectFile.h"
> #include "llvm/Target/TargetOptions.h"
> #include "llvm/Target/TargetRegisterInfo.h"
> +#include "llvm/Transforms/Utils/GlobalStatus.h"
> using namespace llvm;
> 
> static const char *const DWARFGroupName = "DWARF Emission";
> @@ -212,9 +213,8 @@ bool AsmPrinter::doInitialization(Module
>   llvm_unreachable("Unknown exception type.");
> }
> 
> -void AsmPrinter::EmitLinkage(unsigned L, MCSymbol *GVSym) const {
> -  GlobalValue::LinkageTypes Linkage = (GlobalValue::LinkageTypes)L;
> -
> +void AsmPrinter::EmitLinkage(const GlobalValue *GV, MCSymbol *GVSym) const {
> +  GlobalValue::LinkageTypes Linkage = GV->getLinkage();
>   switch (Linkage) {
>   case GlobalValue::CommonLinkage:
>   case GlobalValue::LinkOnceAnyLinkage:
> @@ -227,7 +227,20 @@ void AsmPrinter::EmitLinkage(unsigned L,
>       // .globl _foo
>       OutStreamer.EmitSymbolAttribute(GVSym, MCSA_Global);
> 
> -      if (Linkage != GlobalValue::LinkOnceODRAutoHideLinkage)
> +
> +      bool CanBeHidden = Linkage == GlobalValue::LinkOnceODRAutoHideLinkage;
> +
> +      if (!CanBeHidden && Linkage == GlobalValue::LinkOnceODRLinkage) {
> +        if (GV->hasUnnamedAddr()) {
> +          CanBeHidden = true;
> +        } else {
> +          GlobalStatus GS;
> +          if (!GlobalStatus::analyzeGlobal(GV, GS) && !GS.IsCompared)
> +            CanBeHidden = true;
> +        }
> +      }
> +
> +      if (!CanBeHidden)
>         // .weak_definition _foo
>         OutStreamer.EmitSymbolAttribute(GVSym, MCSA_WeakDefinition);
>       else
> @@ -399,7 +412,7 @@ void AsmPrinter::EmitGlobalVariable(cons
> 
>     OutStreamer.SwitchSection(TLVSect);
>     // Emit the linkage here.
> -    EmitLinkage(GV->getLinkage(), GVSym);
> +    EmitLinkage(GV, GVSym);
>     OutStreamer.EmitLabel(GVSym);
> 
>     // Three pointers in size:
> @@ -418,7 +431,7 @@ void AsmPrinter::EmitGlobalVariable(cons
> 
>   OutStreamer.SwitchSection(TheSection);
> 
> -  EmitLinkage(GV->getLinkage(), GVSym);
> +  EmitLinkage(GV, GVSym);
>   EmitAlignment(AlignLog, GV);
> 
>   OutStreamer.EmitLabel(GVSym);
> @@ -444,7 +457,7 @@ void AsmPrinter::EmitFunctionHeader() {
>   OutStreamer.SwitchSection(getObjFileLowering().SectionForGlobal(F, Mang, TM));
>   EmitVisibility(CurrentFnSym, F->getVisibility());
> 
> -  EmitLinkage(F->getLinkage(), CurrentFnSym);
> +  EmitLinkage(F, CurrentFnSym);
>   EmitAlignment(MF->getAlignment(), F);
> 
>   if (MAI->hasDotTypeDotSizeDirective())
> 
> Added: llvm/trunk/test/CodeGen/X86/weak_def_can_be_hidden.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/weak_def_can_be_hidden.ll?rev=193718&view=auto
> ==============================================================================
> --- llvm/trunk/test/CodeGen/X86/weak_def_can_be_hidden.ll (added)
> +++ llvm/trunk/test/CodeGen/X86/weak_def_can_be_hidden.ll Wed Oct 30 17:08:11 2013
> @@ -0,0 +1,26 @@
> +; RUN: llc -mtriple=x86_64-apple-darwin  -O0 < %s | FileCheck %s
> +
> + at v1 = linkonce_odr global i32 32
> +; CHECK: .globl  _v1
> +; CHECK: .weak_def_can_be_hidden _v1
> +
> +define i32 @f1() {
> +  %x = load i32 * @v1
> +  ret i32 %x
> +}
> +
> + at v2 = linkonce_odr global i32 32
> +; CHECK: .globl  _v2
> +; CHECK: .weak_definition _v2
> +
> + at v3 = linkonce_odr unnamed_addr global i32 32
> +; CHECK: .globl  _v3
> +; CHECK: .weak_def_can_be_hidden _v3
> +
> +define i32* @f2() {
> +  ret i32* @v2
> +}
> +
> +define i32* @f3() {
> +  ret i32* @v3
> +}
> 
> 
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits




More information about the llvm-commits mailing list