summaryrefslogtreecommitdiffstats
path: root/llvm/unittests/Linker
diff options
context:
space:
mode:
authorArtur Pilipenko <apilipenko@azulsystems.com>2016-06-24 15:10:29 +0000
committerArtur Pilipenko <apilipenko@azulsystems.com>2016-06-24 15:10:29 +0000
commit6c7a8abf5c78005bd329f389db8d36820bbee819 (patch)
tree7d5b2da07eb00fc9255b344c6fb41a95c8c60441 /llvm/unittests/Linker
parentb68b82117ab6777074ab344574ccdc93e7a1b36c (diff)
downloadbcm5719-llvm-6c7a8abf5c78005bd329f389db8d36820bbee819.tar.gz
bcm5719-llvm-6c7a8abf5c78005bd329f389db8d36820bbee819.zip
Remangle intrinsics names when types are renamed
This is a resubmittion of previously reverted rL273568. This is a fix for the problem mentioned in "LTO and intrinsics mangling" llvm-dev mail thread: http://lists.llvm.org/pipermail/llvm-dev/2016-April/098387.html Reviewers: mehdi_amini, reames Differential Revision: http://reviews.llvm.org/D19373 llvm-svn: 273686
Diffstat (limited to 'llvm/unittests/Linker')
-rw-r--r--llvm/unittests/Linker/LinkModulesTest.cpp54
1 files changed, 54 insertions, 0 deletions
diff --git a/llvm/unittests/Linker/LinkModulesTest.cpp b/llvm/unittests/Linker/LinkModulesTest.cpp
index 10a89f39869..92c483278be 100644
--- a/llvm/unittests/Linker/LinkModulesTest.cpp
+++ b/llvm/unittests/Linker/LinkModulesTest.cpp
@@ -306,4 +306,58 @@ TEST_F(LinkModuleTest, MoveDistinctMDs) {
EXPECT_EQ(M3, M4->getOperand(0));
}
+TEST_F(LinkModuleTest, RemangleIntrinsics) {
+ LLVMContext C;
+ SMDiagnostic Err;
+
+ // We load two modules inside the same context C. In both modules there is a
+ // "struct.rtx_def" type. In the module loaded the second (Bar) this type will
+ // be renamed to "struct.rtx_def.0". Check that the intrinsics which have this
+ // type in the signature are properly remangled.
+ const char *FooStr =
+ "%struct.rtx_def = type { i16 }\n"
+ "define void @foo(%struct.rtx_def* %a, i8 %b, i32 %c) {\n"
+ " call void @llvm.memset.p0struct.rtx_def.i32(%struct.rtx_def* %a, i8 %b, i32 %c, i32 4, i1 true)\n"
+ " ret void\n"
+ "}\n"
+ "declare void @llvm.memset.p0struct.rtx_def.i32(%struct.rtx_def*, i8, i32, i32, i1)\n";
+
+ const char *BarStr =
+ "%struct.rtx_def = type { i16 }\n"
+ "define void @bar(%struct.rtx_def* %a, i8 %b, i32 %c) {\n"
+ " call void @llvm.memset.p0struct.rtx_def.i32(%struct.rtx_def* %a, i8 %b, i32 %c, i32 4, i1 true)\n"
+ " ret void\n"
+ "}\n"
+ "declare void @llvm.memset.p0struct.rtx_def.i32(%struct.rtx_def*, i8, i32, i32, i1)\n";
+
+ std::unique_ptr<Module> Foo = parseAssemblyString(FooStr, Err, C);
+ assert(Foo);
+ ASSERT_TRUE(Foo.get());
+ // Foo is loaded first, so the type and the intrinsic have theis original
+ // names.
+ ASSERT_TRUE(Foo->getFunction("llvm.memset.p0struct.rtx_def.i32"));
+ ASSERT_FALSE(Foo->getFunction("llvm.memset.p0struct.rtx_def.0.i32"));
+
+ std::unique_ptr<Module> Bar = parseAssemblyString(BarStr, Err, C);
+ assert(Bar);
+ ASSERT_TRUE(Bar.get());
+ // Bar is loaded after Foo, so the type is renamed to struct.rtx_def.0. Check
+ // that the intrinsic is also renamed.
+ ASSERT_FALSE(Bar->getFunction("llvm.memset.p0struct.rtx_def.i32"));
+ ASSERT_TRUE(Bar->getFunction("llvm.memset.p0struct.rtx_def.0.i32"));
+
+ // Link two modules together.
+ auto Dst = llvm::make_unique<Module>("Linked", C);
+ ASSERT_TRUE(Dst.get());
+ Ctx.setDiagnosticHandler(expectNoDiags);
+ bool Failed = Linker::linkModules(*Foo, std::move(Bar));
+ ASSERT_FALSE(Failed);
+
+ // "struct.rtx_def" from Foo and "struct.rtx_def.0" from Bar are isomorphic
+ // types, so they must be uniquified by linker. Check that they use the same
+ // intrinsic definition.
+ Function *F = Foo->getFunction("llvm.memset.p0struct.rtx_def.i32");
+ ASSERT_EQ(F->getNumUses(), (unsigned)2);
+}
+
} // end anonymous namespace
OpenPOWER on IntegriCloud