[PATCH] D21624: Linker: Copy metadata when linking declarations.

Duncan P. N. Exon Smith via llvm-commits llvm-commits at lists.llvm.org
Fri Jun 24 10:35:16 PDT 2016


LGTM.

> On 2016-Jun-23, at 22:14, Peter Collingbourne <peter at pcc.me.uk> wrote:
> 
> pcc updated this revision to Diff 61709.
> pcc added a comment.
> 
> Increase stack allocation to 8
> 
> 
> http://reviews.llvm.org/D21624
> 
> Files:
>  include/llvm/IR/GlobalObject.h
>  lib/IR/Metadata.cpp
>  lib/Linker/IRMover.cpp
>  test/Linker/metadata-attach.ll
> 
> Index: test/Linker/metadata-attach.ll
> ===================================================================
> --- /dev/null
> +++ test/Linker/metadata-attach.ll
> @@ -0,0 +1,19 @@
> +; RUN: llvm-link %s -S -o - | FileCheck %s
> +
> +; CHECK: @g1 = global i32 0, !attach !0
> + at g1 = global i32 0, !attach !0
> +
> +; CHECK: @g2 = external global i32, !attach !0
> + at g2 = external global i32, !attach !0
> +
> +; CHECK: define void @f1() !attach !0
> +define void @f1() !attach !0 {
> +  call void @f2()
> +  store i32 0, i32* @g2
> +  ret void
> +}
> +
> +; CHECK: declare !attach !0 void @f2()
> +declare !attach !0 void @f2()
> +
> +!0 = !{}
> Index: lib/Linker/IRMover.cpp
> ===================================================================
> --- lib/Linker/IRMover.cpp
> +++ lib/Linker/IRMover.cpp
> @@ -637,6 +637,12 @@
> 
>   NewGV->copyAttributesFrom(SGV);
> 
> +  if (auto *NewGO = dyn_cast<GlobalObject>(NewGV)) {
> +    // Metadata for global variables and function declarations is copied eagerly.
> +    if (isa<GlobalVariable>(SGV) || SGV->isDeclaration())
> +      NewGO->copyMetadata(cast<GlobalObject>(SGV));
> +  }
> +
>   // Remove these copied constants in case this stays a declaration, since
>   // they point to the source module. If the def is linked the values will
>   // be mapped in during linkFunctionBody.
> @@ -952,10 +958,7 @@
>     Dst.setPersonalityFn(Src.getPersonalityFn());
> 
>   // Copy over the metadata attachments without remapping.
> -  SmallVector<std::pair<unsigned, MDNode *>, 8> MDs;
> -  Src.getAllMetadata(MDs);
> -  for (const auto &I : MDs)
> -    Dst.setMetadata(I.first, I.second);
> +  Dst.copyMetadata(&Src);
> 
>   // Steal arguments and splice the body of Src into Dst.
>   Dst.stealArgumentListFrom(Src);
> Index: lib/IR/Metadata.cpp
> ===================================================================
> --- lib/IR/Metadata.cpp
> +++ lib/IR/Metadata.cpp
> @@ -1393,6 +1393,13 @@
>   return getMetadata(getContext().getMDKindID(Kind));
> }
> 
> +void GlobalObject::copyMetadata(const GlobalObject *Other) {
> +  SmallVector<std::pair<unsigned, MDNode *>, 8> MDs;
> +  Other->getAllMetadata(MDs);
> +  for (auto &MD : MDs)
> +    addMetadata(MD.first, *MD.second);
> +}
> +
> void Function::setSubprogram(DISubprogram *SP) {
>   setMetadata(LLVMContext::MD_dbg, SP);
> }
> Index: include/llvm/IR/GlobalObject.h
> ===================================================================
> --- include/llvm/IR/GlobalObject.h
> +++ include/llvm/IR/GlobalObject.h
> @@ -114,6 +114,9 @@
>   /// Erase all metadata attachments with the given kind.
>   void eraseMetadata(unsigned KindID);
> 
> +  /// Copy metadata from Src.
> +  void copyMetadata(const GlobalObject *Src);
> +
>   void copyAttributesFrom(const GlobalValue *Src) override;
> 
>   // Methods for support type inquiry through isa, cast, and dyn_cast:
> 
> 
> <D21624.61709.patch>



More information about the llvm-commits mailing list