]> granicus.if.org Git - llvm/commitdiff
LowerTypeTests: Rename local functions to avoid collisions with identically named...
authorPeter Collingbourne <peter@pcc.me.uk>
Thu, 3 Oct 2019 23:42:44 +0000 (23:42 +0000)
committerPeter Collingbourne <peter@pcc.me.uk>
Thu, 3 Oct 2019 23:42:44 +0000 (23:42 +0000)
Without this we can encounter link errors or incorrect behaviour
at runtime as a result of the wrong function being referenced.

Differential Revision: https://reviews.llvm.org/D67945

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@373678 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/IPO/LowerTypeTests.cpp
test/Transforms/LowerTypeTests/export-rename-local.ll [new file with mode: 0644]

index 1b83ccb816e9a408f2978d3708c9f0cd862d3664..36562961744f7998eb4a84cbb1f6aa08f7e7e2fd 100644 (file)
@@ -1887,6 +1887,17 @@ bool LowerTypeTestsModule::lower() {
         CfiFunctionLinkage Linkage = P.second.Linkage;
         MDNode *FuncMD = P.second.FuncMD;
         Function *F = M.getFunction(FunctionName);
+        if (F && F->hasLocalLinkage()) {
+          // Locally defined function that happens to have the same name as a
+          // function defined in a ThinLTO module. Rename it to move it out of
+          // the way of the external reference that we're about to create.
+          // Note that setName will find a unique name for the function, so even
+          // if there is an existing function with the suffix there won't be a
+          // name collision.
+          F->setName(F->getName() + ".1");
+          F = nullptr;
+        }
+
         if (!F)
           F = Function::Create(
               FunctionType::get(Type::getVoidTy(M.getContext()), false),
diff --git a/test/Transforms/LowerTypeTests/export-rename-local.ll b/test/Transforms/LowerTypeTests/export-rename-local.ll
new file mode 100644 (file)
index 0000000..9e7c54e
--- /dev/null
@@ -0,0 +1,15 @@
+; RUN: opt -S %s -lowertypetests -lowertypetests-summary-action=export -lowertypetests-read-summary=%S/Inputs/exported-funcs.yaml | FileCheck %s
+
+; CHECK: define internal void @external_addrtaken.1()
+; CHECK: declare {{.*}} void @external_addrtaken.cfi()
+
+target triple = "x86_64-unknown-linux"
+
+define internal void @external_addrtaken() !type !1 {
+  ret void
+}
+
+!cfi.functions = !{!0}
+
+!0 = !{!"external_addrtaken", i8 0, !1}
+!1 = !{i64 0, !"typeid1"}