1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-22 18:54:02 +01:00

Linker: Copy over function metadata attachments

Update `lib/Linker` to handle `Function` metadata attachments.  The
attachments stick with the function body.

llvm-svn: 235786
This commit is contained in:
Duncan P. N. Exon Smith 2015-04-24 22:07:31 +00:00
parent c4adf5ea45
commit 9cabb129a0
3 changed files with 46 additions and 0 deletions

View File

@ -1205,6 +1205,13 @@ bool ModuleLinker::linkFunctionBody(Function &Dst, Function &Src) {
++DI;
}
// Copy over the metadata attachments.
SmallVector<std::pair<unsigned, MDNode *>, 8> MDs;
Src.getAllMetadata(MDs);
for (const auto &I : MDs)
Dst.setMetadata(I.first, MapMetadata(I.second, ValueMap, RF_None, &TypeMap,
&ValMaterializer));
// Splice the body of the source function into the dest function.
Dst.getBasicBlockList().splice(Dst.end(), Src.getBasicBlockList());

View File

@ -0,0 +1,13 @@
define weak void @foo() !weak !0 {
unreachable
}
define void @baz() !baz !0 {
unreachable
}
define void @b() !b !0 {
unreachable
}
!0 = !{!"b"}

View File

@ -0,0 +1,26 @@
; RUN: llvm-link %s %S/Inputs/metadata-function.ll -S | FileCheck %s
; RUN: llvm-link %S/Inputs/metadata-function.ll %s -S | FileCheck %s
; CHECK-DAG: define weak void @foo() !weak ![[B:[0-9]+]] {
define linkonce void @foo() !linkonce !0 {
unreachable
}
; CHECK-DAG: define void @bar() !bar ![[A:[0-9]+]] {
define void @bar() !bar !0 {
call void @baz()
unreachable
}
; CHECK-DAG: define void @baz() !baz ![[B]] {
declare void @baz()
; CHECK-DAG: define void @a() !a ![[A]] {
; CHECK-DAG: define void @b() !b ![[B]] {
define void @a() !a !0 {
unreachable
}
; CHECK-DAG: ![[A]] = !{!"a"}
; CHECK-DAG: ![[B]] = !{!"b"}
!0 = !{!"a"}